Merged silc_1_0_branch to trunk.
[silc.git] / lib / silcutil / silcsockconn.h
index 7f6ea5f9c35ec0a6f0a02218205ed69e49549802..6fcea38d361b8271f4e4b5a2d64be9c953dd6ca7 100644 (file)
@@ -1,16 +1,15 @@
 /*
+
   silcsockconn.h
+
   Author: Pekka Riikonen <priikone@silnet.org>
-  Copyright (C) 1997 - 2001 Pekka Riikonen
+
+  Copyright (C) 1997 - 2001, 2003 Pekka Riikonen
+
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2 of the License, or
-  (at your option) any later version.
+  the Free Software Foundation; version 2 of the License.
+
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
@@ -36,7 +35,7 @@
 /****s* silcutil/SilcSocketConnectionAPI/SilcSocketConnection
  *
  * NAME
- * 
+ *
  *    typedef struct SilcSocketConnectionStruct *SilcSocketConnection;
  *
  * DESCRIPTION
@@ -54,23 +53,49 @@ typedef struct SilcSocketConnectionStruct *SilcSocketConnection;
 /****s* silcutil/SilcSocketConnectionAPI/SilcSocketConnectionHB
  *
  * NAME
- * 
+ *
  *    typedef struct SilcSocketConnectionHB *SilcSocketConnectionHB;
  *
  * DESCRIPTION
  *
  *    This context is the heartbeat context for the SilcSockeConnection.
  *    It is meant to hold the keepalive information for the connection.
- *    This is allocated internally and freed internally by the 
+ *    This is allocated internally and freed internally by the
  *    interface routines.
  *
  ***/
 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;
+  SilcSocketConnection sock;
+} *SilcSocketConnectionQos;
+
 /****d* silcutil/SilcSocketConnectionAPI/SilcSocketType
  *
  * NAME
- * 
+ *
  *    typedef enum { ... } SilcSocketType;
  *
  * DESCRIPTION
@@ -79,7 +104,7 @@ typedef struct SilcSocketConnectionHBStruct *SilcSocketConnectionHB;
  *    are four different types; unknown, client, server and router.
  *    Unknown connections are connections that hasn't advanced long
  *    enough so that we might know which type of connection it is.
- *    It is the applications responsibility to update the type 
+ *    It is the applications responsibility to update the type
  *    information when it becomes available.
  *
  * SOURCE
@@ -101,11 +126,12 @@ typedef enum {
 #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
  *
  * NAME
- * 
+ *
  *    struct SilcSocketConnectionStruct { ... };
  *
  * DESCRIPTION
@@ -132,7 +158,7 @@ typedef enum {
  *    void *user_data
  *
  *      This is a pointer to a data that is is saved here at the same
- *      time a new connection object is allocated. Usually this is a 
+ *      time a new connection object is allocated. Usually this is a
  *      back-pointer to some important data for fast referencing. For
  *      SILC server this is a pointer to the ID list and for SILC client
  *      to object holding active connections (windows).
@@ -153,12 +179,9 @@ typedef enum {
  *      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
@@ -168,9 +191,12 @@ typedef enum {
  *      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 {
@@ -179,21 +205,26 @@ 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
 
@@ -211,13 +242,15 @@ struct SilcSocketConnectionStruct {
 #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)
@@ -226,6 +259,7 @@ struct SilcSocketConnectionStruct {
 #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 */
 
@@ -238,7 +272,7 @@ struct SilcSocketConnectionStruct {
  *
  * DESCRIPTION
  *
- *    Allocates a new socket connection object. The allocated object is 
+ *    Allocates a new socket connection object. The allocated object is
  *    returned to the new_socket argument. The `sock' is the socket
  *    for the connection, the `type' the initial type of the connection and
  *    the `user_data' a application specific pointer.
@@ -305,7 +339,7 @@ int silc_socket_read(SilcSocketConnection sock);
  * DESCRIPTION
  *
  *    Writes data from the outgoing buffer to the socket connection. If the
- *    data cannot be written at once, it must be written at later time. 
+ *    data cannot be written at once, it must be written at later time.
  *    The data is written from the data section of the buffer, not from head
  *    or tail section. This automatically pulls the data section towards end
  *    after writing the data. Implementation of this function may be
@@ -352,7 +386,7 @@ typedef void (*SilcSocketConnectionHBCb)(SilcSocketConnection sock,
  *
  * SYNOPSIS
  *
- *    void silc_socket_set_heartbeat(SilcSocketConnection sock, 
+ *    void silc_socket_set_heartbeat(SilcSocketConnection sock,
  *                                   SilcUInt32 heartbeat,
  *                                   void *hb_context,
  *                                   SilcSocketConnectionHBCb hb_callback,
@@ -365,16 +399,50 @@ typedef void (*SilcSocketConnectionHBCb)(SilcSocketConnection sock,
  *    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, 
+void silc_socket_set_heartbeat(SilcSocketConnection sock,
                               SilcUInt32 heartbeat,
                               void *hb_context,
                               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.  If all arguments except `sock' are NULL or zero this
+ *    resets the QoS from the socket, all QoS for this socket that may
+ *    be pending will be cancelled.
+ *
+ ***/
+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
@@ -408,16 +476,16 @@ typedef void (*SilcSocketHostLookupCb)(SilcSocketConnection sock,
  *    connection is created and the full IP address and fully qualified
  *    domain name information is desired. The `callback' with `context'
  *    will be called after the lookup is performed. The `schedule'
- *    is the application's scheduler which the lookup routine needs. 
+ *    is the application's scheduler which the lookup routine needs.
  *    If the socket connection is freed during the lookup the library
  *    will automatically cancel the lookup and the `callback' will not be
  *    called.
  *
- *    If `port_lookup' is TRUE then the remote port of the socket 
+ *    If `port_lookup' is TRUE then the remote port of the socket
  *    connection is resolved. After the information is resolved they
  *    are accessible using sock->ip and sock->hostname pointers. Note
  *    that if the both IP and FQDN could not be resolved the sock->hostname
- *    includes the IP address of the remote host. The resolved port is 
+ *    includes the IP address of the remote host. The resolved port is
  *    available in sock->port.
  *
  ***/