[SCTP] sctp_connectx() API support
Implements sctp_connectx() as defined in the SCTP sockets API draft by tunneling the request through a setsockopt(). Signed-off-by: Frank Filz <ffilzlnx@us.ibm.com> Signed-off-by: Sridhar Samudrala <sri@us.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
8b22c249e7
commit
3f7a87d2fa
@@ -65,9 +65,11 @@ typedef enum {
|
||||
SCTP_CMD_TIMER_START, /* Start a timer. */
|
||||
SCTP_CMD_TIMER_RESTART, /* Restart a timer. */
|
||||
SCTP_CMD_TIMER_STOP, /* Stop a timer. */
|
||||
SCTP_CMD_COUNTER_RESET, /* Reset a counter. */
|
||||
SCTP_CMD_COUNTER_INC, /* Increment a counter. */
|
||||
SCTP_CMD_INIT_CHOOSE_TRANSPORT, /* Choose transport for an INIT. */
|
||||
SCTP_CMD_INIT_COUNTER_RESET, /* Reset init counter. */
|
||||
SCTP_CMD_INIT_COUNTER_INC, /* Increment init counter. */
|
||||
SCTP_CMD_INIT_RESTART, /* High level, do init timer work. */
|
||||
SCTP_CMD_COOKIEECHO_RESTART, /* High level, do cookie-echo timer work. */
|
||||
SCTP_CMD_INIT_FAILED, /* High level, do init failure work. */
|
||||
SCTP_CMD_REPORT_DUP, /* Report a duplicate TSN. */
|
||||
SCTP_CMD_STRIKE, /* Mark a strike against a transport. */
|
||||
@@ -118,7 +120,6 @@ typedef union {
|
||||
int error;
|
||||
sctp_state_t state;
|
||||
sctp_event_timeout_t to;
|
||||
sctp_counter_t counter;
|
||||
void *ptr;
|
||||
struct sctp_chunk *chunk;
|
||||
struct sctp_association *asoc;
|
||||
@@ -165,7 +166,6 @@ SCTP_ARG_CONSTRUCTOR(U16, __u16, u16)
|
||||
SCTP_ARG_CONSTRUCTOR(U8, __u8, u8)
|
||||
SCTP_ARG_CONSTRUCTOR(ERROR, int, error)
|
||||
SCTP_ARG_CONSTRUCTOR(STATE, sctp_state_t, state)
|
||||
SCTP_ARG_CONSTRUCTOR(COUNTER, sctp_counter_t, counter)
|
||||
SCTP_ARG_CONSTRUCTOR(TO, sctp_event_timeout_t, to)
|
||||
SCTP_ARG_CONSTRUCTOR(PTR, void *, ptr)
|
||||
SCTP_ARG_CONSTRUCTOR(CHUNK, struct sctp_chunk *, chunk)
|
||||
|
@@ -263,13 +263,6 @@ enum { SCTP_MIN_PMTU = 576 };
|
||||
enum { SCTP_MAX_DUP_TSNS = 16 };
|
||||
enum { SCTP_MAX_GABS = 16 };
|
||||
|
||||
typedef enum {
|
||||
SCTP_COUNTER_INIT_ERROR,
|
||||
} sctp_counter_t;
|
||||
|
||||
/* How many counters does an association need? */
|
||||
#define SCTP_NUMBER_COUNTERS 5
|
||||
|
||||
/* Here we define the default timers. */
|
||||
|
||||
/* cookie timer def = ? seconds */
|
||||
|
@@ -223,6 +223,22 @@ DECLARE_SNMP_STAT(struct sctp_mib, sctp_statistics);
|
||||
extern int sctp_debug_flag;
|
||||
#define SCTP_DEBUG_PRINTK(whatever...) \
|
||||
((void) (sctp_debug_flag && printk(KERN_DEBUG whatever)))
|
||||
#define SCTP_DEBUG_PRINTK_IPADDR(lead, trail, leadparm, saddr, otherparms...) \
|
||||
if (sctp_debug_flag) { \
|
||||
if (saddr->sa.sa_family == AF_INET6) { \
|
||||
printk(KERN_DEBUG \
|
||||
lead "%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x" trail, \
|
||||
leadparm, \
|
||||
NIP6(saddr->v6.sin6_addr), \
|
||||
otherparms); \
|
||||
} else { \
|
||||
printk(KERN_DEBUG \
|
||||
lead "%u.%u.%u.%u" trail, \
|
||||
leadparm, \
|
||||
NIPQUAD(saddr->v4.sin_addr.s_addr), \
|
||||
otherparms); \
|
||||
} \
|
||||
}
|
||||
#define SCTP_ENABLE_DEBUG { sctp_debug_flag = 1; }
|
||||
#define SCTP_DISABLE_DEBUG { sctp_debug_flag = 0; }
|
||||
|
||||
@@ -236,6 +252,7 @@ extern int sctp_debug_flag;
|
||||
#else /* SCTP_DEBUG */
|
||||
|
||||
#define SCTP_DEBUG_PRINTK(whatever...)
|
||||
#define SCTP_DEBUG_PRINTK_IPADDR(whatever...)
|
||||
#define SCTP_ENABLE_DEBUG
|
||||
#define SCTP_DISABLE_DEBUG
|
||||
#define SCTP_ASSERT(expr, str, func)
|
||||
|
@@ -116,7 +116,8 @@ sctp_state_fn_t sctp_sf_eat_data_fast_4_4;
|
||||
sctp_state_fn_t sctp_sf_eat_sack_6_2;
|
||||
sctp_state_fn_t sctp_sf_tabort_8_4_8;
|
||||
sctp_state_fn_t sctp_sf_operr_notify;
|
||||
sctp_state_fn_t sctp_sf_t1_timer_expire;
|
||||
sctp_state_fn_t sctp_sf_t1_init_timer_expire;
|
||||
sctp_state_fn_t sctp_sf_t1_cookie_timer_expire;
|
||||
sctp_state_fn_t sctp_sf_t2_timer_expire;
|
||||
sctp_state_fn_t sctp_sf_t4_timer_expire;
|
||||
sctp_state_fn_t sctp_sf_t5_timer_expire;
|
||||
@@ -258,7 +259,10 @@ struct sctp_chunk *sctp_make_fwdtsn(const struct sctp_association *asoc,
|
||||
void sctp_chunk_assign_tsn(struct sctp_chunk *);
|
||||
void sctp_chunk_assign_ssn(struct sctp_chunk *);
|
||||
|
||||
void sctp_stop_t1_and_abort(sctp_cmd_seq_t *commands, __u16 error);
|
||||
sctp_disposition_t sctp_stop_t1_and_abort(sctp_cmd_seq_t *commands,
|
||||
__u16 error,
|
||||
const struct sctp_association *asoc,
|
||||
struct sctp_transport *transport);
|
||||
|
||||
/* Prototypes for statetable processing. */
|
||||
|
||||
|
@@ -867,10 +867,13 @@ struct sctp_transport {
|
||||
*/
|
||||
unsigned long last_time_ecne_reduced;
|
||||
|
||||
/* active : The current active state of this destination,
|
||||
* : i.e. DOWN, UP, etc.
|
||||
/* The number of times INIT has been sent on this transport. */
|
||||
int init_sent_count;
|
||||
|
||||
/* state : The current state of this destination,
|
||||
* : i.e. SCTP_ACTIVE, SCTP_INACTIVE, SCTP_UNKOWN.
|
||||
*/
|
||||
int active;
|
||||
int state;
|
||||
|
||||
/* hb_allowed : The current heartbeat state of this destination,
|
||||
* : i.e. ALLOW-HB, NO-HEARTBEAT, etc.
|
||||
@@ -1222,9 +1225,6 @@ struct sctp_endpoint {
|
||||
|
||||
/* sendbuf acct. policy. */
|
||||
__u32 sndbuf_policy;
|
||||
|
||||
/* Name for debugging output... */
|
||||
char *debug_name;
|
||||
};
|
||||
|
||||
/* Recover the outter endpoint structure. */
|
||||
@@ -1314,11 +1314,23 @@ struct sctp_association {
|
||||
* : association. Normally this information is
|
||||
* : hashed or keyed for quick lookup and access
|
||||
* : of the TCB.
|
||||
* : The list is also initialized with the list
|
||||
* : of addresses passed with the sctp_connectx()
|
||||
* : call.
|
||||
*
|
||||
* It is a list of SCTP_transport's.
|
||||
*/
|
||||
struct list_head transport_addr_list;
|
||||
|
||||
/* transport_count
|
||||
*
|
||||
* Peer : A count of the number of peer addresses
|
||||
* Transport : in the Peer Transport Address List.
|
||||
* Address :
|
||||
* Count :
|
||||
*/
|
||||
__u16 transport_count;
|
||||
|
||||
/* port
|
||||
* The transport layer port number.
|
||||
*/
|
||||
@@ -1486,6 +1498,9 @@ struct sctp_association {
|
||||
/* Transport to which SHUTDOWN chunk was last sent. */
|
||||
struct sctp_transport *shutdown_last_sent_to;
|
||||
|
||||
/* Transport to which INIT chunk was last sent. */
|
||||
struct sctp_transport *init_last_sent_to;
|
||||
|
||||
/* Next TSN : The next TSN number to be assigned to a new
|
||||
* : DATA chunk. This is sent in the INIT or INIT
|
||||
* : ACK chunk to the peer and incremented each
|
||||
@@ -1549,8 +1564,11 @@ struct sctp_association {
|
||||
/* The message size at which SCTP fragmentation will occur. */
|
||||
__u32 frag_point;
|
||||
|
||||
/* Currently only one counter is used to count INIT errors. */
|
||||
int counters[SCTP_NUMBER_COUNTERS];
|
||||
/* Counter used to count INIT errors. */
|
||||
int init_err_counter;
|
||||
|
||||
/* Count the number of INIT cycles (for doubling timeout). */
|
||||
int init_cycle;
|
||||
|
||||
/* Default send parameters. */
|
||||
__u16 default_stream;
|
||||
@@ -1708,6 +1726,8 @@ void sctp_association_free(struct sctp_association *);
|
||||
void sctp_association_put(struct sctp_association *);
|
||||
void sctp_association_hold(struct sctp_association *);
|
||||
|
||||
struct sctp_transport *sctp_assoc_choose_init_transport(
|
||||
struct sctp_association *);
|
||||
struct sctp_transport *sctp_assoc_choose_shutdown_transport(
|
||||
struct sctp_association *);
|
||||
void sctp_assoc_update_retran_path(struct sctp_association *);
|
||||
@@ -1717,9 +1737,12 @@ int sctp_assoc_lookup_laddr(struct sctp_association *asoc,
|
||||
const union sctp_addr *laddr);
|
||||
struct sctp_transport *sctp_assoc_add_peer(struct sctp_association *,
|
||||
const union sctp_addr *address,
|
||||
const int gfp);
|
||||
const int gfp,
|
||||
const int peer_state);
|
||||
void sctp_assoc_del_peer(struct sctp_association *asoc,
|
||||
const union sctp_addr *addr);
|
||||
void sctp_assoc_rm_peer(struct sctp_association *asoc,
|
||||
struct sctp_transport *peer);
|
||||
void sctp_assoc_control_transport(struct sctp_association *,
|
||||
struct sctp_transport *,
|
||||
sctp_transport_cmd_t, sctp_sn_error_t);
|
||||
|
@@ -111,6 +111,8 @@ enum sctp_optname {
|
||||
#define SCTP_GET_LOCAL_ADDRS_NUM SCTP_GET_LOCAL_ADDRS_NUM
|
||||
SCTP_GET_LOCAL_ADDRS, /* Get all local addresss. */
|
||||
#define SCTP_GET_LOCAL_ADDRS SCTP_GET_LOCAL_ADDRS
|
||||
SCTP_SOCKOPT_CONNECTX, /* CONNECTX requests. */
|
||||
#define SCTP_SOCKOPT_CONNECTX SCTP_SOCKOPT_CONNECTX
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -527,6 +529,7 @@ struct sctp_paddrinfo {
|
||||
enum sctp_spinfo_state {
|
||||
SCTP_INACTIVE,
|
||||
SCTP_ACTIVE,
|
||||
SCTP_UNKNOWN = 0xffff /* Value used for transport state unknown */
|
||||
};
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user