Skip to content
Snippets Groups Projects
structs.h 58.6 KiB
Newer Older
  • Learn to ignore specific revisions
  • Linus Torvalds's avatar
    Linus Torvalds committed
    void sctp_transport_update_rto(struct sctp_transport *, __u32);
    void sctp_transport_raise_cwnd(struct sctp_transport *, __u32, __u32);
    void sctp_transport_lower_cwnd(struct sctp_transport *, sctp_lower_cwnd_t);
    unsigned long sctp_transport_timeout(struct sctp_transport *);
    
    
    /* This is the structure we use to queue packets as they come into
     * SCTP.  We write packets to it and read chunks from it.
     */
    struct sctp_inq {
    	/* This is actually a queue of sctp_chunk each
    	 * containing a partially decoded packet.
    	 */
    
    	struct list_head in_chunk_list;
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    	/* This is the packet which is currently off the in queue and is
    	 * being worked on through the inbound chunk processing.
    	 */
    	struct sctp_chunk *in_progress;
    
    	/* This is the delayed task to finish delivering inbound
    	 * messages.
    	 */
    	struct work_struct immediate;
    
    	int malloced;	     /* Is this structure kfree()able?	*/
    };
    
    void sctp_inq_init(struct sctp_inq *);
    void sctp_inq_free(struct sctp_inq *);
    void sctp_inq_push(struct sctp_inq *, struct sctp_chunk *packet);
    struct sctp_chunk *sctp_inq_pop(struct sctp_inq *);
    void sctp_inq_set_th_handler(struct sctp_inq *, void (*)(void *), void *);
    
    /* This is the structure we use to hold outbound chunks.  You push
     * chunks in and they automatically pop out the other end as bundled
     * packets (it calls (*output_handler)()).
     *
     * This structure covers sections 6.3, 6.4, 6.7, 6.8, 6.10, 7., 8.1,
     * and 8.2 of the v13 draft.
     *
     * It handles retransmissions.	The connection to the timeout portion
     * of the state machine is through sctp_..._timeout() and timeout_handler.
     *
     * If you feed it SACKs, it will eat them.
     *
     * If you give it big chunks, it will fragment them.
     *
     * It assigns TSN's to data chunks.  This happens at the last possible
     * instant before transmission.
     *
     * When free()'d, it empties itself out via output_handler().
     */
    struct sctp_outq {
    	struct sctp_association *asoc;
    
    	/* Data pending that has never been transmitted.  */
    
    	struct list_head out_chunk_list;
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    
    	unsigned out_qlen;	/* Total length of queued data chunks. */
    
    	/* Error of send failed, may used in SCTP_SEND_FAILED event. */
    	unsigned error;
    
    	/* These are control chunks we want to send.  */
    
    	struct list_head control_chunk_list;
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    
    	/* These are chunks that have been sacked but are above the
    	 * CTSN, or cumulative tsn ack point.
    	 */
    	struct list_head sacked;
    
    	/* Put chunks on this list to schedule them for
    	 * retransmission.
    	 */
    	struct list_head retransmit;
    
    	/* Put chunks on this list to save them for FWD TSN processing as
    	 * they were abandoned.
    	 */
    	struct list_head abandoned;
    
    	/* How many unackd bytes do we have in-flight?	*/
    	__u32 outstanding_bytes;
    
    	/* Corked? */
    	char cork;
    
    	/* Is this structure empty?  */
    	char empty;
    
    	/* Are we kfree()able? */
    	char malloced;
    };
    
    void sctp_outq_init(struct sctp_association *, struct sctp_outq *);
    void sctp_outq_teardown(struct sctp_outq *);
    void sctp_outq_free(struct sctp_outq*);
    int sctp_outq_tail(struct sctp_outq *, struct sctp_chunk *chunk);
    int sctp_outq_flush(struct sctp_outq *, int);
    int sctp_outq_sack(struct sctp_outq *, struct sctp_sackhdr *);
    int sctp_outq_is_empty(const struct sctp_outq *);
    void sctp_outq_restart(struct sctp_outq *);
    
    void sctp_retransmit(struct sctp_outq *, struct sctp_transport *,
    		     sctp_retransmit_reason_t);
    void sctp_retransmit_mark(struct sctp_outq *, struct sctp_transport *, __u8);
    int sctp_outq_uncork(struct sctp_outq *);
    /* Uncork and flush an outqueue.  */
    static inline void sctp_outq_cork(struct sctp_outq *q)
    {
    	q->cork = 1;
    }
    
    /* These bind address data fields common between endpoints and associations */
    struct sctp_bind_addr {
    
    	/* RFC 2960 12.1 Parameters necessary for the SCTP instance
    	 *
    	 * SCTP Port:	The local SCTP port number the endpoint is
    	 *		bound to.
    	 */
    	__u16 port;
    
    	/* RFC 2960 12.1 Parameters necessary for the SCTP instance
    	 *
    	 * Address List: The list of IP addresses that this instance
    	 *	has bound.  This information is passed to one's
    	 *	peer(s) in INIT and INIT ACK chunks.
    	 */
    	struct list_head address_list;
    
    	int malloced;	     /* Are we kfree()able?  */
    };
    
    void sctp_bind_addr_init(struct sctp_bind_addr *, __u16 port);
    void sctp_bind_addr_free(struct sctp_bind_addr *);
    int sctp_bind_addr_copy(struct sctp_bind_addr *dest,
    			const struct sctp_bind_addr *src,
    
    			sctp_scope_t scope, gfp_t gfp,
    
    			int flags);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    int sctp_add_bind_addr(struct sctp_bind_addr *, union sctp_addr *,
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    int sctp_del_bind_addr(struct sctp_bind_addr *, union sctp_addr *);
    int sctp_bind_addr_match(struct sctp_bind_addr *, const union sctp_addr *,
    			 struct sctp_sock *);
    union sctp_addr *sctp_find_unmatch_addr(struct sctp_bind_addr	*bp,
    					const union sctp_addr	*addrs,
    					int			addrcnt,
    					struct sctp_sock	*opt);
    union sctp_params sctp_bind_addrs_to_raw(const struct sctp_bind_addr *bp,
    
    					 int *addrs_len,
    
    					 gfp_t gfp);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    int sctp_raw_to_bind_addrs(struct sctp_bind_addr *bp, __u8 *raw, int len,
    
    			   __u16 port, gfp_t gfp);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    
    sctp_scope_t sctp_scope(const union sctp_addr *);
    int sctp_in_scope(const union sctp_addr *addr, const sctp_scope_t scope);
    int sctp_is_any(const union sctp_addr *addr);
    int sctp_addr_is_valid(const union sctp_addr *addr);
    
    
    /* What type of endpoint?  */
    typedef enum {
    	SCTP_EP_TYPE_SOCKET,
    	SCTP_EP_TYPE_ASSOCIATION,
    } sctp_endpoint_type_t;
    
    /*
     * A common base class to bridge the implmentation view of a
     * socket (usually listening) endpoint versus an association's
     * local endpoint.
     * This common structure is useful for several purposes:
     *   1) Common interface for lookup routines.
     *	a) Subfunctions work for either endpoint or association
     *	b) Single interface to lookup allows hiding the lookup lock rather
     *	   than acquiring it externally.
     *   2) Common interface for the inbound chunk handling/state machine.
     *   3) Common object handling routines for reference counting, etc.
     *   4) Disentangle association lookup from endpoint lookup, where we
     *	do not have to find our endpoint to find our association.
     *
     */
    
    struct sctp_ep_common {
    	/* Fields to help us manage our entries in the hash tables. */
    	struct sctp_ep_common *next;
    	struct sctp_ep_common **pprev;
    	int hashent;
    
    	/* Runtime type information.  What kind of endpoint is this? */
    	sctp_endpoint_type_t type;
    
    	/* Some fields to help us manage this object.
    	 *   refcnt   - Reference count access to this object.
    	 *   dead     - Do not attempt to use this object.
    	 *   malloced - Do we need to kfree this object?
    	 */
    	atomic_t    refcnt;
    	char	    dead;
    	char	    malloced;
    
    	/* What socket does this endpoint belong to?  */
    	struct sock *sk;
    
    	/* This is where we receive inbound chunks.  */
    	struct sctp_inq	  inqueue;
    
    	/* This substructure includes the defining parameters of the
    	 * endpoint:
    	 * bind_addr.port is our shared port number.
    	 * bind_addr.address_list is our set of local IP addresses.
    	 */
    	struct sctp_bind_addr bind_addr;
    
    	/* Protection during address list comparisons. */
    	rwlock_t   addr_lock;
    };
    
    
    /* RFC Section 1.4 Key Terms
     *
     * o SCTP endpoint: The logical sender/receiver of SCTP packets. On a
     *   multi-homed host, an SCTP endpoint is represented to its peers as a
     *   combination of a set of eligible destination transport addresses to
     *   which SCTP packets can be sent and a set of eligible source
     *   transport addresses from which SCTP packets can be received.
     *   All transport addresses used by an SCTP endpoint must use the
     *   same port number, but can use multiple IP addresses. A transport
     *   address used by an SCTP endpoint must not be used by another
     *   SCTP endpoint. In other words, a transport address is unique
     *   to an SCTP endpoint.
     *
     * From an implementation perspective, each socket has one of these.
     * A TCP-style socket will have exactly one association on one of
     * these.  An UDP-style socket will have multiple associations hanging
     * off one of these.
     */
    
    struct sctp_endpoint {
    	/* Common substructure for endpoint and association. */
    	struct sctp_ep_common base;
    
    	/* Associations: A list of current associations and mappings
    	 *	      to the data consumers for each association. This
    	 *	      may be in the form of a hash table or other
    	 *	      implementation dependent structure. The data
    	 *	      consumers may be process identification
    	 *	      information such as file descriptors, named pipe
    	 *	      pointer, or table pointers dependent on how SCTP
    	 *	      is implemented.
    	 */
    	/* This is really a list of struct sctp_association entries. */
    	struct list_head asocs;
    
    	/* Secret Key: A secret key used by this endpoint to compute
    	 *	      the MAC.	This SHOULD be a cryptographic quality
    	 *	      random number with a sufficient length.
    	 *	      Discussion in [RFC1750] can be helpful in
    	 *	      selection of the key.
    	 */
    	__u8 secret_key[SCTP_HOW_MANY_SECRETS][SCTP_SECRET_SIZE];
    	int current_key;
    	int last_key;
    	int key_changed_at;
    
    
     	/* digest:  This is a digest of the sctp cookie.  This field is
     	 * 	    only used on the receive path when we try to validate
     	 * 	    that the cookie has not been tampered with.  We put
     	 * 	    this here so we pre-allocate this once and can re-use
     	 * 	    on every receive.
     	 */
     	__u8 digest[SCTP_SIGNATURE_SIZE];
     
    
    	/* sendbuf acct. policy.	*/
    	__u32 sndbuf_policy;
    
    
    	/* rcvbuf acct. policy.	*/
    	__u32 rcvbuf_policy;
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    };
    
    /* Recover the outter endpoint structure. */
    static inline struct sctp_endpoint *sctp_ep(struct sctp_ep_common *base)
    {
    	struct sctp_endpoint *ep;
    
    	ep = container_of(base, struct sctp_endpoint, base);
    	return ep;
    }
    
    /* These are function signatures for manipulating endpoints.  */
    
    struct sctp_endpoint *sctp_endpoint_new(struct sock *, gfp_t);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    void sctp_endpoint_free(struct sctp_endpoint *);
    void sctp_endpoint_put(struct sctp_endpoint *);
    void sctp_endpoint_hold(struct sctp_endpoint *);
    void sctp_endpoint_add_asoc(struct sctp_endpoint *, struct sctp_association *);
    struct sctp_association *sctp_endpoint_lookup_assoc(
    	const struct sctp_endpoint *ep,
    	const union sctp_addr *paddr,
    	struct sctp_transport **);
    int sctp_endpoint_is_peeled_off(struct sctp_endpoint *,
    				const union sctp_addr *);
    struct sctp_endpoint *sctp_endpoint_is_match(struct sctp_endpoint *,
    					const union sctp_addr *);
    int sctp_has_association(const union sctp_addr *laddr,
    			 const union sctp_addr *paddr);
    
    int sctp_verify_init(const struct sctp_association *asoc, sctp_cid_t,
    		     sctp_init_chunk_t *peer_init, struct sctp_chunk *chunk,
    		     struct sctp_chunk **err_chunk);
    int sctp_process_init(struct sctp_association *, sctp_cid_t cid,
    		      const union sctp_addr *peer,
    
    		      sctp_init_chunk_t *init, gfp_t gfp);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    __u32 sctp_generate_tag(const struct sctp_endpoint *);
    __u32 sctp_generate_tsn(const struct sctp_endpoint *);
    
    
    /* RFC2960
     *
     * 12. Recommended Transmission Control Block (TCB) Parameters
     *
     * This section details a recommended set of parameters that should
     * be contained within the TCB for an implementation. This section is
     * for illustrative purposes and should not be deemed as requirements
     * on an implementation or as an exhaustive list of all parameters
     * inside an SCTP TCB. Each implementation may need its own additional
     * parameters for optimization.
     */
    
    
    /* Here we have information about each individual association. */
    struct sctp_association {
    
    	/* A base structure common to endpoint and association.
    	 * In this context, it represents the associations's view
    	 * of the local endpoint of the association.
    	 */
    	struct sctp_ep_common base;
    
    	/* Associations on the same socket. */
    	struct list_head asocs;
    
    	/* association id. */
    	sctp_assoc_t assoc_id;
    
    	/* This is our parent endpoint.	 */
    	struct sctp_endpoint *ep;
    
    	/* These are those association elements needed in the cookie.  */
    	struct sctp_cookie c;
    
    	/* This is all information about our peer.  */
    	struct {
    		/* rwnd
    		 *
    		 * Peer Rwnd   : Current calculated value of the peer's rwnd.
    		 */
    		__u32 rwnd;
    
    		/* transport_addr_list
    		 *
    		 * Peer	       : A list of SCTP transport addresses that the
    		 * Transport   : peer is bound to. This information is derived
    		 * Address     : from the INIT or INIT ACK and is used to
    		 * List	       : associate an inbound packet with a given
    		 *	       : 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.
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    		 *
    		 * 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;
    
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    		/* port
    		 *   The transport layer port number.
    		 */
    		__u16 port;
    
    		/* primary_path
    		 *
    		 * Primary     : This is the current primary destination
    		 * Path	       : transport address of the peer endpoint.  It
    		 *	       : may also specify a source transport address
    		 *	       : on this endpoint.
    		 *
    		 * All of these paths live on transport_addr_list.
    		 *
    		 * At the bakeoffs, we discovered that the intent of
    		 * primaryPath is that it only changes when the ULP
    		 * asks to have it changed.  We add the activePath to
    		 * designate the connection we are currently using to
    		 * transmit new data and most control chunks.
    		 */
    		struct sctp_transport *primary_path;
    
    		/* Cache the primary path address here, when we
    		 * need a an address for msg_name.
    		 */
    		union sctp_addr primary_addr;
    
    		/* active_path
    		 *   The path that we are currently using to
    		 *   transmit new data and most control chunks.
    		 */
    		struct sctp_transport *active_path;
    
    		/* retran_path
    		 *
    		 * RFC2960 6.4 Multi-homed SCTP Endpoints
    		 * ...
    		 * Furthermore, when its peer is multi-homed, an
    		 * endpoint SHOULD try to retransmit a chunk to an
    		 * active destination transport address that is
    		 * different from the last destination address to
    		 * which the DATA chunk was sent.
    		 */
    		struct sctp_transport *retran_path;
    
    		/* Pointer to last transport I have sent on.  */
    		struct sctp_transport *last_sent_to;
    
    		/* This is the last transport I have received DATA on.	*/
    		struct sctp_transport *last_data_from;
    
    		/*
    		 * Mapping  An array of bits or bytes indicating which out of
    		 * Array    order TSN's have been received (relative to the
    		 *	    Last Rcvd TSN). If no gaps exist, i.e. no out of
    		 *	    order packets have been received, this array
    		 *	    will be set to all zero. This structure may be
    		 *	    in the form of a circular buffer or bit array.
    		 *
    		 * Last Rcvd   : This is the last TSN received in
    		 * TSN	       : sequence. This value is set initially by
    		 *	       : taking the peer's Initial TSN, received in
    		 *	       : the INIT or INIT ACK chunk, and subtracting
    		 *	       : one from it.
    		 *
    		 * Throughout most of the specification this is called the
    		 * "Cumulative TSN ACK Point".	In this case, we
    		 * ignore the advice in 12.2 in favour of the term
    		 * used in the bulk of the text.  This value is hidden
    		 * in tsn_map--we get it by calling sctp_tsnmap_get_ctsn().
    		 */
    		struct sctp_tsnmap tsn_map;
    		__u8 _map[sctp_tsnmap_storage_size(SCTP_TSN_MAP_SIZE)];
    
    		/* Ack State   : This flag indicates if the next received
    		 *             : packet is to be responded to with a
    		 *             : SACK. This is initializedto 0.  When a packet
    		 *             : is received it is incremented. If this value
    		 *             : reaches 2 or more, a SACK is sent and the
    		 *             : value is reset to 0. Note: This is used only
    		 *             : when no DATA chunks are received out of
    		 *             : order.  When DATA chunks are out of order,
    		 *             : SACK's are not delayed (see Section 6).
    		 */
    		__u8    sack_needed;     /* Do we need to sack the peer? */
    
    		/* These are capabilities which our peer advertised.  */
    		__u8	ecn_capable;	 /* Can peer do ECN? */
    		__u8	ipv4_address;	 /* Peer understands IPv4 addresses? */
    		__u8	ipv6_address;	 /* Peer understands IPv6 addresses? */
    		__u8	hostname_address;/* Peer understands DNS addresses? */
    		__u8    asconf_capable;  /* Does peer support ADDIP? */
    		__u8    prsctp_capable;  /* Can peer do PR-SCTP? */
    
    		__u32   adaption_ind;	 /* Adaption Code point. */
    
    		/* This mask is used to disable sending the ASCONF chunk
    		 * with specified parameter to peer.
    		 */
    		__u16 addip_disabled_mask;
    
    		struct sctp_inithdr i;
    		int cookie_len;
    		void *cookie;
    
    		/* ADDIP Section 4.2 Upon reception of an ASCONF Chunk.
    		 * C1) ... "Peer-Serial-Number'. This value MUST be initialized to the
    		 * Initial TSN Value minus 1
    		 */
    		__u32 addip_serial;
    	} peer;
    
    	/* State       : A state variable indicating what state the
    	 *	       : association is in, i.e. COOKIE-WAIT,
    	 *	       : COOKIE-ECHOED, ESTABLISHED, SHUTDOWN-PENDING,
    	 *	       : SHUTDOWN-SENT, SHUTDOWN-RECEIVED, SHUTDOWN-ACK-SENT.
    	 *
    	 *		Note: No "CLOSED" state is illustrated since if a
    	 *		association is "CLOSED" its TCB SHOULD be removed.
    	 *
    	 *		In this implementation we DO have a CLOSED
    	 *		state which is used during initiation and shutdown.
    	 *
    	 *		State takes values from SCTP_STATE_*.
    	 */
    	sctp_state_t state;
    
    	/* The cookie life I award for any cookie.  */
    	struct timeval cookie_life;
    
    	/* Overall     : The overall association error count.
    	 * Error Count : [Clear this any time I get something.]
    	 */
    	int overall_error_count;
    
    	/* These are the association's initial, max, and min RTO values.
    	 * These values will be initialized by system defaults, but can
    	 * be modified via the SCTP_RTOINFO socket option.
    	 */
    
    	unsigned long rto_initial;
    	unsigned long rto_max;
    	unsigned long rto_min;
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    
    	/* Maximum number of new data packets that can be sent in a burst.  */
    	int max_burst;
    
    	/* This is the max_retrans value for the association.  This value will
    	 * be initialized initialized from system defaults, but can be
    	 * modified by the SCTP_ASSOCINFO socket option.
    	 */
    	int max_retrans;
    
    	/* Maximum number of times the endpoint will retransmit INIT  */
    	__u16 max_init_attempts;
    
    	/* How many times have we resent an INIT? */
    	__u16 init_retries;
    
    	/* The largest timeout or RTO value to use in attempting an INIT */
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    
    
    	/* Heartbeat interval: The endpoint sends out a Heartbeat chunk to
    	 * the destination address every heartbeat interval. This value
    	 * will be inherited by all new transports.
    	 */
    
    
    	/* This is the max_retrans value for new transports in the
    	 * association.
    	 */
    	__u16 pathmaxrxt;
    
    	/* Association : The smallest PMTU discovered for all of the
    	 * PMTU	       : peer's transport addresses.
    	 */
    	__u32 pathmtu;
    
    	/* Flags controling Heartbeat, SACK delay, and Path MTU Discovery. */
    	__u32 param_flags;
    
    
    	/* SACK delay timeout */
    	unsigned long sackdelay;
    
    
    	unsigned long timeouts[SCTP_NUM_TIMEOUT_TYPES];
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    	struct timer_list timers[SCTP_NUM_TIMEOUT_TYPES];
    
    	/* 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;
    
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    	/* 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
    	 *	       : time a DATA chunk is assigned a TSN
    	 *	       : (normally just prior to transmit or during
    	 *	       : fragmentation).
    	 */
    	__u32 next_tsn;
    
    	/*
    	 * Last Rcvd   : This is the last TSN received in sequence.  This value
    	 * TSN	       : is set initially by taking the peer's Initial TSN,
    	 *	       : received in the INIT or INIT ACK chunk, and
    	 *	       : subtracting one from it.
    	 *
    	 * Most of RFC 2960 refers to this as the Cumulative TSN Ack Point.
    	 */
    
    	__u32 ctsn_ack_point;
    
    	/* PR-SCTP Advanced.Peer.Ack.Point */
    	__u32 adv_peer_ack_point;
    
    	/* Highest TSN that is acknowledged by incoming SACKs. */
    	__u32 highest_sacked;
    
    	/* The number of unacknowledged data chunks.  Reported through
    	 * the SCTP_STATUS sockopt.
    	 */
    	__u16 unack_data;
    
    	/* This is the association's receive buffer space.  This value is used
    	 * to set a_rwnd field in an INIT or a SACK chunk.
    	 */
    	__u32 rwnd;
    
    	/* This is the last advertised value of rwnd over a SACK chunk. */
    	__u32 a_rwnd;
    
    	/* Number of bytes by which the rwnd has slopped.  The rwnd is allowed
    	 * to slop over a maximum of the association's frag_point.
    	 */
    	__u32 rwnd_over;
    
    	/* This is the sndbuf size in use for the association.
    	 * This corresponds to the sndbuf size for the association,
    	 * as specified in the sk->sndbuf.
    	 */
    	int sndbuf_used;
    
    
    	/* This is the amount of memory that this association has allocated
    	 * in the receive path at any given time.
    	 */
    	atomic_t rmem_alloc;
    
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    	/* This is the wait queue head for send requests waiting on
    	 * the association sndbuf space.
    	 */
    	wait_queue_head_t	wait;
    
    	/* The message size at which SCTP fragmentation will occur. */
    	__u32 frag_point;
    
    
    	/* Counter used to count INIT errors. */
    	int init_err_counter;
    
    	/* Count the number of INIT cycles (for doubling timeout). */
    	int init_cycle;
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    
    	/* Default send parameters. */
    	__u16 default_stream;
    	__u16 default_flags;
    	__u32 default_ppid;
    	__u32 default_context;
    	__u32 default_timetolive;
    
    	/* This tracks outbound ssn for a given stream.	 */
    	struct sctp_ssnmap *ssnmap;
    
    	/* All outbound chunks go through this structure.  */
    	struct sctp_outq outqueue;
    
    	/* A smart pipe that will handle reordering and fragmentation,
    	 * as well as handle passing events up to the ULP.
    	 */
    	struct sctp_ulpq ulpq;
    
    	/* Last TSN that caused an ECNE Chunk to be sent.  */
    	__u32 last_ecne_tsn;
    
    	/* Last TSN that caused a CWR Chunk to be sent.	 */
    	__u32 last_cwr_tsn;
    
    	/* How many duplicated TSNs have we seen?  */
    	int numduptsns;
    
    
    	/* Number of seconds of idle time before an association is closed.
    	 * In the association context, this is really used as a boolean
    	 * since the real timeout is stored in the timeouts array
    	 */
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    	__u32 autoclose;
    
    	/* These are to support
    	 * "SCTP Extensions for Dynamic Reconfiguration of IP Addresses
    	 *  and Enforcement of Flow and Message Limits"
    	 * <draft-ietf-tsvwg-addip-sctp-02.txt>
    	 * or "ADDIP" for short.
    	 */
    
    
    
    	/* ADDIP Section 4.1.1 Congestion Control of ASCONF Chunks
    	 *
    	 * R1) One and only one ASCONF Chunk MAY be in transit and
    	 * unacknowledged at any one time.  If a sender, after sending
    	 * an ASCONF chunk, decides it needs to transfer another
    	 * ASCONF Chunk, it MUST wait until the ASCONF-ACK Chunk
    	 * returns from the previous ASCONF Chunk before sending a
    	 * subsequent ASCONF. Note this restriction binds each side,
    	 * so at any time two ASCONF may be in-transit on any given
    	 * association (one sent from each endpoint).
    	 *
    	 * [This is our one-and-only-one ASCONF in flight.  If we do
    	 * not have an ASCONF in flight, this is NULL.]
    	 */
    	struct sctp_chunk *addip_last_asconf;
    
    	/* ADDIP Section 4.2 Upon reception of an ASCONF Chunk.
    	 *
    	 * IMPLEMENTATION NOTE: As an optimization a receiver may wish
    	 * to save the last ASCONF-ACK for some predetermined period
    	 * of time and instead of re-processing the ASCONF (with the
    	 * same serial number) it may just re-transmit the
    	 * ASCONF-ACK. It may wish to use the arrival of a new serial
    	 * number to discard the previously saved ASCONF-ACK or any
    	 * other means it may choose to expire the saved ASCONF-ACK.
    	 *
    	 * [This is our saved ASCONF-ACK.  We invalidate it when a new
    	 * ASCONF serial number arrives.]
    	 */
    	struct sctp_chunk *addip_last_asconf_ack;
    
    	/* These ASCONF chunks are waiting to be sent.
    	 *
    	 * These chunaks can't be pushed to outqueue until receiving
    	 * ASCONF_ACK for the previous ASCONF indicated by
    	 * addip_last_asconf, so as to guarantee that only one ASCONF
    	 * is in flight at any time.
    	 *
    	 * ADDIP Section 4.1.1 Congestion Control of ASCONF Chunks
    	 *
    	 * In defining the ASCONF Chunk transfer procedures, it is
    	 * essential that these transfers MUST NOT cause congestion
    	 * within the network.	To achieve this, we place these
    	 * restrictions on the transfer of ASCONF Chunks:
    	 *
    	 * R1) One and only one ASCONF Chunk MAY be in transit and
    	 * unacknowledged at any one time.  If a sender, after sending
    	 * an ASCONF chunk, decides it needs to transfer another
    	 * ASCONF Chunk, it MUST wait until the ASCONF-ACK Chunk
    	 * returns from the previous ASCONF Chunk before sending a
    	 * subsequent ASCONF. Note this restriction binds each side,
    	 * so at any time two ASCONF may be in-transit on any given
    	 * association (one sent from each endpoint).
    	 *
    	 *
    	 * [I really think this is EXACTLY the sort of intelligence
    	 *  which already resides in sctp_outq.	 Please move this
    	 *  queue and its supporting logic down there.	--piggy]
    	 */
    
    	struct list_head addip_chunk_list;
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    
    	/* ADDIP Section 4.1 ASCONF Chunk Procedures
    	 *
    	 * A2) A serial number should be assigned to the Chunk. The
    	 * serial number SHOULD be a monotonically increasing
    	 * number. The serial number SHOULD be initialized at
    	 * the start of the association to the same value as the
    	 * Initial TSN and every time a new ASCONF chunk is created
    	 * it is incremented by one after assigning the serial number
    	 * to the newly created chunk.
    	 *
    	 * ADDIP
    	 * 3.1.1  Address/Stream Configuration Change Chunk (ASCONF)
    	 *
    	 * Serial Number : 32 bits (unsigned integer)
    	 *
    	 * This value represents a Serial Number for the ASCONF
    	 * Chunk. The valid range of Serial Number is from 0 to
    	 * 4294967295 (2^32 - 1).  Serial Numbers wrap back to 0
    	 * after reaching 4294967295.
    	 */
    	__u32 addip_serial;
    
    	/* Need to send an ECNE Chunk? */
    	char need_ecne;
    
    	/* Is it a temporary association? */
    	char temp;
    };
    
    
    /* An eyecatcher for determining if we are really looking at an
     * association data structure.
     */
    enum {
    	SCTP_ASSOC_EYECATCHER = 0xa550c123,
    };
    
    /* Recover the outter association structure. */
    static inline struct sctp_association *sctp_assoc(struct sctp_ep_common *base)
    {
    	struct sctp_association *asoc;
    
    	asoc = container_of(base, struct sctp_association, base);
    	return asoc;
    }
    
    /* These are function signatures for manipulating associations.	 */
    
    
    struct sctp_association *
    sctp_association_new(const struct sctp_endpoint *, const struct sock *,
    
    		     sctp_scope_t scope, gfp_t gfp);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    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 *);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    struct sctp_transport *sctp_assoc_choose_shutdown_transport(
    	struct sctp_association *);
    void sctp_assoc_update_retran_path(struct sctp_association *);
    struct sctp_transport *sctp_assoc_lookup_paddr(const struct sctp_association *,
    					  const union sctp_addr *);
    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 gfp_t gfp,
    
    				     const int peer_state);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    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);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    void sctp_assoc_control_transport(struct sctp_association *,
    				  struct sctp_transport *,
    				  sctp_transport_cmd_t, sctp_sn_error_t);
    struct sctp_transport *sctp_assoc_lookup_tsn(struct sctp_association *, __u32);
    struct sctp_transport *sctp_assoc_is_match(struct sctp_association *,
    					   const union sctp_addr *,
    					   const union sctp_addr *);
    void sctp_assoc_migrate(struct sctp_association *, struct sock *);
    void sctp_assoc_update(struct sctp_association *old,
    		       struct sctp_association *new);
    
    __u32 sctp_association_get_next_tsn(struct sctp_association *);
    
    void sctp_assoc_sync_pmtu(struct sctp_association *);
    void sctp_assoc_rwnd_increase(struct sctp_association *, unsigned);
    void sctp_assoc_rwnd_decrease(struct sctp_association *, unsigned);
    void sctp_assoc_set_primary(struct sctp_association *,
    			    struct sctp_transport *);
    
    int sctp_assoc_set_bind_addr_from_ep(struct sctp_association *,
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    int sctp_assoc_set_bind_addr_from_cookie(struct sctp_association *,
    
    					 struct sctp_cookie*,
    
    					 gfp_t gfp);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    
    int sctp_cmp_addr_exact(const union sctp_addr *ss1,
    			const union sctp_addr *ss2);
    struct sctp_chunk *sctp_get_ecne_prepend(struct sctp_association *asoc);
    
    /* A convenience structure to parse out SCTP specific CMSGs. */
    typedef struct sctp_cmsgs {
    	struct sctp_initmsg *init;
    	struct sctp_sndrcvinfo *info;
    } sctp_cmsgs_t;
    
    /* Structure for tracking memory objects */
    typedef struct {
    	char *label;
    	atomic_t *counter;
    } sctp_dbg_objcnt_entry_t;
    
    #endif /* __sctp_structs_h__ */