]> git.hungrycats.org Git - linux/commitdiff
Move IP-specific identity information
authorDavid S. Miller <davem@nuts.ninka.net>
Sun, 10 Mar 2002 21:47:33 +0000 (13:47 -0800)
committerDavid S. Miller <davem@nuts.ninka.net>
Sun, 10 Mar 2002 21:47:33 +0000 (13:47 -0800)
out of struct sock.
Fix -EFAULT handling in TCP direct user copy handling.
Use struct initializers in IPV6 ndisc code.

31 files changed:
drivers/net/pppoe.c
include/linux/if_ec.h
include/linux/if_pppox.h
include/linux/ip.h
include/net/ip.h
include/net/sock.h
include/net/tcp.h
include/net/udp.h
net/econet/af_econet.c
net/ipv4/af_inet.c
net/ipv4/ip_input.c
net/ipv4/ip_output.c
net/ipv4/ip_sockglue.c
net/ipv4/netfilter/ip_conntrack_core.c
net/ipv4/raw.c
net/ipv4/tcp.c
net/ipv4/tcp_diag.c
net/ipv4/tcp_input.c
net/ipv4/tcp_ipv4.c
net/ipv4/tcp_minisocks.c
net/ipv4/tcp_output.c
net/ipv4/tcp_timer.c
net/ipv4/udp.c
net/ipv6/af_inet6.c
net/ipv6/ipv6_sockglue.c
net/ipv6/ndisc.c
net/ipv6/raw.c
net/ipv6/tcp_ipv6.c
net/ipv6/udp.c
net/packet/af_packet.c
net/sunrpc/svcsock.c

index ffb77a36fa7f2420a70f02255a27409c02ab0b0f..3c6bfaed71cfb16f67fb95a96f1b38b8daaa0ff2 100644 (file)
@@ -635,7 +635,7 @@ int pppoe_connect(struct socket *sock, struct sockaddr *uservaddr,
                sk->state = PPPOX_CONNECTED;
        }
 
-       sk->num = sp->sa_addr.pppoe.sid;
+       po->num = sp->sa_addr.pppoe.sid;
 
  end:
        release_sock(sk);
@@ -788,7 +788,7 @@ int pppoe_sendmsg(struct socket *sock, struct msghdr *m,
        hdr.ver = 1;
        hdr.type = 1;
        hdr.code = 0;
-       hdr.sid = sk->num;
+       hdr.sid = po->num;
 
        lock_sock(sk);
 
@@ -862,7 +862,7 @@ int __pppoe_xmit(struct sock *sk, struct sk_buff *skb)
        hdr.ver = 1;
        hdr.type = 1;
        hdr.code = 0;
-       hdr.sid = sk->num;
+       hdr.sid = po->num;
        hdr.length = htons(skb->len);
 
        if (!dev)
index 8e2e4a1fe424fd5385221372046aad91f880c7ea..b5ee8425325f995bef031c7b15a7788a1ae01c2c 100644 (file)
@@ -53,6 +53,7 @@ struct econet_opt
   unsigned char port;
   unsigned char station;
   unsigned char net;
+  unsigned short num;
 };
 
 #define ec_sk(__sk) ((struct econet_opt *)(__sk)->protinfo)
index 64b16b277e3c37eda7d4d8b80abafc13e90c2bbc..9d2206b1d06f372bba7941d9b3f2a7c08ebbb3c2 100644 (file)
@@ -127,6 +127,7 @@ struct pppox_opt {
        union {
                struct pppoe_opt pppoe;
        } proto;
+       unsigned short          num;
 };
 #define pppoe_dev      proto.pppoe.dev
 #define pppoe_pa       proto.pppoe.pa
