#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)
* Packet flags. Flags are defined above.
*
* unsigned char *src_id
- * uint16 src_id_len
+ * uint8 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;
+ * uint8 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
+ * uint8 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
***/
typedef struct {
SilcBuffer buffer;
- SilcPacketType type;
+
+ uint16 truelen;
SilcPacketFlags flags;
+ SilcPacketType type;
+ uint8 padlen;
unsigned char *src_id;
- uint16 src_id_len;
- unsigned char src_id_type;
+ uint8 src_id_len;
+ uint8 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;
+ uint8 dst_id_len;
+ uint8 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;
} SilcPacketContext;
/****s* silccore/SilcPacketAPI/SilcPacketParserContext
*
* SYNOPSIS
*
- * typedef void (*SilcPacketParserCallback)(SilcPacketParserContext
+ * typedef bool (*SilcPacketParserCallback)(SilcPacketParserContext
* *parse_context);
*
* DESCRIPTION
* 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 */
*
* 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)
/***/
* 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 */
*
* 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,