Integer type name change.
[runtime.git] / lib / silccore / silcpacket.h
index 1e70334d00df1016ad4e4efd976b9aa03d558fcc..b4f1a8e4a1a58fa39b080faa68fa12c7fdc2bf74 100644 (file)
 #define SILC_PACKET_MIN_HEADER_LEN 16
 
 /* Maximum padding length */
-#define SILC_PACKET_MAX_PADLEN 16
+#define SILC_PACKET_MAX_PADLEN 128
+
+/* Default padding length */
+#define SILC_PACKET_DEFAULT_PADLEN 16
 
 /* Minimum packet length */
 #define SILC_PACKET_MIN_LEN (SILC_PACKET_HEADER_LEN + 1)
@@ -171,21 +174,21 @@ typedef unsigned char SilcPacketFlags;
  *      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 
@@ -199,38 +202,32 @@ 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.
  *
  ***/
 typedef struct {
   SilcBuffer buffer;
-  SilcPacketType type;
+
+  SilcUInt16 truelen;
   SilcPacketFlags flags;
+  SilcPacketType type;
+  SilcUInt8 padlen;
 
   unsigned char *src_id;
-  uint16 src_id_len;
-  unsigned char src_id_type;
+  SilcUInt8 src_id_len;
+  SilcUInt8 src_id_type;
 
   unsigned char *dst_id;
-  uint16 dst_id_len;
-  unsigned char dst_id_type;
-
-  uint16 truelen;
-  uint16 padlen;
-
-  /* Back pointers */
-  void *context;
-  SilcSocketConnection sock;
+  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;
-
-  /* XXX backwards support for 0.5.c
-     XXX remove in 0.7.x */
-  bool back;
+  SilcUInt32 sequence;
 } SilcPacketContext;
 
 /****s* silccore/SilcPacketAPI/SilcPacketParserContext
@@ -282,7 +279,7 @@ typedef struct {
  *
  * SYNOPSIS
  *
- *    typedef void (*SilcPacketParserCallback)(SilcPacketParserContext 
+ *    typedef bool (*SilcPacketParserCallback)(SilcPacketParserContext 
  *                                             *parse_context);
  *
  * DESCRIPTION
@@ -295,8 +292,16 @@ typedef struct {
  *    context. The application receiving the SilcPacketParserContext
  *    must free it.
  *
+ *    This returns TRUE if the library should continue packet processing
+ *    (assuming there is more data to be processed), and FALSE if the
+ *    upper layer does not want the library to continue but to leave the
+ *    rest of the data is the packet queue untouched.  Application may
+ *    want to do this for example if the cipher is not ready before 
+ *    processing a certain packet.  In this case the application wants
+ *    to recall the processing function with the correct cipher.
+ *
  ***/
-typedef void (*SilcPacketParserCallback)(SilcPacketParserContext 
+typedef bool (*SilcPacketParserCallback)(SilcPacketParserContext 
                                         *parse_context, void *context);
 
 /* Macros */
@@ -315,9 +320,10 @@ typedef void (*SilcPacketParserCallback)(SilcPacketParserContext
  *
  * SOURCE
  */
-#define SILC_PACKET_LENGTH(__packet, __ret_truelen)    \
-do {                                                   \
-  SILC_GET16_MSB((__ret_truelen), (__packet)->data);   \
+#define SILC_PACKET_LENGTH(__packet, __ret_truelen, __ret_paddedlen)   \
+do {                                                                   \
+  SILC_GET16_MSB((__ret_truelen), (__packet)->data);                   \
+  (__ret_paddedlen) = (__ret_truelen) + (__packet)->data[4];           \
 } while(0)
 /***/
 
@@ -335,15 +341,27 @@ do {                                                      \
  * SOURCE
  */
 #define SILC_PACKET_PADLEN(__packetlen, __blocklen)            \
-  SILC_PACKET_MAX_PADLEN - (__packetlen) %                     \
-    ((__blocklen) ? (__blocklen) : SILC_PACKET_MAX_PADLEN)
+  SILC_PACKET_DEFAULT_PADLEN - (__packetlen) %                 \
+    ((__blocklen) ? (__blocklen) : SILC_PACKET_DEFAULT_PADLEN)
 /***/
 
-/* XXX Backwards support for 0.5.x
-   XXX Remove in 0.7.x */
-#define SILC_PACKET_PADLEN2(__packetlen, __blocklen)           \
-  SILC_PACKET_MAX_PADLEN - ((__packetlen) - 2 ) %              \
-    ((__blocklen) ? (__blocklen) : SILC_PACKET_MAX_PADLEN)
+/****d* silccore/SilcPacketAPI/SILC_PACKET_PADLEN_MAX
+ *
+ * NAME
+ * 
+ *    #define SILC_PACKET_PADLEN_MAX ...
+ *
+ * DESCRIPTION
+ *
+ *    Returns the length of the padding up to the maximum length, which
+ *    is 128 butes. This is used by various library routines to determine
+ *    needed padding length.
+ *
+ * SOURCE
+ */
+#define SILC_PACKET_PADLEN_MAX(__packetlen)                            \
+  SILC_PACKET_MAX_PADLEN - (__packetlen) % SILC_PACKET_MAX_PADLEN
+/***/
 
 /* Prototypes */
 
@@ -371,7 +389,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
  *
@@ -383,8 +401,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
  *
@@ -446,9 +464,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
  *
@@ -459,9 +477,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
  *
@@ -485,7 +503,7 @@ int silc_packet_receive(SilcSocketConnection sock);
  *
  * 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,
@@ -493,7 +511,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
@@ -507,10 +525,10 @@ int silc_packet_receive(SilcSocketConnection sock);
  *    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);