diff options
| author | Jon Grimm <jgrimm@touki.austin.ibm.com> | 2003-03-28 02:49:50 -0600 |
|---|---|---|
| committer | Jon Grimm <jgrimm@touki.austin.ibm.com> | 2003-03-28 02:49:50 -0600 |
| commit | c425b68c35c0d90223b5e8f235f389d3213fcb0b (patch) | |
| tree | 69e449aa0a7889ba9bde610accf63ff2941325ba /include/net | |
| parent | 1bafb09e6ebf31151b7c9b62e67f1f3bcb419337 (diff) | |
[SCTP] Add LINKLOCAL/sin6_scope_id support.
Diffstat (limited to 'include/net')
| -rw-r--r-- | include/net/sctp/sctp.h | 51 | ||||
| -rw-r--r-- | include/net/sctp/sm.h | 13 | ||||
| -rw-r--r-- | include/net/sctp/structs.h | 127 | ||||
| -rw-r--r-- | include/net/sctp/ulpevent.h | 6 |
4 files changed, 99 insertions, 98 deletions
diff --git a/include/net/sctp/sctp.h b/include/net/sctp/sctp.h index 5c003845721c..5c537d9e7499 100644 --- a/include/net/sctp/sctp.h +++ b/include/net/sctp/sctp.h @@ -199,28 +199,28 @@ extern void sctp_hash_digest(const char *secret, const int secret_len, #define sctp_spin_unlock_irqrestore(lock, flags) \ spin_unlock_irqrestore(lock, flags) #define sctp_local_bh_disable() local_bh_disable() -#define sctp_local_bh_enable() local_bh_enable() -#define sctp_spin_lock(lock) spin_lock(lock) -#define sctp_spin_unlock(lock) spin_unlock(lock) -#define sctp_write_lock(lock) write_lock(lock) +#define sctp_local_bh_enable() local_bh_enable() +#define sctp_spin_lock(lock) spin_lock(lock) +#define sctp_spin_unlock(lock) spin_unlock(lock) +#define sctp_write_lock(lock) write_lock(lock) #define sctp_write_unlock(lock) write_unlock(lock) -#define sctp_read_lock(lock) read_lock(lock) -#define sctp_read_unlock(lock) read_unlock(lock) +#define sctp_read_lock(lock) read_lock(lock) +#define sctp_read_unlock(lock) read_unlock(lock) /* sock lock wrappers. */ -#define sctp_lock_sock(sk) lock_sock(sk) -#define sctp_release_sock(sk) release_sock(sk) -#define sctp_bh_lock_sock(sk) bh_lock_sock(sk) -#define sctp_bh_unlock_sock(sk) bh_unlock_sock(sk) -#define SCTP_SOCK_SLEEP_PRE(sk) SOCK_SLEEP_PRE(sk) +#define sctp_lock_sock(sk) lock_sock(sk) +#define sctp_release_sock(sk) release_sock(sk) +#define sctp_bh_lock_sock(sk) bh_lock_sock(sk) +#define sctp_bh_unlock_sock(sk) bh_unlock_sock(sk) +#define SCTP_SOCK_SLEEP_PRE(sk) SOCK_SLEEP_PRE(sk) #define SCTP_SOCK_SLEEP_POST(sk) SOCK_SLEEP_POST(sk) /* SCTP SNMP MIB stats handlers */ DECLARE_SNMP_STAT(struct sctp_mib, sctp_statistics); -#define SCTP_INC_STATS(field) SNMP_INC_STATS(sctp_statistics, field) -#define SCTP_INC_STATS_BH(field) SNMP_INC_STATS_BH(sctp_statistics, field) -#define SCTP_INC_STATS_USER(field) SNMP_INC_STATS_USER(sctp_statistics, field) -#define SCTP_DEC_STATS(field) SNMP_DEC_STATS(sctp_statistics, field) +#define SCTP_INC_STATS(field) SNMP_INC_STATS(sctp_statistics, field) +#define SCTP_INC_STATS_BH(field) SNMP_INC_STATS_BH(sctp_statistics, field) +#define SCTP_INC_STATS_USER(field) SNMP_INC_STATS_USER(sctp_statistics, field) +#define SCTP_DEC_STATS(field) SNMP_DEC_STATS(sctp_statistics, field) /* Determine if this is a valid kernel address. */ static inline int sctp_is_valid_kaddr(unsigned long addr) @@ -488,21 +488,24 @@ static inline struct sctp_protocol *sctp_get_protocol(void) /* Convert from an IP version number to an Address Family symbol. */ static inline int ipver2af(__u8 ipver) { - int family; - switch (ipver) { case 4: - family = AF_INET; - break; + return AF_INET; case 6: - family = AF_INET6; - break; + return AF_INET6; default: - family = 0; - break; + return 0; }; +} - return family; +/* Perform some sanity checks. */ +static inline int sctp_sanity_check(void) +{ + SCTP_ASSERT(sizeof(struct sctp_ulpevent) <= + sizeof(((struct sk_buff *)0)->cb), + "SCTP: ulpevent does not fit in skb!\n", return 0); + + return 1; } /* Warning: The following hash functions assume a power of two 'size'. */ diff --git a/include/net/sctp/sm.h b/include/net/sctp/sm.h index 16737eda8d8c..6b9a30330630 100644 --- a/include/net/sctp/sm.h +++ b/include/net/sctp/sm.h @@ -197,15 +197,14 @@ sctp_state_fn_t sctp_addip_do_asconf; sctp_state_fn_t sctp_addip_do_asconf_ack; /* Prototypes for utility support functions. */ -__u8 sctp_get_chunk_type(sctp_chunk_t *chunk); +__u8 sctp_get_chunk_type(struct sctp_chunk *chunk); sctp_sm_table_entry_t *sctp_sm_lookup_event(sctp_event_t event_type, sctp_state_t state, sctp_subtype_t event_subtype); - -time_t timeval_sub(struct timeval *, struct timeval *); -sctp_association_t *sctp_make_temp_asoc(const sctp_endpoint_t *, - sctp_chunk_t *, - const int priority); +int sctp_chunk_iif(const struct sctp_chunk *); +struct sctp_association *sctp_make_temp_asoc(const struct sctp_endpoint *, + struct sctp_chunk *, + int gfp); __u32 sctp_generate_verification_tag(void); void sctp_populate_tie_tags(__u8 *cookie, __u32 curTag, __u32 hisTag); @@ -344,7 +343,7 @@ __u32 sctp_generate_tsn(const sctp_endpoint_t *); /* 4th level prototypes */ void sctp_param2sockaddr(union sctp_addr *addr, sctp_addr_param_t *, - __u16 port); + __u16 port, int iif); int sctp_addr2sockaddr(const union sctp_params, union sctp_addr *); int sockaddr2sctp_addr(const union sctp_addr *, sctp_addr_param_t *); diff --git a/include/net/sctp/structs.h b/include/net/sctp/structs.h index 44c81f5c3020..5cf74d3c2882 100644 --- a/include/net/sctp/structs.h +++ b/include/net/sctp/structs.h @@ -242,6 +242,7 @@ struct sctp_af { void (*inaddr_any) (union sctp_addr *, unsigned short); int (*is_any) (const union sctp_addr *); int (*available) (const union sctp_addr *); + int (*skb_iif) (const struct sk_buff *sk); __u16 net_header_len; int sockaddr_len; sa_family_t sa_family; @@ -260,6 +261,7 @@ struct sctp_pf { const union sctp_addr *, struct sctp_opt *); int (*bind_verify) (struct sctp_opt *, union sctp_addr *); + int (*send_verify) (struct sctp_opt *, union sctp_addr *); int (*supported_addrs)(const struct sctp_opt *, __u16 *); struct sock *(*create_accept_sk) (struct sock *sk, struct sctp_association *asoc); @@ -430,7 +432,7 @@ struct sctp_ssnmap { }; struct sctp_ssnmap *sctp_ssnmap_init(struct sctp_ssnmap *, __u16, __u16); -struct sctp_ssnmap *sctp_ssnmap_new(__u16 in, __u16 out, int priority); +struct sctp_ssnmap *sctp_ssnmap_new(__u16 in, __u16 out, int gfp); void sctp_ssnmap_free(struct sctp_ssnmap *map); void sctp_ssnmap_clear(struct sctp_ssnmap *map); @@ -509,7 +511,7 @@ struct sctp_chunk { struct sctp_sndrcvinfo sinfo; /* Which association does this belong to? */ - sctp_association_t *asoc; + struct sctp_association *asoc; /* What endpoint received this chunk? */ sctp_endpoint_common_t *rcvr; @@ -541,11 +543,11 @@ struct sctp_chunk { struct sctp_transport *transport; }; -sctp_chunk_t *sctp_make_chunk(const sctp_association_t *, __u8 type, +sctp_chunk_t *sctp_make_chunk(const struct sctp_association *, __u8 type, __u8 flags, int size); void sctp_free_chunk(sctp_chunk_t *); void *sctp_addto_chunk(sctp_chunk_t *chunk, int len, const void *data); -sctp_chunk_t *sctp_chunkify(struct sk_buff *, const sctp_association_t *, +sctp_chunk_t *sctp_chunkify(struct sk_buff *, const struct sctp_association *, struct sock *); void sctp_init_addrs(sctp_chunk_t *, union sctp_addr *, union sctp_addr *); const union sctp_addr *sctp_source(const sctp_chunk_t *chunk); @@ -560,7 +562,7 @@ struct sockaddr_storage_list { union sctp_addr a; }; -typedef sctp_chunk_t *(sctp_packet_phandler_t)(sctp_association_t *); +typedef sctp_chunk_t *(sctp_packet_phandler_t)(struct sctp_association *); /* This structure holds lists of chunks as we are assembling for * transmission. @@ -596,7 +598,7 @@ struct sctp_packet { char has_cookie_echo; /* This packet containsa SACK chunk. */ - char has_sack; + char has_sack; /* SCTP cannot fragment this packet. So let ip fragment it. */ char ipfragok; @@ -663,7 +665,7 @@ struct sctp_transport { struct sctp_af *af_specific; /* Which association do we belong to? */ - sctp_association_t *asoc; + struct sctp_association *asoc; /* RFC2960 * @@ -802,7 +804,8 @@ struct sctp_transport { struct sctp_transport *sctp_transport_new(const union sctp_addr *, int); struct sctp_transport *sctp_transport_init(struct sctp_transport *, const union sctp_addr *, int); -void sctp_transport_set_owner(struct sctp_transport *, sctp_association_t *); +void sctp_transport_set_owner(struct sctp_transport *, + struct sctp_association *); void sctp_transport_route(struct sctp_transport *, union sctp_addr *, struct sctp_opt *); void sctp_transport_pmtu(struct sctp_transport *); @@ -865,7 +868,7 @@ void sctp_inq_set_th_handler(struct sctp_inq *, void (*)(void *), void *); * When free()'d, it empties itself out via output_handler(). */ struct sctp_outq { - sctp_association_t *asoc; + struct sctp_association *asoc; /* Data pending that has never been transmitted. */ struct sk_buff_head out; @@ -908,8 +911,8 @@ struct sctp_outq { int malloced; }; -struct sctp_outq *sctp_outq_new(sctp_association_t *); -void sctp_outq_init(sctp_association_t *, struct sctp_outq *); +struct sctp_outq *sctp_outq_new(struct sctp_association *); +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 *, sctp_chunk_t *chunk); @@ -953,20 +956,16 @@ sctp_bind_addr_t *sctp_bind_addr_new(int gfp_mask); void sctp_bind_addr_init(sctp_bind_addr_t *, __u16 port); void sctp_bind_addr_free(sctp_bind_addr_t *); int sctp_bind_addr_copy(sctp_bind_addr_t *dest, const sctp_bind_addr_t *src, - sctp_scope_t scope, int priority,int flags); + sctp_scope_t scope, int gfp,int flags); int sctp_add_bind_addr(sctp_bind_addr_t *, union sctp_addr *, - int priority); + int gfp); int sctp_del_bind_addr(sctp_bind_addr_t *, union sctp_addr *); int sctp_bind_addr_match(sctp_bind_addr_t *, const union sctp_addr *, struct sctp_opt *); -union sctp_params sctp_bind_addrs_to_raw(const sctp_bind_addr_t *bp, - int *addrs_len, - int priority); -int sctp_raw_to_bind_addrs(sctp_bind_addr_t *bp, - __u8 *raw_addr_list, - int addrs_len, - unsigned short port, - int priority); +union sctp_params sctp_bind_addrs_to_raw(const struct sctp_bind_addr *bp, + int *addrs_len, int gfp); +int sctp_raw_to_bind_addrs(struct sctp_bind_addr *bp, __u8 *raw, int len, + __u16 port, int gfp); sctp_scope_t sctp_scope(const union sctp_addr *); int sctp_in_scope(const union sctp_addr *addr, const sctp_scope_t scope); @@ -1069,7 +1068,7 @@ struct sctp_endpoint { * pointer, or table pointers dependent on how SCTP * is implemented. */ - /* This is really a list of sctp_association_t entries. */ + /* 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 @@ -1105,12 +1104,12 @@ static inline sctp_endpoint_t *sctp_ep(sctp_endpoint_common_t *base) sctp_endpoint_t *sctp_endpoint_new(struct sctp_protocol *, struct sock *, int); sctp_endpoint_t *sctp_endpoint_init(struct sctp_endpoint *, struct sctp_protocol *, - struct sock *, int priority); + struct sock *, int gfp); void sctp_endpoint_free(sctp_endpoint_t *); void sctp_endpoint_put(sctp_endpoint_t *); void sctp_endpoint_hold(sctp_endpoint_t *); -void sctp_endpoint_add_asoc(sctp_endpoint_t *, sctp_association_t *asoc); -sctp_association_t *sctp_endpoint_lookup_assoc(const sctp_endpoint_t *ep, +void sctp_endpoint_add_asoc(sctp_endpoint_t *, struct sctp_association *asoc); +struct sctp_association *sctp_endpoint_lookup_assoc(const sctp_endpoint_t *ep, const union sctp_addr *paddr, struct sctp_transport **); int sctp_endpoint_is_peeled_off(sctp_endpoint_t *, const union sctp_addr *); @@ -1119,18 +1118,16 @@ sctp_endpoint_t *sctp_endpoint_is_match(sctp_endpoint_t *, int sctp_has_association(const union sctp_addr *laddr, const union sctp_addr *paddr); -int sctp_verify_init(const sctp_association_t *asoc, - sctp_cid_t cid, - sctp_init_chunk_t *peer_init, - sctp_chunk_t *chunk, - sctp_chunk_t **err_chunk); -int sctp_process_init(sctp_association_t *asoc, sctp_cid_t cid, - const union sctp_addr *peer_addr, - sctp_init_chunk_t *peer_init, int priority); -int sctp_process_param(sctp_association_t *asoc, union sctp_params param, - const union sctp_addr *peer_addr, int priority); -__u32 sctp_generate_tag(const sctp_endpoint_t *ep); -__u32 sctp_generate_tsn(const sctp_endpoint_t *ep); +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, int gfp); +int sctp_process_param(struct sctp_association *, union sctp_params param, + const union sctp_addr *from, int gfp); +__u32 sctp_generate_tag(const sctp_endpoint_t *); +__u32 sctp_generate_tsn(const sctp_endpoint_t *); /* RFC2960 @@ -1159,7 +1156,7 @@ struct sctp_association { struct list_head asocs; /* This is a signature that lets us know that this is a - * sctp_association_t data structure. Used for mapping an + * struct sctp_association data structure. Used for mapping an * association id to an association. */ __u32 eyecatcher; @@ -1562,44 +1559,46 @@ enum { }; /* Recover the outter association structure. */ -static inline sctp_association_t *sctp_assoc(sctp_endpoint_common_t *base) +static inline struct sctp_association *sctp_assoc(sctp_endpoint_common_t *base) { - sctp_association_t *asoc; + struct sctp_association *asoc; - asoc = container_of(base, sctp_association_t, base); + asoc = container_of(base, struct sctp_association, base); return asoc; } /* These are function signatures for manipulating associations. */ -sctp_association_t * +struct sctp_association * sctp_association_new(const sctp_endpoint_t *, const struct sock *, - sctp_scope_t scope, int priority); -sctp_association_t * -sctp_association_init(sctp_association_t *, const sctp_endpoint_t *, + sctp_scope_t scope, int gfp); +struct sctp_association * +sctp_association_init(struct sctp_association *, const sctp_endpoint_t *, const struct sock *, sctp_scope_t scope, - int priority); -void sctp_association_free(sctp_association_t *); -void sctp_association_put(sctp_association_t *); -void sctp_association_hold(sctp_association_t *); - -struct sctp_transport *sctp_assoc_choose_shutdown_transport(sctp_association_t *); -void sctp_assoc_update_retran_path(sctp_association_t *); -struct sctp_transport *sctp_assoc_lookup_paddr(const sctp_association_t *, + int gfp); +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_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 *); -struct sctp_transport *sctp_assoc_add_peer(sctp_association_t *, +struct sctp_transport *sctp_assoc_add_peer(struct sctp_association *, const union sctp_addr *address, - const int priority); + const int gfp); 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(sctp_association_t *, __u32); -struct sctp_transport *sctp_assoc_is_match(sctp_association_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(sctp_association_t *, struct sock *); -void sctp_assoc_update(sctp_association_t *dst, sctp_association_t *src); +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 *); __u32 sctp_association_get_tsn_block(struct sctp_association *, int); @@ -1609,14 +1608,14 @@ void sctp_assoc_rwnd_increase(struct sctp_association *, int); void sctp_assoc_rwnd_decrease(struct sctp_association *, int); void sctp_assoc_set_primary(struct sctp_association *, struct sctp_transport *); -int sctp_assoc_set_bind_addr_from_ep(sctp_association_t *, int); -int sctp_assoc_set_bind_addr_from_cookie(sctp_association_t *, - sctp_cookie_t *, int); +int sctp_assoc_set_bind_addr_from_ep(struct sctp_association *, int); +int sctp_assoc_set_bind_addr_from_cookie(struct sctp_association *, + sctp_cookie_t *, int gfp); int sctp_cmp_addr_exact(const union sctp_addr *ss1, const union sctp_addr *ss2); -sctp_chunk_t *sctp_get_ecne_prepend(sctp_association_t *asoc); -sctp_chunk_t *sctp_get_no_prepend(sctp_association_t *asoc); +sctp_chunk_t *sctp_get_ecne_prepend(struct sctp_association *asoc); +sctp_chunk_t *sctp_get_no_prepend(struct sctp_association *asoc); /* A convenience structure to parse out SCTP specific CMSGs. */ typedef struct sctp_cmsgs { diff --git a/include/net/sctp/ulpevent.h b/include/net/sctp/ulpevent.h index 8d0edaf22025..d508ca47ea4d 100644 --- a/include/net/sctp/ulpevent.h +++ b/include/net/sctp/ulpevent.h @@ -38,7 +38,6 @@ * be incorporated into the next SCTP release. */ - #ifndef __sctp_ulpevent_h__ #define __sctp_ulpevent_h__ @@ -50,6 +49,7 @@ struct sctp_ulpevent { struct sctp_association *asoc; struct sctp_sndrcvinfo sndrcvinfo; int msg_flags; + int iif; }; /* Retrieve the skb this event sits inside of. */ @@ -61,9 +61,9 @@ static inline struct sk_buff *sctp_event2skb(struct sctp_ulpevent *ev) /* Retrieve & cast the event sitting inside the skb. */ static inline struct sctp_ulpevent *sctp_skb2event(struct sk_buff *skb) { - return (struct sctp_ulpevent *)skb->cb; + return (struct sctp_ulpevent *)skb->cb; } - + struct sctp_ulpevent *sctp_ulpevent_new(int size, int flags, int priority); struct sctp_ulpevent *sctp_ulpevent_init(struct sctp_ulpevent *, int flags); void sctp_ulpevent_free(struct sctp_ulpevent *); |
