*/
-/****h* silccore/SilcPacketAPI
+/****h* silccore/Packet Protocol Interface
*
* DESCRIPTION
*
/* Minimum packet length */
#define SILC_PACKET_MIN_LEN (SILC_PACKET_HEADER_LEN + 1)
+/* Maximum packet length */
+#define SILC_PACKET_MAX_LEN 0xffff
+
/* Maximum length of ID */
#define SILC_PACKET_MAX_ID_LEN 16
* Packet flags. Flags are defined above.
*
* unsigned char *src_id
- * uint16 src_id_len
+ * SilcUInt8 src_id_len
* unsigned char src_id_type
*
* Source ID, its length and type. On packet reception retuned ID's
* are always the hash values of the ID's from the packet.
*
* unsigned char *dst_id;
- * uint16 dst_id_len;
+ * SilcUInt8 dst_id_len;
* unsigned char src_id_type;
*
* Destination ID, its length and type. On packet reception retuned
* ID's are always the hash values of the ID's from the packet.
*
- * uint16 truelen
- * uint16 padlen
+ * SilcUInt16 truelen
+ * SilcUInt8 padlen
*
* The true lenght of the packet and the padded length of the packet.
* These may be set by the caller before calling any of the
* calling silc_packet_context_dup and decreased by calling the
* silc_packet_context_free.
*
- * uint32 sequence;
+ * SilcUInt32 sequence;
*
* Packet sequence number.
*
typedef struct {
SilcBuffer buffer;
- uint16 truelen;
+ SilcUInt16 truelen;
SilcPacketFlags flags;
SilcPacketType type;
- uint8 padlen;
+ SilcUInt8 padlen;
unsigned char *src_id;
- uint8 src_id_len;
- uint8 src_id_type;
+ SilcUInt8 src_id_len;
+ SilcUInt8 src_id_type;
unsigned char *dst_id;
- uint8 dst_id_len;
- uint8 dst_id_type;
+ SilcUInt8 dst_id_len;
+ SilcUInt8 dst_id_type;
int users;
bool long_pad; /* Set to TRUE to use maximum padding
in packet (up to 256 bytes). */
- uint32 sequence;
+ SilcUInt32 sequence;
} SilcPacketContext;
/****s* silccore/SilcPacketAPI/SilcPacketParserContext
} while(0)
/***/
+/****d* silccore/SilcPacketAPI/SILC_PACKET_DATALEN
+ *
+ * NAME
+ *
+ * #define SILC_PACKET_DATALEN ...
+ *
+ * DESCRIPTION
+ *
+ * Calculates the data length with given header length. This macro
+ * can be used to check whether the data_len with header_len exceeds
+ * SILC_PACKET_MAX_LEN. If it does, this returns the new data_len
+ * so that the SILC_PACKET_MAX_LEN is not exceeded. If the data_len
+ * plus header_len fits SILC_PACKET_MAX_LEN the returned data length
+ * is the data_len given as argument. This macro can be used when
+ * assembling packet.
+ *
+ * SOURCE
+ */
+#define SILC_PACKET_DATALEN(data_len, header_len) \
+ ((data_len + header_len) > SILC_PACKET_MAX_LEN ? \
+ data_len - ((data_len + header_len) - SILC_PACKET_MAX_LEN) : data_len)
+/***/
+
/****d* silccore/SilcPacketAPI/SILC_PACKET_PADLEN
*
* NAME
* SYNOPSIS
*
* void silc_packet_encrypt(SilcCipher cipher, SilcHmac hmac,
- * SilcBuffer buffer, uint32 len);
+ * SilcBuffer buffer, SilcUInt32 len);
*
* DESCRIPTION
*
* cannot be used.
*
***/
-void silc_packet_encrypt(SilcCipher cipher, SilcHmac hmac, uint32 sequence,
- SilcBuffer buffer, uint32 len);
+void silc_packet_encrypt(SilcCipher cipher, SilcHmac hmac, SilcUInt32 sequence,
+ SilcBuffer buffer, SilcUInt32 len);
/****f* silccore/SilcPacketAPI/silc_packet_assemble
*
* SYNOPSIS
*
* void silc_packet_send_prepare(SilcSocketConnection sock,
- * uint32 header_len,
- * uint32 padlen,
- * uint32 data_len);
+ * SilcUInt32 header_len,
+ * SilcUInt32 padlen,
+ * SilcUInt32 data_len);
*
* DESCRIPTION
*
*
***/
void silc_packet_send_prepare(SilcSocketConnection sock,
- uint32 header_len,
- uint32 padlen,
- uint32 data_len);
+ SilcUInt32 header_len,
+ SilcUInt32 padlen,
+ SilcUInt32 data_len);
/****f* silccore/SilcPacketAPI/silc_packet_receive
*
*
* SYNOPSIS
*
- * void silc_packet_receive_process(SilcSocketConnection sock,
+ * bool silc_packet_receive_process(SilcSocketConnection sock,
* bool local_is_router,
* SilcCipher cipher, SilcHmac hmac,
* SilcPacketParserCallback parser,
*
* DESCRIPTION
*
- * Processes and decrypts the incmoing data, and calls parser callback
+ * Processes and decrypts the incoming data, and calls parser callback
* for each received packet that will handle the actual packet parsing.
* If more than one packet was received this calls the parser multiple
* times. The parser callback will get context SilcPacketParserContext
* packet was normal or special packet.
*
***/
-void silc_packet_receive_process(SilcSocketConnection sock,
+bool silc_packet_receive_process(SilcSocketConnection sock,
bool local_is_router,
SilcCipher cipher, SilcHmac hmac,
- uint32 sequence,
+ SilcUInt32 sequence,
SilcPacketParserCallback parser,
void *parser_context);