Merged silc_1_0_branch to trunk.
[silc.git] / lib / silcutil / silcsockconn.h
index f8321ed1fc2da628c956dd73409948053a670434..6fcea38d361b8271f4e4b5a2d64be9c953dd6ca7 100644 (file)
@@ -1,24 +1,23 @@
-/****h* silcutil/silcsockconn.h
- *
- * NAME
- *
- * silcsockconn.h
- *
- * COPYRIGHT
- *
- * Author: Pekka Riikonen <priikone@silnet.org>
- *
- * Copyright (C) 1997 - 2001 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.
- *
- * 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
- * GNU General Public License for more details.
+/*
+
+  silcsockconn.h
+
+  Author: Pekka Riikonen <priikone@silnet.org>
+
+  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; 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
+  GNU General Public License for more details.
+
+*/
+
+/****h* silcutil/SILC Socket Interface
  *
  * DESCRIPTION
  *
@@ -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 SilcSocketConnectionHB *SilcSocketConnectionHB;
+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 SilcSocketConnectionHB *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
@@ -93,33 +118,20 @@ typedef enum {
 /***/
 
 /* Socket flags */
-#define SILC_SF_NONE 0
-#define SILC_SF_INBUF_PENDING 1
-#define SILC_SF_OUTBUF_PENDING 2
-#define SILC_SF_DISCONNECTING 3
-#define SILC_SF_DISCONNECTED 4
-
-/****f* silcutil/SilcSocketConnectionAPI/SilcSocketConnectionHBCb
- *
- * SYNOPSIS
- *
- *    typedef void (*SilcSocketConnectionHBCb)(SilcSocketConnection sock,
- *                                             void *context);
- *
- * DESCRIPTION
- *
- *    Heartbeat callback function. This is the function in the application
- *    that this library will call when it is time to send the keepalive
- *    packet SILC_PACKET_HEARTBEAT.
- *
- ***/
-typedef void (*SilcSocketConnectionHBCb)(SilcSocketConnection sock,
-                                        void *context);
+#define SILC_SF_NONE             0
+#define SILC_SF_INBUF_PENDING    1 /* data in inbound buffer */
+#define SILC_SF_OUTBUF_PENDING   2 /* data in outbound buffer */
+#define SILC_SF_DISCONNECTING    3 /* socket disconnecting */
+#define SILC_SF_DISCONNECTED     4 /* socket disconnected */
+#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
@@ -146,7 +158,7 @@ typedef void (*SilcSocketConnectionHBCb)(SilcSocketConnection sock,
  *    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).