index 97e388ade2617f35b6269520a41075952aa3fe0a..3ba8e804b0d84ef1b8eec5bc6cf16fbeba27b9d0 100644 (file)
@@ -116,17 +116,24 @@ struct ip_options {
 #define optlength(opt) (sizeof(struct ip_options) + opt->optlen)
 
 struct inet_opt {
+       /* Socket demultiplex comparisons on incoming packets. */
+       __u32                   daddr;          /* Foreign IPv4 addr */
+       __u32                   rcv_saddr;      /* Bound local IPv4 addr */
+       __u16                   dport;          /* Destination port */
+       __u16                   num;            /* Local port */
+       __u32                   saddr;          /* Sending source */
        int                     ttl;            /* TTL setting */
        int                     tos;            /* TOS */
        unsigned                cmsg_flags;
        struct ip_options       *opt;
+       __u16                   sport;          /* Source port */
        unsigned char           hdrincl;        /* Include headers ? */
        __u8                    mc_ttl;         /* Multicasting TTL */
        __u8                    mc_loop;        /* Loopback */
+       __u8                    pmtudisc;
+       __u16                   id;             /* ID counter for DF pkts */
        unsigned                recverr : 1,
                                freebind : 1;
-       __u16                   id;             /* ID counter for DF pkts */
-       __u8                    pmtudisc;
        int                     mc_index;       /* Multicast device index */
        __u32                   mc_addr;
        struct ip_mc_socklist   *mc_list;       /* Group array */
index 705fed205357b22d7c178aa271e0a9a2a5c8ec80..e2da92393da8e9414851d6d37a07b11e35924324 100644 (file)
@@ -197,7 +197,8 @@ static inline void ip_select_ident(struct iphdr *iph, struct dst_entry *dst, str
                 * does not change, they drop every other packet in
                 * a TCP stream using header compression.
                 */
-               iph->id = (sk && sk->daddr) ? htons(inet_sk(sk)->id++) : 0;
+               iph->id = (sk && inet_sk(sk)->daddr) ?
+                                       htons(inet_sk(sk)->id++) : 0;
        } else
                __ip_select_ident(iph, dst);
 }
index 898193d61fc3d699b14d2a97c185a9f80ec18e24..4c5d7c257d7507e79c57f682521c91747413854d 100644 (file)
@@ -83,28 +83,22 @@ do {        spin_lock_init(&((__sk)->lock.slock)); \
 } while(0);
 
 struct sock {
-       /* Socket demultiplex comparisons on incoming packets. */
-       __u32                   daddr;          /* Foreign IPv4 addr                    */
-       __u32                   rcv_saddr;      /* Bound local IPv4 addr                */
-       __u16                   dport;          /* Destination port                     */
-       unsigned short          num;            /* Local port                           */
-       int                     bound_dev_if;   /* Bound device index if != 0           */
-
+       /* Begin of struct sock/struct tcp_tw_bucket shared layout */
+       volatile unsigned char  state,          /* Connection state */
+                               zapped;         /* ax25 & ipx means !linked */
+       unsigned char           reuse;          /* SO_REUSEADDR setting */
+       unsigned char           shutdown;
+       int                     bound_dev_if;   /* Bound device index if != 0 */
        /* Main hash linkage for various protocol lookup tables. */
        struct sock             *next;
        struct sock             **pprev;
        struct sock             *bind_next;
        struct sock             **bind_pprev;
-
-       volatile unsigned char  state,          /* Connection state                     */
-                               zapped;         /* In ax25 & ipx means not linked       */
-       __u16                   sport;          /* Source port                          */
-
-       unsigned short          family;         /* Address family                       */
-       unsigned char           reuse;          /* SO_REUSEADDR setting                 */
-       unsigned char           shutdown;
        atomic_t                refcnt;         /* Reference count                      */
-
+       unsigned short          family;         /* Address family */
+       /* End of struct sock/struct tcp_tw_bucket shared layout */
+       unsigned char           use_write_queue;
+       unsigned char           userlocks;
        socket_lock_t           lock;           /* Synchronizer...                      */
        int                     rcvbuf;         /* Size of receive buffer in bytes      */
 
@@ -118,7 +112,6 @@ struct sock {
        atomic_t                omem_alloc;     /* "o" is "option" or "other" */
        int                     wmem_queued;    /* Persistent queue size */
        int                     forward_alloc;  /* Space allocated forward. */
-       __u32                   saddr;          /* Sending source                       */
        unsigned int            allocation;     /* Allocation mode                      */
        int                     sndbuf;         /* Size of send buffer in bytes         */
        struct sock             *prev;
@@ -137,9 +130,7 @@ struct sock {
                                bsdism;
        unsigned char           debug;
        unsigned char           rcvtstamp;
-       unsigned char           use_write_queue;
-       unsigned char           userlocks;
-       /* Hole of 3 bytes. Try to pack. */
+       /* Hole of 1 byte. Try to pack. */
        int                     route_caps;
        int                     proc;
        unsigned long           lingertime;
index bccbac72b43ef4a25ad0228fa4af645766cb9ced..c45fc3e12845729ca3746f4bc7b4547a87b20a06 100644 (file)
@@ -53,7 +53,7 @@ struct tcp_ehash_bucket {
  *     2) If all sockets have sk->reuse set, and none of them are in
  *        TCP_LISTEN state, the port may be shared.
  *        Failing that, goto test 3.
- *     3) If all sockets are bound to a specific sk->rcv_saddr local
+ *     3) If all sockets are bound to a specific inet_sk(sk)->rcv_saddr local
  *        address, and none of them are the same, the port may be
  *        shared.
  *        Failing this, the port cannot be shared.
@@ -162,23 +162,26 @@ struct tcp_tw_bucket {
         * XXX Yes I know this is gross, but I'd have to edit every single
         * XXX networking file if I created a "struct sock_header". -DaveM
         */
-       __u32                   daddr;
-       __u32                   rcv_saddr;
-       __u16                   dport;
-       unsigned short          num;
+       volatile unsigned char  state,          /* Connection state           */
+                               substate;       /* "zapped" -> "substate"     */
+       unsigned char           reuse;          /* SO_REUSEADDR setting       */
+       unsigned char           rcv_wscale;     /* also TW bucket specific    */
        int                     bound_dev_if;
+       /* Main hash linkage for various protocol lookup tables. */
        struct sock             *next;
        struct sock             **pprev;
        struct sock             *bind_next;
        struct sock             **bind_pprev;
-       unsigned char           state,
-                               substate; /* "zapped" is replaced with "substate" */
-       __u16                   sport;
-       unsigned short          family;
-       unsigned char           reuse,
-                               rcv_wscale; /* It is also TW bucket specific */
        atomic_t                refcnt;
-
+       unsigned short          family;
+       /* End of struct sock/struct tcp_tw_bucket shared layout */
+       __u16                   sport;
+       /* Socket demultiplex comparisons on incoming packets. */
+       /* these five are in inet_opt */
+       __u32                   daddr;
+       __u32                   rcv_saddr;
+       __u16                   dport;
+       __u16                   num;
        /* And these are ours. */
        int                     hashent;
        int                     timeout;
@@ -236,20 +239,20 @@ extern void tcp_tw_deschedule(struct tcp_tw_bucket *tw);
        __u64 __name = (((__u64)(__daddr))<<32)|((__u64)(__saddr));
 #endif /* __BIG_ENDIAN */
 #define TCP_IPV4_MATCH(__sk, __cookie, __saddr, __daddr, __ports, __dif)\
-       (((*((__u64 *)&((__sk)->daddr)))== (__cookie))  &&              \
-        ((*((__u32 *)&((__sk)->dport)))== (__ports))   &&              \
+       (((*((__u64 *)&(inet_sk(__sk)->daddr)))== (__cookie))   &&      \
+        ((*((__u32 *)&(inet_sk(__sk)->dport)))== (__ports))   &&       \
         (!((__sk)->bound_dev_if) || ((__sk)->bound_dev_if == (__dif))))
 #else /* 32-bit arch */
 #define TCP_V4_ADDR_COOKIE(__name, __saddr, __daddr)
 #define TCP_IPV4_MATCH(__sk, __cookie, __saddr, __daddr, __ports, __dif)\
-       (((__sk)->daddr                 == (__saddr))   &&              \
-        ((__sk)->rcv_saddr             == (__daddr))   &&              \
-        ((*((__u32 *)&((__sk)->dport)))== (__ports))   &&              \
+       ((inet_sk(__sk)->daddr                  == (__saddr))   &&      \
+        (inet_sk(__sk)->rcv_saddr              == (__daddr))   &&      \
+        ((*((__u32 *)&(inet_sk(__sk)->dport)))== (__ports))    &&      \
         (!((__sk)->bound_dev_if) || ((__sk)->bound_dev_if == (__dif))))
 #endif /* 64-bit arch */
 
 #define TCP_IPV6_MATCH(__sk, __saddr, __daddr, __ports, __dif)    \
-       (((*((__u32 *)&((__sk)->dport)))== (__ports))           && \
+       (((*((__u32 *)&(inet_sk(__sk)->dport)))== (__ports))    && \
         ((__sk)->family                == AF_INET6)            && \
         !ipv6_addr_cmp(&inet6_sk(__sk)->daddr, (__saddr))      && \
         !ipv6_addr_cmp(&inet6_sk(__sk)->rcv_saddr, (__daddr))  && \
@@ -263,7 +266,7 @@ static __inline__ int tcp_lhashfn(unsigned short num)
 
 static __inline__ int tcp_sk_listen_hashfn(struct sock *sk)
 {
-       return tcp_lhashfn(sk->num);
+       return tcp_lhashfn(inet_sk(sk)->num);
 }
 
 #define MAX_TCP_HEADER (128 + MAX_HEADER)
index c7049c5b4bf82f5b9fb7c1e7f6d75e822ac19f7f..15f7626f7dcd36856af40e636e44dfb38d627993 100644 (file)
@@ -23,6 +23,7 @@
 #define _UDP_H
 
 #include <linux/udp.h>
+#include <linux/ip.h>
 #include <net/sock.h>
 
 #define UDP_HTABLE_SIZE                128
@@ -41,7 +42,7 @@ static inline int udp_lport_inuse(u16 num)
        struct sock *sk = udp_hash[num & (UDP_HTABLE_SIZE - 1)];
 
        for(; sk != NULL; sk = sk->next) {
-               if(sk->num == num)
+               if (inet_sk(sk)->num == num)
                        return 1;
        }
        return 0;
index e9fa912af2009fa2e7ab2c4290e5a74dc0c05aa0..8aeaff1bb47131a1b0ecf6e183c6cf8eaf7dd6ce 100644 (file)
@@ -554,7 +554,7 @@ static int econet_create(struct socket *sock, int protocol)
        memset(eo, 0, sizeof(*eo));
        sk->zapped=0;
        sk->family = PF_ECONET;
-       sk->num = protocol;
+       eo->num = protocol;
 
        sklist_insert_socket(&econet_sklist, sk);
        return(0);
index 93080c9a1e0fb7a40f15d8a164d5a2c6e23a8eed..8b70a21036be6b97b9de796a7c0c83bf5e04b063 100644 (file)
@@ -270,14 +270,15 @@ int inet_getsockopt(struct socket *sock, int level, int optname,
 
 static int inet_autobind(struct sock *sk)
 {
+       struct inet_opt *inet = inet_sk(sk);
        /* We may need to bind the socket. */
        lock_sock(sk);
-       if (sk->num == 0) {
+       if (!inet->num) {
                if (sk->prot->get_port(sk, 0) != 0) {
                        release_sock(sk);
                        return -EAGAIN;
                }
-               sk->sport = htons(sk->num);
+               inet->sport = htons(inet->num);
        }
        release_sock(sk);
        return 0;
@@ -397,7 +398,7 @@ static int inet_create(struct socket *sock, int protocol)
        inet = inet_sk(sk);
 
        if (SOCK_RAW == sock->type) {
-               sk->num = protocol;
+               inet->num = protocol;
                if (IPPROTO_RAW == protocol)
                        inet->hdrincl = 1;
        }
@@ -430,13 +431,13 @@ static int inet_create(struct socket *sock, int protocol)
        atomic_inc(&inet_sock_nr);
 #endif
 
-       if (sk->num) {
+       if (inet->num) {
                /* It assumes that any protocol which allows
                 * the user to assign a number at socket
                 * creation time automatically
                 * shares.
                 */
-               sk->sport = htons(sk->num);
+               inet->sport = htons(inet->num);
 
                /* Add to protocol hash chains. */
                sk->prot->hash(sk);
@@ -551,28 +552,27 @@ static int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
 
        /* Check these errors (active socket, double bind). */
        err = -EINVAL;
-       if ((sk->state != TCP_CLOSE)                    ||
-           (sk->num != 0))
+       if (sk->state != TCP_CLOSE || inet->num)
                goto out;
 
-       sk->rcv_saddr = sk->saddr = addr->sin_addr.s_addr;
+       inet->rcv_saddr = inet->saddr = addr->sin_addr.s_addr;
        if (chk_addr_ret == RTN_MULTICAST || chk_addr_ret == RTN_BROADCAST)
-               sk->saddr = 0;  /* Use device */
+               inet->saddr = 0;  /* Use device */
 
        /* Make sure we are allowed to bind here. */
        if (sk->prot->get_port(sk, snum) != 0) {
-               sk->saddr = sk->rcv_saddr = 0;
+               inet->saddr = inet->rcv_saddr = 0;
                err = -EADDRINUSE;
                goto out;
        }
 
-       if (sk->rcv_saddr)
+       if (inet->rcv_saddr)
                sk->userlocks |= SOCK_BINDADDR_LOCK;
        if (snum)
                sk->userlocks |= SOCK_BINDPORT_LOCK;
-       sk->sport = htons(sk->num);
-       sk->daddr = 0;
-       sk->dport = 0;
+       inet->sport = htons(inet->num);
+       inet->daddr = 0;
+       inet->dport = 0;
        sk_dst_reset(sk);
        err = 0;
 out:
@@ -588,7 +588,7 @@ int inet_dgram_connect(struct socket *sock, struct sockaddr * uaddr,
        if (uaddr->sa_family == AF_UNSPEC)
                return sk->prot->disconnect(sk, flags);
 
-       if (sk->num==0 && inet_autobind(sk) != 0)
+       if (!inet_sk(sk)->num && inet_autobind(sk))
                return -EAGAIN;
        return sk->prot->connect(sk, (struct sockaddr *)uaddr, addr_len);
 }
@@ -627,6 +627,7 @@ int inet_stream_connect(struct socket *sock, struct sockaddr * uaddr,
                        int addr_len, int flags)
 {
        struct sock *sk=sock->sk;
+       struct inet_opt *inet = inet_sk(sk);
        int err;
        long timeo;
 
@@ -655,10 +656,10 @@ int inet_stream_connect(struct socket *sock, struct sockaddr * uaddr,
                        goto out;
 
                err = -EAGAIN;
-               if (sk->num == 0) {
+               if (!inet->num) {
                        if (sk->prot->get_port(sk, 0) != 0)
                                goto out;
-                       sk->sport = htons(sk->num);
+                       inet->sport = htons(inet->num);
                }
 
                err = sk->prot->connect(sk, uaddr, addr_len);
@@ -748,21 +749,22 @@ static int inet_getname(struct socket *sock, struct sockaddr *uaddr,
                 int *uaddr_len, int peer)
 {
        struct sock *sk         = sock->sk;
+       struct inet_opt *inet   = inet_sk(sk);
        struct sockaddr_in *sin = (struct sockaddr_in *)uaddr;
   
        sin->sin_family = AF_INET;
        if (peer) {
-               if (!sk->dport)
+               if (!inet->dport)
                        return -ENOTCONN;
                if (((1<<sk->state)&(TCPF_CLOSE|TCPF_SYN_SENT)) && peer == 1)
                        return -ENOTCONN;
-               sin->sin_port = sk->dport;
-               sin->sin_addr.s_addr = sk->daddr;
+               sin->sin_port = inet->dport;
+               sin->sin_addr.s_addr = inet->daddr;
        } else {
-               __u32 addr = sk->rcv_saddr;
+               __u32 addr = inet->rcv_saddr;
                if (!addr)
-                       addr = sk->saddr;
-               sin->sin_port = sk->sport;
+                       addr = inet->saddr;
+               sin->sin_port = inet->sport;
                sin->sin_addr.s_addr = addr;
        }
        *uaddr_len = sizeof(*sin);
@@ -792,7 +794,7 @@ int inet_sendmsg(struct socket *sock, struct msghdr *msg, int size,
        struct sock *sk = sock->sk;
 
        /* We may need to bind the socket. */
-       if (sk->num==0 && inet_autobind(sk) != 0)
+       if (!inet_sk(sk)->num && inet_autobind(sk))
                return -EAGAIN;
 
        return sk->prot->sendmsg(sk, msg, size);
index 6cafdab00560362b04e387595307a806d5695ced..3f93680cc5fe858a5c8b6ac56231922e289d815a 100644 (file)
@@ -166,7 +166,7 @@ int ip_call_ra_chain(struct sk_buff *skb)
                /* If socket is bound to an interface, only report
                 * the packet if it came  from that interface.
                 */
-               if (sk && sk->num == protocol 
+               if (sk && inet_sk(sk)->num == protocol 
                    && ((sk->bound_dev_if == 0) 
                        || (sk->bound_dev_if == skb->dev->ifindex))) {
                        if (skb->nh.iph->frag_off & htons(IP_MF|IP_OFFSET)) {
index c6a27ffabb9e5208810f3cc554d9cd83ab725874..b5d4485d08f2256849b533d6e3e7e510e39f77ba 100644 (file)
@@ -360,7 +360,7 @@ int ip_queue_xmit(struct sk_buff *skb)
                u32 daddr;
 
                /* Use correct destination address if we have options. */
-               daddr = sk->daddr;
+               daddr = inet->daddr;
                if(opt && opt->srr)
                        daddr = opt->faddr;
 
@@ -368,7 +368,7 @@ int ip_queue_xmit(struct sk_buff *skb)
                 * keep trying until route appears or the connection times itself
                 * out.
                 */
-               if (ip_route_output(&rt, daddr, sk->saddr,
+               if (ip_route_output(&rt, daddr, inet->saddr,
                                    RT_CONN_FLAGS(sk),
                                    sk->bound_dev_if))
                        goto no_route;
@@ -395,7 +395,7 @@ packet_routed:
 
        if(opt && opt->optlen) {
                iph->ihl += opt->optlen >> 2;
-               ip_options_build(skb, opt, sk->daddr, rt, 0);
+               ip_options_build(skb, opt, inet->daddr, rt, 0);
        }
 
        return NF_HOOK(PF_INET, NF_IP_LOCAL_OUT, skb, NULL, rt->u.dst.dev,
@@ -471,7 +471,7 @@ static int ip_build_xmit_slow(struct sock *sk,
        }
 
        if (length + fragheaderlen > 0xFFFF) {
-               ip_local_error(sk, EMSGSIZE, rt->rt_dst, sk->dport, mtu);
+               ip_local_error(sk, EMSGSIZE, rt->rt_dst, inet->dport, mtu);
                return -EMSGSIZE;
        }
 
@@ -503,7 +503,7 @@ static int ip_build_xmit_slow(struct sock *sk,
         */
 
        if (offset > 0 && inet->pmtudisc == IP_PMTUDISC_DO) { 
-               ip_local_error(sk, EMSGSIZE, rt->rt_dst, sk->dport, mtu);
+               ip_local_error(sk, EMSGSIZE, rt->rt_dst, inet->dport, mtu);
                return -EMSGSIZE;
        }
        if (flags&MSG_PROBE)
@@ -659,7 +659,8 @@ int ip_build_xmit(struct sock *sk,
                        return ip_build_xmit_slow(sk,getfrag,frag,length,ipc,rt,flags); 
        } else {
                if (length > rt->u.dst.dev->mtu) {
-                       ip_local_error(sk, EMSGSIZE, rt->rt_dst, sk->dport, rt->u.dst.dev->mtu);
+                       ip_local_error(sk, EMSGSIZE, rt->rt_dst, inet->dport,
+                                      rt->u.dst.dev->mtu);
                        return -EMSGSIZE;
                }
        }
index 135b3235f840a26e1864e94998064d5bda9089cf..ffd85dc5870b6c2fa9e10026e2200bbbd77609cf 100644 (file)
@@ -193,7 +193,7 @@ int ip_ra_control(struct sock *sk, unsigned char on, void (*destructor)(struct s
 {
        struct ip_ra_chain *ra, *new_ra, **rap;
 
-       if (sk->type != SOCK_RAW || sk->num == IPPROTO_RAW)
+       if (sk->type != SOCK_RAW || inet_sk(sk)->num == IPPROTO_RAW)
                return -EINVAL;
 
        new_ra = on ? kmalloc(sizeof(*new_ra), GFP_KERNEL) : NULL;
@@ -435,7 +435,7 @@ int ip_setsockopt(struct sock *sk, int level, int optname, char *optval, int opt
 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
                                if (sk->family == PF_INET ||
                                    (!((1<<sk->state)&(TCPF_LISTEN|TCPF_CLOSE))
-                                    && sk->daddr != LOOPBACK4_IPV6)) {
+                                    && inet->daddr != LOOPBACK4_IPV6)) {
 #endif
                                        if (opt)
                                                tp->ext_header_len = opt->optlen;
@@ -771,8 +771,8 @@ int ip_getsockopt(struct sock *sk, int level, int optname, char *optval, int *op
                        if (inet->cmsg_flags & IP_CMSG_PKTINFO) {
                                struct in_pktinfo info;
 
-                               info.ipi_addr.s_addr = sk->rcv_saddr;
-                               info.ipi_spec_dst.s_addr = sk->rcv_saddr;
+                               info.ipi_addr.s_addr = inet->rcv_saddr;
+                               info.ipi_spec_dst.s_addr = inet->rcv_saddr;
                                info.ipi_ifindex = inet->mc_index;
                                put_cmsg(&msg, SOL_IP, IP_PKTINFO, sizeof(info), &info);
                        }
index 97f23d5c4a0c37a6787cdfc58703aeb8d46f47e5..41c893ed78bdd7cff9fbecd84fefa7dda8dbab53 100644 (file)
@@ -969,9 +969,12 @@ ip_ct_selective_cleanup(int (*kill)(const struct ip_conntrack *i, void *data),
 static int
 getorigdst(struct sock *sk, int optval, void *user, int *len)
 {
+       struct inet_opt *inet = inet_sk(sk);
        struct ip_conntrack_tuple_hash *h;
-       struct ip_conntrack_tuple tuple = { { sk->rcv_saddr, { sk->sport } },
-                                           { sk->daddr, { sk->dport },
+       struct ip_conntrack_tuple tuple = { { inet->rcv_saddr,
+                                               { inet->sport } },
+                                           { inet->daddr,
+                                               { inet->dport },
                                              IPPROTO_TCP } };
 
        /* We only do TCP at the moment: is there a better way? */
index 49c1c6db38f1567ecf18d8ab393a4c82613d04d7..1c798bdd94144cf5f2e9bbb90c5c38d9c8fe76e5 100644 (file)
@@ -70,7 +70,8 @@ rwlock_t raw_v4_lock = RW_LOCK_UNLOCKED;
 
 static void raw_v4_hash(struct sock *sk)
 {
-       struct sock **skp = &raw_v4_htable[sk->num & (RAWV4_HTABLE_SIZE - 1)];
+       struct sock **skp = &raw_v4_htable[inet_sk(sk)->num &
+                                          (RAWV4_HTABLE_SIZE - 1)];
 
        write_lock_bh(&raw_v4_lock);
        if ((sk->next = *skp) != NULL)
@@ -103,9 +104,11 @@ struct sock *__raw_v4_lookup(struct sock *sk, unsigned short num,
        struct sock *s = sk;
 
        for (s = sk; s; s = s->next) {
-               if (s->num == num                               &&
-                   !(s->daddr && s->daddr != raddr)            &&
-                   !(s->rcv_saddr && s->rcv_saddr != laddr)    &&
+               struct inet_opt *inet = inet_sk(s);
+
+               if (inet->num == num                                    &&
+                   !(inet->daddr && inet->daddr != raddr)              &&
+                   !(inet->rcv_saddr && inet->rcv_saddr != laddr)      &&
                    !(s->bound_dev_if && s->bound_dev_if != dif))
                        break; /* gotcha */
        }
@@ -364,10 +367,10 @@ static int raw_sendmsg(struct sock *sk, struct msghdr *msg, int len)
                err = -EINVAL;
                if (sk->state != TCP_ESTABLISHED) 
                        goto out;
-               daddr = sk->daddr;
+               daddr = inet->daddr;
        }
 
-       ipc.addr = sk->saddr;
+       ipc.addr = inet->saddr;
        ipc.opt = NULL;
        ipc.oif = sk->bound_dev_if;
 
@@ -458,6 +461,7 @@ static void raw_close(struct sock *sk, long timeout)
 /* This gets rid of all the nasties in af_inet. -DaveM */
 static int raw_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len)
 {
+       struct inet_opt *inet = inet_sk(sk);
        struct sockaddr_in *addr = (struct sockaddr_in *) uaddr;
        int ret = -EINVAL;
        int chk_addr_ret;
@@ -469,9 +473,9 @@ static int raw_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len)
        if (addr->sin_addr.s_addr && chk_addr_ret != RTN_LOCAL &&
            chk_addr_ret != RTN_MULTICAST && chk_addr_ret != RTN_BROADCAST)
                goto out;
-       sk->rcv_saddr = sk->saddr = addr->sin_addr.s_addr;
+       inet->rcv_saddr = inet->saddr = addr->sin_addr.s_addr;
        if (chk_addr_ret == RTN_MULTICAST || chk_addr_ret == RTN_BROADCAST)
-               sk->saddr = 0;  /* Use device */
+               inet->saddr = 0;  /* Use device */
        sk_dst_reset(sk);
        ret = 0;
 out:   return ret;
@@ -534,7 +538,7 @@ out:        return err ? : copied;
 static int raw_init(struct sock *sk)
 {
        struct raw_opt *tp = raw4_sk(sk);
-       if (sk->num == IPPROTO_ICMP)
+       if (inet_sk(sk)->num == IPPROTO_ICMP)
                memset(&tp->filter, 0, sizeof(tp->filter));
        return 0;
 }
@@ -574,7 +578,7 @@ static int raw_setsockopt(struct sock *sk, int level, int optname,
                return ip_setsockopt(sk, level, optname, optval, optlen);
 
        if (optname == ICMP_FILTER) {
-               if (sk->num != IPPROTO_ICMP)
+               if (inet_sk(sk)->num != IPPROTO_ICMP)
                        return -EOPNOTSUPP;
                else
                        return raw_seticmpfilter(sk, optval, optlen);
@@ -589,7 +593,7 @@ static int raw_getsockopt(struct sock *sk, int level, int optname,
                return ip_getsockopt(sk, level, optname, optval, optlen);
 
        if (optname == ICMP_FILTER) {
-               if (sk->num != IPPROTO_ICMP)
+               if (inet_sk(sk)->num != IPPROTO_ICMP)
                        return -EOPNOTSUPP;
                else
                        return raw_geticmpfilter(sk, optval, optlen);
@@ -627,10 +631,11 @@ static int raw_ioctl(struct sock *sk, int cmd, unsigned long arg)
 
 static void get_raw_sock(struct sock *sp, char *tmpbuf, int i)
 {
-       unsigned int dest = sp->daddr,
-                    src = sp->rcv_saddr;
+       struct inet_opt *inet = inet_sk(sp);
+       unsigned int dest = inet->daddr,
+                    src = inet->rcv_saddr;
        __u16 destp = 0,
-             srcp  = sp->num;
+             srcp  = inet->num;
 
        sprintf(tmpbuf, "%4d: %08X:%04X %08X:%04X"
                " %02X %08X:%08X %02X:%08lX %08X %5d %8d %ld %d %p",
index 0d8366237ee8c6929da046d2d2f95dcf00948929..286c18ca2ee48ca7cdf12af8912ab0f51ebe4c7d 100644 (file)
@@ -524,6 +524,7 @@ int tcp_ioctl(struct sock *sk, int cmd, unsigned long arg)
 
 int tcp_listen_start(struct sock *sk)
 {
+       struct inet_opt *inet = inet_sk(sk);
        struct tcp_opt *tp = tcp_sk(sk);
        struct tcp_listen_opt *lopt;
 
@@ -552,8 +553,8 @@ int tcp_listen_start(struct sock *sk)
         * after validation is complete.
         */
        sk->state = TCP_LISTEN;
-       if (sk->prot->get_port(sk, sk->num) == 0) {
-               sk->sport = htons(sk->num);
+       if (!sk->prot->get_port(sk, inet->num)) {
+               inet->sport = htons(inet->num);
 
                sk_dst_reset(sk);
                sk->prot->hash(sk);
@@ -1786,8 +1787,8 @@ void tcp_destroy_sock(struct sock *sk)
        /* It cannot be in hash table! */
        BUG_TRAP(sk->pprev==NULL);
 
-       /* If it has not 0 sk->num, it must be bound */
-       BUG_TRAP(!sk->num || sk->prev!=NULL);
+       /* If it has not 0 inet_sk(sk)->num, it must be bound */
+       BUG_TRAP(!inet_sk(sk)->num || sk->prev);
 
 #ifdef TCP_DEBUG
        if (sk->zapped) {
@@ -1988,6 +1989,7 @@ extern __inline__ int tcp_need_reset(int state)
 
 int tcp_disconnect(struct sock *sk, int flags)
 {
+       struct inet_opt *inet = inet_sk(sk);
        struct tcp_opt *tp = tcp_sk(sk);
        int old_state;
        int err = 0;
@@ -2015,11 +2017,10 @@ int tcp_disconnect(struct sock *sk, int flags)
        tcp_writequeue_purge(sk);
        __skb_queue_purge(&tp->out_of_order_queue);
 
-       sk->dport = 0;
+       inet->dport = 0;
 
        if (!(sk->userlocks&SOCK_BINDADDR_LOCK)) {
-               sk->rcv_saddr = 0;
-               sk->saddr = 0;
+               inet->rcv_saddr = inet->saddr = 0;
 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
                if (sk->family == PF_INET6) {
                        struct ipv6_pinfo *np = inet6_sk(sk);
@@ -2049,7 +2050,7 @@ int tcp_disconnect(struct sock *sk, int flags)
        tcp_sack_reset(tp);
        __sk_dst_reset(sk);
 
-       BUG_TRAP(!sk->num || sk->prev);
+       BUG_TRAP(!inet->num || sk->prev);
 
        sk->error_report(sk);
        return err;
index e84d336e8fac23763099a4dbb8cd08f7a9ef1314..a2248dc5b948199650a8436a8defd5626f250c7e 100644 (file)
@@ -44,6 +44,7 @@ static struct sock *tcpnl;
 static int tcpdiag_fill(struct sk_buff *skb, struct sock *sk,
                        int ext, u32 pid, u32 seq)
 {
+       struct inet_opt *inet = inet_sk(sk);
        struct tcp_opt *tp = tcp_sk(sk);
        struct tcpdiagmsg *r;
        struct nlmsghdr  *nlh;
@@ -64,10 +65,6 @@ static int tcpdiag_fill(struct sk_buff *skb, struct sock *sk,
        r->tcpdiag_timer = 0;
        r->tcpdiag_retrans = 0;
 
-       r->id.tcpdiag_sport = sk->sport;
-       r->id.tcpdiag_dport = sk->dport;
-       r->id.tcpdiag_src[0] = sk->rcv_saddr;
-       r->id.tcpdiag_dst[0] = sk->daddr;
        r->id.tcpdiag_if = sk->bound_dev_if;
        *((struct sock **)&r->id.tcpdiag_cookie) = sk;
 
@@ -77,6 +74,10 @@ static int tcpdiag_fill(struct sk_buff *skb, struct sock *sk,
                if (tmo < 0)
                        tmo = 0;
 
+               r->id.tcpdiag_sport = tw->sport;
+               r->id.tcpdiag_dport = tw->dport;
+               r->id.tcpdiag_src[0] = tw->rcv_saddr;
+               r->id.tcpdiag_dst[0] = tw->daddr;
                r->tcpdiag_state = tw->substate;
                r->tcpdiag_timer = 3;
                r->tcpdiag_expires = (tmo*1000+HZ-1)/HZ;
@@ -94,6 +95,11 @@ static int tcpdiag_fill(struct sk_buff *skb, struct sock *sk,
                return skb->len;
        }
 
+       r->id.tcpdiag_sport = inet->sport;
+       r->id.tcpdiag_dport = inet->dport;
+       r->id.tcpdiag_src[0] = inet->rcv_saddr;
+       r->id.tcpdiag_dst[0] = inet->daddr;
+
 #ifdef CONFIG_IPV6
        if (r->tcpdiag_family == AF_INET6) {
                struct ipv6_pinfo *np = inet6_sk(sk);
@@ -291,6 +297,7 @@ int tcpdiag_bc_run(char *bc, int len, struct sock *sk)
 {
        while (len > 0) {
                int yes = 1;
+               struct inet_opt *inet = inet_sk(sk);
                struct tcpdiag_bc_op *op = (struct tcpdiag_bc_op*)bc;
 
                switch (op->code) {
@@ -300,16 +307,16 @@ int tcpdiag_bc_run(char *bc, int len, struct sock *sk)
                        yes = 0;
                        break;
                case TCPDIAG_BC_S_GE:
-                       yes = (sk->num >= op[1].no);
+                       yes = inet->num >= op[1].no;
                        break;
                case TCPDIAG_BC_S_LE:
-                       yes = (sk->num <= op[1].no);
+                       yes = inet->num <= op[1].no;
                        break;
                case TCPDIAG_BC_D_GE:
-                       yes = (ntohs(sk->dport) >= op[1].no);
+                       yes = ntohs(inet->dport) >= op[1].no;
                        break;
                case TCPDIAG_BC_D_LE:
-                       yes = (ntohs(sk->dport) <= op[1].no);
+                       yes = ntohs(inet->dport) <= op[1].no;
                        break;
                case TCPDIAG_BC_AUTO:
                        yes = !(sk->userlocks&SOCK_BINDPORT_LOCK);
@@ -321,7 +328,8 @@ int tcpdiag_bc_run(char *bc, int len, struct sock *sk)
                        u32 *addr;
 
                        if (cond->port != -1 &&
-                           cond->port != (op->code == TCPDIAG_BC_S_COND ? sk->num : ntohs(sk->dport))) {
+                           cond->port != (op->code == TCPDIAG_BC_S_COND ?
+                                            inet->num : ntohs(inet->dport))) {
                                yes = 0;
                                break;
                        }
@@ -341,9 +349,9 @@ int tcpdiag_bc_run(char *bc, int len, struct sock *sk)
 #endif
                        {
                                if (op->code == TCPDIAG_BC_S_COND)
-                                       addr = &sk->rcv_saddr;
+                                       addr = &inet->rcv_saddr;
                                else
-                                       addr = &sk->daddr;
+                                       addr = &inet->daddr;
                        }
 
                        if (bitstring_match(addr, cond->addr, cond->prefix_len))
@@ -453,12 +461,14 @@ int tcpdiag_dump(struct sk_buff *skb, struct netlink_callback *cb)
                        for (sk = tcp_listening_hash[i], num = 0;
                             sk != NULL;
                             sk = sk->next, num++) {
+                               struct inet_opt *inet = inet_sk(sk);
                                if (num < s_num)
                                        continue;
                                if (!(r->tcpdiag_states&TCPF_LISTEN) ||
                                    r->id.tcpdiag_dport)
                                        continue;
-                               if (r->id.tcpdiag_sport != sk->sport && r->id.tcpdiag_sport)
+                               if (r->id.tcpdiag_sport != inet->sport &&
+                                   r->id.tcpdiag_sport)
                                        continue;
                                if (bc && !tcpdiag_bc_run(RTA_DATA(bc), RTA_PAYLOAD(bc), sk))
                                        continue;
@@ -491,13 +501,16 @@ skip_listen_ht:
                for (sk = head->chain, num = 0;
                     sk != NULL;
                     sk = sk->next, num++) {
+                       struct inet_opt *inet = inet_sk(sk);
+
                        if (num < s_num)
                                continue;
                        if (!(r->tcpdiag_states&(1<<sk->state)))
                                continue;
-                       if (r->id.tcpdiag_sport != sk->sport && r->id.tcpdiag_sport)
+                       if (r->id.tcpdiag_sport != inet->sport &&
+                           r->id.tcpdiag_sport)
                                continue;
-                       if (r->id.tcpdiag_dport != sk->dport && r->id.tcpdiag_dport)
+                       if (r->id.tcpdiag_dport != inet->dport && r->id.tcpdiag_dport)
                                continue;
                        if (bc && !tcpdiag_bc_run(RTA_DATA(bc), RTA_PAYLOAD(bc), sk))
                                continue;
@@ -513,13 +526,17 @@ skip_listen_ht:
                        for (sk = tcp_ehash[i+tcp_ehash_size].chain;
                             sk != NULL;
                             sk = sk->next, num++) {
+                               struct inet_opt *inet = inet_sk(sk);
+
                                if (num < s_num)
                                        continue;
                                if (!(r->tcpdiag_states&(1<<sk->zapped)))
                                        continue;
-                               if (r->id.tcpdiag_sport != sk->sport && r->id.tcpdiag_sport)
+                               if (r->id.tcpdiag_sport != inet->sport &&
+                                   r->id.tcpdiag_sport)
                                        continue;
-                               if (r->id.tcpdiag_dport != sk->dport && r->id.tcpdiag_dport)
+                               if (r->id.tcpdiag_dport != inet->dport &&
+                                   r->id.tcpdiag_dport)
                                        continue;
                                if (bc && !tcpdiag_bc_run(RTA_DATA(bc), RTA_PAYLOAD(bc), sk))
                                        continue;
index d8643a594a7cb71dd1e8941b7ff8419bcf2ddbda..a397d84e00447e4183dde642c23db14b9316517a 100644 (file)
@@ -1329,9 +1329,10 @@ static __inline__ int tcp_packet_delayed(struct tcp_opt *tp)
 #if FASTRETRANS_DEBUG > 1
 static void DBGUNDO(struct sock *sk, struct tcp_opt *tp, const char *msg)
 {
+       struct inet_opt *inet = inet_sk(sk);
        printk(KERN_DEBUG "Undo %s %u.%u.%u.%u/%u c%u l%u ss%u/%u p%u\n",
               msg,
-              NIPQUAD(sk->daddr), ntohs(sk->dport),
+              NIPQUAD(inet->daddr), ntohs(inet->dport),
               tp->snd_cwnd, tp->left_out,
               tp->snd_ssthresh, tp->prior_ssthresh, tp->packets_out);
 }
@@ -2570,15 +2571,12 @@ static void tcp_data_queue(struct sock *sk, struct sk_buff *skb)
                        __set_current_state(TASK_RUNNING);
 
                        local_bh_enable();
-                       if (skb_copy_datagram_iovec(skb, 0, tp->ucopy.iov,
-                                                   chunk)) {
-                               sk->err = EFAULT;
-                               sk->error_report(sk);
+                       if (!skb_copy_datagram_iovec(skb, 0, tp->ucopy.iov, chunk)) {
+                               tp->ucopy.len -= chunk;
+                               tp->copied_seq += chunk;
+                               eaten = (chunk == skb->len && !th->fin);
                        }
                        local_bh_disable();
-                       tp->ucopy.len -= chunk;
-                       tp->copied_seq += chunk;
-                       eaten = (chunk == skb->len && !th->fin);
                }
 
                if (eaten <= 0) {
@@ -3178,17 +3176,8 @@ static int tcp_copy_to_iovec(struct sock *sk, struct sk_buff *skb, int hlen)
                                                       tp->ucopy.iov);
 
        if (!err) {
-update:
-               tp->ucopy.len  -= chunk;
+               tp->ucopy.len -= chunk;
                tp->copied_seq += chunk;
-               local_bh_disable();
-               return 0;
-       }
-
-       if (err == -EFAULT) {
-               sk->err = EFAULT;
-               sk->error_report(sk);
-               goto update;
        }
 
        local_bh_disable();
@@ -3327,19 +3316,16 @@ int tcp_rcv_established(struct sock *sk, struct sk_buff *skb,
                            tp->copied_seq == tp->rcv_nxt &&
                            len - tcp_header_len <= tp->ucopy.len &&
                            sk->lock.users) {
-                               eaten = 1;
-
-                               NET_INC_STATS_BH(TCPHPHitsToUser);
-
                                __set_current_state(TASK_RUNNING);
 
-                               if (tcp_copy_to_iovec(sk, skb, tcp_header_len))
-                                       goto csum_error;
-
-                               __skb_pull(skb,tcp_header_len);
-
-                               tp->rcv_nxt = TCP_SKB_CB(skb)->end_seq;
-                       } else {
+                               if (!tcp_copy_to_iovec(sk, skb, tcp_header_len)) {
+                                       __skb_pull(skb, tcp_header_len);
+                                       tp->rcv_nxt = TCP_SKB_CB(skb)->end_seq;
+                                       NET_INC_STATS_BH(TCPHPHitsToUser);
+                                       eaten = 1;
+                               }
+                       }
+                       if (!eaten) {
                                if (tcp_checksum_complete_user(sk, skb))
                                        goto csum_error;
 
index 41648df322c6a20e8aca137442d305c317740539..b7049e4294afbc2ad981c7ee3043bb97860a625a 100644 (file)
@@ -109,10 +109,11 @@ static __inline__ int tcp_hashfn(__u32 laddr, __u16 lport,
 
 static __inline__ int tcp_sk_hashfn(struct sock *sk)
 {
-       __u32 laddr = sk->rcv_saddr;
-       __u16 lport = sk->num;
-       __u32 faddr = sk->daddr;
-       __u16 fport = sk->dport;
+       struct inet_opt *inet = inet_sk(sk);
+       __u32 laddr = inet->rcv_saddr;
+       __u16 lport = inet->num;
+       __u32 faddr = inet->daddr;
+       __u16 fport = inet->dport;
 
        return tcp_hashfn(laddr, lport, faddr, fport);
 }
@@ -141,7 +142,8 @@ struct tcp_bind_bucket *tcp_bucket_create(struct tcp_bind_hashbucket *head,
 /* Caller must disable local BH processing. */
 static __inline__ void __tcp_inherit_port(struct sock *sk, struct sock *child)
 {
-       struct tcp_bind_hashbucket *head = &tcp_bhash[tcp_bhashfn(child->num)];
+       struct tcp_bind_hashbucket *head =
+                               &tcp_bhash[tcp_bhashfn(inet_sk(child)->num)];
        struct tcp_bind_bucket *tb;
 
        spin_lock(&head->lock);
@@ -163,7 +165,7 @@ __inline__ void tcp_inherit_port(struct sock *sk, struct sock *child)
 
 static inline void tcp_bind_hash(struct sock *sk, struct tcp_bind_bucket *tb, unsigned short snum) 
 { 
-       sk->num = snum; 
+       inet_sk(sk)->num = snum; 
        if ((sk->bind_next = tb->owners) != NULL)
                tb->owners->bind_pprev = &sk->bind_next;
        tb->owners = sk;
@@ -173,6 +175,7 @@ static inline void tcp_bind_hash(struct sock *sk, struct tcp_bind_bucket *tb, un
 
 static inline int tcp_bind_conflict(struct sock *sk, struct tcp_bind_bucket *tb)
 { 
+       struct inet_opt *inet = inet_sk(sk);
        struct sock *sk2 = tb->owners;
        int sk_reuse = sk->reuse;
        
@@ -182,9 +185,10 @@ static inline int tcp_bind_conflict(struct sock *sk, struct tcp_bind_bucket *tb)
                        if (!sk_reuse   ||
                            !sk2->reuse ||
                            sk2->state == TCP_LISTEN) {
-                               if (!sk2->rcv_saddr     ||
-                                   !sk->rcv_saddr      ||
-                                   (sk2->rcv_saddr == sk->rcv_saddr))
+                               struct inet_opt *inet2 = inet_sk(sk2);
+                               if (!inet2->rcv_saddr   ||
+                                   !inet->rcv_saddr    ||
+                                   (inet2->rcv_saddr == inet->rcv_saddr))
                                        break;
                        }
                }
@@ -281,7 +285,8 @@ fail:
  */
 __inline__ void __tcp_put_port(struct sock *sk)
 {
-       struct tcp_bind_hashbucket *head = &tcp_bhash[tcp_bhashfn(sk->num)];
+       struct inet_opt *inet = inet_sk(sk);
+       struct tcp_bind_hashbucket *head = &tcp_bhash[tcp_bhashfn(inet->num)];
        struct tcp_bind_bucket *tb;
 
        spin_lock(&head->lock);
@@ -290,7 +295,7 @@ __inline__ void __tcp_put_port(struct sock *sk)
                sk->bind_next->bind_pprev = sk->bind_pprev;
        *(sk->bind_pprev) = sk->bind_next;
        sk->prev = NULL;
-       sk->num = 0;
+       inet->num = 0;
        if (tb->owners == NULL) {
                if (tb->next)
                        tb->next->pprev = tb->pprev;
@@ -409,8 +414,10 @@ static struct sock *__tcp_v4_lookup_listener(struct sock *sk, u32 daddr, unsigne
 
        hiscore=0;
        for(; sk; sk = sk->next) {
-               if(sk->num == hnum) {
-                       __u32 rcv_saddr = sk->rcv_saddr;
+               struct inet_opt *inet = inet_sk(sk);
+
+               if(inet->num == hnum) {
+                       __u32 rcv_saddr = inet->rcv_saddr;
 
                        score = 1;
                        if(rcv_saddr) {
@@ -442,9 +449,11 @@ __inline__ struct sock *tcp_v4_lookup_listener(u32 daddr, unsigned short hnum, i
        read_lock(&tcp_lhash_lock);
        sk = tcp_listening_hash[tcp_lhashfn(hnum)];
        if (sk) {
-               if (sk->num == hnum &&
+               struct inet_opt *inet = inet_sk(sk);
+
+               if (inet->num == hnum &&
                    sk->next == NULL &&
-                   (!sk->rcv_saddr || sk->rcv_saddr == daddr) &&
+                   (!inet->rcv_saddr || inet->rcv_saddr == daddr) &&
                    !sk->bound_dev_if)
                        goto sherry_cache;
                sk = __tcp_v4_lookup_listener(sk, daddr, hnum, dif);
@@ -531,12 +540,13 @@ static inline __u32 tcp_v4_init_sequence(struct sock *sk, struct sk_buff *skb)
 
 static int tcp_v4_check_established(struct sock *sk)
 {
-       u32 daddr = sk->rcv_saddr;
-       u32 saddr = sk->daddr;
+       struct inet_opt *inet = inet_sk(sk);
+       u32 daddr = inet->rcv_saddr;
+       u32 saddr = inet->daddr;
        int dif = sk->bound_dev_if;
        TCP_V4_ADDR_COOKIE(acookie, saddr, daddr)
-       __u32 ports = TCP_COMBINED_PORTS(sk->dport, sk->num);
-       int hash = tcp_hashfn(daddr, sk->num, saddr, sk->dport);
+       __u32 ports = TCP_COMBINED_PORTS(inet->dport, inet->num);
+       int hash = tcp_hashfn(daddr, inet->num, saddr, inet->dport);
        struct tcp_ehash_bucket *head = &tcp_ehash[hash];
        struct sock *sk2, **skp;
        struct tcp_tw_bucket *tw;
@@ -625,7 +635,7 @@ not_unique:
 
 int tcp_v4_hash_connecting(struct sock *sk)
 {
-       unsigned short snum = sk->num;
+       unsigned short snum = inet_sk(sk)->num;
        struct tcp_bind_hashbucket *head = &tcp_bhash[tcp_bhashfn(snum)];
        struct tcp_bind_bucket *tb = (struct tcp_bind_bucket *)sk->prev;
 
@@ -667,7 +677,7 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
                nexthop = inet->opt->faddr;
        }
 
-       tmp = ip_route_connect(&rt, nexthop, sk->saddr,
+       tmp = ip_route_connect(&rt, nexthop, inet->saddr,
                               RT_CONN_FLAGS(sk), sk->bound_dev_if);
        if (tmp < 0)
                return tmp;
@@ -689,11 +699,11 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
        if (buff == NULL)
                goto failure;
 
-       if (!sk->saddr)
-               sk->saddr = rt->rt_src;
-       sk->rcv_saddr = sk->saddr;
+       if (!inet->saddr)
+               inet->saddr = rt->rt_src;
+       inet->rcv_saddr = inet->saddr;
 
-       if (tp->ts_recent_stamp && sk->daddr != daddr) {
+       if (tp->ts_recent_stamp && inet->daddr != daddr) {
                /* Reset inherited state */
                tp->ts_recent       = 0;
                tp->ts_recent_stamp = 0;
@@ -716,12 +726,13 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
                }
        }
 
-       sk->dport = usin->sin_port;
-       sk->daddr = daddr;
+       inet->dport = usin->sin_port;
+       inet->daddr = daddr;
 
        if (!tp->write_seq)
-               tp->write_seq = secure_tcp_sequence_number(sk->saddr, sk->daddr,
-                                                          sk->sport,
+               tp->write_seq = secure_tcp_sequence_number(inet->saddr,
+                                                          inet->daddr,
+                                                          inet->sport,
                                                           usin->sin_port);
 
        tp->ext_header_len = 0;
@@ -738,7 +749,7 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
 failure:
        __sk_dst_reset(sk);
        sk->route_caps = 0;
-       sk->dport = 0;
+       inet->dport = 0;
        return err;
 }
 
@@ -1018,11 +1029,13 @@ out:
 void tcp_v4_send_check(struct sock *sk, struct tcphdr *th, int len, 
                       struct sk_buff *skb)
 {
+       struct inet_opt *inet = inet_sk(sk);
+
        if (skb->ip_summed == CHECKSUM_HW) {
-               th->check = ~tcp_v4_check(th, len, sk->saddr, sk->daddr, 0);
+               th->check = ~tcp_v4_check(th, len, inet->saddr, inet->daddr, 0);
                skb->csum = offsetof(struct tcphdr, check);
        } else {
-               th->check = tcp_v4_check(th, len, sk->saddr, sk->daddr,
+               th->check = tcp_v4_check(th, len, inet->saddr, inet->daddr,
                                         csum_partial((char *)th, th->doff<<2, skb->csum));
        }
 }
@@ -1448,10 +1461,10 @@ struct sock * tcp_v4_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
        newsk->route_caps = dst->dev->features;
 
        newtp = tcp_sk(newsk);
-       newsk->daddr = req->af.v4_req.rmt_addr;
-       newsk->saddr = req->af.v4_req.loc_addr;
-       newsk->rcv_saddr = req->af.v4_req.loc_addr;
        newinet = inet_sk(newsk);
+       newinet->daddr = req->af.v4_req.rmt_addr;
+       newinet->rcv_saddr = req->af.v4_req.loc_addr;
+       newinet->saddr = req->af.v4_req.loc_addr;
        newinet->opt = req->af.v4_req.opt;
        req->af.v4_req.opt = NULL;
        newinet->mc_index = tcp_v4_iif(skb);
@@ -1736,9 +1749,9 @@ static int tcp_v4_reselect_saddr(struct sock *sk)
        struct inet_opt *inet = inet_sk(sk);
        int err;
        struct rtable *rt;
-       __u32 old_saddr = sk->saddr;
+       __u32 old_saddr = inet->saddr;
        __u32 new_saddr;
-       __u32 daddr = sk->daddr;
+       __u32 daddr = inet->daddr;
 
        if (inet->opt && inet->opt->srr)
                daddr = inet->opt->faddr;
@@ -1759,14 +1772,14 @@ static int tcp_v4_reselect_saddr(struct sock *sk)
                return 0;
 
        if (sysctl_ip_dynaddr > 1) {
-               printk(KERN_INFO "tcp_v4_rebuild_header(): shifting sk->saddr "
-                      "from %d.%d.%d.%d to %d.%d.%d.%d\n",
+               printk(KERN_INFO "tcp_v4_rebuild_header(): shifting inet->"
+                                "saddr from %d.%d.%d.%d to %d.%d.%d.%d\n",
                       NIPQUAD(old_saddr), 
                       NIPQUAD(new_saddr));
        }
 
-       sk->saddr = new_saddr;
-       sk->rcv_saddr = new_saddr;
+       inet->saddr = new_saddr;
+       inet->rcv_saddr = new_saddr;
 
        /* XXX The only one ugly spot where we need to
         * XXX really change the sockets identity after
@@ -1791,11 +1804,11 @@ int tcp_v4_rebuild_header(struct sock *sk)
                return 0;
 
        /* Reroute. */
-       daddr = sk->daddr;
+       daddr = inet->daddr;
        if (inet->opt && inet->opt->srr)
                daddr = inet->opt->faddr;
 
-       err = ip_route_output(&rt, daddr, sk->saddr,
+       err = ip_route_output(&rt, daddr, inet->saddr,
                              RT_CONN_FLAGS(sk), sk->bound_dev_if);
        if (!err) {
                __sk_dst_set(sk, &rt->u.dst);
@@ -1818,10 +1831,11 @@ int tcp_v4_rebuild_header(struct sock *sk)
 static void v4_addr2sockaddr(struct sock *sk, struct sockaddr * uaddr)
 {
        struct sockaddr_in *sin = (struct sockaddr_in *) uaddr;
+       struct inet_opt *inet = inet_sk(sk);
 
        sin->sin_family         = AF_INET;
-       sin->sin_addr.s_addr    = sk->daddr;
-       sin->sin_port           = sk->dport;
+       sin->sin_addr.s_addr    = inet->daddr;
+       sin->sin_port           = inet->dport;
 }
 
 /* VJ's idea. Save last timestamp seen from this destination
@@ -1832,13 +1846,14 @@ static void v4_addr2sockaddr(struct sock *sk, struct sockaddr * uaddr)
 
 int tcp_v4_remember_stamp(struct sock *sk)
 {
+       struct inet_opt *inet = inet_sk(sk);
        struct tcp_opt *tp = tcp_sk(sk);
        struct rtable *rt = (struct rtable*)__sk_dst_get(sk);
        struct inet_peer *peer = NULL;
        int release_it = 0;
 
-       if (rt == NULL || rt->rt_dst != sk->daddr) {
-               peer = inet_getpeer(sk->daddr, 1);
+       if (rt == NULL || rt->rt_dst != inet->daddr) {
+               peer = inet_getpeer(inet->daddr, 1);
                release_it = 1;
        } else {
                if (rt->peer == NULL)
@@ -1979,7 +1994,7 @@ static void get_openreq(struct sock *sk, struct open_request *req, char *tmpbuf,
                " %02X %08X:%08X %02X:%08X %08X %5d %8d %u %d %p",
                i,
                req->af.v4_req.loc_addr,
-               ntohs(sk->sport),
+               ntohs(inet_sk(sk)->sport),
                req->af.v4_req.rmt_addr,
                ntohs(req->rmt_port),
                TCP_SYN_RECV,
@@ -2002,11 +2017,12 @@ static void get_tcp_sock(struct sock *sp, char *tmpbuf, int i)
        int timer_active;
        unsigned long timer_expires;
        struct tcp_opt *tp = tcp_sk(sp);
+       struct inet_opt *inet = inet_sk(sp);
 
-       dest  = sp->daddr;
-       src   = sp->rcv_saddr;
-       destp = ntohs(sp->dport);
-       srcp  = ntohs(sp->sport);
+       dest  = inet->daddr;
+       src   = inet->rcv_saddr;
+       destp = ntohs(inet->dport);
+       srcp  = ntohs(inet->sport);
        if (tp->pending == TCP_TIME_RETRANS) {
                timer_active    = 1;
                timer_expires   = tp->timeout;
index 13a8c587243707e68a85804c587a363e17c62187..16ddbb124bd2f9fa2a7c0a9526a548308c512517 100644 (file)
@@ -327,10 +327,10 @@ static void __tcp_tw_hashdance(struct sock *sk, struct tcp_tw_bucket *tw)
        write_unlock(&ehead->lock);
 
        /* Step 3: Put TW into bind hash. Original socket stays there too.
-          Note, that any socket with sk->num!=0 MUST be bound in binding
-          cache, even if it is closed.
+          Note, that any socket with inet_sk(sk)->num != 0 MUST be bound in
+          binding cache, even if it is closed.
         */
-       bhead = &tcp_bhash[tcp_bhashfn(sk->num)];
+       bhead = &tcp_bhash[tcp_bhashfn(inet_sk(sk)->num)];
        spin_lock(&bhead->lock);
        tw->tb = (struct tcp_bind_bucket *)sk->prev;
        BUG_TRAP(sk->prev!=NULL);
@@ -357,17 +357,18 @@ void tcp_time_wait(struct sock *sk, int state, int timeo)
                tw = kmem_cache_alloc(tcp_timewait_cachep, SLAB_ATOMIC);
 
        if(tw != NULL) {
+               struct inet_opt *inet = inet_sk(sk);
                int rto = (tp->rto<<2) - (tp->rto>>1);
 
                /* Give us an identity. */
-               tw->daddr       = sk->daddr;
-               tw->rcv_saddr   = sk->rcv_saddr;
+               tw->daddr       = inet->daddr;
+               tw->rcv_saddr   = inet->rcv_saddr;
                tw->bound_dev_if= sk->bound_dev_if;
-               tw->num         = sk->num;
+               tw->num         = inet->num;
                tw->state       = TCP_TIME_WAIT;
                tw->substate    = state;
-               tw->sport       = sk->sport;
-               tw->dport       = sk->dport;
+               tw->sport       = inet->sport;
+               tw->dport       = inet->dport;
                tw->family      = sk->family;
                tw->reuse       = sk->reuse;
                tw->rcv_wscale  = tp->rcv_wscale;
@@ -660,7 +661,7 @@ struct sock *tcp_create_openreq_child(struct sock *sk, struct open_request *req,
                newsk->prev = NULL;
 
                /* Clone the TCP header template */
-               newsk->dport = req->rmt_port;
+               inet_sk(newsk)->dport = req->rmt_port;
 
                sock_lock_init(newsk);
                bh_lock_sock(newsk);
index 7035069014eeb848f3ca13c8044c83ba813d7666..71b406306d247672c873b9a97f95d0339e9de1f1 100644 (file)
@@ -188,6 +188,7 @@ static __inline__ u16 tcp_select_window(struct sock *sk)
 int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb)
 {
        if(skb != NULL) {
+               struct inet_opt *inet = inet_sk(sk);
                struct tcp_opt *tp = tcp_sk(sk);
                struct tcp_skb_cb *tcb = TCP_SKB_CB(skb);
                int tcp_header_size = tp->tcp_header_len;
@@ -227,8 +228,8 @@ int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb)
                skb_set_owner_w(skb, sk);
 
                /* Build TCP header and checksum it. */
-               th->source              = sk->sport;
-               th->dest                = sk->dport;
+               th->source              = inet->sport;
+               th->dest                = inet->dport;
                th->seq                 = htonl(tcb->seq);
                th->ack_seq             = htonl(tp->rcv_nxt);
                *(((__u16 *)th) + 6)    = htons(((tcp_header_size >> 2) << 12) | tcb->flags);
@@ -1120,7 +1121,7 @@ struct sk_buff * tcp_make_synack(struct sock *sk, struct dst_entry *dst,
        th->syn = 1;
        th->ack = 1;
        TCP_ECN_make_synack(req, th);
-       th->source = sk->sport;
+       th->source = inet_sk(sk)->sport;
        th->dest = req->rmt_port;
        TCP_SKB_CB(skb)->seq = req->snt_isn;
        TCP_SKB_CB(skb)->end_seq = TCP_SKB_CB(skb)->seq + 1;
index 7bffbbfd7b1170556cecf3b52be484d4a6c8e063..3901d11cac15bafaafc928e300e92ceeb6eb2561 100644 (file)
@@ -334,10 +334,12 @@ static void tcp_retransmit_timer(struct sock *sk)
                 * we cannot allow such beasts to hang infinitely.
                 */
 #ifdef TCP_DEBUG
-               if (net_ratelimit())
+               if (net_ratelimit()) {
+                       struct inet_opt *inet = inet_sk(sk);
                        printk(KERN_DEBUG "TCP: Treason uncloaked! Peer %u.%u.%u.%u:%u/%u shrinks window %u:%u. Repaired.\n",
-                              NIPQUAD(sk->daddr), htons(sk->dport), sk->num,
-                              tp->snd_una, tp->snd_nxt);
+                              NIPQUAD(inet->daddr), htons(inet->dport),
+                              inet->num, tp->snd_una, tp->snd_nxt);
+               }
 #endif
                if (tcp_time_stamp - tp->rcv_tstamp > TCP_RTO_MAX) {
                        tcp_write_err(sk);
index f43ec7d29215e387d1379fc0c9c903c3e29d38a4..7cb2d0cee4ee3a29c1ecb8a7a2ee6a9bc8fc9d78 100644 (file)
@@ -108,6 +108,8 @@ int udp_port_rover;
 
 static int udp_v4_get_port(struct sock *sk, unsigned short snum)
 {
+       struct inet_opt *inet = inet_sk(sk);
+
        write_lock_bh(&udp_hash_lock);
        if (snum == 0) {
                int best_size_so_far, best, result, i;
@@ -118,11 +120,11 @@ static int udp_v4_get_port(struct sock *sk, unsigned short snum)
                best_size_so_far = 32767;
                best = result = udp_port_rover;
                for (i = 0; i < UDP_HTABLE_SIZE; i++, result++) {
-                       struct sock *sk;
+                       struct sock *sk2;
                        int size;
 
-                       sk = udp_hash[result & (UDP_HTABLE_SIZE - 1)];
-                       if (!sk) {
+                       sk2 = udp_hash[result & (UDP_HTABLE_SIZE - 1)];
+                       if (!sk2) {
                                if (result > sysctl_local_port_range[1])
                                        result = sysctl_local_port_range[0] +
                                                ((result - sysctl_local_port_range[0]) &
@@ -133,7 +135,7 @@ static int udp_v4_get_port(struct sock *sk, unsigned short snum)
                        do {
                                if (++size >= best_size_so_far)
                                        goto next;
-                       } while ((sk = sk->next) != NULL);
+                       } while ((sk2 = sk2->next) != NULL);
                        best_size_so_far = size;
                        best = result;
                next:;
@@ -157,17 +159,19 @@ gotit:
                for (sk2 = udp_hash[snum & (UDP_HTABLE_SIZE - 1)];
                     sk2 != NULL;
                     sk2 = sk2->next) {
-                       if (sk2->num == snum &&
+                       struct inet_opt *inet2 = inet_sk(sk2);
+
+                       if (inet2->num == snum &&
                            sk2 != sk &&
                            sk2->bound_dev_if == sk->bound_dev_if &&
-                           (!sk2->rcv_saddr ||
-                            !sk->rcv_saddr ||
-                            sk2->rcv_saddr == sk->rcv_saddr) &&
+                           (!inet2->rcv_saddr ||
+                            !inet->rcv_saddr ||
+                            inet2->rcv_saddr == inet->rcv_saddr) &&
                            (!sk2->reuse || !sk->reuse))
                                goto fail;
                }
        }
-       sk->num = snum;
+       inet->num = snum;
        if (sk->pprev == NULL) {
                struct sock **skp = &udp_hash[snum & (UDP_HTABLE_SIZE - 1)];
                if ((sk->next = *skp) != NULL)
@@ -198,7 +202,7 @@ static void udp_v4_unhash(struct sock *sk)
                        sk->next->pprev = sk->pprev;
                *sk->pprev = sk->next;
                sk->pprev = NULL;
-               sk->num = 0;
+               inet_sk(sk)->num = 0;
                sock_prot_dec_use(sk->prot);
                __sock_put(sk);
        }
@@ -215,20 +219,22 @@ struct sock *udp_v4_lookup_longway(u32 saddr, u16 sport, u32 daddr, u16 dport, i
        int badness = -1;
 
        for(sk = udp_hash[hnum & (UDP_HTABLE_SIZE - 1)]; sk != NULL; sk = sk->next) {
-               if(sk->num == hnum) {
+               struct inet_opt *inet = inet_sk(sk);
+
+               if (inet->num == hnum) {
                        int score = 0;
-                       if(sk->rcv_saddr) {
-                               if(sk->rcv_saddr != daddr)
+                       if (inet->rcv_saddr) {
+                               if (inet->rcv_saddr != daddr)
                                        continue;
                                score++;
                        }
-                       if(sk->daddr) {
-                               if(sk->daddr != saddr)
+                       if (inet->daddr) {
+                               if (inet->daddr != saddr)
                                        continue;
                                score++;
                        }
-                       if(sk->dport) {
-                               if(sk->dport != sport)
+                       if (inet->dport) {
+                               if (inet->dport != sport)
                                        continue;
                                score++;
                        }
@@ -269,10 +275,12 @@ static inline struct sock *udp_v4_mcast_next(struct sock *sk,
        struct sock *s = sk;
        unsigned short hnum = ntohs(loc_port);
        for(; s; s = s->next) {
-               if ((s->num != hnum)                                    ||
-                   (s->daddr && s->daddr!=rmt_addr)                    ||
-                   (s->dport != rmt_port && s->dport != 0)                     ||
-                   (s->rcv_saddr  && s->rcv_saddr != loc_addr)         ||
+               struct inet_opt *inet = inet_sk(s);
+
+               if (inet->num != hnum                                   ||
+                   (inet->daddr && inet->daddr != rmt_addr)            ||
+                   (inet->dport != rmt_port && inet->dport)            ||
+                   (inet->rcv_saddr && inet->rcv_saddr != loc_addr)    ||
                    (s->bound_dev_if && s->bound_dev_if != dif))
                        continue;
                break;
@@ -469,15 +477,15 @@ int udp_sendmsg(struct sock *sk, struct msghdr *msg, int len)
        } else {
                if (sk->state != TCP_ESTABLISHED)
                        return -ENOTCONN;
-               ufh.daddr = sk->daddr;
-               ufh.uh.dest = sk->dport;
+               ufh.daddr   = inet->daddr;
+               ufh.uh.dest = inet->dport;
                /* Open fast path for connected socket.
                   Route will not be used, if at least one option is set.
                 */
                connected = 1;
        }
-       ipc.addr = sk->saddr;
-       ufh.uh.source = sk->sport;
+       ipc.addr = inet->saddr;
+       ufh.uh.source = inet->sport;
 
        ipc.opt = NULL;
        ipc.oif = sk->bound_dev_if;
@@ -728,7 +736,7 @@ int udp_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
 
        sk_dst_reset(sk);
 
-       err = ip_route_connect(&rt, usin->sin_addr.s_addr, sk->saddr,
+       err = ip_route_connect(&rt, usin->sin_addr.s_addr, inet->saddr,
                               RT_CONN_FLAGS(sk), sk->bound_dev_if);
        if (err)
                return err;
@@ -736,12 +744,12 @@ int udp_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
                ip_rt_put(rt);
                return -EACCES;
        }
-       if(!sk->saddr)
-               sk->saddr = rt->rt_src;         /* Update source address */
-       if(!sk->rcv_saddr)
-               sk->rcv_saddr = rt->rt_src;
-       sk->daddr = rt->rt_dst;
-       sk->dport = usin->sin_port;
+       if (!inet->saddr)
+               inet->saddr = rt->rt_src;       /* Update source address */
+       if (!inet->rcv_saddr)
+               inet->rcv_saddr = rt->rt_src;
+       inet->daddr = rt->rt_dst;
+       inet->dport = usin->sin_port;
        sk->state = TCP_ESTABLISHED;
        inet->id = jiffies;
 
@@ -751,17 +759,17 @@ int udp_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
 
 int udp_disconnect(struct sock *sk, int flags)
 {
+       struct inet_opt *inet = inet_sk(sk);
        /*
         *      1003.1g - break association.
         */
         
        sk->state = TCP_CLOSE;
-       sk->daddr = 0;
-       sk->dport = 0;
+       inet->daddr = 0;
+       inet->dport = 0;
        sk->bound_dev_if = 0;
        if (!(sk->userlocks&SOCK_BINDADDR_LOCK)) {
-               sk->rcv_saddr = 0;
-               sk->saddr = 0;
+               inet->rcv_saddr = inet->saddr = 0;
 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
                if (sk->family == PF_INET6) {
                        struct ipv6_pinfo *np = inet6_sk(sk);
@@ -773,7 +781,7 @@ int udp_disconnect(struct sock *sk, int flags)
        }
        if (!(sk->userlocks&SOCK_BINDPORT_LOCK)) {
                sk->prot->unhash(sk);
-               sk->sport = 0;
+               inet->sport = 0;
        }
        sk_dst_reset(sk);
        return 0;
@@ -962,13 +970,14 @@ csum_error:
 
 static void get_udp_sock(struct sock *sp, char *tmpbuf, int i)
 {
+       struct inet_opt *inet = inet_sk(sp);
        unsigned int dest, src;
        __u16 destp, srcp;
 
-       dest  = sp->daddr;
-       src   = sp->rcv_saddr;
-       destp = ntohs(sp->dport);
-       srcp  = ntohs(sp->sport);
+       dest  = inet->daddr;
+       src   = inet->rcv_saddr;
+       destp = ntohs(inet->dport);
+       srcp  = ntohs(inet->sport);
        sprintf(tmpbuf, "%4d: %08X:%04X %08X:%04X"
                " %02X %08X:%08X %02X:%08lX %08X %5d %8d %ld %d %p",
                i, src, srcp, dest, destp, sp->state, 
index 0cc92d8ac24678ebca4cb2baa1c26563669b3dd1..628bf2fb97c815d5f8a0cc5e71065cef6ca6d6e4 100644 (file)
@@ -200,7 +200,7 @@ static int inet6_create(struct socket *sock, int protocol)
        inet = inet_sk(sk);
 
        if (SOCK_RAW == sock->type) {
-               sk->num = protocol;
+               inet->num = protocol;
                if (IPPROTO_RAW == protocol)
                        inet->hdrincl = 1;
        }
@@ -241,12 +241,12 @@ static int inet6_create(struct socket *sock, int protocol)
 #endif
        MOD_INC_USE_COUNT;
 
-       if (sk->num) {
+       if (inet->num) {
                /* It assumes that any protocol which allows
                 * the user to assign a number at socket
                 * creation time automatically shares.
                 */
-               sk->sport = ntohs(sk->num);
+               inet->sport = ntohs(inet->num);
                sk->prot->hash(sk);
        }
        if (sk->prot->init) {
@@ -278,6 +278,7 @@ static int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
 {
        struct sockaddr_in6 *addr=(struct sockaddr_in6 *)uaddr;
        struct sock *sk = sock->sk;
+       struct inet_opt *inet = inet_sk(sk);
        struct ipv6_pinfo *np = inet6_sk(sk);
        __u32 v4addr = 0;
        unsigned short snum;
@@ -318,8 +319,7 @@ static int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
        lock_sock(sk);
 
        /* Check these errors (active socket, double bind). */
-       if ((sk->state != TCP_CLOSE)                    ||
-           (sk->num != 0)) {
+       if (sk->state != TCP_CLOSE || inet->num) {
                release_sock(sk);
                return -EINVAL;
        }
@@ -340,8 +340,8 @@ static int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
                }
        }
 
-       sk->rcv_saddr = v4addr;
-       sk->saddr = v4addr;
+       inet->rcv_saddr = v4addr;
+       inet->saddr = v4addr;
 
        ipv6_addr_copy(&np->rcv_saddr, &addr->sin6_addr);
                
@@ -350,8 +350,7 @@ static int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
 
        /* Make sure we are allowed to bind here. */
        if (sk->prot->get_port(sk, snum) != 0) {
-               sk->rcv_saddr = 0;
-               sk->saddr = 0;
+               inet->rcv_saddr = inet->saddr = 0;
                memset(&np->rcv_saddr, 0, sizeof(struct in6_addr));
                memset(&np->saddr, 0, sizeof(struct in6_addr));
 
@@ -363,9 +362,9 @@ static int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
                sk->userlocks |= SOCK_BINDADDR_LOCK;
        if (snum)
                sk->userlocks |= SOCK_BINDPORT_LOCK;
-       sk->sport = ntohs(sk->num);
-       sk->dport = 0;
-       sk->daddr = 0;
+       inet->sport = ntohs(inet->num);
+       inet->dport = 0;
+       inet->daddr = 0;
        release_sock(sk);
 
        return 0;
@@ -421,17 +420,18 @@ static int inet6_getname(struct socket *sock, struct sockaddr *uaddr,
 {
        struct sockaddr_in6 *sin=(struct sockaddr_in6 *)uaddr;
        struct sock *sk = sock->sk;
+       struct inet_opt *inet = inet_sk(sk);
        struct ipv6_pinfo *np = inet6_sk(sk);
   
        sin->sin6_family = AF_INET6;
        sin->sin6_flowinfo = 0;
        sin->sin6_scope_id = 0;
        if (peer) {
-               if (!sk->dport)
+               if (!inet->dport)
                        return -ENOTCONN;
                if (((1<<sk->state)&(TCPF_CLOSE|TCPF_SYN_SENT)) && peer == 1)
                        return -ENOTCONN;
-               sin->sin6_port = sk->dport;
+               sin->sin6_port = inet->dport;
                memcpy(&sin->sin6_addr, &np->daddr, sizeof(struct in6_addr));
                if (np->sndflow)
                        sin->sin6_flowinfo = np->flow_label;
@@ -443,7 +443,7 @@ static int inet6_getname(struct socket *sock, struct sockaddr *uaddr,
                        memcpy(&sin->sin6_addr, &np->rcv_saddr,
                               sizeof(struct in6_addr));
 
-               sin->sin6_port = sk->sport;
+               sin->sin6_port = inet->sport;
        }
        if (ipv6_addr_type(&sin->sin6_addr) & IPV6_ADDR_LINKLOCAL)
                sin->sin6_scope_id = sk->bound_dev_if;
index 28639542055081c4079af1ed367eb44da3f1ee55..808481d9848807f79e66f00cc9fb6a0056f174ed 100644 (file)
@@ -79,7 +79,7 @@ int ip6_ra_control(struct sock *sk, int sel, void (*destructor)(struct sock *))
        struct ip6_ra_chain *ra, *new_ra, **rap;
 
        /* RA packet may be delivered ONLY to IPPROTO_RAW socket */
-       if (sk->type != SOCK_RAW || sk->num != IPPROTO_RAW)
+       if (sk->type != SOCK_RAW || inet_sk(sk)->num != IPPROTO_RAW)
                return -EINVAL;
 
        new_ra = (sel>=0) ? kmalloc(sizeof(*new_ra), GFP_KERNEL) : NULL;
@@ -283,7 +283,7 @@ update:
                        if (opt) {
                                struct tcp_opt *tp = tcp_sk(sk);
                                if (!((1<<sk->state)&(TCPF_LISTEN|TCPF_CLOSE))
-                                   && sk->daddr != LOOPBACK4_IPV6) {
+                                   && inet_sk(sk)->daddr != LOOPBACK4_IPV6) {
                                        tp->ext_header_len = opt->opt_flen + opt->opt_nflen;
                                        tcp_sync_mss(sk, tp->pmtu_cookie);
                                }
index 399eb59ad2ea60589bcca388174e33403c249bbf..2231feb00c2fac43cf5da6b1c4026a4c5289aaa4 100644 (file)
@@ -84,58 +84,63 @@ static int pndisc_constructor(struct pneigh_entry *n);
 static void pndisc_destructor(struct pneigh_entry *n);
 static void pndisc_redo(struct sk_buff *skb);
 
-static struct neigh_ops ndisc_generic_ops =
-{
-       AF_INET6,
-       NULL,
-       ndisc_solicit,
-       ndisc_error_report,
-       neigh_resolve_output,
-       neigh_connected_output,
-       dev_queue_xmit,
-       dev_queue_xmit
+static struct neigh_ops ndisc_generic_ops = {
+       family:                 AF_INET6,
+       solicit:                ndisc_solicit,
+       error_report:           ndisc_error_report,
+       output:                 neigh_resolve_output,
+       connected_output:       neigh_connected_output,
+       hh_output:              dev_queue_xmit,
+       queue_xmit:             dev_queue_xmit,
 };
 
-static struct neigh_ops ndisc_hh_ops =
-{
-       AF_INET6,
-       NULL,
-       ndisc_solicit,
-       ndisc_error_report,
-       neigh_resolve_output,
-       neigh_resolve_output,
-       dev_queue_xmit,
-       dev_queue_xmit
+static struct neigh_ops ndisc_hh_ops = {
+       family:                 AF_INET6,
+       solicit:                ndisc_solicit,
+       error_report:           ndisc_error_report,
+       output:                 neigh_resolve_output,
+       connected_output:       neigh_resolve_output,
+       hh_output:              dev_queue_xmit,
+       queue_xmit:             dev_queue_xmit,
 };
 
 
-static struct neigh_ops ndisc_direct_ops =
-{
-       AF_INET6,
-       NULL,
-       NULL,
-       NULL,
-       dev_queue_xmit,
-       dev_queue_xmit,
-       dev_queue_xmit,
-       dev_queue_xmit
+static struct neigh_ops ndisc_direct_ops = {
+       family:                 AF_INET6,
+       output:                 dev_queue_xmit,
+       connected_output:       dev_queue_xmit,
+       hh_output:              dev_queue_xmit,
+       queue_xmit:             dev_queue_xmit,
 };
 
-struct neigh_table nd_tbl =
-{
-       NULL,
-       AF_INET6,
-       sizeof(struct neighbour) + sizeof(struct in6_addr),
-       sizeof(struct in6_addr),
-       ndisc_hash,
-       ndisc_constructor,
-       pndisc_constructor,
-       pndisc_destructor,
-       pndisc_redo,
-       "ndisc_cache",
-        { NULL, NULL, &nd_tbl, 0, NULL, NULL,
-                 30*HZ, 1*HZ, 60*HZ, 30*HZ, 5*HZ, 3, 3, 0, 3, 1*HZ, (8*HZ)/10, 64, 0 },
-       30*HZ, 128, 512, 1024,
+struct neigh_table nd_tbl = {
+       family:         AF_INET6,
+       entry_size:     sizeof(struct neighbour) + sizeof(struct in6_addr),
+       key_len:        sizeof(struct in6_addr),
+       hash:           ndisc_hash,
+       constructor:    ndisc_constructor,
+       pconstructor:   pndisc_constructor,
+       pdestructor:    pndisc_destructor,
+       proxy_redo:     pndisc_redo,
+       id:             "ndisc_cache",
+       parms: {
+               tbl:                    &nd_tbl,
+               base_reachable_time:    30 * HZ,
+               retrans_time:            1 * HZ,
+               gc_staletime:           60 * HZ,
+               reachable_time:         30 * HZ,
+               delay_probe_time:        5 * HZ,
+               queue_len:               3,
+               ucast_probes:            3,
+               mcast_probes:            3,
+               anycast_delay:           1 * HZ,
+               proxy_delay:            (8 * HZ) / 10,
+               proxy_qlen:             64,
+       },
+       gc_interval:      30 * HZ,
+       gc_thresh1:      128,
+       gc_thresh2:      512,
+       gc_thresh3:     1024,
 };
 
 #define NDISC_OPT_SPACE(len) (((len)+2+7)&~7)
index e5745fcd371e7397272befdd759e331d71a856f3..b2255c0056935ae8ae7580cec010bc83421a0329 100644 (file)
@@ -50,7 +50,8 @@ rwlock_t raw_v6_lock = RW_LOCK_UNLOCKED;
 
 static void raw_v6_hash(struct sock *sk)
 {
-       struct sock **skp = &raw_v6_htable[sk->num & (RAWV6_HTABLE_SIZE - 1)];
+       struct sock **skp = &raw_v6_htable[inet_sk(sk)->num &
+                                          (RAWV6_HTABLE_SIZE - 1)];
 
        write_lock_bh(&raw_v6_lock);
        if ((sk->next = *skp) != NULL)
@@ -85,7 +86,7 @@ struct sock *__raw_v6_lookup(struct sock *sk, unsigned short num,
        int addr_type = ipv6_addr_type(loc_addr);
 
        for(s = sk; s; s = s->next) {
-               if(s->num == num) {
+               if (inet_sk(s)->num == num) {
                        struct ipv6_pinfo *np = inet6_sk(s);
 
                        if (!ipv6_addr_any(&np->daddr) &&
@@ -186,6 +187,7 @@ out:
 /* This cleans up af_inet6 a bit. -DaveM */
 static int rawv6_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len)
 {
+       struct inet_opt *inet = inet_sk(sk);
        struct ipv6_pinfo *np = inet6_sk(sk);
        struct sockaddr_in6 *addr = (struct sockaddr_in6 *) uaddr;
        __u32 v4addr = 0;
@@ -233,8 +235,7 @@ static int rawv6_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len)
                }
        }
 
-       sk->rcv_saddr = v4addr;
-       sk->saddr = v4addr;
+       inet->rcv_saddr = inet->saddr = v4addr;
        ipv6_addr_copy(&np->rcv_saddr, &addr->sin6_addr);
        if (!(addr_type & IPV6_ADDR_MULTICAST))
                ipv6_addr_copy(&np->saddr, &addr->sin6_addr);
@@ -439,6 +440,7 @@ static int rawv6_sendmsg(struct sock *sk, struct msghdr *msg, int len)
 {
        struct ipv6_txoptions opt_space;
        struct sockaddr_in6 * sin6 = (struct sockaddr_in6 *) msg->msg_name;
+       struct inet_opt *inet = inet_sk(sk);
        struct ipv6_pinfo *np = inet6_sk(sk);
        struct ipv6_txoptions *opt = NULL;
        struct ip6_flowlabel *flowlabel = NULL;
@@ -478,7 +480,7 @@ static int rawv6_sendmsg(struct sock *sk, struct msghdr *msg, int len)
                proto = ntohs(sin6->sin6_port);
 
                if (!proto)
-                       proto = sk->num;
+                       proto = inet->num;
 
                if (proto > 255)
                        return(-EINVAL);
@@ -507,7 +509,7 @@ static int rawv6_sendmsg(struct sock *sk, struct msghdr *msg, int len)
                if (sk->state != TCP_ESTABLISHED) 
                        return(-EINVAL);
                
-               proto = sk->num;
+               proto = inet->num;
                daddr = &np->daddr;
                fl.fl6_flowlabel = np->flow_label;
        }
@@ -635,7 +637,7 @@ static int rawv6_setsockopt(struct sock *sk, int level, int optname,
                        break;
 
                case SOL_ICMPV6:
-                       if (sk->num != IPPROTO_ICMPV6)
+                       if (inet_sk(sk)->num != IPPROTO_ICMPV6)
                                return -EOPNOTSUPP;
                        return rawv6_seticmpfilter(sk, level, optname, optval,
                                                   optlen);
@@ -678,7 +680,7 @@ static int rawv6_getsockopt(struct sock *sk, int level, int optname,
                        break;
 
                case SOL_ICMPV6:
-                       if (sk->num != IPPROTO_ICMPV6)
+                       if (inet_sk(sk)->num != IPPROTO_ICMPV6)
                                return -EOPNOTSUPP;
                        return rawv6_geticmpfilter(sk, level, optname, optval,
                                                   optlen);
@@ -741,7 +743,7 @@ static int rawv6_ioctl(struct sock *sk, int cmd, unsigned long arg)
 
 static void rawv6_close(struct sock *sk, long timeout)
 {
-       if (sk->num == IPPROTO_RAW)
+       if (inet_sk(sk)->num == IPPROTO_RAW)
                ip6_ra_control(sk, -1, NULL);
 
        inet_sock_release(sk);
@@ -764,7 +766,7 @@ static void get_raw6_sock(struct sock *sp, char *tmpbuf, int i)
        dest  = &np->daddr;
        src   = &np->rcv_saddr;
        destp = 0;
-       srcp  = sp->num;
+       srcp  = inet_sk(sp)->num;
        sprintf(tmpbuf,
                "%4d: %08X%08X%08X%08X:%04X %08X%08X%08X%08X:%04X "
                "%02X %08X:%08X %02X:%08lX %08X %5d %8d %ld %d %p",
index 867cea08a1965500b1718d2e3e2463914d05b27e..7ff24c734daeb26ae4c6fcdfb1af157197ba39cb 100644 (file)
@@ -76,11 +76,12 @@ static __inline__ int tcp_v6_hashfn(struct in6_addr *laddr, u16 lport,
 
 static __inline__ int tcp_v6_sk_hashfn(struct sock *sk)
 {
+       struct inet_opt *inet = inet_sk(sk);
        struct ipv6_pinfo *np = inet6_sk(sk);
        struct in6_addr *laddr = &np->rcv_saddr;
        struct in6_addr *faddr = &np->daddr;
-       __u16 lport = sk->num;
-       __u16 fport = sk->dport;
+       __u16 lport = inet->num;
+       __u16 fport = inet->dport;
        return tcp_v6_hashfn(laddr, lport, faddr, fport);
 }
 
@@ -153,14 +154,15 @@ static int tcp_v6_get_port(struct sock *sk, unsigned short snum)
                                            !sk2->reuse ||
                                            sk2->state == TCP_LISTEN) {
                                                /* NOTE: IPv6 tw bucket have different format */
-                                               if (!sk2->rcv_saddr     ||
+                                               if (!inet_sk(sk2)->rcv_saddr ||
                                                    addr_type == IPV6_ADDR_ANY ||
                                                    !ipv6_addr_cmp(&np->rcv_saddr,
                                                                   sk2->state != TCP_TIME_WAIT ?
                                                                   &np2->rcv_saddr :
                                                                   &((struct tcp_tw_bucket*)sk)->v6_rcv_saddr) ||
                                                    (addr_type==IPV6_ADDR_MAPPED && sk2->family==AF_INET &&
-                                                    sk->rcv_saddr==sk2->rcv_saddr))
+                                                    inet_sk(sk)->rcv_saddr ==
+                                                    inet_sk(sk2)->rcv_saddr))
                                                        break;
                                        }
                                }
@@ -185,7 +187,7 @@ static int tcp_v6_get_port(struct sock *sk, unsigned short snum)
                tb->fastreuse = 0;
 
 success:
-       sk->num = snum;
+       inet_sk(sk)->num = snum;
        if (sk->prev == NULL) {
                if ((sk->bind_next = tb->owners) != NULL)
                        tb->owners->bind_pprev = &sk->bind_next;
@@ -255,7 +257,7 @@ static struct sock *tcp_v6_lookup_listener(struct in6_addr *daddr, unsigned shor
        read_lock(&tcp_lhash_lock);
        sk = tcp_listening_hash[tcp_lhashfn(hnum)];
        for(; sk; sk = sk->next) {
-               if((sk->num == hnum) && (sk->family == PF_INET6)) {
+               if (inet_sk(sk)->num == hnum && sk->family == PF_INET6) {
                        struct ipv6_pinfo *np = inet6_sk(sk);
                        
                        score = 1;
@@ -313,9 +315,11 @@ static inline struct sock *__tcp_v6_lookup_established(struct in6_addr *saddr, u
        }
        /* Must check for a TIME_WAIT'er before going to listener hash. */
        for(sk = (head + tcp_ehash_size)->chain; sk; sk = sk->next) {
-               if(*((__u32 *)&(sk->dport))     == ports        &&
+               /* FIXME: acme: check this... */
+               struct tcp_tw_bucket *tw = (struct tcp_tw_bucket *)sk;
+
+               if(*((__u32 *)&(tw->dport))     == ports        &&
                   sk->family                   == PF_INET6) {
-                       struct tcp_tw_bucket *tw = (struct tcp_tw_bucket *)sk;
                        if(!ipv6_addr_cmp(&tw->v6_daddr, saddr) &&
                           !ipv6_addr_cmp(&tw->v6_rcv_saddr, daddr) &&
                           (!sk->bound_dev_if || sk->bound_dev_if == dif))
@@ -424,12 +428,13 @@ static __u32 tcp_v6_init_sequence(struct sock *sk, struct sk_buff *skb)
 
 static int tcp_v6_check_established(struct sock *sk)
 {
+       struct inet_opt *inet = inet_sk(sk);
        struct ipv6_pinfo *np = inet6_sk(sk);
        struct in6_addr *daddr = &np->rcv_saddr;
        struct in6_addr *saddr = &np->daddr;
        int dif = sk->bound_dev_if;
-       u32 ports = TCP_COMBINED_PORTS(sk->dport, sk->num);
-       int hash = tcp_v6_hashfn(daddr, sk->num, saddr, sk->dport);
+       u32 ports = TCP_COMBINED_PORTS(inet->dport, inet->num);
+       int hash = tcp_v6_hashfn(daddr, inet->num, saddr, inet->dport);
        struct tcp_ehash_bucket *head = &tcp_ehash[hash];
        struct sock *sk2, **skp;
        struct tcp_tw_bucket *tw;
@@ -439,7 +444,7 @@ static int tcp_v6_check_established(struct sock *sk)
        for(skp = &(head + tcp_ehash_size)->chain; (sk2=*skp)!=NULL; skp = &sk2->next) {
                tw = (struct tcp_tw_bucket*)sk2;
 
-               if(*((__u32 *)&(sk2->dport))    == ports        &&
+               if(*((__u32 *)&(tw->dport))     == ports        &&
                   sk2->family                  == PF_INET6     &&
                   !ipv6_addr_cmp(&tw->v6_daddr, saddr)         &&
                   !ipv6_addr_cmp(&tw->v6_rcv_saddr, daddr)     &&
@@ -496,7 +501,7 @@ not_unique:
 
 static int tcp_v6_hash_connecting(struct sock *sk)
 {
-       unsigned short snum = sk->num;
+       unsigned short snum = inet_sk(sk)->num;
        struct tcp_bind_hashbucket *head = &tcp_bhash[tcp_bhashfn(snum)];
        struct tcp_bind_bucket *tb = head->chain;
 
@@ -522,6 +527,7 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
                          int addr_len)
 {
        struct sockaddr_in6 *usin = (struct sockaddr_in6 *) uaddr;
+       struct inet_opt *inet = inet_sk(sk);
        struct ipv6_pinfo *np = inet6_sk(sk);
        struct tcp_opt *tp = tcp_sk(sk);
        struct in6_addr *saddr = NULL;
@@ -618,9 +624,9 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
                        goto failure;
                } else {
                        ipv6_addr_set(&np->saddr, 0, 0, htonl(0x0000FFFF),
-                                     sk->saddr);
+                                     inet->saddr);
                        ipv6_addr_set(&np->rcv_saddr, 0, 0, htonl(0x0000FFFF),
-                                     sk->rcv_saddr);
+                                     inet->rcv_saddr);
                }
 
                return err;
@@ -634,7 +640,7 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
        fl.fl6_src = saddr;
        fl.oif = sk->bound_dev_if;
        fl.uli_u.ports.dport = usin->sin6_port;
-       fl.uli_u.ports.sport = sk->sport;
+       fl.uli_u.ports.sport = inet->sport;
 
        if (np->opt && np->opt->srcrt) {
                struct rt0_hdr *rt0 = (struct rt0_hdr *)np->opt->srcrt;
@@ -662,7 +668,7 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
        /* set the source address */
        ipv6_addr_copy(&np->rcv_saddr, saddr);
        ipv6_addr_copy(&np->saddr, saddr);
-       sk->rcv_saddr= LOOPBACK4_IPV6;
+       inet->rcv_saddr = LOOPBACK4_IPV6;
 
        tp->ext_header_len = 0;
        if (np->opt)
@@ -675,7 +681,7 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
        if (buff == NULL)
                goto failure;
 
-       sk->dport = usin->sin6_port;
+       inet->dport = usin->sin6_port;
 
        /*
         *      Init variables
@@ -684,7 +690,8 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
        if (!tp->write_seq)
                tp->write_seq = secure_tcpv6_sequence_number(np->saddr.s6_addr32,
                                                             np->daddr.s6_addr32,
-                                                            sk->sport, sk->dport);
+                                                            inet->sport,
+                                                            inet->dport);
 
        err = tcp_connect(sk, buff);
        if (err == 0)
@@ -692,7 +699,7 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
 
 failure:
        __sk_dst_reset(sk);
-       sk->dport = 0;
+       inet->dport = 0;
        sk->route_caps = 0;
        return err;
 }
@@ -750,6 +757,7 @@ void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
                dst = __sk_dst_check(sk, np->dst_cookie);
 
                if (dst == NULL) {
+                       struct inet_opt *inet = inet_sk(sk);
                        struct flowi fl;
 
                        /* BUGGG_FUTURE: Again, it is not clear how
@@ -760,8 +768,8 @@ void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
                        fl.nl_u.ip6_u.daddr = &np->daddr;
                        fl.nl_u.ip6_u.saddr = &np->saddr;
                        fl.oif = sk->bound_dev_if;
-                       fl.uli_u.ports.dport = sk->dport;
-                       fl.uli_u.ports.sport = sk->sport;
+                       fl.uli_u.ports.dport = inet->dport;
+                       fl.uli_u.ports.sport = inet->sport;
 
                        dst = ip6_route_output(sk, &fl);
                } else
@@ -850,7 +858,7 @@ static int tcp_v6_send_synack(struct sock *sk, struct open_request *req,
        fl.fl6_flowlabel = 0;
        fl.oif = req->af.v6_req.iif;
        fl.uli_u.ports.dport = req->rmt_port;
-       fl.uli_u.ports.sport = sk->sport;
+       fl.uli_u.ports.sport = inet_sk(sk)->sport;
 
        if (dst == NULL) {
                opt = np->opt;
@@ -1245,14 +1253,15 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
                if (newsk == NULL) 
                        return NULL;
 
+               newinet = inet_sk(newsk);
                newnp = inet6_sk(newsk);
                newtp = tcp_sk(newsk);
 
                ipv6_addr_set(&newnp->daddr, 0, 0, htonl(0x0000FFFF),
-                             newsk->daddr);
+                             newinet->daddr);
 
                ipv6_addr_set(&newnp->saddr, 0, 0, htonl(0x0000FFFF),
-                             newsk->saddr);
+                             newinet->saddr);
 
                ipv6_addr_copy(&newnp->rcv_saddr, &newnp->saddr);
 
@@ -1303,7 +1312,7 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
                fl.fl6_flowlabel = 0;
                fl.oif = sk->bound_dev_if;
                fl.uli_u.ports.dport = req->rmt_port;
-               fl.uli_u.ports.sport = sk->sport;
+               fl.uli_u.ports.sport = inet_sk(sk)->sport;
 
                dst = ip6_route_output(sk, &fl);
        }
@@ -1376,9 +1385,7 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
        newtp->advmss = dst->advmss;
        tcp_initialize_rcv_mss(newsk);
 
-       newsk->daddr     = LOOPBACK4_IPV6;
-       newsk->saddr     = LOOPBACK4_IPV6;
-       newsk->rcv_saddr = LOOPBACK4_IPV6;
+       newinet->daddr = newinet->saddr = newinet->rcv_saddr = LOOPBACK4_IPV6;
 
        __tcp_v6_hash(newsk);
        tcp_inherit_port(sk, newsk);
@@ -1680,6 +1687,7 @@ static int tcp_v6_rebuild_header(struct sock *sk)
        dst = __sk_dst_check(sk, np->dst_cookie);
 
        if (dst == NULL) {
+               struct inet_opt *inet = inet_sk(sk);
                struct flowi fl;
 
                fl.proto = IPPROTO_TCP;
@@ -1687,8 +1695,8 @@ static int tcp_v6_rebuild_header(struct sock *sk)
                fl.nl_u.ip6_u.saddr = &np->saddr;
                fl.fl6_flowlabel = np->flow_label;
                fl.oif = sk->bound_dev_if;
-               fl.uli_u.ports.dport = sk->dport;
-               fl.uli_u.ports.sport = sk->sport;
+               fl.uli_u.ports.dport = inet->dport;
+               fl.uli_u.ports.sport = inet->sport;
 
                if (np->opt && np->opt->srcrt) {
                        struct rt0_hdr *rt0 = (struct rt0_hdr *) np->opt->srcrt;
@@ -1714,6 +1722,7 @@ static int tcp_v6_rebuild_header(struct sock *sk)
 static int tcp_v6_xmit(struct sk_buff *skb)
 {
        struct sock *sk = skb->sk;
+       struct inet_opt *inet = inet_sk(sk);
        struct ipv6_pinfo *np = inet6_sk(sk);
        struct flowi fl;
        struct dst_entry *dst;
@@ -1724,8 +1733,8 @@ static int tcp_v6_xmit(struct sk_buff *skb)
        fl.fl6_flowlabel = np->flow_label;
        IP6_ECN_flow_xmit(sk, fl.fl6_flowlabel);
        fl.oif = sk->bound_dev_if;
-       fl.uli_u.ports.sport = sk->sport;
-       fl.uli_u.ports.dport = sk->dport;
+       fl.uli_u.ports.sport = inet->sport;
+       fl.uli_u.ports.dport = inet->dport;
 
        if (np->opt && np->opt->srcrt) {
                struct rt0_hdr *rt0 = (struct rt0_hdr *) np->opt->srcrt;
@@ -1761,7 +1770,7 @@ static void v6_addr2sockaddr(struct sock *sk, struct sockaddr * uaddr)
 
        sin6->sin6_family = AF_INET6;
        memcpy(&sin6->sin6_addr, &np->daddr, sizeof(struct in6_addr));
-       sin6->sin6_port = sk->dport;
+       sin6->sin6_port = inet_sk(sk)->dport;
        /* We do not store received flowlabel for TCP */
        sin6->sin6_flowinfo = 0;
        sin6->sin6_scope_id = 0;
@@ -1903,7 +1912,7 @@ static void get_openreq6(struct sock *sk, struct open_request *req, char *tmpbuf
                i,
                src->s6_addr32[0], src->s6_addr32[1],
                src->s6_addr32[2], src->s6_addr32[3],
-               ntohs(sk->sport),
+               ntohs(inet_sk(sk)->sport),
                dest->s6_addr32[0], dest->s6_addr32[1],
                dest->s6_addr32[2], dest->s6_addr32[3],
                ntohs(req->rmt_port),
@@ -1924,13 +1933,14 @@ static void get_tcp6_sock(struct sock *sp, char *tmpbuf, int i)
        __u16 destp, srcp;
        int timer_active;
        unsigned long timer_expires;
+       struct inet_opt *inet = inet_sk(sp);
        struct tcp_opt *tp = tcp_sk(sp);
        struct ipv6_pinfo *np = inet6_sk(sp);
 
        dest  = &np->daddr;
        src   = &np->rcv_saddr;
-       destp = ntohs(sp->dport);
-       srcp  = ntohs(sp->sport);
+       destp = ntohs(inet->dport);
+       srcp  = ntohs(inet->sport);
        if (tp->pending == TCP_TIME_RETRANS) {
                timer_active    = 1;
                timer_expires   = tp->timeout;
index c28551fd60781f000e43ff7157f99b9ff5a65412..a8e89f16dc2c04d5604013c4e018e36df0f0d906 100644 (file)
@@ -65,11 +65,11 @@ static int udp_v6_get_port(struct sock *sk, unsigned short snum)
                best_size_so_far = 32767;
                best = result = udp_port_rover;
                for (i = 0; i < UDP_HTABLE_SIZE; i++, result++) {
-                       struct sock *sk;
+                       struct sock *sk2;
                        int size;
 
-                       sk = udp_hash[result & (UDP_HTABLE_SIZE - 1)];
-                       if (!sk) {
+                       sk2 = udp_hash[result & (UDP_HTABLE_SIZE - 1)];
+                       if (!sk2) {
                                if (result > sysctl_local_port_range[1])
                                        result = sysctl_local_port_range[0] +
                                                ((result - sysctl_local_port_range[0]) &
@@ -80,7 +80,7 @@ static int udp_v6_get_port(struct sock *sk, unsigned short snum)
                        do {
                                if (++size >= best_size_so_far)
                                        goto next;
-                       } while ((sk = sk->next) != NULL);
+                       } while ((sk2 = sk2->next) != NULL);
                        best_size_so_far = size;
                        best = result;
                next:;
@@ -104,23 +104,24 @@ gotit:
                for (sk2 = udp_hash[snum & (UDP_HTABLE_SIZE - 1)];
                     sk2 != NULL;
                     sk2 = sk2->next) {
+                       struct inet_opt *inet2 = inet_sk(sk2);
                        struct ipv6_pinfo *np2 = inet6_sk(sk2);
 
-                       if (sk2->num == snum &&
+                       if (inet2->num == snum &&
                            sk2 != sk &&
                            sk2->bound_dev_if == sk->bound_dev_if &&
-                           (!sk2->rcv_saddr ||
+                           (!inet2->rcv_saddr ||
                             addr_type == IPV6_ADDR_ANY ||
                             !ipv6_addr_cmp(&np->rcv_saddr, &np2->rcv_saddr) ||
                             (addr_type == IPV6_ADDR_MAPPED &&
                              sk2->family == AF_INET &&
-                             sk->rcv_saddr == sk2->rcv_saddr)) &&
+                             inet_sk(sk)->rcv_saddr == inet2->rcv_saddr)) &&
                            (!sk2->reuse || !sk->reuse))
                                goto fail;
                }
        }
 
-       sk->num = snum;
+       inet_sk(sk)->num = snum;
        if (sk->pprev == NULL) {
                struct sock **skp = &udp_hash[snum & (UDP_HTABLE_SIZE - 1)];
                if ((sk->next = *skp) != NULL)
@@ -151,7 +152,7 @@ static void udp_v6_unhash(struct sock *sk)
                        sk->next->pprev = sk->pprev;
                *sk->pprev = sk->next;
                sk->pprev = NULL;
-               sk->num = 0;
+               inet_sk(sk)->num = 0;
                sock_prot_dec_use(sk->prot);
                __sock_put(sk);
        }
@@ -167,12 +168,13 @@ static struct sock *udp_v6_lookup(struct in6_addr *saddr, u16 sport,
 
        read_lock(&udp_hash_lock);
        for(sk = udp_hash[hnum & (UDP_HTABLE_SIZE - 1)]; sk != NULL; sk = sk->next) {
-               if((sk->num == hnum)            &&
-                  (sk->family == PF_INET6)) {
+               struct inet_opt *inet = inet_sk(sk);
+
+               if (inet->num == hnum && sk->family == PF_INET6) {
                        struct ipv6_pinfo *np = inet6_sk(sk);
                        int score = 0;
-                       if(sk->dport) {
-                               if(sk->dport != sport)
+                       if (inet->dport) {
+                               if (inet->dport != sport)
                                        continue;
                                score++;
                        }
@@ -213,6 +215,7 @@ static struct sock *udp_v6_lookup(struct in6_addr *saddr, u16 sport,
 int udpv6_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
 {
        struct sockaddr_in6     *usin = (struct sockaddr_in6 *) uaddr;
+       struct inet_opt         *inet = inet_sk(sk);
        struct ipv6_pinfo       *np = inet6_sk(sk);
        struct in6_addr         *daddr;
        struct in6_addr         saddr;
@@ -268,16 +271,16 @@ ipv4_connected:
                if (err < 0)
                        return err;
                
-               ipv6_addr_set(&np->daddr, 0, 0, htonl(0x0000ffff), sk->daddr);
+               ipv6_addr_set(&np->daddr, 0, 0, htonl(0x0000ffff), inet->daddr);
 
                if (ipv6_addr_any(&np->saddr)) {
                        ipv6_addr_set(&np->saddr, 0, 0, htonl(0x0000ffff),
-                                     sk->saddr);
+                                     inet->saddr);
                }
 
                if (ipv6_addr_any(&np->rcv_saddr)) {
                        ipv6_addr_set(&np->rcv_saddr, 0, 0, htonl(0x0000ffff),
-                                     sk->rcv_saddr);
+                                     inet->rcv_saddr);
                }
                return 0;
        }
@@ -300,7 +303,7 @@ ipv4_connected:
        ipv6_addr_copy(&np->daddr, daddr);
        np->flow_label = fl.fl6_flowlabel;
 
-       sk->dport = usin->sin6_port;
+       inet->dport = usin->sin6_port;
 
        /*
         *      Check for a route to destination an obtain the
@@ -311,8 +314,8 @@ ipv4_connected:
        fl.fl6_dst = &np->daddr;
        fl.fl6_src = &saddr;
        fl.oif = sk->bound_dev_if;
-       fl.uli_u.ports.dport = sk->dport;
-       fl.uli_u.ports.sport = sk->sport;
+       fl.uli_u.ports.dport = inet->dport;
+       fl.uli_u.ports.sport = inet->sport;
 
        if (flowlabel) {
                if (flowlabel->opt && flowlabel->opt->srcrt) {
@@ -344,7 +347,7 @@ ipv4_connected:
 
                if (ipv6_addr_any(&np->rcv_saddr)) {
                        ipv6_addr_copy(&np->rcv_saddr, &saddr);
-                       sk->rcv_saddr = LOOPBACK4_IPV6;
+                       inet->rcv_saddr = LOOPBACK4_IPV6;
                }
                sk->state = TCP_ESTABLISHED;
        }
@@ -528,10 +531,12 @@ static struct sock *udp_v6_mcast_next(struct sock *sk,
        struct sock *s = sk;
        unsigned short num = ntohs(loc_port);
        for(; s; s = s->next) {
-               if(s->num == num) {
+               struct inet_opt *inet = inet_sk(s);
+
+               if (inet->num == num) {
                        struct ipv6_pinfo *np = inet6_sk(s);
-                       if(s->dport) {
-                               if(s->dport != rmt_port)
+                       if (inet->dport) {
+                               if (inet->dport != rmt_port)
                                        continue;
                        }
                        if (!ipv6_addr_any(&np->daddr) &&
@@ -757,6 +762,7 @@ static int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, int ulen)
 {
        struct ipv6_txoptions opt_space;
        struct udpv6fakehdr udh;
+       struct inet_opt *inet = inet_sk(sk);
        struct ipv6_pinfo *np = inet6_sk(sk);
        struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) msg->msg_name;
        struct ipv6_txoptions *opt = NULL;
@@ -818,7 +824,7 @@ static int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, int ulen)
                if (sk->state != TCP_ESTABLISHED)
                        return -ENOTCONN;
 
-               udh.uh.dest = sk->dport;
+               udh.uh.dest = inet->dport;
                daddr = &np->daddr;
                fl.fl6_flowlabel = np->flow_label;
        }
@@ -867,7 +873,7 @@ static int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, int ulen)
        if (opt && opt->srcrt)
                udh.daddr = daddr;
 
-       udh.uh.source = sk->sport;
+       udh.uh.source = inet->sport;
        udh.uh.len = len < 0x10000 ? htons(len) : 0;
        udh.uh.check = 0;
        udh.iov = msg->msg_iov;
@@ -905,14 +911,15 @@ static struct inet6_protocol udpv6_protocol = {
 
 static void get_udp6_sock(struct sock *sp, char *tmpbuf, int i)
 {
+       struct inet_opt *inet = inet_sk(sp);
        struct ipv6_pinfo *np = inet6_sk(sp);
        struct in6_addr *dest, *src;
        __u16 destp, srcp;
 
        dest  = &np->daddr;
        src   = &np->rcv_saddr;
-       destp = ntohs(sp->dport);
-       srcp  = ntohs(sp->sport);
+       destp = ntohs(inet->dport);
+       srcp  = ntohs(inet->sport);
        sprintf(tmpbuf,
                "%4d: %08X%08X%08X%08X:%04X %08X%08X%08X%08X:%04X "
                "%02X %08X:%08X %02X:%08lX %08X %5d %8d %ld %d %p",
index 76c50e67866e81ba709cdfe638bc56dbcfbf41b6..84e1262d6660e24ee3a39d9af71d008d5c9e1e62 100644 (file)
@@ -180,6 +180,7 @@ struct packet_opt
        spinlock_t              bind_lock;
        char                    running;        /* prot_hook is attached*/
        int                     ifindex;        /* bound device         */
+       unsigned short          num;
        struct tpacket_stats    stats;
 #ifdef CONFIG_PACKET_MULTICAST
        struct packet_mclist    *mclist;
@@ -678,8 +679,10 @@ static int packet_sendmsg(struct socket *sock, struct msghdr *msg, int len,
         */
         
        if (saddr == NULL) {
-               ifindex = pkt_sk(sk)->ifindex;
-               proto   = sk->num;
+               struct packet_opt *po = pkt_sk(sk);
+
+               ifindex = po->ifindex;
+               proto   = po->num;
                addr    = NULL;
        } else {
                err = -EINVAL;
@@ -839,7 +842,7 @@ static int packet_do_bind(struct sock *sk, struct net_device *dev, int protocol)
                po->running = 0;
        }
 
-       sk->num = protocol;
+       po->num = protocol;
        po->prot_hook.type = protocol;
        po->prot_hook.dev = dev;
 
@@ -894,7 +897,7 @@ static int packet_bind_spkt(struct socket *sock, struct sockaddr *uaddr, int add
 
        dev = dev_get_by_name(name);
        if (dev) {
-               err = packet_do_bind(sk, dev, sk->num);
+               err = packet_do_bind(sk, dev, pkt_sk(sk)->num);
                dev_put(dev);
        }
        return err;
@@ -924,7 +927,7 @@ static int packet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len
                if (dev == NULL)
                        goto out;
        }
-       err = packet_do_bind(sk, dev, sll->sll_protocol ? : sk->num);
+       err = packet_do_bind(sk, dev, sll->sll_protocol ? : pkt_sk(sk)->num);
        if (dev)
                dev_put(dev);
 
@@ -972,7 +975,7 @@ static int packet_create(struct socket *sock, int protocol)
                goto out_free;
        memset(po, 0, sizeof(*po));
        sk->family = PF_PACKET;
-       sk->num = protocol;
+       po->num = protocol;
 
        sk->destruct = packet_sock_destruct;
        atomic_inc(&packet_socks_nr);
@@ -1131,7 +1134,7 @@ static int packet_getname(struct socket *sock, struct sockaddr *uaddr,
 
        sll->sll_family = AF_PACKET;
        sll->sll_ifindex = po->ifindex;
-       sll->sll_protocol = sk->num;
+       sll->sll_protocol = po->num;
        dev = dev_get_by_index(po->ifindex);
        if (dev) {
                sll->sll_hatype = dev->type;
@@ -1410,7 +1413,8 @@ static int packet_notifier(struct notifier_block *this, unsigned long msg, void
                        break;
                case NETDEV_UP:
                        spin_lock(&po->bind_lock);
-                       if (dev->ifindex == po->ifindex && sk->num && po->running==0) {
+                       if (dev->ifindex == po->ifindex && po->num &&
+                           !po->running) {
                                dev_add_pack(&po->prot_hook);
                                sock_hold(sk);
                                po->running = 1;
@@ -1861,7 +1865,7 @@ static int packet_read_proc(char *buffer, char **start, off_t offset,
                             s,
                             atomic_read(&s->refcnt),
                             s->type,
-                            ntohs(s->num),
+                            ntohs(po->num),
                             po->ifindex,
                             po->running,
                             atomic_read(&s->rmem_alloc),
index 919a095f69539fe22ab3deb8e435d015e64e11d7..31200f4283c63059c45f3afbc27977c3c2a143e0 100644 (file)
@@ -1161,7 +1161,8 @@ if (svsk->sk_sk == NULL)
 
        /* Register socket with portmapper */
        if (*errp >= 0 && pmap_register)
-               *errp = svc_register(serv, inet->protocol, ntohs(inet->sport));
+               *errp = svc_register(serv, inet->protocol,
+                                    ntohs(inet_sk(inet)->sport));
 
        if (*errp < 0) {
                inet->user_data = NULL;