Author: Pekka Riikonen <priikone@poseidon.pspt.fi>
- Copyright (C) 1997 - 2000 Pekka Riikonen
+ Copyright (C) 1997 - 2001 Pekka Riikonen
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
#define IDLIST_H
/* Forward declarations */
-typedef struct SilcServerListStruct SilcServerList;
-typedef struct SilcClientListStruct SilcClientList;
-typedef struct SilcChannelListStruct SilcChannelList;
+typedef struct SilcServerEntryStruct *SilcServerEntry;
+typedef struct SilcClientEntryStruct *SilcClientEntry;
+typedef struct SilcChannelEntryStruct *SilcChannelEntry;
+
+/*
+ Generic ID list data structure.
+
+ This structure is included in all ID list entries and it includes data
+ pointers that are common to all ID entries. This structure is always
+ defined to the first field in the ID entries and is used to explicitly
+ cast to this type without first explicitly casting to correct ID entry
+ type. Hence, the ID list entry is casted to this type to get this data
+ from the ID entry (which is usually opaque pointer).
+
+ Note that some of the fields may be NULL.
+
+*/
+typedef struct {
+ /* Send and receive symmetric keys */
+ SilcCipher send_key;
+ SilcCipher receive_key;
+
+ /* HMAC and raw key data */
+ SilcHmac hmac;
+ unsigned char *hmac_key;
+ unsigned int hmac_key_len;
+
+ /* PKCS and public key */
+ SilcPKCS pkcs;
+ SilcPublicKey public_key;
+
+ unsigned short cmd_ident; /* Current command identifier, 0 not used */
+ long last_receive; /* Time last received data */
+ long last_sent; /* Time last sent data */
+ unsigned char registered; /* Boolean whether connection is registered */
+} *SilcIDListData, SilcIDListDataStruct;
/*
- SILC Server list object.
+ SILC Server entry object.
- This list holds information about servers in SILC network. However,
- contents of this list is highly dependent of what kind of server we are
- (normal server or router server) and whether the list is used as a local
- list or a global list. These factors dictates the contents of this list.
+ This entry holds information about servers in SILC network. However,
+ contents of this entry is highly dependent of what kind of server we are
+ (normal server or router server) and whether the entry is used as a local
+ list or a global list. These factors dictates the contents of this entry.
- This list is defined as follows:
+ This entry is defined as follows:
Server type List type Contents
=======================================================================
Following short description of the fields:
+ SilcIDListDataStruct data
+
+ Generic data structure to hold data common to all ID entries.
+
char *server_name
Logical name of the server. There is no limit of the length of the
the server SILC will ever need. These are also the informations
that is broadcasted between servers and routers in the SILC network.
- struct SilcServerListStruct *router
+ SilcServerEntry router
This is a pointer back to the server list. This is the router server
where this server is connected to. If this is the router itself and
it doesn't have a route this is NULL.
SilcCipher send_key
-
SilcCipher receive_key
+ Data sending and receiving keys.
+
void *connection
A pointer, usually, to the socket list for fast referencing to
list.
*/
-struct SilcServerListStruct {
+struct SilcServerEntryStruct {
+ /* Generic data structure. DO NOT add anything before this! */
+ SilcIDListDataStruct data;
+
char *server_name;
int server_type;
SilcServerID *id;
- /* TRUE when server is registered to server */
- int registered;
-
/* Pointer to the router */
- struct SilcServerListStruct *router;
-
- /* Keys */
- SilcCipher send_key;
- SilcCipher receive_key;
- SilcPKCS pkcs;
- SilcPublicKey public_key;
- SilcHmac hmac;
- unsigned char *hmac_key;
- unsigned int hmac_key_len;
+ SilcServerEntry router;
/* Connection data */
void *connection;
-
- struct SilcServerListStruct *next;
- struct SilcServerListStruct *prev;
};
/*
- SILC Client list object.
+ SILC Channel Client entry structure.
+
+ This entry used only by the SilcChannelEntry object and it holds
+ information about current clients (ie. users) on channel. Following
+ short description of the fields:
+
+ SilcClientEntry client
+
+ Pointer to the client list. This is the client currently on channel.
+
+ unsigned int mode
+
+ Client's current mode on the channel.
+
+ SilcChannelEntry channel
+
+ Back pointer back to channel. As this structure is also used by
+ SilcClientEntry we have this here for fast access to the channel when
+ used by SilcClientEntry.
+
+ struct SilcChannelClientEntryStruct *client_list
+ struct SilcChannelClientEntryStruct *channel_list
+
+ List member pointers. This structure is used by channel entry and
+ client entry thus we must have separate list member pointers for
+ them since we are using same entry for both lists (the entry is not
+ duplicated). SilcList requires this.
+
+*/
+typedef struct SilcChannelClientEntryStruct {
+ SilcClientEntry client;
+ unsigned int mode;
+ SilcChannelEntry channel;
+ struct SilcChannelClientEntryStruct *client_list;
+ struct SilcChannelClientEntryStruct *channel_list;
+} *SilcChannelClientEntry;
+
+/*
+ SILC Client entry object.
- This list holds information about connected clients ie. users in the SILC
- network. The contents of this list is depended on whether we are normal
+ This entry holds information about connected clients ie. users in the SILC
+ network. The contents of this entrt is depended on whether we are normal
server or router server and whether the list is a local or global list.
- This list is defined as follows:
+ This entry is defined as follows:
Server type List type Contents
=======================================================================
Following short description of the fields:
+ SilcIDListDataStruct data
+
+ Generic data structure to hold data common to all ID entries.
+
char username
Client's (meaning user's) real name. This is defined in following
Client's mode. Client maybe for example server operator or
router operator (SILC operator).
- SilcServerList *router
+ long last_command
+
+ Time of last time client executed command. We are strict and will
+ not allow any command to be exeucted more than once in about
+ 2 seconds. This is result of normal time().
+
+ SilcServerEntry router
This is a pointer to the server list. This is the router server whose
cell this client is coming from. This is used to route messages to
PKCS of the client. This maybe NULL.
SilcHmac hmac
- unsigned char *hmac_key
- unsigned int hmac_key_len
MAC key used to compute MAC's for packets.
list.
*/
-struct SilcClientListStruct {
- char *nickname;
+struct SilcClientEntryStruct {
+ /* Generic data structure. DO NOT add anything before this! */
+ SilcIDListDataStruct data;
+
+ unsigned char *nickname;
char *username;
char *userinfo;
SilcClientID *id;
int mode;
- /* TRUE when client is registered to server */
- int registered;
+ long last_command;
/* Pointer to the router */
- SilcServerList *router;
-
- /* Pointers to channels this client has joined */
- SilcChannelList **channel;
- unsigned int channel_count;
+ SilcServerEntry router;
- /* Keys */
- SilcCipher send_key;
- SilcCipher receive_key;
- SilcPKCS pkcs;
- SilcHmac hmac;
- unsigned char *hmac_key;
- unsigned int hmac_key_len;
+ /* List of channels client has joined to */
+ SilcList channels;
/* Connection data */
void *connection;
-
- struct SilcClientListStruct *next;
- struct SilcClientListStruct *prev;
};
/*
- SILC Channel Client list structure.
-
- This list used only by the SilcChannelList object and it holds information
- about current clients (ie. users) on channel. Following short description
- of the fields:
-
- SilcClientList client
-
- Pointer to the client list. This is the client currently on channel.
-
- int mode
-
- Client's current mode on the channel.
-
-*/
-typedef struct SilcChannelClientListStruct {
- SilcClientList *client;
- int mode;
-} SilcChannelClientList;
-
-/*
- SILC Channel list object.
+ SILC Channel entry object.
- This list holds information about channels in SILC network. The contents
- of this list is depended on whether we are normal server or router server
+ This entry holds information about channels in SILC network. The contents
+ of this entry is depended on whether we are normal server or router server
and whether the list is a local or global list.
- This list is defined as follows:
+ This entry is defined as follows:
Server type List type Contents
=======================================================================
Logical name of the channel.
- int mode
+ unsigned int mode
- Current mode of the channel.
+ Current mode of the channel. See lib/silccore/silcchannel.h for
+ all modes.
SilcChannelID *id
Current topic of the channel.
- SilcServerList *router
+ char *cipher
+
+ Default cipher of the channel. If this is NULL then server picks
+ the cipher to be used. This can be set at SILC_COMMAND_JOIN.
+
+ SilcServerEntry router
This is a pointer to the server list. This is the router server
whose cell this channel belongs to. This is used to route messages
to this channel.
- SilcCipher send_key
+ SilcCipher channel_key
+ The key of the channel (the cipher actually).
- SilcCipher receive_key
+ unsigned char *key
+ unsigned int key_len
+
+ Raw key data of the channel key.
+
+ unsigned char iv[SILC_CIPHER_MAX_IV_SIZE]
+
+ Current initial vector. Initial vector is received always along
+ with the channel packet. By default this is filled with NULL.
*/
-struct SilcChannelListStruct {
+struct SilcChannelEntryStruct {
char *channel_name;
- int mode;
+ unsigned int mode;
SilcChannelID *id;
int global_users;
char *topic;
+ char *cipher;
+
+ /* Data that is related to different channel modes. */
+ struct {
+ unsigned int user_limit;
+ unsigned char *passphrase;
+ unsigned char *ban_list;
+ unsigned char *invite_list;
+ unsigned char *cipher;
+ unsigned int key_len;
+ } mode_data;
/* List of users on channel */
- SilcChannelClientList *user_list;
- unsigned int user_list_count;
+ SilcList user_list;
/* Pointer to the router */
- SilcServerList *router;
+ SilcServerEntry router;
/* Channel keys */
SilcCipher channel_key;
unsigned char *key;
unsigned int key_len;
unsigned char iv[SILC_CIPHER_MAX_IV_SIZE];
-
- struct SilcChannelListStruct *next;
- struct SilcChannelListStruct *prev;
};
/*
As for remainder these lists are defined as follows:
- List Server type List type Contents
+ Entry list (cache) Server type List type Contents
=======================================================================
- servers server local list Server itself
- servers server global list NULL
- servers router local list All servers in cell
- servers router global list All servers in SILC
+ servers server local list Server itself
+ servers server global list NULL
+ servers router local list All servers in cell
+ servers router global list All servers in SILC
- clients server local list All clients in server
- clients server global list NULL
- clients router local list All clients in cell
- clients router global list All clients in SILC
+ clients server local list All clients in server
+ clients server global list NULL
+ clients router local list All clients in cell
+ clients router global list All clients in SILC
- channels server local list All channels in server
- channels server global list NULL
- channels router local list All channels in cell
- channels router global list All channels in SILC
+ channels server local list All channels in server
+ channels server global list NULL
+ channels router local list All channels in cell
+ channels router global list All channels in SILC
As seen on the list normal server never defines a global list. This is
because of normal server don't know anything about anything global data,
other hand, always define local and global lists because routers really
know all the relevant data in the SILC network.
-*/
-typedef struct SilcIDListStruct {
- SilcServerList *servers;
- SilcClientList *clients;
- SilcChannelList *channels;
+ This object is used as local and global list by the server/router.
+ Above table shows how this is defined on different conditions.
- /* ID Caches. Caches are used to perform fast search on the ID's. */
- SilcIDCache *server_cache[96];
- unsigned int server_cache_count[96];
- SilcIDCache *client_cache[96];
- unsigned int client_cache_count[96];
- SilcIDCache *channel_cache[96];
- unsigned int channel_cache_count[96];
-} SilcIDListObject;
+ This object holds pointers to the ID cache system. Every ID cache entry
+ has a specific context pointer to allocated entry (server, client or
+ channel entry).
-typedef SilcIDListObject *SilcIDList;
+*/
+typedef struct SilcIDListStruct {
+ SilcIDCache servers;
+ SilcIDCache clients;
+ SilcIDCache channels;
+} *SilcIDList;
/*
- Temporary ID List object.
+ ID Entry for Unknown connections.
- This is used during authentication phases where we still don't
- know what kind of connection remote connection is, hence, we
- will use this structure instead until we know what type of
- connection remote end is.
+ This is used during authentication phases where we still don't know
+ what kind of connection remote connection is, hence, we will use this
+ structure instead until we know what type of connection remote end is.
- This is not in any list. This is always individually allocated
- and used as such.
+ This is not in any list. This is always individually allocated and
+ used as such.
*/
typedef struct {
- SilcCipher send_key;
- SilcCipher receive_key;
- SilcPKCS pkcs;
- SilcPublicKey public_key;
-
- SilcHmac hmac;
- unsigned char *hmac_key;
- unsigned int hmac_key_len;
-
- /* SilcComp comp */
-} SilcIDListUnknown;
+ /* Generic data structure. DO NOT add anything before this! */
+ SilcIDListDataStruct data;
+} *SilcUnknownEntry;
/* Prototypes */
-void silc_idlist_add_server(SilcServerList **list,
- char *server_name, int server_type,
- SilcServerID *id, SilcServerList *router,
- SilcCipher send_key, SilcCipher receive_key,
- SilcPKCS public_key, SilcHmac hmac,
- SilcServerList **new_idlist);
-void silc_idlist_add_client(SilcClientList **list, char *nickname,
- char *username, char *userinfo,
- SilcClientID *id, SilcServerList *router,
- SilcCipher send_key, SilcCipher receive_key,
- SilcPKCS public_key, SilcHmac hmac,
- SilcClientList **new_idlist);
-void silc_idlist_del_client(SilcClientList **list, SilcClientList *entry);
-SilcClientList *
-silc_idlist_find_client_by_nickname(SilcClientList *list,
- char *nickname,
- char *server);
-SilcClientList *
-silc_idlist_find_client_by_hash(SilcClientList *list,
- char *nickname, SilcHash hash);
-SilcClientList *
-silc_idlist_find_client_by_id(SilcClientList *list, SilcClientID *id);
-void silc_idlist_add_channel(SilcChannelList **list,
- char *channel_name, int mode,
- SilcChannelID *id, SilcServerList *router,
- SilcCipher channel_key,
- SilcChannelList **new_idlist);
-SilcChannelList *
-silc_idlist_find_channel_by_id(SilcChannelList *list, SilcChannelID *id);
-void silc_idlist_del_channel(SilcChannelList **list, SilcChannelList *entry);
+void silc_idlist_add_data(void *entry, SilcIDListData idata);
+void silc_idlist_del_data(void *entry);
+SilcServerEntry
+silc_idlist_add_server(SilcIDList id_list,
+ char *server_name, int server_type,
+ SilcServerID *id, SilcServerEntry router,
+ void *connection);
+SilcServerEntry
+silc_idlist_find_server_by_id(SilcIDList id_list, SilcServerID *id,
+ SilcIDCacheEntry *ret_entry);
+SilcServerEntry
+silc_idlist_replace_server_id(SilcIDList id_list, SilcServerID *old_id,
+ SilcServerID *new_id);
+void silc_idlist_del_server(SilcIDList id_list, SilcServerEntry entry);
+SilcClientEntry
+silc_idlist_add_client(SilcIDList id_list, unsigned char *nickname,
+ char *username, char *userinfo, SilcClientID *id,
+ SilcServerEntry router, void *connection);
+void silc_idlist_del_client(SilcIDList id_list, SilcClientEntry entry);
+SilcClientEntry *
+silc_idlist_get_clients_by_nickname(SilcIDList id_list, char *nickname,
+ char *server, unsigned int *clients_count);
+SilcClientEntry *
+silc_idlist_get_clients_by_hash(SilcIDList id_list, char *nickname,
+ SilcHash md5hash,
+ unsigned int *clients_count);
+SilcClientEntry
+silc_idlist_find_client_by_nickname(SilcIDList id_list, char *nickname,
+ char *server,
+ SilcIDCacheEntry *ret_entry);
+SilcClientEntry
+silc_idlist_find_client_by_hash(SilcIDList id_list, char *nickname,
+ SilcHash md5hash, SilcIDCacheEntry *ret_entry);
+SilcClientEntry
+silc_idlist_find_client_by_id(SilcIDList id_list, SilcClientID *id,
+ SilcIDCacheEntry *ret_entry);
+SilcClientEntry
+silc_idlist_replace_client_id(SilcIDList id_list, SilcClientID *old_id,
+ SilcClientID *new_id);
+SilcChannelEntry
+silc_idlist_add_channel(SilcIDList id_list, char *channel_name, int mode,
+ SilcChannelID *id, SilcServerEntry router,
+ SilcCipher channel_key);
+int silc_idlist_del_channel(SilcIDList id_list, SilcChannelEntry entry);
+SilcChannelEntry
+silc_idlist_find_channel_by_name(SilcIDList id_list, char *name,
+ SilcIDCacheEntry *ret_entry);
+SilcChannelEntry
+silc_idlist_find_channel_by_id(SilcIDList id_list, SilcChannelID *id,
+ SilcIDCacheEntry *ret_entry);
#endif