/*-------------------------------------------------------------*/
typedef enum {
NETWIB_TCPOPTTYPE_END = 0, /* rfc 793 - end of options */
NETWIB_TCPOPTTYPE_NOOP = 1, /* rfc 793 - no operation */
NETWIB_TCPOPTTYPE_MSS = 2, /* rfc 793 - maximum segment size */
NETWIB_TCPOPTTYPE_WINDOWSCALE = 3, /* rfc 1323 - window scale */
NETWIB_TCPOPTTYPE_SACKPERMITTED = 4,/* rfc 2018 - SACK permitted */
NETWIB_TCPOPTTYPE_SACK = 5, /* rfc 2018 - selective acknowledgment */
NETWIB_TCPOPTTYPE_ECHOREQUEST = 6, /* rfc 1072 - echo request */
NETWIB_TCPOPTTYPE_ECHOREPLY = 7, /* rfc 1072 - echo reply */
NETWIB_TCPOPTTYPE_TIMESTAMP = 8, /* rfc 1323 - timestamp */
NETWIB_TCPOPTTYPE_CC = 11, /* rfc 1644 - connection count */
NETWIB_TCPOPTTYPE_CCNEW = 12, /* rfc 1644 - connection count */
NETWIB_TCPOPTTYPE_CCECHO = 13 /* rfc 1644 - connection count */
} netwib_tcpopttype;
/*-------------------------------------------------------------*/
/* maximum length of one TCP option */
#define NETWIB_TCPOPT_MAXLEN 40
/*-------------------------------------------------------------*/
typedef struct {
netwib_uint16 maxsegsize;
} netwib_tcpopt_mss;
typedef const netwib_tcpopt_mss netwib_consttcpopt_mss;
/*-------------------------------------------------------------*/
typedef struct {
netwib_uint8 windowscale;
} netwib_tcpopt_windowscale;
typedef const netwib_tcpopt_windowscale netwib_consttcpopt_windowscale;
/*-------------------------------------------------------------*/
typedef struct {
netwib_uint32 storedvalues; /* 0 to 4 */
netwib_uint32 leftedge[4];
netwib_uint32 rightedge[4];
} netwib_tcpopt_sack;
typedef const netwib_tcpopt_sack netwib_consttcpopt_sack;
/*-------------------------------------------------------------*/
typedef struct {
netwib_uint32 data;
} netwib_tcpopt_echo;
typedef const netwib_tcpopt_echo netwib_consttcpopt_echo;
/*-------------------------------------------------------------*/
typedef struct {
netwib_uint32 val;
netwib_uint32 echoreply;
} netwib_tcpopt_timestamp;
typedef const netwib_tcpopt_timestamp netwib_consttcpopt_timestamp;
/*-------------------------------------------------------------*/
typedef struct {
netwib_uint32 connectioncount;
} netwib_tcpopt_cc;
typedef const netwib_tcpopt_cc netwib_consttcpopt_cc;
/*-------------------------------------------------------------*/
typedef struct {
netwib_tcpopttype type;
union {
/* type end : no value */
/* type noop : no value */
netwib_tcpopt_mss mss;
netwib_tcpopt_windowscale windowscale;
/* type sackpermitted : no value */
netwib_tcpopt_sack sack;
netwib_tcpopt_echo echo; /* used for request and reply */
netwib_tcpopt_timestamp timestamp;
netwib_tcpopt_cc cc; /* used for cc, ccnew and ccecho */
} opt;
} netwib_tcpopt;
typedef const netwib_tcpopt netwib_consttcpopt;
/*-------------------------------------------------------------*/
/* Name : netwib_tcpopt_initdefault
Description :
Initialize a netwib_tcpopt with default values.
Input parameter(s) :
Input/output parameter(s) :
Output parameter(s) :
*ptcpopt : netwib_tcpopt to initialize
Normal return values :
NETWIB_ERR_OK : ok
*/
netwib_err netwib_tcpopt_initdefault(netwib_tcpopttype tcpopttype,
netwib_tcpopt *ptcpopt);
/*-------------------------------------------------------------*/
/* Name : netwib_pkt_append_tcpopt
Description :
Initialize physical data from a netwib_tcpopt.
Input parameter(s) :
tcpopt : netwib_tcpopt
Input/output parameter(s) :
*ppht : buffer to initialize
Output parameter(s) :
Normal return values :
NETWIB_ERR_OK : ok
*/
netwib_err netwib_pkt_append_tcpopt(netwib_consttcpopt *ptcpopt,
netwib_buf *ppkt);
netwib_err netwib_pkt_prepend_tcpopt(netwib_consttcpopt *ptcpopt,
netwib_buf *ppkt);
/*-------------------------------------------------------------*/
/* Name : netwib_pkt_decode_tcpopt
Description :
Decode a netwib_tcpopt from data coming from wire.
Input parameter(s) :
*ppkt : buffer containing physical data
Input/output parameter(s) :
Output parameter(s) :
*ptcpopt : netwib_tcpopt to initialize
*pskipsize : size to skip this option
Normal return values :
NETWIB_ERR_OK : ok
*/
netwib_err netwib_pkt_decode_tcpopt(netwib_constbuf *ppkt,
netwib_tcpopt *ptcpopt,
netwib_uint32 *pskipsize);