diff options
| author | Jon Grimm <jgrimm@touki.austin.ibm.com> | 2002-11-05 23:13:25 -0600 |
|---|---|---|
| committer | Jon Grimm <jgrimm@touki.austin.ibm.com> | 2002-11-05 23:13:25 -0600 |
| commit | e025484e869f835f7bc62e4129719e842c14e4d7 (patch) | |
| tree | b05912797a7f765c86b2e7e38089363e6c09359e | |
| parent | c03e61bb150e2792c7fa220d7b621134bbdb2fc7 (diff) | |
| parent | 3e780f7bb3fb27d604ce835228f89cb875d9e917 (diff) | |
Merge touki.austin.ibm.com:/home/jgrimm/bk/lksctp-2.5
into touki.austin.ibm.com:/home/jgrimm/bk/lksctp-2.5.work
| -rw-r--r-- | include/net/sctp/sctp.h | 22 | ||||
| -rw-r--r-- | include/net/sctp/sm.h | 6 | ||||
| -rw-r--r-- | include/net/sctp/structs.h | 85 | ||||
| -rw-r--r-- | net/sctp/associola.c | 18 | ||||
| -rw-r--r-- | net/sctp/bind_addr.c | 20 | ||||
| -rw-r--r-- | net/sctp/endpointola.c | 6 | ||||
| -rw-r--r-- | net/sctp/input.c | 105 | ||||
| -rw-r--r-- | net/sctp/ipv6.c | 68 | ||||
| -rw-r--r-- | net/sctp/output.c | 11 | ||||
| -rw-r--r-- | net/sctp/protocol.c | 95 | ||||
| -rw-r--r-- | net/sctp/sm_make_chunk.c | 38 | ||||
| -rw-r--r-- | net/sctp/sm_statefuns.c | 6 | ||||
| -rw-r--r-- | net/sctp/socket.c | 50 | ||||
| -rw-r--r-- | net/sctp/transport.c | 12 |
14 files changed, 272 insertions, 270 deletions
diff --git a/include/net/sctp/sctp.h b/include/net/sctp/sctp.h index 7b261af05ad4..73c948813e72 100644 --- a/include/net/sctp/sctp.h +++ b/include/net/sctp/sctp.h @@ -1,7 +1,7 @@ /* SCTP kernel reference Implementation * Copyright (c) 1999-2000 Cisco, Inc. * Copyright (c) 1999-2001 Motorola, Inc. - * Copyright (c) 2001 International Business Machines, Corp. + * Copyright (c) 2001-2002 International Business Machines, Corp. * Copyright (c) 2001 Intel Corp. * * This file is part of the SCTP kernel reference Implementation @@ -473,6 +473,26 @@ static inline sctp_protocol_t *sctp_get_protocol(void) return &sctp_proto; } +/* 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; + case 6: + family = AF_INET6; + break; + default: + family = 0; + break; + }; + + return family; +} + /* Warning: The following hash functions assume a power of two 'size'. */ /* This is the hash function for the SCTP port hash table. */ static inline int sctp_phashfn(__u16 lport) diff --git a/include/net/sctp/sm.h b/include/net/sctp/sm.h index 9c5d678b2b14..5082a4a11cb9 100644 --- a/include/net/sctp/sm.h +++ b/include/net/sctp/sm.h @@ -332,10 +332,10 @@ __u32 sctp_generate_tag(const sctp_endpoint_t *); __u32 sctp_generate_tsn(const sctp_endpoint_t *); /* 4th level prototypes */ -void sctp_param2sockaddr(sockaddr_storage_t *addr, sctp_addr_param_t *, +void sctp_param2sockaddr(union sctp_addr *addr, sctp_addr_param_t *, __u16 port); -int sctp_addr2sockaddr(const union sctp_params, sockaddr_storage_t *); -int sockaddr2sctp_addr(const sockaddr_storage_t *, sctp_addr_param_t *); +int sctp_addr2sockaddr(const union sctp_params, union sctp_addr *); +int sockaddr2sctp_addr(const union sctp_addr *, sctp_addr_param_t *); /* Extern declarations for major data structures. */ sctp_sm_table_entry_t *sctp_chunk_event_lookup(sctp_cid_t, sctp_state_t); diff --git a/include/net/sctp/structs.h b/include/net/sctp/structs.h index 505e9a54bb39..62c2cb28ccb4 100644 --- a/include/net/sctp/structs.h +++ b/include/net/sctp/structs.h @@ -95,11 +95,11 @@ struct sockaddr_storage { /* A convenience structure for handling sockaddr structures. * We should wean ourselves off this. */ -typedef union { +union sctp_addr { struct sockaddr_in v4; struct sockaddr_in6 v6; struct sockaddr sa; -} sockaddr_storage_t; +}; /* Forward declarations for data structures. */ @@ -246,17 +246,24 @@ typedef struct sctp_func { int optname, char *optval, int *optlen); - struct dst_entry *(*get_dst) (sockaddr_storage_t *daddr, - sockaddr_storage_t *saddr); + struct dst_entry *(*get_dst) (union sctp_addr *daddr, + union sctp_addr *saddr); + void (*copy_addrlist) (struct list_head *, + struct net_device *); int (*cmp_saddr) (struct dst_entry *dst, - sockaddr_storage_t *saddr); + union sctp_addr *saddr); + void (*addr_copy) (union sctp_addr *dst, + union sctp_addr *src); + void (*from_skb) (union sctp_addr *, + struct sk_buff *skb, + int saddr); __u16 net_header_len; int sockaddr_len; sa_family_t sa_family; struct list_head list; } sctp_func_t; -sctp_func_t *sctp_get_af_specific(const sockaddr_storage_t *address); +sctp_func_t *sctp_get_af_specific(sa_family_t); /* Protocol family functions. */ typedef struct sctp_pf { @@ -339,7 +346,7 @@ typedef struct sctp_cookie { __u32 initial_tsn; /* This holds the originating address of the INIT packet. */ - sockaddr_storage_t peer_addr; + union sctp_addr peer_addr; /* This is a shim for my peer's INIT packet, followed by * a copy of the raw address list of the association. @@ -393,7 +400,7 @@ union sctp_params { */ typedef struct sctp_sender_hb_info { sctp_paramhdr_t param_hdr; - sockaddr_storage_t daddr; + union sctp_addr daddr; unsigned long sent_at; } sctp_sender_hb_info_t __attribute__((packed)); @@ -479,9 +486,9 @@ struct SCTP_chunk { __u8 tsn_missing_report; /* Data chunk missing counter. */ /* What is the origin IP address for this chunk? */ - sockaddr_storage_t source; + union sctp_addr source; /* Destination address for this chunk. */ - sockaddr_storage_t dest; + union sctp_addr dest; /* For an inbound chunk, this tells us where it came from. * For an outbound chunk, it tells us where we'd like it to @@ -499,7 +506,7 @@ int sctp_user_addto_chunk(sctp_chunk_t *chunk, int len, struct iovec *data); sctp_chunk_t *sctp_chunkify(struct sk_buff *, const sctp_association_t *, struct sock *); void sctp_init_addrs(sctp_chunk_t *chunk); -const sockaddr_storage_t *sctp_source(const sctp_chunk_t *chunk); +const union sctp_addr *sctp_source(const sctp_chunk_t *chunk); /* This is a structure for holding either an IPv6 or an IPv4 address. */ /* sin_family -- AF_INET or AF_INET6 @@ -508,7 +515,7 @@ const sockaddr_storage_t *sctp_source(const sctp_chunk_t *chunk); */ struct sockaddr_storage_list { struct list_head list; - sockaddr_storage_t a; + union sctp_addr a; }; typedef sctp_chunk_t *(sctp_packet_phandler_t)(sctp_association_t *); @@ -574,7 +581,7 @@ void sctp_packet_free(sctp_packet_t *); /* This represents a remote transport address. - * For local transport addresses, we just use sockaddr_storage_t. + * For local transport addresses, we just use union sctp_addr. * * RFC2960 Section 1.4 Key Terms * @@ -602,7 +609,7 @@ struct SCTP_transport { int dead; /* This is the peer's IP address and port. */ - sockaddr_storage_t ipaddr; + union sctp_addr ipaddr; /* These are the functions we call to handle LLP stuff. */ sctp_func_t *af_specific; @@ -742,11 +749,11 @@ struct SCTP_transport { int malloced; /* Is this structure kfree()able? */ }; -extern sctp_transport_t *sctp_transport_new(const sockaddr_storage_t *, int); +extern sctp_transport_t *sctp_transport_new(const union sctp_addr *, int); extern sctp_transport_t *sctp_transport_init(sctp_transport_t *, - const sockaddr_storage_t *, int); + const union sctp_addr *, int); extern void sctp_transport_set_owner(sctp_transport_t *, sctp_association_t *); -extern void sctp_transport_route(sctp_transport_t *, sockaddr_storage_t *); +extern void sctp_transport_route(sctp_transport_t *, union sctp_addr *); extern void sctp_transport_free(sctp_transport_t *); extern void sctp_transport_destroy(sctp_transport_t *); extern void sctp_transport_reset_timers(sctp_transport_t *); @@ -893,10 +900,10 @@ 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); -int sctp_add_bind_addr(sctp_bind_addr_t *, sockaddr_storage_t *, +int sctp_add_bind_addr(sctp_bind_addr_t *, union sctp_addr *, int priority); -int sctp_del_bind_addr(sctp_bind_addr_t *, sockaddr_storage_t *); -int sctp_bind_addr_has_addr(sctp_bind_addr_t *, const sockaddr_storage_t *); +int sctp_del_bind_addr(sctp_bind_addr_t *, union sctp_addr *); +int sctp_bind_addr_has_addr(sctp_bind_addr_t *, const union sctp_addr *); union sctp_params sctp_bind_addrs_to_raw(const sctp_bind_addr_t *bp, int *addrs_len, int priority); @@ -906,10 +913,10 @@ int sctp_raw_to_bind_addrs(sctp_bind_addr_t *bp, unsigned short port, int priority); -sctp_scope_t sctp_scope(const sockaddr_storage_t *); -int sctp_in_scope(const sockaddr_storage_t *addr, const sctp_scope_t scope); -int sctp_is_any(const sockaddr_storage_t *addr); -int sctp_addr_is_valid(const sockaddr_storage_t *addr); +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 sctp_endpoint_common? */ @@ -1051,13 +1058,13 @@ 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, - const sockaddr_storage_t *paddr, + const union sctp_addr *paddr, sctp_transport_t **); sctp_endpoint_t *sctp_endpoint_is_match(sctp_endpoint_t *, - const sockaddr_storage_t *); + const union sctp_addr *); -int sctp_has_association(const sockaddr_storage_t *laddr, - const sockaddr_storage_t *paddr); +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, @@ -1065,10 +1072,10 @@ int sctp_verify_init(const sctp_association_t *asoc, sctp_chunk_t *chunk, sctp_chunk_t **err_chunk); int sctp_process_init(sctp_association_t *asoc, sctp_cid_t cid, - const sockaddr_storage_t *peer_addr, + 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 sockaddr_storage_t *peer_addr, int priority); + 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); @@ -1157,7 +1164,7 @@ struct SCTP_association { /* Cache the primary path address here, when we * need a an address for msg_name. */ - sockaddr_storage_t primary_addr; + union sctp_addr primary_addr; /* active_path * The path that we are currently using to @@ -1535,16 +1542,16 @@ void sctp_association_hold(sctp_association_t *); sctp_transport_t *sctp_assoc_choose_shutdown_transport(sctp_association_t *); sctp_transport_t *sctp_assoc_lookup_paddr(const sctp_association_t *, - const sockaddr_storage_t *); + const union sctp_addr *); sctp_transport_t *sctp_assoc_add_peer(sctp_association_t *, - const sockaddr_storage_t *address, + const union sctp_addr *address, const int priority); void sctp_assoc_control_transport(sctp_association_t *, sctp_transport_t *, sctp_transport_cmd_t, sctp_sn_error_t); sctp_transport_t *sctp_assoc_lookup_tsn(sctp_association_t *, __u32); sctp_transport_t *sctp_assoc_is_match(sctp_association_t *, - const sockaddr_storage_t *, - const sockaddr_storage_t *); + 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); @@ -1552,10 +1559,10 @@ __u32 __sctp_association_get_next_tsn(sctp_association_t *); __u32 __sctp_association_get_tsn_block(sctp_association_t *, int); __u16 __sctp_association_get_next_ssn(sctp_association_t *, __u16 sid); -int sctp_cmp_addr(const sockaddr_storage_t *ss1, - const sockaddr_storage_t *ss2); -int sctp_cmp_addr_exact(const sockaddr_storage_t *ss1, - const sockaddr_storage_t *ss2); +int sctp_cmp_addr(const union sctp_addr *ss1, + const union sctp_addr *ss2); +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); diff --git a/net/sctp/associola.c b/net/sctp/associola.c index 096c02e8ea67..1ba2060789ce 100644 --- a/net/sctp/associola.c +++ b/net/sctp/associola.c @@ -364,7 +364,7 @@ static void sctp_association_destroy(sctp_association_t *asoc) /* Add a transport address to an association. */ sctp_transport_t *sctp_assoc_add_peer(sctp_association_t *asoc, - const sockaddr_storage_t *addr, + const union sctp_addr *addr, int priority) { sctp_transport_t *peer; @@ -424,7 +424,7 @@ sctp_transport_t *sctp_assoc_add_peer(sctp_association_t *asoc, asoc->frag_point = asoc->pmtu - (SCTP_IP_OVERHEAD + sizeof(sctp_data_chunk_t)); - /* The asoc->peer.port might not be meaningful as of now, but + /* The asoc->peer.port might not be meaningful yet, but * initialize the packet structure anyway. */ (asoc->outqueue.init_output)(&peer->packet, @@ -478,7 +478,7 @@ sctp_transport_t *sctp_assoc_add_peer(sctp_association_t *asoc, asoc->peer.primary_path = peer; /* Set a default msg_name for events. */ memcpy(&asoc->peer.primary_addr, &peer->ipaddr, - sizeof(sockaddr_storage_t)); + sizeof(union sctp_addr)); asoc->peer.active_path = peer; asoc->peer.retran_path = peer; } @@ -491,7 +491,7 @@ sctp_transport_t *sctp_assoc_add_peer(sctp_association_t *asoc, /* Lookup a transport by address. */ sctp_transport_t *sctp_assoc_lookup_paddr(const sctp_association_t *asoc, - const sockaddr_storage_t *address) + const union sctp_addr *address) { sctp_transport_t *t; struct list_head *pos; @@ -654,7 +654,7 @@ __u16 __sctp_association_get_next_ssn(sctp_association_t *asoc, __u16 sid) * * FIXME: We do not match address scopes correctly. */ -int sctp_cmp_addr(const sockaddr_storage_t *ss1, const sockaddr_storage_t *ss2) +int sctp_cmp_addr(const union sctp_addr *ss1, const union sctp_addr *ss2) { int len; const void *base1; @@ -710,8 +710,8 @@ match: * * FIXME: We do not match address scopes correctly. */ -int sctp_cmp_addr_exact(const sockaddr_storage_t *ss1, - const sockaddr_storage_t *ss2) +int sctp_cmp_addr_exact(const union sctp_addr *ss1, + const union sctp_addr *ss2) { int len; const void *base1; @@ -846,8 +846,8 @@ out: /* Is this the association we are looking for? */ sctp_transport_t *sctp_assoc_is_match(sctp_association_t *asoc, - const sockaddr_storage_t *laddr, - const sockaddr_storage_t *paddr) + const union sctp_addr *laddr, + const union sctp_addr *paddr) { sctp_transport_t *transport; diff --git a/net/sctp/bind_addr.c b/net/sctp/bind_addr.c index bc2ea6cb2120..69b61643f861 100644 --- a/net/sctp/bind_addr.c +++ b/net/sctp/bind_addr.c @@ -52,7 +52,7 @@ #include <net/sctp/sm.h> /* Forward declarations for internal helpers. */ -static int sctp_copy_one_addr(sctp_bind_addr_t *, sockaddr_storage_t *, +static int sctp_copy_one_addr(sctp_bind_addr_t *, union sctp_addr *, sctp_scope_t scope, int priority, int flags); static void sctp_bind_addr_clean(sctp_bind_addr_t *); @@ -143,7 +143,7 @@ void sctp_bind_addr_free(sctp_bind_addr_t *bp) } /* Add an address to the bind address list in the SCTP_bind_addr structure. */ -int sctp_add_bind_addr(sctp_bind_addr_t *bp, sockaddr_storage_t *new, +int sctp_add_bind_addr(sctp_bind_addr_t *bp, union sctp_addr *new, int priority) { struct sockaddr_storage_list *addr; @@ -171,7 +171,7 @@ int sctp_add_bind_addr(sctp_bind_addr_t *bp, sockaddr_storage_t *new, /* Delete an address from the bind address list in the SCTP_bind_addr * structure. */ -int sctp_del_bind_addr(sctp_bind_addr_t *bp, sockaddr_storage_t *del_addr) +int sctp_del_bind_addr(sctp_bind_addr_t *bp, union sctp_addr *del_addr) { struct list_head *pos, *temp; struct sockaddr_storage_list *addr; @@ -242,7 +242,7 @@ int sctp_raw_to_bind_addrs(sctp_bind_addr_t *bp, __u8 *raw_addr_list, { sctp_addr_param_t *rawaddr; sctp_paramhdr_t *param; - sockaddr_storage_t addr; + union sctp_addr addr; int retval = 0; int len; @@ -283,7 +283,7 @@ int sctp_raw_to_bind_addrs(sctp_bind_addr_t *bp, __u8 *raw_addr_list, ********************************************************************/ /* Does this contain a specified address? */ -int sctp_bind_addr_has_addr(sctp_bind_addr_t *bp, const sockaddr_storage_t *addr) +int sctp_bind_addr_has_addr(sctp_bind_addr_t *bp, const union sctp_addr *addr) { struct sockaddr_storage_list *laddr; struct list_head *pos; @@ -298,7 +298,7 @@ int sctp_bind_addr_has_addr(sctp_bind_addr_t *bp, const sockaddr_storage_t *addr } /* Copy out addresses from the global local address list. */ -static int sctp_copy_one_addr(sctp_bind_addr_t *dest, sockaddr_storage_t *addr, +static int sctp_copy_one_addr(sctp_bind_addr_t *dest, union sctp_addr *addr, sctp_scope_t scope, int priority, int flags) { sctp_protocol_t *proto = sctp_get_protocol(); @@ -324,7 +324,7 @@ static int sctp_copy_one_addr(sctp_bind_addr_t *dest, sockaddr_storage_t *addr, } /* Is addr one of the wildcards? */ -int sctp_is_any(const sockaddr_storage_t *addr) +int sctp_is_any(const union sctp_addr *addr) { int retval = 0; @@ -350,7 +350,7 @@ int sctp_is_any(const sockaddr_storage_t *addr) } /* Is 'addr' valid for 'scope'? */ -int sctp_in_scope(const sockaddr_storage_t *addr, sctp_scope_t scope) +int sctp_in_scope(const union sctp_addr *addr, sctp_scope_t scope) { sctp_scope_t addr_scope = sctp_scope(addr); @@ -420,7 +420,7 @@ int sctp_in_scope(const sockaddr_storage_t *addr, sctp_scope_t scope) ********************************************************************/ /* What is the scope of 'addr'? */ -sctp_scope_t sctp_scope(const sockaddr_storage_t *addr) +sctp_scope_t sctp_scope(const union sctp_addr *addr) { sctp_scope_t retval = SCTP_SCOPE_GLOBAL; @@ -501,7 +501,7 @@ sctp_scope_t sctp_scope(const sockaddr_storage_t *addr) * Return 0 - If the address is a non-unicast or an illegal address. * Return 1 - If the address is a unicast. */ -int sctp_addr_is_valid(const sockaddr_storage_t *addr) +int sctp_addr_is_valid(const union sctp_addr *addr) { unsigned short sa_family = addr->sa.sa_family; diff --git a/net/sctp/endpointola.c b/net/sctp/endpointola.c index 5abbd964d262..36b39aa20eba 100644 --- a/net/sctp/endpointola.c +++ b/net/sctp/endpointola.c @@ -237,7 +237,7 @@ void sctp_endpoint_put(sctp_endpoint_t *ep) /* Is this the endpoint we are looking for? */ sctp_endpoint_t *sctp_endpoint_is_match(sctp_endpoint_t *ep, - const sockaddr_storage_t *laddr) + const union sctp_addr *laddr) { sctp_endpoint_t *retval; @@ -262,7 +262,7 @@ out: */ sctp_association_t *__sctp_endpoint_lookup_assoc( const sctp_endpoint_t *endpoint, - const sockaddr_storage_t *paddr, + const union sctp_addr *paddr, sctp_transport_t **transport) { int rport; @@ -289,7 +289,7 @@ sctp_association_t *__sctp_endpoint_lookup_assoc( /* Lookup association on an endpoint based on a peer address. BH-safe. */ sctp_association_t *sctp_endpoint_lookup_assoc(const sctp_endpoint_t *ep, - const sockaddr_storage_t *paddr, + const union sctp_addr *paddr, sctp_transport_t **transport) { sctp_association_t *asoc; diff --git a/net/sctp/input.c b/net/sctp/input.c index c54f983d040d..fc699388cf3e 100644 --- a/net/sctp/input.c +++ b/net/sctp/input.c @@ -60,64 +60,11 @@ /* Forward declarations for internal helpers. */ static int sctp_rcv_ootb(struct sk_buff *); sctp_association_t *__sctp_rcv_lookup(struct sk_buff *skb, - const sockaddr_storage_t *laddr, - const sockaddr_storage_t *paddr, + const union sctp_addr *laddr, + const union sctp_addr *paddr, sctp_transport_t **transportp); -sctp_endpoint_t *__sctp_rcv_lookup_endpoint(const sockaddr_storage_t *laddr); +sctp_endpoint_t *__sctp_rcv_lookup_endpoint(const union sctp_addr *laddr); -/* Initialize a sockaddr_storage from in incoming skb. - * FIXME: This belongs with AF specific sctp_func_t. --jgrimm - */ -static sockaddr_storage_t *sctp_sockaddr_storage_init(sockaddr_storage_t *addr, - const struct sk_buff *skb, - int is_saddr) -{ - sockaddr_storage_t *ret = NULL; - void *to, *saddr, *daddr; - __u16 *port; - size_t len; - struct sctphdr *sh; - - switch (skb->nh.iph->version) { - case 4: - to = &addr->v4.sin_addr.s_addr; - port = &addr->v4.sin_port; - saddr = &skb->nh.iph->saddr; - daddr = &skb->nh.iph->daddr; - len = sizeof(struct in_addr); - addr->v4.sin_family = AF_INET; - break; - - case 6: - SCTP_V6( - to = &addr->v6.sin6_addr; - port = &addr->v6.sin6_port; - saddr = &skb->nh.ipv6h->saddr; - daddr = &skb->nh.ipv6h->daddr; - len = sizeof(struct in6_addr); - addr->v6.sin6_family = AF_INET6; - addr->v6.sin6_flowinfo = 0; /* FIXME */ - addr->v6.sin6_scope_id = 0; /* FIXME */ - break; - ) - - default: - goto out; - }; - - sh = (struct sctphdr *) skb->h.raw; - if (is_saddr) { - *port = ntohs(sh->source); - memcpy(to, saddr, len); - } else { - *port = ntohs(sh->dest); - memcpy(to, daddr, len); - } - - ret = addr; -out: - return ret; -} /* Calculate the SCTP checksum of an SCTP packet. */ static inline int sctp_rcv_checksum(struct sk_buff *skb) @@ -147,8 +94,9 @@ int sctp_rcv(struct sk_buff *skb) sctp_transport_t *transport = NULL; sctp_chunk_t *chunk; struct sctphdr *sh; - sockaddr_storage_t src; - sockaddr_storage_t dest; + union sctp_addr src; + union sctp_addr dest; + struct sctp_func *af; int ret = 0; if (skb->pkt_type!=PACKET_HOST) @@ -163,10 +111,15 @@ int sctp_rcv(struct sk_buff *skb) if (sctp_rcv_checksum(skb) < 0) goto bad_packet; - skb_pull(skb, sizeof(struct sctphdr)); + skb_pull(skb, sizeof(struct sctphdr)); + + af = sctp_get_af_specific(ipver2af(skb->nh.iph->version)); + if (unlikely(!af)) + goto bad_packet; - sctp_sockaddr_storage_init(&src, skb, 1); - sctp_sockaddr_storage_init(&dest, skb, 0); + /* Initialize local addresses for lookups. */ + af->from_skb(&src, skb, 1); + af->from_skb(&dest, skb, 0); /* If the packet is to or from a non-unicast address, * silently discard the packet. @@ -431,7 +384,7 @@ void sctp_unhash_endpoint(sctp_endpoint_t *ep) } /* Look up an endpoint. */ -sctp_endpoint_t *__sctp_rcv_lookup_endpoint(const sockaddr_storage_t *laddr) +sctp_endpoint_t *__sctp_rcv_lookup_endpoint(const union sctp_addr *laddr) { sctp_hashbucket_t *head; sctp_endpoint_common_t *epb; @@ -523,8 +476,8 @@ void __sctp_unhash_established(sctp_association_t *asoc) } /* Look up an association. */ -sctp_association_t *__sctp_lookup_association(const sockaddr_storage_t *laddr, - const sockaddr_storage_t *paddr, +sctp_association_t *__sctp_lookup_association(const union sctp_addr *laddr, + const union sctp_addr *paddr, sctp_transport_t **transportp) { sctp_hashbucket_t *head; @@ -559,8 +512,8 @@ hit: } /* Look up an association. BH-safe. */ -sctp_association_t *sctp_lookup_association(const sockaddr_storage_t *laddr, - const sockaddr_storage_t *paddr, +sctp_association_t *sctp_lookup_association(const union sctp_addr *laddr, + const union sctp_addr *paddr, sctp_transport_t **transportp) { sctp_association_t *asoc; @@ -573,8 +526,8 @@ sctp_association_t *sctp_lookup_association(const sockaddr_storage_t *laddr, } /* Is there an association matching the given local and peer addresses? */ -int sctp_has_association(const sockaddr_storage_t *laddr, - const sockaddr_storage_t *paddr) +int sctp_has_association(const union sctp_addr *laddr, + const union sctp_addr *paddr) { sctp_association_t *asoc; sctp_transport_t *transport; @@ -606,12 +559,12 @@ int sctp_has_association(const sockaddr_storage_t *laddr, * in certain circumstances. * */ -static sctp_association_t *__sctp_rcv_initack_lookup(struct sk_buff *skb, - const sockaddr_storage_t *laddr, sctp_transport_t **transportp) +static sctp_association_t *__sctp_rcv_init_lookup(struct sk_buff *skb, + const union sctp_addr *laddr, sctp_transport_t **transportp) { sctp_association_t *asoc; - sockaddr_storage_t addr; - sockaddr_storage_t *paddr = &addr; + union sctp_addr addr; + union sctp_addr *paddr = &addr; struct sctphdr *sh = (struct sctphdr *) skb->h.raw; sctp_chunkhdr_t *ch; union sctp_params params; @@ -665,20 +618,20 @@ static sctp_association_t *__sctp_rcv_initack_lookup(struct sk_buff *skb, /* Lookup an association for an inbound skb. */ sctp_association_t *__sctp_rcv_lookup(struct sk_buff *skb, - const sockaddr_storage_t *paddr, - const sockaddr_storage_t *laddr, + const union sctp_addr *paddr, + const union sctp_addr *laddr, sctp_transport_t **transportp) { sctp_association_t *asoc; asoc = __sctp_lookup_association(laddr, paddr, transportp); - /* Further lookup for INIT-ACK packet. + /* Further lookup for INIT/INIT-ACK packets. * SCTP Implementors Guide, 2.18 Handling of address * parameters within the INIT or INIT-ACK. */ if (!asoc) - asoc = __sctp_rcv_initack_lookup(skb, laddr, transportp); + asoc = __sctp_rcv_init_lookup(skb, laddr, transportp); return asoc; } diff --git a/net/sctp/ipv6.c b/net/sctp/ipv6.c index eb31e378985c..b24470424218 100644 --- a/net/sctp/ipv6.c +++ b/net/sctp/ipv6.c @@ -172,8 +172,8 @@ static inline int sctp_v6_xmit(struct sk_buff *skb) /* Returns the dst cache entry for the given source and destination ip * addresses. */ -struct dst_entry *sctp_v6_get_dst(sockaddr_storage_t *daddr, - sockaddr_storage_t *saddr) +struct dst_entry *sctp_v6_get_dst(union sctp_addr *daddr, + union sctp_addr *saddr) { struct dst_entry *dst; struct flowi fl = { .nl_u = { .ip6_u = { .daddr = &daddr->v6.sin6_addr, @@ -206,8 +206,63 @@ struct dst_entry *sctp_v6_get_dst(sockaddr_storage_t *daddr, return dst; } +/* Make a copy of all potential local addresses. */ +static void sctp_v6_copy_addrlist(struct list_head *addrlist, + struct net_device *dev) +{ + struct inet6_dev *in6_dev; + struct inet6_ifaddr *ifp; + struct sockaddr_storage_list *addr; + + read_lock(&addrconf_lock); + if ((in6_dev = __in6_dev_get(dev)) == NULL) { + read_unlock(&addrconf_lock); + return; + } + + read_lock(&in6_dev->lock); + for (ifp = in6_dev->addr_list; ifp; ifp = ifp->if_next) { + /* Add the address to the local list. */ + addr = t_new(struct sockaddr_storage_list, GFP_ATOMIC); + if (addr) { + addr->a.v6.sin6_family = AF_INET6; + addr->a.v6.sin6_port = 0; + addr->a.v6.sin6_addr = ifp->addr; + INIT_LIST_HEAD(&addr->list); + list_add_tail(&addr->list, addrlist); + } + } + + read_unlock(&in6_dev->lock); + read_unlock(&addrconf_lock); +} + +/* Initialize a sockaddr_storage from in incoming skb. */ +static void sctp_v6_from_skb(union sctp_addr *addr,struct sk_buff *skb, + int is_saddr) +{ + void *from; + __u16 *port; + struct sctphdr *sh; + + port = &addr->v6.sin6_port; + addr->v6.sin6_family = AF_INET6; + addr->v6.sin6_flowinfo = 0; /* FIXME */ + addr->v6.sin6_scope_id = 0; /* FIXME */ + + sh = (struct sctphdr *) skb->h.raw; + if (is_saddr) { + *port = ntohs(sh->source); + from = &skb->nh.ipv6h->saddr; + } else { + *port = ntohs(sh->dest); + from = &skb->nh.ipv6h->daddr; + } + ipv6_addr_copy(&addr->v6.sin6_addr, from); +} + /* Check if the dst entry's source addr matches the given source addr. */ -int sctp_v6_cmp_saddr(struct dst_entry *dst, sockaddr_storage_t *saddr) +int sctp_v6_cmp_saddr(struct dst_entry *dst, union sctp_addr *saddr) { struct rt6_info *rt = (struct rt6_info *)dst; @@ -227,12 +282,13 @@ static void sctp_inet6_msgname(char *msgname, int *addr_len) } /* Initialize a PF_INET msgname from a ulpevent. */ -static void sctp_inet6_event_msgname(sctp_ulpevent_t *event, char *msgname, int *addrlen) +static void sctp_inet6_event_msgname(sctp_ulpevent_t *event, char *msgname, + int *addrlen) { struct sockaddr_in6 *sin6, *sin6from; if (msgname) { - sockaddr_storage_t *addr; + union sctp_addr *addr; sctp_inet6_msgname(msgname, addrlen); sin6 = (struct sockaddr_in6 *)msgname; @@ -327,6 +383,8 @@ static sctp_func_t sctp_ipv6_specific = { .setsockopt = ipv6_setsockopt, .getsockopt = ipv6_getsockopt, .get_dst = sctp_v6_get_dst, + .copy_addrlist = sctp_v6_copy_addrlist, + .from_skb = sctp_v6_from_skb, .cmp_saddr = sctp_v6_cmp_saddr, .net_header_len = sizeof(struct ipv6hdr), .sockaddr_len = sizeof(struct sockaddr_in6), diff --git a/net/sctp/output.c b/net/sctp/output.c index 5962d3e72e52..7620a118c1f8 100644 --- a/net/sctp/output.c +++ b/net/sctp/output.c @@ -366,18 +366,13 @@ int sctp_packet_transmit(sctp_packet_t *packet) */ sh->checksum = htonl(crc32); + /* FIXME: Delete the rest of this switch statement once phase 2 + * of address selection (ipv6 support) drops in. + */ switch (transport->ipaddr.sa.sa_family) { - case AF_INET: - inet_sk(sk)->daddr = transport->ipaddr.v4.sin_addr.s_addr; - break; - case AF_INET6: SCTP_V6(inet6_sk(sk)->daddr = transport->ipaddr.v6.sin6_addr;) break; - - default: - /* This is bogus address type, just bail. */ - break; }; /* IP layer ECN support diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c index 5724996717d7..22c709b4974c 100644 --- a/net/sctp/protocol.c +++ b/net/sctp/protocol.c @@ -1,7 +1,7 @@ /* SCTP kernel reference Implementation * Copyright (c) 1999-2000 Cisco, Inc. * Copyright (c) 1999-2001 Motorola, Inc. - * Copyright (c) 2001 International Business Machines, Corp. + * Copyright (c) 2001-2002 International Business Machines, Corp. * Copyright (c) 2001 Intel Corp. * Copyright (c) 2001 Nokia, Inc. * Copyright (c) 2001 La Monte H.P. Yarroll @@ -103,8 +103,8 @@ void sctp_proc_exit(void) /* Private helper to extract ipv4 address and stash them in * the protocol structure. */ -static inline void sctp_v4_get_local_addr_list(sctp_protocol_t *proto, - struct net_device *dev) +static void sctp_v4_copy_addrlist(struct list_head *addrlist, + struct net_device *dev) { struct in_device *in_dev; struct in_ifaddr *ifa; @@ -117,7 +117,6 @@ static inline void sctp_v4_get_local_addr_list(sctp_protocol_t *proto, } read_lock(&in_dev->lock); - for (ifa = in_dev->ifa_list; ifa; ifa = ifa->ifa_next) { /* Add the address to the local list. */ addr = t_new(struct sockaddr_storage_list, GFP_ATOMIC); @@ -126,7 +125,7 @@ static inline void sctp_v4_get_local_addr_list(sctp_protocol_t *proto, addr->a.v4.sin_family = AF_INET; addr->a.v4.sin_port = 0; addr->a.v4.sin_addr.s_addr = ifa->ifa_local; - list_add_tail(&addr->list, &proto->local_addr_list); + list_add_tail(&addr->list, addrlist); } } @@ -134,56 +133,21 @@ static inline void sctp_v4_get_local_addr_list(sctp_protocol_t *proto, read_unlock(&inetdev_lock); } -/* Private helper to extract ipv6 address and stash them in - * the protocol structure. - * FIXME: Make this an address family function. - */ -static inline void sctp_v6_get_local_addr_list(sctp_protocol_t *proto, - struct net_device *dev) -{ -#ifdef SCTP_V6_SUPPORT - /* FIXME: The testframe doesn't support this function. */ -#ifndef TEST_FRAME - struct inet6_dev *in6_dev; - struct inet6_ifaddr *ifp; - struct sockaddr_storage_list *addr; - - read_lock(&addrconf_lock); - if ((in6_dev = __in6_dev_get(dev)) == NULL) { - read_unlock(&addrconf_lock); - return; - } - - read_lock_bh(&in6_dev->lock); - for (ifp = in6_dev->addr_list; ifp; ifp = ifp->if_next) { - /* Add the address to the local list. */ - addr = t_new(struct sockaddr_storage_list, GFP_ATOMIC); - if (addr) { - addr->a.v6.sin6_family = AF_INET6; - addr->a.v6.sin6_port = 0; - addr->a.v6.sin6_addr = ifp->addr; - INIT_LIST_HEAD(&addr->list); - list_add_tail(&addr->list, &proto->local_addr_list); - } - } - - read_unlock_bh(&in6_dev->lock); - read_unlock(&addrconf_lock); -#endif /* TEST_FRAME */ -#endif /* SCTP_V6_SUPPORT */ -} - /* Extract our IP addresses from the system and stash them in the * protocol structure. */ static void __sctp_get_local_addr_list(sctp_protocol_t *proto) { struct net_device *dev; + struct list_head *pos; + struct sctp_func *af; read_lock(&dev_base_lock); for (dev = dev_base; dev; dev = dev->next) { - sctp_v4_get_local_addr_list(proto, dev); - sctp_v6_get_local_addr_list(proto, dev); + list_for_each(pos, &proto->address_families) { + af = list_entry(pos, sctp_func_t, list); + af->copy_addrlist(&proto->local_addr_list, dev); + } } read_unlock(&dev_base_lock); } @@ -259,8 +223,8 @@ end_copy: /* Returns the dst cache entry for the given source and destination ip * addresses. */ -struct dst_entry *sctp_v4_get_dst(sockaddr_storage_t *daddr, - sockaddr_storage_t *saddr) +struct dst_entry *sctp_v4_get_dst(union sctp_addr *daddr, + union sctp_addr *saddr) { struct rtable *rt; struct flowi fl = { .nl_u = { .ip4_u = { .daddr = @@ -285,8 +249,31 @@ struct dst_entry *sctp_v4_get_dst(sockaddr_storage_t *daddr, return &rt->u.dst; } + +/* Initialize a sctp_addr from in incoming skb. */ +static void sctp_v4_from_skb(union sctp_addr *addr, struct sk_buff *skb, + int is_saddr) +{ + void *from; + __u16 *port; + struct sctphdr *sh; + + port = &addr->v4.sin_port; + addr->v4.sin_family = AF_INET; + + sh = (struct sctphdr *) skb->h.raw; + if (is_saddr) { + *port = ntohs(sh->source); + from = &skb->nh.iph->saddr; + } else { + *port = ntohs(sh->dest); + from = &skb->nh.iph->daddr; + } + memcpy(&addr->v4.sin_addr.s_addr, from, sizeof(struct in_addr)); +} + /* Check if the dst entry's source addr matches the given source addr. */ -int sctp_v4_cmp_saddr(struct dst_entry *dst, sockaddr_storage_t *saddr) +int sctp_v4_cmp_saddr(struct dst_entry *dst, union sctp_addr *saddr) { struct rtable *rt = (struct rtable *)dst; @@ -336,11 +323,11 @@ int sctp_ctl_sock_init(void) /* Get the table of functions for manipulating a particular address * family. */ -sctp_func_t *sctp_get_af_specific(const sockaddr_storage_t *address) +sctp_func_t *sctp_get_af_specific(sa_family_t family) { struct list_head *pos; sctp_protocol_t *proto = sctp_get_protocol(); - sctp_func_t *retval, *af; + struct sctp_func *retval, *af; retval = NULL; @@ -349,7 +336,7 @@ sctp_func_t *sctp_get_af_specific(const sockaddr_storage_t *address) */ list_for_each(pos, &proto->address_families) { af = list_entry(pos, sctp_func_t, list); - if (address->sa.sa_family == af->sa_family) { + if (family == af->sa_family) { retval = af; break; } @@ -448,11 +435,13 @@ static struct inet_protocol sctp_protocol = { }; /* IPv4 address related functions. */ -sctp_func_t sctp_ipv4_specific = { +struct sctp_func sctp_ipv4_specific = { .queue_xmit = ip_queue_xmit, .setsockopt = ip_setsockopt, .getsockopt = ip_getsockopt, .get_dst = sctp_v4_get_dst, + .copy_addrlist = sctp_v4_copy_addrlist, + .from_skb = sctp_v4_from_skb, .cmp_saddr = sctp_v4_cmp_saddr, .net_header_len = sizeof(struct iphdr), .sockaddr_len = sizeof(struct sockaddr_in), diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c index fb4c5b6f561b..1b0e16b99e87 100644 --- a/net/sctp/sm_make_chunk.c +++ b/net/sctp/sm_make_chunk.c @@ -1033,7 +1033,7 @@ nodata: /* Set chunk->source and dest based on the IP header in chunk->skb. */ void sctp_init_addrs(sctp_chunk_t *chunk) { - sockaddr_storage_t *source, *dest; + union sctp_addr *source, *dest; struct sk_buff *skb; struct sctphdr *sh; struct iphdr *ih4; @@ -1075,7 +1075,7 @@ void sctp_init_addrs(sctp_chunk_t *chunk) } /* Extract the source address from a chunk. */ -const sockaddr_storage_t *sctp_source(const sctp_chunk_t *chunk) +const union sctp_addr *sctp_source(const sctp_chunk_t *chunk) { /* If we have a known transport, use that. */ if (chunk->transport) { @@ -1661,7 +1661,7 @@ int sctp_verify_init(const sctp_association_t *asoc, * Returns 0 on failure, else success. */ int sctp_process_init(sctp_association_t *asoc, sctp_cid_t cid, - const sockaddr_storage_t *peer_addr, + const union sctp_addr *peer_addr, sctp_init_chunk_t *peer_init, int priority) { @@ -1780,9 +1780,9 @@ nomem: * structures for the addresses. */ int sctp_process_param(sctp_association_t *asoc, union sctp_params param, - const sockaddr_storage_t *peer_addr, int priority) + const union sctp_addr *peer_addr, int priority) { - sockaddr_storage_t addr; + union sctp_addr addr; int i; __u16 sat; int retval = 1; @@ -1906,8 +1906,8 @@ __u32 sctp_generate_tsn(const sctp_endpoint_t *ep) * 4th Level Abstractions ********************************************************************/ -/* Convert from an SCTP IP parameter to a sockaddr_storage_t. */ -void sctp_param2sockaddr(sockaddr_storage_t *addr, sctp_addr_param_t *param, +/* Convert from an SCTP IP parameter to a union sctp_addr. */ +void sctp_param2sockaddr(union sctp_addr *addr, sctp_addr_param_t *param, __u16 port) { switch(param->v4.param_hdr.type) { @@ -1934,7 +1934,7 @@ void sctp_param2sockaddr(sockaddr_storage_t *addr, sctp_addr_param_t *param, /* Convert an IP address in an SCTP param into a sockaddr_in. */ /* Returns true if a valid conversion was possible. */ -int sctp_addr2sockaddr(union sctp_params p, sockaddr_storage_t *sa) +int sctp_addr2sockaddr(union sctp_params p, union sctp_addr *sa) { switch (p.p->type) { case SCTP_PARAM_IPV4_ADDRESS: @@ -1955,30 +1955,10 @@ int sctp_addr2sockaddr(union sctp_params p, sockaddr_storage_t *sa) return 1; } -/* Convert from an IP version number to an Address Family symbol. */ -int ipver2af(__u8 ipver) -{ - int family; - - switch (ipver) { - case 4: - family = AF_INET; - break; - case 6: - family = AF_INET6; - break; - default: - family = 0; - break; - }; - - return family; -} - /* Convert a sockaddr_in to an IP address in an SCTP param. * Returns len if a valid conversion was possible. */ -int sockaddr2sctp_addr(const sockaddr_storage_t *sa, sctp_addr_param_t *p) +int sockaddr2sctp_addr(const union sctp_addr *sa, sctp_addr_param_t *p) { int len = 0; diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c index 9c0212a049da..f8830fc33079 100644 --- a/net/sctp/sm_statefuns.c +++ b/net/sctp/sm_statefuns.c @@ -832,7 +832,7 @@ sctp_disposition_t sctp_sf_backbeat_8_3(const sctp_endpoint_t *ep, sctp_cmd_seq_t *commands) { sctp_chunk_t *chunk = arg; - sockaddr_storage_t from_addr; + union sctp_addr from_addr; sctp_transport_t *link; sctp_sender_hb_info_t *hbinfo; unsigned long max_interval; @@ -881,7 +881,7 @@ sctp_disposition_t sctp_sf_backbeat_8_3(const sctp_endpoint_t *ep, /* Helper function to send out an abort for the restart * condition. */ -static int sctp_sf_send_restart_abort(sockaddr_storage_t *ssa, +static int sctp_sf_send_restart_abort(union sctp_addr *ssa, sctp_chunk_t *init, sctp_cmd_seq_t *commands) { @@ -4313,7 +4313,7 @@ sctp_packet_t *sctp_ootb_pkt_new(const sctp_association_t *asoc, /* Cache a route for the transport with the chunk's destination as * the source address. */ - sctp_transport_route(transport, (sockaddr_storage_t *)&chunk->dest); + sctp_transport_route(transport, (union sctp_addr *)&chunk->dest); packet = sctp_packet_init(packet, transport, sport, dport); packet = sctp_packet_config(packet, vtag, 0, NULL); diff --git a/net/sctp/socket.c b/net/sctp/socket.c index 6533707fb521..31e765f49306 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c @@ -87,14 +87,14 @@ static int sctp_wait_for_sndbuf(sctp_association_t *asoc, long *timeo_p, int msg_len); static int sctp_wait_for_packet(struct sock * sk, int *err, long *timeo_p); static inline void sctp_sk_addr_set(struct sock *, - const sockaddr_storage_t *newaddr, - sockaddr_storage_t *saveaddr); + const union sctp_addr *newaddr, + union sctp_addr *saveaddr); static inline void sctp_sk_addr_restore(struct sock *, - const sockaddr_storage_t *); + const union sctp_addr *); static inline int sctp_sendmsg_verify_name(struct sock *, struct msghdr *); static int sctp_bindx_add(struct sock *, struct sockaddr_storage *, int); static int sctp_bindx_rem(struct sock *, struct sockaddr_storage *, int); -static int sctp_do_bind(struct sock *, sockaddr_storage_t *, int); +static int sctp_do_bind(struct sock *, union sctp_addr *, int); static int sctp_autobind(struct sock *sk); @@ -122,7 +122,7 @@ int sctp_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len) /* Disallow binding twice. */ if (!sctp_sk(sk)->ep->base.bind_addr.port) - retval = sctp_do_bind(sk, (sockaddr_storage_t *)uaddr, + retval = sctp_do_bind(sk, (union sctp_addr *)uaddr, addr_len); else retval = -EINVAL; @@ -135,14 +135,14 @@ int sctp_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len) static long sctp_get_port_local(struct sock *, unsigned short); /* Bind a local address either to an endpoint or to an association. */ -SCTP_STATIC int sctp_do_bind(struct sock *sk, sockaddr_storage_t *newaddr, +SCTP_STATIC int sctp_do_bind(struct sock *sk, union sctp_addr *newaddr, int addr_len) { sctp_opt_t *sp = sctp_sk(sk); sctp_endpoint_t *ep = sp->ep; sctp_bind_addr_t *bp = &ep->base.bind_addr; unsigned short sa_family = newaddr->sa.sa_family; - sockaddr_storage_t tmpaddr, saveaddr; + union sctp_addr tmpaddr, saveaddr; unsigned short *snum; int ret = 0; @@ -403,7 +403,7 @@ int sctp_bindx_add(struct sock *sk, struct sockaddr_storage *addrs, int addrcnt) goto err_bindx_add; }; - retval = sctp_do_bind(sk, (sockaddr_storage_t *)&addrs[cnt], + retval = sctp_do_bind(sk, (union sctp_addr *)&addrs[cnt], addr_len); err_bindx_add: @@ -481,7 +481,7 @@ int sctp_bindx_rem(struct sock *sk, struct sockaddr_storage *addrs, int addrcnt) int cnt; sctp_bind_addr_t *bp = &ep->base.bind_addr; int retval = 0; - sockaddr_storage_t saveaddr; + union sctp_addr saveaddr; SCTP_DEBUG_PRINTK("sctp_bindx_rem (sk: %p, addrs: %p, addrcnt: %d)\n", sk, addrs, addrcnt); @@ -500,7 +500,7 @@ int sctp_bindx_rem(struct sock *sk, struct sockaddr_storage *addrs, int addrcnt) */ switch (((struct sockaddr *)&addrs[cnt])->sa_family) { case AF_INET: - saveaddr = *((sockaddr_storage_t *) + saveaddr = *((union sctp_addr *) &addrs[cnt]); saveaddr.v4.sin_port = ntohs(saveaddr.v4.sin_port); /* Verify the port. */ @@ -511,7 +511,7 @@ int sctp_bindx_rem(struct sock *sk, struct sockaddr_storage *addrs, int addrcnt) break; case AF_INET6: - saveaddr = *((sockaddr_storage_t *) + saveaddr = *((union sctp_addr *) &addrs[cnt]); saveaddr.v6.sin6_port = ntohs(saveaddr.v6.sin6_port); @@ -741,7 +741,7 @@ SCTP_STATIC int sctp_sendmsg(struct kiocb *iocb, struct sock *sk, sctp_association_t *new_asoc=NULL, *asoc=NULL; sctp_transport_t *transport; sctp_chunk_t *chunk = NULL; - sockaddr_storage_t to; + union sctp_addr to; struct sockaddr *msg_name = NULL; struct sctp_sndrcvinfo default_sinfo = { 0 }; struct sctp_sndrcvinfo *sinfo; @@ -1258,7 +1258,7 @@ static inline int sctp_setsockopt_set_peer_addr_params(struct sock *sk, { struct sctp_paddrparams params; sctp_association_t *asoc; - sockaddr_storage_t *addr; + union sctp_addr *addr; sctp_transport_t *trans; int error; @@ -1271,7 +1271,7 @@ static inline int sctp_setsockopt_set_peer_addr_params(struct sock *sk, if (!asoc) return -EINVAL; - addr = (sockaddr_storage_t *) &(params.spp_address); + addr = (union sctp_addr *) &(params.spp_address); trans = sctp_assoc_lookup_paddr(asoc, addr); if (!trans) @@ -1606,7 +1606,7 @@ static int sctp_getsockopt_sctp_status(struct sock *sk, int len, char *optval, status.sstat_fragmentation_point = assoc->frag_point; status.sstat_primary.spinfo_assoc_id = sctp_assoc2id(transport->asoc); memcpy(&status.sstat_primary.spinfo_address, - &(transport->ipaddr), sizeof(sockaddr_storage_t)); + &(transport->ipaddr), sizeof(union sctp_addr)); status.sstat_primary.spinfo_state = transport->active; status.sstat_primary.spinfo_cwnd = transport->cwnd; status.sstat_primary.spinfo_srtt = transport->srtt; @@ -1781,7 +1781,7 @@ static inline int sctp_getsockopt_get_peer_addr_params(struct sock *sk, { struct sctp_paddrparams params; sctp_association_t *asoc; - sockaddr_storage_t *addr; + union sctp_addr *addr; sctp_transport_t *trans; if (len != sizeof(struct sctp_paddrparams)) @@ -1793,7 +1793,7 @@ static inline int sctp_getsockopt_get_peer_addr_params(struct sock *sk, if (!asoc) return -EINVAL; - addr = (sockaddr_storage_t *) &(params.spp_address); + addr = (union sctp_addr *) &(params.spp_address); trans = sctp_assoc_lookup_paddr(asoc, addr); if (!trans) @@ -1990,7 +1990,7 @@ static long sctp_get_port_local(struct sock *sk, unsigned short snum) * socket is going to be sk2. */ int sk_reuse = sk->reuse; - sockaddr_storage_t tmpaddr; + union sctp_addr tmpaddr; struct sock *sk2 = pp->sk; SCTP_DEBUG_PRINTK("sctp_get_port() found a " @@ -2293,10 +2293,10 @@ void sctp_put_port(struct sock *sk) */ static int sctp_autobind(struct sock *sk) { - sockaddr_storage_t autoaddr; + union sctp_addr autoaddr; int addr_len = 0; - memset(&autoaddr, 0, sizeof(sockaddr_storage_t)); + memset(&autoaddr, 0, sizeof(union sctp_addr)); switch (sk->family) { case PF_INET: @@ -2437,8 +2437,8 @@ SCTP_STATIC int sctp_msghdr_parse(const struct msghdr *msg, /* Setup sk->rcv_saddr before calling get_port(). */ static inline void sctp_sk_addr_set(struct sock *sk, - const sockaddr_storage_t *newaddr, - sockaddr_storage_t *saveaddr) + const union sctp_addr *newaddr, + union sctp_addr *saveaddr) { struct inet_opt *inet = inet_sk(sk); @@ -2465,7 +2465,7 @@ static inline void sctp_sk_addr_set(struct sock *sk, } /* Restore sk->rcv_saddr after failing get_port(). */ -static inline void sctp_sk_addr_restore(struct sock *sk, const sockaddr_storage_t *addr) +static inline void sctp_sk_addr_restore(struct sock *sk, const union sctp_addr *addr) { struct inet_opt *inet = inet_sk(sk); @@ -2610,12 +2610,12 @@ no_packet: static inline int sctp_sendmsg_verify_name(struct sock *sk, struct msghdr *msg) { - sockaddr_storage_t *sa; + union sctp_addr *sa; if (msg->msg_namelen < sizeof (struct sockaddr)) return -EINVAL; - sa = (sockaddr_storage_t *) msg->msg_name; + sa = (union sctp_addr *) msg->msg_name; switch (sa->sa.sa_family) { case AF_INET: if (msg->msg_namelen < sizeof(struct sockaddr_in)) diff --git a/net/sctp/transport.c b/net/sctp/transport.c index e5cc78b8726e..482b1a34effc 100644 --- a/net/sctp/transport.c +++ b/net/sctp/transport.c @@ -9,7 +9,7 @@ * * This module provides the abstraction for an SCTP tranport representing * a remote transport address. For local transport addresses, we just use - * sockaddr_storage_t. + * union sctp_addr. * * The SCTP reference implementation is free software; * you can redistribute it and/or modify it under the terms of @@ -53,7 +53,7 @@ /* 1st Level Abstractions. */ /* Allocate and initialize a new transport. */ -sctp_transport_t *sctp_transport_new(const sockaddr_storage_t *addr, int priority) +sctp_transport_t *sctp_transport_new(const union sctp_addr *addr, int priority) { sctp_transport_t *transport; @@ -78,14 +78,14 @@ fail: /* Intialize a new transport from provided memory. */ sctp_transport_t *sctp_transport_init(sctp_transport_t *peer, - const sockaddr_storage_t *addr, + const union sctp_addr *addr, int priority) { sctp_protocol_t *proto = sctp_get_protocol(); /* Copy in the address. */ peer->ipaddr = *addr; - peer->af_specific = sctp_get_af_specific(addr); + peer->af_specific = sctp_get_af_specific(addr->sa.sa_family); peer->asoc = NULL; /* From 6.3.1 RTO Calculation: @@ -204,11 +204,11 @@ void sctp_transport_set_owner(sctp_transport_t *transport, * souce address. */ void sctp_transport_route(sctp_transport_t *transport, - sockaddr_storage_t *saddr) + union sctp_addr *saddr) { sctp_association_t *asoc = transport->asoc; sctp_func_t *af = transport->af_specific; - sockaddr_storage_t *daddr = &transport->ipaddr; + union sctp_addr *daddr = &transport->ipaddr; sctp_bind_addr_t *bp; rwlock_t *addr_lock; struct sockaddr_storage_list *laddr; |