@@ -156,7 +168,7 @@ typedef void (*SilcSocketConnectionHBCb)(SilcSocketConnection sock,
  *      Protocol object for the socket. Currently only one protocol can be
  *      executing at a time for a particular socket.
  *
- *    uint32 flags
+ *    SilcUInt32 flags
  *
  *      Socket flags that indicate the status of the socket. This can
  *      indicate several different status that can affect the use of the
@@ -167,12 +179,9 @@ typedef void (*SilcSocketConnectionHBCb)(SilcSocketConnection sock,
  *      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
- *    uint16 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
@@ -182,9 +191,12 @@ typedef void (*SilcSocketConnectionHBCb)(SilcSocketConnection sock,
  *      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 {
@@ -192,21 +204,27 @@ struct SilcSocketConnectionStruct {
   SilcSocketType type;
   void *user_data;
   SilcProtocol protocol;
-  uint32 flags;
+  SilcUInt32 flags;
   int users;
 
-  char *hostname;
-  char *ip;
-  uint16 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
 
@@ -223,16 +241,25 @@ struct SilcSocketConnectionStruct {
 #define SILC_SET_INBUF_PENDING(x) SF_SET((x), SILC_SF_INBUF_PENDING)
 #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_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_INBUF_PENDING(x) SF_IS((x), SILC_SF_INBUF_PENDING)
 #define SILC_IS_DISCONNECTING(x) SF_IS((x), SILC_SF_DISCONNECTING)
 #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 */
 
@@ -245,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.
@@ -307,12 +334,12 @@ int silc_socket_read(SilcSocketConnection sock);
  *
  * SYNOPSIS
  *
- *    int silc_socket_read(SilcSocketConnection sock);
+ *    int silc_socket_write(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
@@ -321,15 +348,49 @@ int silc_socket_read(SilcSocketConnection sock);
  ***/
 int silc_socket_write(SilcSocketConnection sock);
 
+/****f* silcutil/SilcSocketConnectionAPI/silc_socket_get_error
+ *
+ * SYNOPSIS
+ *
+ *    bool silc_socket_get_error(SilcSocketConnection sock, char *error,
+ *                               SilcUInt32 error_len);
+ *
+ * DESCRIPTION
+ *
+ *    Returns human readable error message into the `error' buffer if
+ *    the socket is in error status.  Returns TRUE if error message was
+ *    written into the buffer and FALSE if there is not socket error.
+ *
+ ***/
+bool silc_socket_get_error(SilcSocketConnection sock, char *error,
+                          SilcUInt32 error_len);
+
+/****f* silcutil/SilcSocketConnectionAPI/SilcSocketConnectionHBCb
+ *
+ * SYNOPSIS
+ *
+ *    typedef void (*SilcSocketConnectionHBCb)(SilcSocketConnection sock,
+ *                                             void *context);
+ *
+ * DESCRIPTION
+ *
+ *    Heartbeat callback function. This is the function in the application
+ *    that this library will call when it is time to send the keepalive
+ *    packet SILC_PACKET_HEARTBEAT.
+ *
+ ***/
+typedef void (*SilcSocketConnectionHBCb)(SilcSocketConnection sock,
+                                        void *context);
+
 /****f* silcutil/SilcSocketConnectionAPI/silc_socket_set_heartbeat
  *
  * SYNOPSIS
  *
- *    void silc_socket_set_heartbeat(SilcSocketConnection sock, 
- *                                   uint32 heartbeat,
+ *    void silc_socket_set_heartbeat(SilcSocketConnection sock,
+ *                                   SilcUInt32 heartbeat,
  *                                   void *hb_context,
  *                                   SilcSocketConnectionHBCb hb_callback,
- *                                   void *timeout_queue);
+ *                                   SilcSchedule schedule);
  *
  * DESCRIPTION
  *
@@ -338,14 +399,100 @@ int silc_socket_write(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
- *    `timeout_queue' is the application's scheduler timeout queue.
+ *    but and must be freed by the application.  The `schedule' is the
+ *    application's scheduler.
  *
  ***/
-void silc_socket_set_heartbeat(SilcSocketConnection sock, 
-                              uint32 heartbeat,
+void silc_socket_set_heartbeat(SilcSocketConnection sock,
+                              SilcUInt32 heartbeat,
                               void *hb_context,
                               SilcSocketConnectionHBCb hb_callback,
-                              void *timeout_queue);
+                              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
+ *
+ *    typedef void (*SilcSocketHostLookupCb)(SilcSocketConnection sock,
+ *                                           void *context);
+ *
+ * DESCRIPTION
+ *
+ *    Asynchronous host lookup callback function that will be called
+ *    when the lookup is performed.
+ *
+ ***/
+typedef void (*SilcSocketHostLookupCb)(SilcSocketConnection sock,
+                                      void *context);
+
+/****f* silcutil/SilcSocketConnectionAPI/silc_socket_host_lookup
+ *
+ * SYNOPSIS
+ *
+ *    void silc_socket_host_lookup(SilcSocketConnection sock,
+ *                                 bool port_lookup,
+ *                                 SilcSocketHostLookupCb callback,
+ *                                 void *context,
+ *                                 SilcSchedule schedule);
+ *
+ * DESCRIPTION
+ *
+ *    Performs asynchronous host name and IP address lookups for the
+ *    specified socket connection. This may be called when the socket
+ *    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.
+ *    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
+ *    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
+ *    available in sock->port.
+ *
+ ***/
+void silc_socket_host_lookup(SilcSocketConnection sock,
+                            bool port_lookup,
+                            SilcSocketHostLookupCb callback,
+                            void *context,
+                            SilcSchedule schedule);
 
 #endif