#ifndef SILCPACKET_H
#define SILCPACKET_H
-/* XXX many of these could go to silcpacket_i.h */
-
/* Maximum packet length */
#define SILC_PACKET_MAX_LEN 0xffff
#define SILC_PACKET_FLAG_ACK 0x10 /* Acknowledge packet */
/* Impelemntation specific flags */
-#define SILC_PACKET_FLAG_LONG_PAD 0x12 /* Use maximum padding */
+#define SILC_PACKET_FLAG_LONG_PAD 0x20 /* Use maximum padding */
/***/
/****s* silccore/SilcPacketAPI/SilcPacketEngine
* from the actual stream. It can retrieve the underlaying stream from
* the packet stream by calling silc_packet_stream_get_stream function.
*
+ * You may retrieve string version of the SilcPacketError by calling
+ * silc_packet_error_string.
+ *
* SOURCE
*/
typedef enum {
***/
void silc_packet_engine_stop(SilcPacketEngine engine);
+/****f* silccore/SilcPacketAPI/silc_packet_error_string
+ *
+ * SYNOPSIS
+ *
+ * const char *silc_packet_error_string(SilcPacketError error);
+ *
+ * DESCRIPTION
+ *
+ * Return the packet error as string.
+ *
+ ***/
+const char *silc_packet_error_string(SilcPacketError error);
+
+/****f* silccore/SilcPacketAPI/silc_packet_engine_get_streams
+ *
+ * SYNOPSIS
+ *
+ * SilcDList silc_packet_engine_get_streams(SilcPacketEngine engine);
+ *
+ * DESCRIPTION
+ *
+ * Returns list of packet streams added to the packet engine. The caller
+ * must free the list with silc_packet_engine_free_streams_list.
+ *
+ * NOTES
+ *
+ * This function may also return disconnected and destroyed streams. The
+ * caller should use silc_packet_stream_is_valid to check if the stream
+ * is valid.
+ *
+ ***/
+SilcDList silc_packet_engine_get_streams(SilcPacketEngine engine);
+
+/****f* silccore/SilcPacketAPI/silc_packet_engine_free_streams_list
+ *
+ * SYNOPSIS
+ *
+ * void silc_packet_engine_free_streams_list(SilcDList streams);
+ *
+ * DESCRIPTION
+ *
+ * Free's the streams list returned by silc_packet_engine_get_streams.
+ *
+ ***/
+void silc_packet_engine_free_streams_list(SilcDList streams);
+
/****f* silccore/SilcPacketAPI/silc_packet_stream_create
*
* SYNOPSIS
***/
void silc_packet_stream_destroy(SilcPacketStream stream);
+/****f* silccore/SilcPacketAPI/silc_packet_stream_is_valid
+ *
+ * SYNOPSIS
+ *
+ * SilcBool silc_packet_stream_is_valid(SilcPacketStream stream);
+ *
+ * DESCRIPTION
+ *
+ * Returns TRUE if the packet stream indicated by `stream' is valid and
+ * has not been disconnected or destroyed.
+ *
+ ***/
+SilcBool silc_packet_stream_is_valid(SilcPacketStream stream);
+
/****f* silccore/SilcPacketAPI/silc_packet_stream_set_router
*
* SYNOPSIS
*
* DESCRIPTION
*
- * Set the source ID and destinaion ID to be used when sending packets to
+ * Set the source ID and destination ID to be used when sending packets to
* this packet stream. The IDs to be used for a packet stream can be
* overridden when sending packets. However, if the IDs do not ever change
* for the packet stream it is recommended they are set using this function.
SilcIdType src_id_type, const void *src_id,
SilcIdType dst_id_type, const void *dst_id);
+/****f* silccore/SilcPacketAPI/silc_packet_get_ids
+ *
+ * SYNOPSIS
+ *
+ * SilcBool silc_packet_get_ids(SilcPacketStream stream,
+ * SilcBool *src_id_set, SilcID *src_id,
+ * SilcBool *dst_id_set, SilcID *dst_id);
+ *
+ * DESCRIPTION
+ *
+ * Returns source and destination IDs from the packet stream. The
+ * `src_id_set' is set to TRUE if the source ID was returned. The
+ * `dst_id_set' is set to TRUE if the destination ID was returned.
+ *
+ ***/
+SilcBool silc_packet_get_ids(SilcPacketStream stream,
+ SilcBool *src_id_set, SilcID *src_id,
+ SilcBool *dst_id_set, SilcID *dst_id);
+
/****f* silccore/SilcPacketAPI/silc_packet_set_sid
*
* SYNOPSIS
SilcIdType dst_id_type, void *dst_id,
SilcCipher cipher, SilcHmac hmac, ...);
-/****f* silccore/SilcPacketAPI/silc_packet_wait
+/****f* silccore/SilcPacketAPI/silc_packet_wait_init
*
* SYNOPSIS
*
- * void *silc_packet_wait_init(SilcPacketStream stream, ...);
+ * void *silc_packet_wait_init(SilcPacketStream stream,
+ * const SilcID *source_id, ...);
*
* DESCRIPTION
*
* Initializes a packet waiter for the packet stream `stream' and
* for the variable argument list of packet types. The function
* silc_packet_wait can be used to block the thread until a packet
- * has been received. This function is used to initialize the waiting
- * and to give the list of packet types that caller wish to receive.
- * The variable argument list must end with -1. To receive all
- * packets use SILC_PACKET_ANY. Returns a context that must be given
- * to the silc_packet_wait function as argument. Returns NULL on
- * error. To uninitialize the waiting call silc_packet_wait_uninit.
+ * has been received.
+ *
+ * This function is used to initialize the waiting and to give the list
+ * of packet types that caller wish to receive. The variable argument
+ * list must end with -1. To receive all packets use SILC_PACKET_ANY.
+ * If the `source_id' is non-NULL then only packets of the specified
+ * type from the specified `source_id' are received. If it is NULL
+ * then the packet source is ignored.
+ *
+ * Returns a context that must be given to the silc_packet_wait function
+ * as argument. Returns NULL on error. To uninitialize the waiting
+ * call silc_packet_wait_uninit.
*
* NOTES
*
* void *waiter;
*
* // Will wait for private message packets
- * waiter = silc_packet_wait_init(stream,
+ * waiter = silc_packet_wait_init(stream, NULL,
* SILC_PACKET_PRIVATE_MESSAGE, -1);
*
- *
***/
-void *silc_packet_wait_init(SilcPacketStream stream, ...);
+void *silc_packet_wait_init(SilcPacketStream stream,
+ const SilcID *source_id, ...);
/****f* silccore/SilcPacketAPI/silc_packet_wait_uninit
*