Added checking for maximum packet length.
[silc.git] / lib / silccore / silcpacket.h
index b5789fe0142dc6d9f401dad752b5a784bbf214c4..a944d332f6fb65e96e0e91819f19a3f49a614cc7 100644 (file)
@@ -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
 
@@ -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