***/
typedef struct SilcSocketConnectionHBStruct *SilcSocketConnectionHB;
+/****s* silcutil/SilcSocketConnectionAPI/SilcSocketConnectionQos
+ *
+ * NAME
+ *
+ * typedef struct SilcSocketConnectionQosStruct *SilcSocketConnectionQos;
+ *
+ * DESCRIPTION
+ *
+ * This structure is "Quality of Service" structure for the socket
+ * connection and is set with silc_socket_set_qos function for a
+ * socket context.
+ *
+ ***/
+typedef struct SilcSocketConnectionQosStruct {
+ SilcUInt16 read_limit_bytes; /* Max read bytes */
+ SilcUInt16 read_rate; /* Max read rate/second */
+ SilcUInt16 limit_sec; /* Limit seconds */
+ SilcUInt32 limit_usec; /* Limit microseconds */
+ SilcSchedule schedule;
+ struct timeval next_limit;
+ unsigned int cur_rate : 31;
+ unsigned int applied : 1;
+ SilcUInt32 data_len;
+} *SilcSocketConnectionQos;
+
/****d* silcutil/SilcSocketConnectionAPI/SilcSocketType
*
* NAME
#define SILC_SF_HOST_LOOKUP 5 /* performing host lookup for socket */
#define SILC_SF_DISABLED 6 /* socket connection is disabled,
no data is sent or received. */
+#define SILC_SF_LISTENER 7
/****s* silcutil/SilcSocketConnectionAPI/SilcSocketConnectionStruct
*
* Reference counter. When allocated it is set to one (1) and it won't
* be freed until it hits zero (0).
*
- * char *hostname
- * char *ip
- * SilcUInt16 port
+ * SilcSocketConnectionHB hb
*
- * Resolved hostname, IP address and port of the connection who owns
- * this object.
+ * The heartbeat context. If NULL, heartbeat is not performed.
*
* SilcBuffer inbuf
* SilcBuffer outbuf
* inbuf buffer and outgoing data after encryption is put to the outbuf
* buffer.
*
- * SilcSocketConnectionHB hb
+ * char *hostname
+ * char *ip
+ * SilcUInt16 port
*
- * The heartbeat context. If NULL, heartbeat is not performed.
+ * Resolved hostname, IP address and port of the connection who owns
+ * this object.
*
***/
struct SilcSocketConnectionStruct {
void *user_data;
SilcProtocol protocol;
SilcUInt32 flags;
- SilcUInt8 sock_error;
int users;
- char *hostname;
- char *ip;
- SilcUInt16 port;
+ SilcSocketConnectionHB hb;
+ SilcSocketConnectionQos qos;
SilcBuffer inbuf;
SilcBuffer outbuf;
- SilcSocketConnectionHB hb;
+ char *hostname;
+ char *ip;
+ SilcUInt16 port;
+ SilcUInt8 sock_error;
+ SilcUInt8 version;
};
/* Macros */
+/* Check for specific protocol version */
+#define SILC_PROTOCOL_VERSION(s, maj, min) (s->version == maj##min)
+
/* Amount of bytes to be read from the socket connection at once. */
#define SILC_SOCKET_READ_SIZE 16384
#define SILC_SET_DISCONNECTING(x) SF_SET((x), SILC_SF_DISCONNECTING)
#define SILC_SET_DISCONNECTED(x) SF_SET((x), SILC_SF_DISCONNECTED)
#define SILC_SET_HOST_LOOKUP(x) SF_SET((x), SILC_SF_HOST_LOOKUP)
-#define SILC_SET_DISABLED(x) SF_SET((x), SILC_SF_HOST_LOOKUP)
+#define SILC_SET_DISABLED(x) SF_SET((x), SILC_SF_DISABLED)
+#define SILC_SET_LISTENER(x) SF_SET((x), SILC_SF_LISTENER)
#define SILC_UNSET_OUTBUF_PENDING(x) SF_UNSET((x), SILC_SF_OUTBUF_PENDING)
#define SILC_UNSET_INBUF_PENDING(x) SF_UNSET((x), SILC_SF_INBUF_PENDING)
#define SILC_UNSET_DISCONNECTING(x) SF_UNSET((x), SILC_SF_DISCONNECTING)
#define SILC_UNSET_DISCONNECTED(x) SF_UNSET((x), SILC_SF_DISCONNECTED)
#define SILC_UNSET_HOST_LOOKUP(x) SF_UNSET((x), SILC_SF_HOST_LOOKUP)
#define SILC_UNSET_DISABLED(x) SF_UNSET((x), SILC_SF_DISABLED)
+#define SILC_UNSET_LISTENER(x) SF_UNSET((x), SILC_SF_LISTENER)
/* Checking for flags */
#define SILC_IS_OUTBUF_PENDING(x) SF_IS((x), SILC_SF_OUTBUF_PENDING)
#define SILC_IS_DISCONNECTED(x) SF_IS((x), SILC_SF_DISCONNECTED)
#define SILC_IS_HOST_LOOKUP(x) SF_IS((x), SILC_SF_HOST_LOOKUP)
#define SILC_IS_DISABLED(x) SF_IS((x), SILC_SF_DISABLED)
+#define SILC_IS_LISTENER(x) SF_IS((x), SILC_SF_LISTENER)
/* Prototypes */
* allocated by the application and will be sent as argument to the
* `hb_callback' function that is called when the `heartbeat' timeout
* expires. The callback `hb_context' won't be touched by the library
- * but will be freed automatically when calling silc_socket_free. The
- * `schedule' is the application's scheduler.
+ * but and must be freed by the application. The `schedule' is the
+ * application's scheduler.
*
***/
void silc_socket_set_heartbeat(SilcSocketConnection sock,
SilcSocketConnectionHBCb hb_callback,
SilcSchedule schedule);
+/****f* silcutil/SilcSocketConnectionAPI/silc_socket_set_qos
+ *
+ * SYNOPSIS
+ *
+ * void silc_socket_set_qos(SilcSocketConnection sock,
+ * SilcUInt32 read_rate,
+ * SilcUInt32 read_limit_bytes,
+ * SilcUInt32 limit_sec,
+ * SilcUInt32 limit_usec,
+ * SilcSchedule schedule)
+ *
+ * DESCRIPTION
+ *
+ * Sets a "Quality of Service" settings for socket connection `sock'.
+ * The `read_rate' specifies the maximum read operations per second.
+ * If more read operations are executed the limit will be applied for
+ * the reading. The `read_limit_bytes' specifies the maximum data
+ * that is read. It is guaranteed that silc_socket_read never returns
+ * more that `read_limit_bytes' of data. If more is read the limit
+ * will be applied for the reading. The `limit_sec' and `limit_usec'
+ * specifies the limit that is applied if `read_rate' and/or
+ * `read_limit_bytes' is reached. The `schedule' is the application's
+ * scheduler.
+ *
+ ***/
+void silc_socket_set_qos(SilcSocketConnection sock,
+ SilcUInt32 read_rate,
+ SilcUInt32 read_limit_bytes,
+ SilcUInt32 limit_sec,
+ SilcUInt32 limit_usec,
+ SilcSchedule schedule);
+
/****f* silcutil/SilcSocketConnectionAPI/SilcSocketHostLookupCb
*
* SYNOPSIS