X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilccore%2Fsilcid.h;h=9f8c84e7dcb278484276968430248a3da91836ce;hb=833a982d981c3b6f058c6e7c2d405a5814c7c61b;hp=9fb5630cf3d2d155f8d488608a84582c301a71c3;hpb=7bb6974af2a8c8fd3bfd6ef0731bb1a534e3c324;p=runtime.git diff --git a/lib/silccore/silcid.h b/lib/silccore/silcid.h index 9fb5630c..9f8c84e7 100644 --- a/lib/silccore/silcid.h +++ b/lib/silccore/silcid.h @@ -1,16 +1,15 @@ /* - + silcid.h - + Author: Pekka Riikonen - - Copyright (C) 1997 - 2000 Pekka Riikonen - + + Copyright (C) 1997 - 2008 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 - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - + the Free Software Foundation; version 2 of the License. + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the @@ -40,10 +39,18 @@ #ifndef SILCID_H #define SILCID_H +/* The ID Lenghts. These are IPv4 based and should be noted if used directly + that these cannot be used with IPv6. */ +#define SILC_ID_SERVER_LEN (64 / 8) +#define SILC_ID_CLIENT_LEN (128 / 8) +#define SILC_ID_CHANNEL_LEN (64 / 8) + +#define CLIENTID_HASH_LEN (88 / 8) /* Client ID's 88 bit MD5 hash */ + /****d* silccore/SilcIDAPI/SilcIdType * * NAME - * + * * typedef SilcUInt16 SilcIdType; * * DESCRIPTION @@ -61,168 +68,10 @@ typedef SilcUInt16 SilcIdType; #define SILC_ID_CHANNEL 3 /***/ -/* The ID Lenghts. These are IPv4 based and should be noted if used directly - that these cannot be used with IPv6. */ -#define SILC_ID_SERVER_LEN (64 / 8) -#define SILC_ID_CLIENT_LEN (128 / 8) -#define SILC_ID_CHANNEL_LEN (64 / 8) - -#define CLIENTID_HASH_LEN (88 / 8) /* Client ID's 88 bit MD5 hash */ - -/****s* silccore/SilcIDAPI/SilcIDPayload - * - * NAME - * - * typedef struct SilcIDPayloadStruct *SilcIDPayload; - * - * DESCRIPTION - * - * This context is the actual ID Payload and is allocated by - * silc_id_payload_parse and given as argument usually to all - * silc_id_payload_* functions. It is freed by the function - * silc_id_payload_free. - * - ***/ -typedef struct SilcIDPayloadStruct *SilcIDPayload; - -/* Prototypes */ - -/****f* silccore/SilcIDAPI/silc_id_payload_parse - * - * SYNOPSIS - * - * SilcIDPayload silc_id_payload_parse(const unsigned char *payload, - * SilcUInt32 payload_len); - * - * DESCRIPTION - * - * Parses buffer and return ID payload into payload structure. The - * `buffer' is raw payload buffer. The caller must free the returned - * payload. - * - ***/ -SilcIDPayload silc_id_payload_parse(const unsigned char *payload, - SilcUInt32 payload_len); - -/****f* silccore/SilcIDAPI/silc_id_payload_parse_id - * - * SYNOPSIS - * - * void *silc_id_payload_parse_id(const unsigned char *data, - * SilcUInt32 len, - * SilcIdType *type); - * - * DESCRIPTION - * - * Return ID directly from the raw ID Payload data buffer. The - * caller must free the returned ID. - * - ***/ -void *silc_id_payload_parse_id(const unsigned char *data, SilcUInt32 len, - SilcIdType *type); - -/****f* silccore/SilcIDAPI/silc_id_payload_encode - * - * SYNOPSIS - * - * SilcBuffer silc_id_payload_encode(const void *id, SilcIdType type); - * - * DESCRIPTION - * - * Encodes ID Payload. The `id' is the ID of the type `type' to put - * into the payload. Returns the encoded payload buffer. - * - ***/ -SilcBuffer silc_id_payload_encode(const void *id, SilcIdType type); - -/****f* silccore/SilcIDAPI/silc_id_payload_encode_data - * - * SYNOPSIS - * - * SilcBuffer silc_id_payload_encode_data(const unsigned char *id, - * uin32 id_len, SilcIdType type); - * - * DESCRIPTION - * - * Encodes ID Payload. The `id' is raw ID data of the length of `id_len' - * of type of `type'. Returns the encoded payload buffer. - * - ***/ -SilcBuffer silc_id_payload_encode_data(const unsigned char *id, - SilcUInt32 id_len, SilcIdType type); - -/****f* silccore/SilcIDAPI/silc_id_payload_free - * - * SYNOPSIS - * - * void silc_id_payload_free(SilcIDPayload payload); - * - * DESCRIPTION - * - * Frees the ID Payload and all data in it. - * - ***/ -void silc_id_payload_free(SilcIDPayload payload); - -/****f* silccore/SilcIDAPI/silc_id_payload_get_type - * - * SYNOPSIS - * - * SilcIdType silc_id_payload_get_type(SilcIDPayload payload); - * - * DESCRIPTION - * - * Returns the ID type from the ID Payload. The type tells the - * type of the ID in the payload. - * - ***/ -SilcIdType silc_id_payload_get_type(SilcIDPayload payload); - -/****f* silccore/SilcIDAPI/silc_id_payload_get_id - * - * SYNOPSIS - * - * void *silc_id_payload_get_id(SilcIDPayload payload); - * - * DESCRIPTION - * - * Returns the ID in the ID Payload. The caller must free the - * returned ID. - * - ***/ -void *silc_id_payload_get_id(SilcIDPayload payload); - -/****f* silccore/SilcIDAPI/silc_id_payload_get_data - * - * SYNOPSIS - * - * unsigned char *silc_id_payload_get_data(SilcIDPayload payload); - * - * DESCRIPTION - * - * Returns the raw ID data from the ID Payload. The data is duplicated - * and the caller must free it. - * - ***/ -unsigned char *silc_id_payload_get_data(SilcIDPayload payload); - -/****f* silccore/SilcIDAPI/silc_id_payload_get_len - * - * SYNOPSIS - * - * SilcUInt32 silc_id_payload_get_len(SilcIDPayload payload); - * - * DESCRIPTION - * - * Returns the length of the ID in the ID Payload. - * - ***/ -SilcUInt32 silc_id_payload_get_len(SilcIDPayload payload); - /****s* silccore/SilcIDAPI/SilcIDIP * * NAME - * + * * typedef struct { ... } SilcIDIP; * * DESCRIPTION @@ -233,7 +82,7 @@ SilcUInt32 silc_id_payload_get_len(SilcIDPayload payload); * * SOURCE */ -typedef struct { +typedef struct SilcIDIPStruct { unsigned char data[16]; /* IP data (in MSB first order) */ SilcUInt8 data_len; /* Length of the data (4 or 16) */ } SilcIDIP; @@ -242,20 +91,20 @@ typedef struct { /****s* silccore/SilcIDAPI/SilcServerID * * NAME - * + * * typedef struct { ... } SilcServerID; * * DESCRIPTION * * 64 or 160 bit SilcServerID structure: - * + * * n bit IP address * 16 bit port * 16 bit random number * * SOURCE */ -typedef struct { +typedef struct SilcServerIDStruct { SilcIDIP ip; /* n bit IP address */ SilcUInt16 port; /* 16 bit port */ SilcUInt16 rnd; /* 16 bit random number */ @@ -265,7 +114,7 @@ typedef struct { /****s* silccore/SilcIDAPI/SilcClientID * * NAME - * + * * typedef struct { ... } SilcClientID; * * DESCRIPTION @@ -278,7 +127,7 @@ typedef struct { * * SOURCE */ -typedef struct { +typedef struct SilcClientIDStruct { SilcIDIP ip; /* n bit IP address */ unsigned char rnd; /* 8 bit random number */ unsigned char hash[CLIENTID_HASH_LEN]; /* 88 bit MD5 hash */ @@ -288,7 +137,7 @@ typedef struct { /****s* silccore/SilcIDAPI/SilcChannelID * * NAME - * + * * typedef struct { ... } SilcChannelID; * * DESCRIPTION @@ -301,19 +150,64 @@ typedef struct { * * SOURCE */ -typedef struct { +typedef struct SilcChannelIDStruct { SilcIDIP ip; /* n bit IP address */ SilcUInt16 port; /* 16 bit port */ SilcUInt16 rnd; /* 16 bit random number */ } SilcChannelID; /***/ +/****s* silccore/SilcIDAPI/SilcID + * + * NAME + * + * typedef struct { ... } SilcID; + * + * DESCRIPTION + * + * The generic ID structure that can represent SilcClientID, SilcServerID + * and SilcChannelID. The silc_id_payload_parse_id returns the ID in the + * SilcID structure. Other routines except either SilcClientID, + * SilcServerID or SilcChannelID as a void pointer. + * + * SOURCE + */ +typedef struct SilcIDStruct { + union { + SilcServerID server_id; + SilcChannelID channel_id; + SilcClientID client_id; + } u; + SilcIdType type; +} SilcID; +/***/ + /* Macros */ +/****d* silccore/SilcIDAPI/SILC_ID_GET_ID + * + * NAME + * + * #define SILC_ID_GET_ID ... + * + * DESCRIPTION + * + * Returns the ID type specific pointer from the SilcID structure. As + * the SilcID is able to house all types of IDs this macro can be used + * to get the specific ID from the structure by its type. + * + * SOURCE + */ +#define SILC_ID_GET_ID(id) \ + ((id).type == SILC_ID_CLIENT ? (void *)&(id).u.client_id : \ + (id).type == SILC_ID_SERVER ? (void *)&(id).u.server_id : \ + (void *)&(id).u.channel_id) +/***/ + /****d* silccore/SilcIDAPI/SILC_ID_COMPARE * * NAME - * + * * #define SILC_ID_COMPARE ... * * DESCRIPTION @@ -329,7 +223,7 @@ typedef struct { /****d* silccore/SilcIDAPI/SILC_ID_CLIENT_COMPARE * * NAME - * + * * #define SILC_ID_CLIENT_COMPARE ... * * DESCRIPTION @@ -345,7 +239,7 @@ typedef struct { /****d* silccore/SilcIDAPI/SILC_ID_SERVER_COMPARE * * NAME - * + * * #define SILC_ID_SERVER_COMPARE ... * * DESCRIPTION @@ -361,7 +255,7 @@ typedef struct { /****d* silccore/SilcIDAPI/SILC_ID_CHANNEL_COMPARE * * NAME - * + * * #define SILC_ID_CHANNEL_COMPARE ... * * DESCRIPTION @@ -377,7 +271,7 @@ typedef struct { /****d* silccore/SilcIDAPI/SILC_ID_COMPARE_TYPE * * NAME - * + * * #define SILC_ID_COMPARE_TYPE ... * * DESCRIPTION @@ -395,7 +289,7 @@ typedef struct { /****d* silccore/SilcIDAPI/SILC_ID_COMPARE_HASH * * NAME - * + * * #define SILC_ID_COMPARE_HASH ... * * DESCRIPTION @@ -411,37 +305,208 @@ typedef struct { (!memcmp((id1)->hash, (id2)->hash, CLIENTID_HASH_LEN)) /***/ +/****s* silccore/SilcIDAPI/SilcIDPayload + * + * NAME + * + * typedef struct SilcIDPayloadStruct *SilcIDPayload; + * + * DESCRIPTION + * + * This context is the actual ID Payload and is allocated by + * silc_id_payload_parse and given as argument usually to all + * silc_id_payload_* functions. It is freed by the function + * silc_id_payload_free. + * + ***/ +typedef struct SilcIDPayloadStruct *SilcIDPayload; + /* Prototypes */ +/****f* silccore/SilcIDAPI/silc_id_payload_parse + * + * SYNOPSIS + * + * SilcIDPayload silc_id_payload_parse(const unsigned char *payload, + * SilcUInt32 payload_len); + * + * DESCRIPTION + * + * Parses buffer and return ID payload into payload structure. The + * `buffer' is raw payload buffer. The caller must free the returned + * payload. + * + ***/ +SilcIDPayload silc_id_payload_parse(const unsigned char *payload, + SilcUInt32 payload_len); + +/****f* silccore/SilcIDAPI/silc_id_payload_parse_id + * + * SYNOPSIS + * + * SilcBool silc_id_payload_parse_id(const unsigned char *data, + * SilcUInt32 len, SilcID *ret_id); + * + * DESCRIPTION + * + * Return ID directly from the raw ID Payload data buffer. This does + * not allocate any memory. + * + ***/ +SilcBool silc_id_payload_parse_id(const unsigned char *data, SilcUInt32 len, + SilcID *ret_id); + +/****f* silccore/SilcIDAPI/silc_id_payload_encode + * + * SYNOPSIS + * + * SilcBuffer silc_id_payload_encode(const void *id, SilcIdType type); + * + * DESCRIPTION + * + * Encodes ID Payload. The `id' is the ID of the type `type' to put + * into the payload. Returns the encoded payload buffer. + * + ***/ +SilcBuffer silc_id_payload_encode(const void *id, SilcIdType type); + +/****f* silccore/SilcIDAPI/silc_id_payload_encode_data + * + * SYNOPSIS + * + * SilcBuffer silc_id_payload_encode_data(const unsigned char *id, + * uin32 id_len, SilcIdType type); + * + * DESCRIPTION + * + * Encodes ID Payload. The `id' is raw ID data of the length of `id_len' + * of type of `type'. Returns the encoded payload buffer. + * + ***/ +SilcBuffer silc_id_payload_encode_data(const unsigned char *id, + SilcUInt32 id_len, SilcIdType type); + +/****f* silccore/SilcIDAPI/silc_id_payload_free + * + * SYNOPSIS + * + * void silc_id_payload_free(SilcIDPayload payload); + * + * DESCRIPTION + * + * Frees the ID Payload and all data in it. + * + ***/ +void silc_id_payload_free(SilcIDPayload payload); + +/****f* silccore/SilcIDAPI/silc_id_payload_get_type + * + * SYNOPSIS + * + * SilcIdType silc_id_payload_get_type(SilcIDPayload payload); + * + * DESCRIPTION + * + * Returns the ID type from the ID Payload. The type tells the + * type of the ID in the payload. + * + ***/ +SilcIdType silc_id_payload_get_type(SilcIDPayload payload); + +/****f* silccore/SilcIDAPI/silc_id_payload_get_id + * + * SYNOPSIS + * + * SilcBool silc_id_payload_get_id(SilcIDPayload payload, void *ret_id, + * SilcUInt32 ret_id_len); + * + * DESCRIPTION + * + * Returns the ID in the ID Payload. This does not allocate any memory. + * + ***/ +SilcBool silc_id_payload_get_id(SilcIDPayload payload, void *ret_id, + SilcUInt32 ret_id_len); + +/****f* silccore/SilcIDAPI/silc_id_payload_get_data + * + * SYNOPSIS + * + * unsigned char *silc_id_payload_get_data(SilcIDPayload payload); + * + * DESCRIPTION + * + * Returns the raw ID data from the ID Payload. The data is duplicated + * and the caller must free it. + * + ***/ +unsigned char *silc_id_payload_get_data(SilcIDPayload payload); + +/****f* silccore/SilcIDAPI/silc_id_payload_get_len + * + * SYNOPSIS + * + * SilcUInt32 silc_id_payload_get_len(SilcIDPayload payload); + * + * DESCRIPTION + * + * Returns the length of the ID in the ID Payload. + * + ***/ +SilcUInt32 silc_id_payload_get_len(SilcIDPayload payload); + /****f* silccore/SilcIDAPI/silc_id_id2str * * SYNOPSIS * - * unsigned char *silc_id_id2str(const void *id, SilcIdType type); + * SilcBool silc_id_id2str(const void *id, SilcIdType type, + * unsigned char *ret_id, SilcUInt32 ret_id_size, + * SilcUInt32 *ret_id_len); * * DESCRIPTION * * Converts an ID of type `type' to data. This can be used to - * convert the ID's to data for inclusion in the packets. + * convert the ID's to data for inclusion in the packets. This does + * not allocate any memory. * ***/ -unsigned char *silc_id_id2str(const void *id, SilcIdType type); +SilcBool silc_id_id2str(const void *id, SilcIdType type, + unsigned char *ret_id, SilcUInt32 ret_id_size, + SilcUInt32 *ret_id_len); /****f* silccore/SilcIDAPI/silc_id_str2id * * SYNOPSIS * - * void *silc_id_str2id(const unsigned char *id, SilcUInt32 id_len, - * SilcIdType type); + * SilcBool silc_id_str2id(const unsigned char *id, SilcUInt32 id_len, + * SilcIdType type, void *ret_id, + * SilcUInt32 ret_id_size); * * DESCRIPTION * * Converts ID data string to an ID. This can be used to get the - * ID out of data that has been taken for example from packet. + * ID out of data that has been taken for example from packet. This + * does not allocate any memory. + * + ***/ +SilcBool silc_id_str2id(const unsigned char *id, SilcUInt32 id_len, + SilcIdType type, void *ret_id, SilcUInt32 ret_id_size); + +/****f* silccore/SilcIDAPI/silc_id_str2id2 + * + * SYNOPSIS + * + * SilcBool silc_id_str2id2(const unsigned char *id, SilcUInt32 id_len, + * SilcIdType type, SilcID *ret_id); + * + * DESCRIPTION + * + * Same as silc_id_str2id but returns the ID into SilcID structure in + * `ret_id' pointer. This does not allocate any memory. * ***/ -void *silc_id_str2id(const unsigned char *id, SilcUInt32 id_len, - SilcIdType type); +SilcBool silc_id_str2id2(const unsigned char *id, SilcUInt32 id_len, + SilcIdType type, SilcID *ret_id); /****f* silccore/SilcIDAPI/silc_id_get_len * @@ -470,4 +535,81 @@ SilcUInt32 silc_id_get_len(const void *id, SilcIdType type); ***/ void *silc_id_dup(const void *id, SilcIdType type); +/****f* silccore/SilcIDAPI/silc_hash_id + * + * SYNOPSIS + * + * SilcUInt32 silc_hash_id(void *key, void *user_context); + * + * DESCRIPTION + * + * Hash a ID. The `user_context' is the ID type. Can be used with + * SilcHashTable. + * + ***/ +SilcUInt32 silc_hash_id(void *key, void *user_context); + +/****f* silccore/SilcIDAPI/silc_hash_client_id_hash + * + * SYNOPSIS + * + * SilcUInt32 silc_hash_client_id_hash(void *key, void *user_context) + * + * DESCRIPTION + * + * Hash Client ID's hash. Can be used with SilcHashTable. + * + ***/ +SilcUInt32 silc_hash_client_id_hash(void *key, void *user_context); + +/****f* silccore/SilcIDAPI/silc_hash_id_compare + * + * SYNOPSIS + * + * SilcBool silc_hash_id_compare(void *key1, void *key2, + * void *user_context); + * + * DESCRIPTION + * + * Compares two ID's. May be used as SilcHashTable comparison function. + * The Client ID's compares only the hash of the Client ID not any other + * part of the Client ID. Other ID's are fully compared. Can be + * used with SilcHashTable. + * + ***/ +SilcBool silc_hash_id_compare(void *key1, void *key2, void *user_context); + +/****f* silccore/SilcIDAPI/silc_hash_id_compare_full + * + * SYNOPSIS + * + * SilcBool silc_hash_id_compare_full(void *key1, void *key2, + * void *user_context) + * + * DESCRIPTION + * + * Compares two ID's. May be used as SilcHashTable comparison function. + * To compare full ID's instead of only partial, like the + * silc_hash_id_compare does, use this function. Can be used with + * SilcHashTable. + * + ***/ +SilcBool silc_hash_id_compare_full(void *key1, void *key2, void *user_context); + +/****f* silccore/SilcIDAPI/silc_hash_client_id_compare + * + * SYNOPSIS + * + * SilcBool silc_hash_client_id_compare(void *key1, void *key2, + * void *user_context); + * + * DESCRIPTION + * + * Compare two Client ID's entirely and not just the hash from the ID. + * Can be used with SilcHashTable. + * + ***/ +SilcBool silc_hash_client_id_compare(void *key1, void *key2, + void *user_context); + #endif