inbuf = silc_dlist_get(ps->sc->inbufs);
if (!inbuf) {
/* Allocate new data input buffer */
- inbuf = silc_buffer_alloc(SILC_PACKET_DEFAULT_SIZE * 31);
+ inbuf = silc_buffer_alloc(SILC_PACKET_DEFAULT_SIZE * 61);
if (!inbuf) {
silc_mutex_unlock(ps->lock);
return FALSE;
silc_free(engine);
}
+static const char *packet_error[] = {
+ "Cannot read from stream",
+ "Cannot write to stream",
+ "Packet MAC failed",
+ "Packet decryption failed",
+ "Unknown SID",
+ "Packet is malformed",
+ "System out of memory",
+};
+
+/* Return packet error string */
+
+const char *silc_packet_error_string(SilcPacketError error)
+{
+ if (error < SILC_PACKET_ERR_READ || error > SILC_PACKET_ERR_NO_MEMORY)
+ return "";
+ return packet_error[error];
+}
+
/* Return list of packet streams in the engine */
SilcDList silc_packet_engine_get_streams(SilcPacketEngine engine)
ps->sc->schedule = schedule;
/* Allocate data input buffer */
- inbuf = silc_buffer_alloc(SILC_PACKET_DEFAULT_SIZE * 31);
+ inbuf = silc_buffer_alloc(SILC_PACKET_DEFAULT_SIZE * 61);
if (!inbuf) {
silc_free(ps->sc);
ps->sc = NULL;
SilcMutex wait_lock;
SilcCond wait_cond;
SilcList packet_queue;
+ unsigned char id[28];
+ unsigned int id_type : 2;
+ unsigned int id_len : 5;
unsigned int stopped : 1;
} *SilcPacketWait;
{
SilcPacketWait pw = callback_context;
+ /* If source ID is specified check for it */
+ if (pw->id_len) {
+ if (pw->id_type != packet->src_id_type ||
+ memcmp(pw->id, packet->src_id, pw->id_len))
+ return FALSE;
+ }
+
/* Signal the waiting thread for a new packet */
silc_mutex_lock(pw->wait_lock);
/* Initialize packet waiting */
-void *silc_packet_wait_init(SilcPacketStream stream, ...)
+void *silc_packet_wait_init(SilcPacketStream stream,
+ const SilcID *source_id, ...)
{
SilcPacketWait pw;
SilcBool ret;
}
/* Link to the packet stream for the requested packet types */
- va_start(ap, stream);
+ va_start(ap, source_id);
ret = silc_packet_stream_link_va(stream, &silc_packet_wait_cbs, pw,
10000000, ap);
va_end(ap);
/* Initialize packet queue */
silc_list_init(pw->packet_queue, struct SilcPacketStruct, next);
+ if (source_id) {
+ SilcUInt32 id_len;
+ silc_id_id2str(SILC_ID_GET_ID(*source_id), source_id->type, pw->id,
+ sizeof(pw->id), &id_len);
+ pw->id_type = source_id->type;
+ pw->id_len = id_len;
+ }
+
return (void *)pw;
}
if (pws->blocking) {
/* Blocking mode. Use packet waiter to do the thing. */
- pws->waiter = silc_packet_wait_init(pws->stream, pws->type, -1);
+ pws->waiter = silc_packet_wait_init(pws->stream, NULL, pws->type, -1);
if (!pws->waiter) {
silc_free(pws);
return NULL;