X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilcutil%2Fsilcsockconn.h;h=6fcea38d361b8271f4e4b5a2d64be9c953dd6ca7;hb=c257b555225193e54d85daf541d29578b3c93882;hp=89de51aace822bc5f023e9f77a4013172b85100c;hpb=50fa4501eebb214056c76276adf147c5f2a4f5d0;p=silc.git diff --git a/lib/silcutil/silcsockconn.h b/lib/silcutil/silcsockconn.h index 89de51aa..6fcea38d 100644 --- a/lib/silcutil/silcsockconn.h +++ b/lib/silcutil/silcsockconn.h @@ -1,16 +1,15 @@ /* - + silcsockconn.h - + Author: Pekka Riikonen - - 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 @@ -18,7 +17,7 @@ */ -/****h* silcutil/SilcSocketConnectionAPI +/****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 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 @@ -94,16 +119,19 @@ 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 -#define SILC_SF_HOST_LOOKUP 5 +#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 @@ -130,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). @@ -140,7 +168,7 @@ typedef enum { * 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 @@ -151,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 - * 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 @@ -166,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 { @@ -176,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 @@ -208,11 +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_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) @@ -220,6 +258,8 @@ struct SilcSocketConnectionStruct { #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 */ @@ -232,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. @@ -294,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 @@ -308,6 +348,23 @@ 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 @@ -329,8 +386,8 @@ typedef void (*SilcSocketConnectionHBCb)(SilcSocketConnection sock, * * 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, * SilcSchedule schedule); @@ -342,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, - uint32 heartbeat, +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 @@ -385,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. * ***/