Added checking for maximum packet length.
[silc.git] / lib / silccore / silcpacket.h
index 54d6bc16a1a9d58962547b7a2f3fc4b9e0267fab..a944d332f6fb65e96e0e91819f19a3f49a614cc7 100644 (file)
@@ -17,7 +17,7 @@
 
 */
 
-/****h* silccore/SilcPacketAPI
+/****h* silccore/Packet Protocol Interface
  *
  * DESCRIPTION
  *
@@ -51,6 +51,9 @@
 /* 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
 
@@ -174,21 +177,21 @@ typedef unsigned char SilcPacketFlags;
  *      Packet flags. Flags are defined above.
  *
  *    unsigned char *src_id
- *    uint8 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;
- *    uint8 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
- *    uint8 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 
@@ -202,7 +205,7 @@ typedef unsigned char SilcPacketFlags;
  *      calling silc_packet_context_dup and decreased by calling the
  *      silc_packet_context_free.
  *
- *    uint32 sequence;
+ *    SilcUInt32 sequence;
  *
  *      Packet sequence number.
  *
@@ -210,24 +213,24 @@ typedef unsigned char SilcPacketFlags;
 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
@@ -327,6 +330,29 @@ do {                                                                       \
 } 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
@@ -389,7 +415,7 @@ int silc_packet_send(SilcSocketConnection sock, bool force_send);
  * SYNOPSIS
  *
  *    void silc_packet_encrypt(SilcCipher cipher, SilcHmac hmac, 
- *                             SilcBuffer buffer, uint32 len);
+ *                             SilcBuffer buffer, SilcUInt32 len);
  *
  * DESCRIPTION
  *
@@ -401,8 +427,8 @@ int silc_packet_send(SilcSocketConnection sock, bool force_send);
  *    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
  *
@@ -464,9 +490,9 @@ void silc_packet_assemble(SilcPacketContext *ctx, SilcCipher cipher);
  * 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
  *
@@ -477,9 +503,9 @@ void silc_packet_assemble(SilcPacketContext *ctx, SilcCipher cipher);
  *
  ***/
 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
  *
@@ -511,7 +537,7 @@ int silc_packet_receive(SilcSocketConnection sock);
  *
  * 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
@@ -528,7 +554,7 @@ int silc_packet_receive(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);