Commit 2a6fd78a authored by Al Viro's avatar Al Viro Committed by David S. Miller

[SCTP] embedded sctp_addr: net-endian mirrors

Add sctp_chunk->source, sctp_sockaddr_entry->a, sctp_transport->ipaddr
and sctp_transport->saddr, maintain them as net-endian mirrors of
their host-endian counterparts.
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 09ef7fec
...@@ -713,6 +713,7 @@ struct sctp_chunk { ...@@ -713,6 +713,7 @@ struct sctp_chunk {
unsigned long sent_at; unsigned long sent_at;
/* What is the origin IP address for this chunk? */ /* What is the origin IP address for this chunk? */
union sctp_addr source;
union sctp_addr source_h; union sctp_addr source_h;
/* Destination address for this chunk. */ /* Destination address for this chunk. */
union sctp_addr dest; union sctp_addr dest;
...@@ -756,6 +757,7 @@ const union sctp_addr *sctp_source(const struct sctp_chunk *chunk); ...@@ -756,6 +757,7 @@ const union sctp_addr *sctp_source(const struct sctp_chunk *chunk);
/* This is a structure for holding either an IPv6 or an IPv4 address. */ /* This is a structure for holding either an IPv6 or an IPv4 address. */
struct sctp_sockaddr_entry { struct sctp_sockaddr_entry {
struct list_head list; struct list_head list;
union sctp_addr a;
union sctp_addr a_h; union sctp_addr a_h;
__u8 use_as_src; __u8 use_as_src;
}; };
...@@ -842,6 +844,7 @@ struct sctp_transport { ...@@ -842,6 +844,7 @@ struct sctp_transport {
int dead; int dead;
/* This is the peer's IP address and port. */ /* This is the peer's IP address and port. */
union sctp_addr ipaddr;
union sctp_addr ipaddr_h; union sctp_addr ipaddr_h;
/* These are the functions we call to handle LLP stuff. */ /* These are the functions we call to handle LLP stuff. */
...@@ -900,6 +903,7 @@ struct sctp_transport { ...@@ -900,6 +903,7 @@ struct sctp_transport {
/* Destination */ /* Destination */
struct dst_entry *dst; struct dst_entry *dst;
/* Source address. */ /* Source address. */
union sctp_addr saddr;
union sctp_addr saddr_h; union sctp_addr saddr_h;
/* When was the last time(in jiffies) that a data packet was sent on /* When was the last time(in jiffies) that a data packet was sent on
......
...@@ -163,6 +163,8 @@ int sctp_add_bind_addr(struct sctp_bind_addr *bp, union sctp_addr *new, ...@@ -163,6 +163,8 @@ int sctp_add_bind_addr(struct sctp_bind_addr *bp, union sctp_addr *new,
if (!addr->a_h.v4.sin_port) if (!addr->a_h.v4.sin_port)
addr->a_h.v4.sin_port = bp->port; addr->a_h.v4.sin_port = bp->port;
flip_to_n(&addr->a, &addr->a_h);
addr->use_as_src = use_as_src; addr->use_as_src = use_as_src;
INIT_LIST_HEAD(&addr->list); INIT_LIST_HEAD(&addr->list);
......
...@@ -332,10 +332,11 @@ static void sctp_v6_copy_addrlist(struct list_head *addrlist, ...@@ -332,10 +332,11 @@ static void sctp_v6_copy_addrlist(struct list_head *addrlist,
/* Add the address to the local list. */ /* Add the address to the local list. */
addr = t_new(struct sctp_sockaddr_entry, GFP_ATOMIC); addr = t_new(struct sctp_sockaddr_entry, GFP_ATOMIC);
if (addr) { if (addr) {
addr->a_h.v6.sin6_family = AF_INET6; addr->a.v6.sin6_family = AF_INET6;
addr->a_h.v6.sin6_port = 0; addr->a.v6.sin6_port = 0;
addr->a_h.v6.sin6_addr = ifp->addr; addr->a.v6.sin6_addr = ifp->addr;
addr->a_h.v6.sin6_scope_id = dev->ifindex; addr->a.v6.sin6_scope_id = dev->ifindex;
addr->a_h = addr->a;
INIT_LIST_HEAD(&addr->list); INIT_LIST_HEAD(&addr->list);
list_add_tail(&addr->list, addrlist); list_add_tail(&addr->list, addrlist);
} }
......
...@@ -150,9 +150,10 @@ static void sctp_v4_copy_addrlist(struct list_head *addrlist, ...@@ -150,9 +150,10 @@ static void sctp_v4_copy_addrlist(struct list_head *addrlist,
/* Add the address to the local list. */ /* Add the address to the local list. */
addr = t_new(struct sctp_sockaddr_entry, GFP_ATOMIC); addr = t_new(struct sctp_sockaddr_entry, GFP_ATOMIC);
if (addr) { if (addr) {
addr->a_h.v4.sin_family = AF_INET; addr->a.v4.sin_family = AF_INET;
addr->a_h.v4.sin_port = 0; addr->a.v4.sin_port = 0;
addr->a_h.v4.sin_addr.s_addr = ifa->ifa_local; addr->a.v4.sin_addr.s_addr = ifa->ifa_local;
addr->a_h = addr->a;
list_add_tail(&addr->list, addrlist); list_add_tail(&addr->list, addrlist);
} }
} }
......
...@@ -1032,6 +1032,7 @@ void sctp_init_addrs(struct sctp_chunk *chunk, union sctp_addr *src, ...@@ -1032,6 +1032,7 @@ void sctp_init_addrs(struct sctp_chunk *chunk, union sctp_addr *src,
union sctp_addr *dest) union sctp_addr *dest)
{ {
memcpy(&chunk->source_h, src, sizeof(union sctp_addr)); memcpy(&chunk->source_h, src, sizeof(union sctp_addr));
flip_to_n(&chunk->source, &chunk->source_h);
memcpy(&chunk->dest, dest, sizeof(union sctp_addr)); memcpy(&chunk->dest, dest, sizeof(union sctp_addr));
} }
......
...@@ -62,10 +62,12 @@ static struct sctp_transport *sctp_transport_init(struct sctp_transport *peer, ...@@ -62,10 +62,12 @@ static struct sctp_transport *sctp_transport_init(struct sctp_transport *peer,
{ {
/* Copy in the address. */ /* Copy in the address. */
peer->ipaddr_h = *addr; peer->ipaddr_h = *addr;
flip_to_n(&peer->ipaddr, &peer->ipaddr_h);
peer->af_specific = sctp_get_af_specific(addr->sa.sa_family); peer->af_specific = sctp_get_af_specific(addr->sa.sa_family);
peer->asoc = NULL; peer->asoc = NULL;
peer->dst = NULL; peer->dst = NULL;
memset(&peer->saddr, 0, sizeof(union sctp_addr));
memset(&peer->saddr_h, 0, sizeof(union sctp_addr)); memset(&peer->saddr_h, 0, sizeof(union sctp_addr));
/* From 6.3.1 RTO Calculation: /* From 6.3.1 RTO Calculation:
...@@ -258,6 +260,7 @@ void sctp_transport_route(struct sctp_transport *transport, ...@@ -258,6 +260,7 @@ void sctp_transport_route(struct sctp_transport *transport,
memcpy(&transport->saddr_h, saddr, sizeof(union sctp_addr)); memcpy(&transport->saddr_h, saddr, sizeof(union sctp_addr));
else else
af->get_saddr(asoc, dst, daddr, &transport->saddr_h); af->get_saddr(asoc, dst, daddr, &transport->saddr_h);
flip_to_n(&transport->saddr, &transport->saddr_h);
transport->dst = dst; transport->dst = dst;
if ((transport->param_flags & SPP_PMTUD_DISABLE) && transport->pathmtu) { if ((transport->param_flags & SPP_PMTUD_DISABLE) && transport->pathmtu) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment