[SCTP] embedded sctp_addr: net-endian mirrors
authorAl Viro <viro@zeniv.linux.org.uk>
Tue, 21 Nov 2006 01:04:42 +0000 (17:04 -0800)
committerDavid S. Miller <davem@sunset.davemloft.net>
Sun, 3 Dec 2006 05:26:30 +0000 (21:26 -0800)
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: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/sctp/structs.h
net/sctp/bind_addr.c
net/sctp/ipv6.c
net/sctp/protocol.c
net/sctp/sm_make_chunk.c
net/sctp/transport.c

index 953a73f9689ce0cff3c72153ff11c5494160d6b1..2c35f2fd56011f5957ecb207a4b434b06a231777 100644 (file)
@@ -713,6 +713,7 @@ struct sctp_chunk {
        unsigned long sent_at;
 
        /* What is the origin IP address for this chunk?  */
+       union sctp_addr source;
        union sctp_addr source_h;
        /* Destination address for this chunk. */
        union sctp_addr dest;
@@ -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.  */
 struct sctp_sockaddr_entry {
        struct list_head list;
+       union sctp_addr a;
        union sctp_addr a_h;
        __u8 use_as_src;
 };
@@ -842,6 +844,7 @@ struct sctp_transport {
        int      dead;
 
        /* This is the peer's IP address and port. */
+       union sctp_addr ipaddr;
        union sctp_addr ipaddr_h;
 
        /* These are the functions we call to handle LLP stuff.  */
@@ -900,6 +903,7 @@ struct sctp_transport {
        /* Destination */
        struct dst_entry *dst;
        /* Source address. */
+       union sctp_addr saddr;
        union sctp_addr saddr_h;
 
        /* When was the last time(in jiffies) that a data packet was sent on
index b8115cb31ae330abfc78397559e7dd1322f98648..2b36e4238170a51678ac34c0c889266b153b8e96 100644 (file)
@@ -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)
                addr->a_h.v4.sin_port = bp->port;
 
+       flip_to_n(&addr->a, &addr->a_h);
+
        addr->use_as_src = use_as_src;
 
        INIT_LIST_HEAD(&addr->list);
index e533970fa335272ca0d5deeb9a429399f54fdeb9..8ebd177296ba3c62b461ba285fec52661550e668 100644 (file)
@@ -332,10 +332,11 @@ static void sctp_v6_copy_addrlist(struct list_head *addrlist,
                /* Add the address to the local list.  */
                addr = t_new(struct sctp_sockaddr_entry, GFP_ATOMIC);
                if (addr) {
-                       addr->a_h.v6.sin6_family = AF_INET6;
-                       addr->a_h.v6.sin6_port = 0;
-                       addr->a_h.v6.sin6_addr = ifp->addr;
-                       addr->a_h.v6.sin6_scope_id = dev->ifindex;
+                       addr->a.v6.sin6_family = AF_INET6;
+                       addr->a.v6.sin6_port = 0;
+                       addr->a.v6.sin6_addr = ifp->addr;
+                       addr->a.v6.sin6_scope_id = dev->ifindex;
+                       addr->a_h = addr->a;
                        INIT_LIST_HEAD(&addr->list);
                        list_add_tail(&addr->list, addrlist);
                }
index 20883ffd51d95ef3bfef6479fe9c4b0fdf989465..3632740450324065768f53182fff174b420dd77b 100644 (file)
@@ -150,9 +150,10 @@ static void sctp_v4_copy_addrlist(struct list_head *addrlist,
                /* Add the address to the local list.  */
                addr = t_new(struct sctp_sockaddr_entry, GFP_ATOMIC);
                if (addr) {
-                       addr->a_h.v4.sin_family = AF_INET;
-                       addr->a_h.v4.sin_port = 0;
-                       addr->a_h.v4.sin_addr.s_addr = ifa->ifa_local;
+                       addr->a.v4.sin_family = AF_INET;
+                       addr->a.v4.sin_port = 0;
+                       addr->a.v4.sin_addr.s_addr = ifa->ifa_local;
+                       addr->a_h = addr->a;
                        list_add_tail(&addr->list, addrlist);
                }
        }
index 13109cfc3ae5e7318d353ddd19cf6b38d2f82d65..b8e0f72b319fb28c9966a94946645b0b00915f4a 100644 (file)
@@ -1032,6 +1032,7 @@ void sctp_init_addrs(struct sctp_chunk *chunk, union sctp_addr *src,
                     union sctp_addr *dest)
 {
        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));
 }
 
index 1f56c9d95739ebc7b79b851c7a439c2b78ba9944..bacd09448b8e026c946d0f0703408594effed4f2 100644 (file)
@@ -62,10 +62,12 @@ static struct sctp_transport *sctp_transport_init(struct sctp_transport *peer,
 {
        /* Copy in the address.  */
        peer->ipaddr_h = *addr;
+       flip_to_n(&peer->ipaddr, &peer->ipaddr_h);
        peer->af_specific = sctp_get_af_specific(addr->sa.sa_family);
        peer->asoc = NULL;
 
        peer->dst = NULL;
+       memset(&peer->saddr, 0, sizeof(union sctp_addr));
        memset(&peer->saddr_h, 0, sizeof(union sctp_addr));
 
        /* From 6.3.1 RTO Calculation:
@@ -258,6 +260,7 @@ void sctp_transport_route(struct sctp_transport *transport,
                memcpy(&transport->saddr_h, saddr, sizeof(union sctp_addr));
        else
                af->get_saddr(asoc, dst, daddr, &transport->saddr_h);
+       flip_to_n(&transport->saddr, &transport->saddr_h);
 
        transport->dst = dst;
        if ((transport->param_flags & SPP_PMTUD_DISABLE) && transport->pathmtu) {