[INET]: Move bind_hash from tcp_sk to inet_sk
authorArnaldo Carvalho de Melo <acme@ghostprotocols.net>
Wed, 10 Aug 2005 03:01:14 +0000 (20:01 -0700)
committerDavid S. Miller <davem@sunset.davemloft.net>
Mon, 29 Aug 2005 22:38:48 +0000 (15:38 -0700)
This should really be in a inet_connection_sock, but I'm leaving it
for a later optimization, when some more fields common to INET
transport protocols now in tcp_sk or inet_sk will be chunked out into
inet_connection_sock, for now its better to concentrate on getting the
changes in the core merged to leave the DCCP tree with only DCCP
specific code.

Next changesets will take advantage of this move to generalise things
like tcp_bind_hash, tcp_put_port, tcp_inherit_port, making the later
receive a inet_hashinfo parameter, and even __tcp_tw_hashdance, etc in
the future, when tcp_tw_bucket gets transformed into the struct
timewait_sock hierarchy.

tcp_destroy_sock also is eligible as soon as tcp_orphan_count gets
moved to sk_prot.

A cascade of incremental changes will ultimately make the tcp_lookup
functions be fully generic.

Signed-off-by: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/ip.h
include/linux/tcp.h
include/net/tcp.h
net/ipv4/tcp.c
net/ipv4/tcp_ipv4.c
net/ipv4/tcp_minisocks.c
net/ipv6/tcp_ipv6.c

index 33e8a19a1a0fbaec33122f4f931c3d577fc975c9..2c54bbd3da76ab5d200e6fe0a97b67f9d2851c33 100644 (file)
@@ -128,6 +128,7 @@ static inline struct inet_request_sock *inet_rsk(const struct request_sock *sk)
        return (struct inet_request_sock *)sk;
 }
 
+struct inet_bind_bucket;
 struct ipv6_pinfo;
 
 struct inet_sock {
@@ -157,6 +158,7 @@ struct inet_sock {
        int                     mc_index;       /* Multicast device index */
        __u32                   mc_addr;
        struct ip_mc_socklist   *mc_list;       /* Group array */
+       struct inet_bind_bucket *bind_hash;
        /*
         * Following members are used to retain the infomation to build
         * an ip header on each ip fragmentation while the socket is corked.
index ec580a560e8c3d0be363bbfe36f4b986a7acac66..e70ab19652db88a674394d78282967f95cbf5810 100644 (file)
@@ -258,7 +258,6 @@ struct tcp_sock {
        __u32   snd_sml;        /* Last byte of the most recently transmitted small packet */
        __u32   rcv_tstamp;     /* timestamp of last received ACK (for keepalives) */
        __u32   lsndtime;       /* timestamp of last sent data packet (for restart window) */
-       struct inet_bind_bucket *bind_hash;
        /* Delayed ACK control data */
        struct {
                __u8    pending;        /* ACK is pending */
index ff5d30ac2b06602114034bc439a1d21472acd728..6c6c879e7e8732cce0d14968b11ee8cd3a46f5e5 100644 (file)
@@ -1266,7 +1266,7 @@ static __inline__ void tcp_set_state(struct sock *sk, int state)
                        TCP_INC_STATS(TCP_MIB_ESTABRESETS);
 
                sk->sk_prot->unhash(sk);
-               if (tcp_sk(sk)->bind_hash &&
+               if (inet_sk(sk)->bind_hash &&
                    !(sk->sk_userlocks & SOCK_BINDPORT_LOCK))
                        tcp_put_port(sk);
                /* fall through */
index 1ec03db7dcd9b1a690483bb7d3303f0d62e0124a..e54a410ca701b223aa1940881e786b96a74b17f9 100644 (file)
@@ -1575,7 +1575,7 @@ void tcp_destroy_sock(struct sock *sk)
        BUG_TRAP(sk_unhashed(sk));
 
        /* If it has not 0 inet_sk(sk)->num, it must be bound */
-       BUG_TRAP(!inet_sk(sk)->num || tcp_sk(sk)->bind_hash);
+       BUG_TRAP(!inet_sk(sk)->num || inet_sk(sk)->bind_hash);
 
        sk->sk_prot->destroy(sk);
 
@@ -1802,7 +1802,7 @@ int tcp_disconnect(struct sock *sk, int flags)
        tcp_sack_reset(&tp->rx_opt);
        __sk_dst_reset(sk);
 
-       BUG_TRAP(!inet->num || tp->bind_hash);
+       BUG_TRAP(!inet->num || inet->bind_hash);
 
        sk->sk_error_report(sk);
        return err;
index 58e36ed88f25bb861b954b200e916417fb75cd30..10a9b3ae344219fc059b6fc53187adcd4ecfe0c2 100644 (file)
@@ -113,9 +113,9 @@ static __inline__ void __tcp_inherit_port(struct sock *sk, struct sock *child)
        struct inet_bind_bucket *tb;
 
        spin_lock(&head->lock);
-       tb = tcp_sk(sk)->bind_hash;
+       tb = inet_sk(sk)->bind_hash;
        sk_add_bind_node(child, &tb->owners);
-       tcp_sk(child)->bind_hash = tb;
+       inet_sk(child)->bind_hash = tb;
        spin_unlock(&head->lock);
 }
 
@@ -129,9 +129,10 @@ inline void tcp_inherit_port(struct sock *sk, struct sock *child)
 void tcp_bind_hash(struct sock *sk, struct inet_bind_bucket *tb,
                   const unsigned short snum)
 {
-       inet_sk(sk)->num = snum;
+       struct inet_sock *inet = inet_sk(sk);
+       inet->num       = snum;
        sk_add_bind_node(sk, &tb->owners);
-       tcp_sk(sk)->bind_hash = tb;
+       inet->bind_hash = tb;
 }
 
 static inline int tcp_bind_conflict(struct sock *sk, struct inet_bind_bucket *tb)
@@ -246,9 +247,9 @@ tb_not_found:
                   (!sk->sk_reuse || sk->sk_state == TCP_LISTEN))
                tb->fastreuse = 0;
 success:
-       if (!tcp_sk(sk)->bind_hash)
+       if (!inet_sk(sk)->bind_hash)
                tcp_bind_hash(sk, tb, snum);
-       BUG_TRAP(tcp_sk(sk)->bind_hash == tb);
+       BUG_TRAP(inet_sk(sk)->bind_hash == tb);
        ret = 0;
 
 fail_unlock:
@@ -269,9 +270,9 @@ static void __tcp_put_port(struct sock *sk)
        struct inet_bind_bucket *tb;
 
        spin_lock(&head->lock);
-       tb = tcp_sk(sk)->bind_hash;
+       tb = inet->bind_hash;
        __sk_del_bind_node(sk);
-       tcp_sk(sk)->bind_hash = NULL;
+       inet->bind_hash = NULL;
        inet->num = 0;
        inet_bind_bucket_destroy(tcp_bucket_cachep, tb);
        spin_unlock(&head->lock);
@@ -694,7 +695,7 @@ ok:
        }
 
        head = &tcp_bhash[inet_bhashfn(snum, tcp_bhash_size)];
-       tb  = tcp_sk(sk)->bind_hash;
+       tb  = inet_sk(sk)->bind_hash;
        spin_lock_bh(&head->lock);
        if (sk_head(&tb->owners) == sk && !sk->sk_bind_node.next) {
                __tcp_v4_hash(sk, 0);
@@ -1940,7 +1941,7 @@ int tcp_v4_destroy_sock(struct sock *sk)
        __skb_queue_purge(&tp->ucopy.prequeue);
 
        /* Clean up a referenced TCP bind bucket. */
-       if (tp->bind_hash)
+       if (inet_sk(sk)->bind_hash)
                tcp_put_port(sk);
 
        /*
index 1df6cd46066bb05b40e504d1d979019773ffb5d4..267cea1087e549fba348ae015437c7977d42d9f3 100644 (file)
@@ -296,17 +296,17 @@ kill:
  */
 static void __tcp_tw_hashdance(struct sock *sk, struct tcp_tw_bucket *tw)
 {
+       const struct inet_sock *inet = inet_sk(sk);
        struct inet_ehash_bucket *ehead = &tcp_ehash[sk->sk_hashent];
        struct inet_bind_hashbucket *bhead;
-
        /* Step 1: Put TW into bind hash. Original socket stays there too.
-          Note, that any socket with inet_sk(sk)->num != 0 MUST be bound in
+          Note, that any socket with inet->num != 0 MUST be bound in
           binding cache, even if it is closed.
         */
-       bhead = &tcp_bhash[inet_bhashfn(inet_sk(sk)->num, tcp_bhash_size)];
+       bhead = &tcp_bhash[inet_bhashfn(inet->num, tcp_bhash_size)];
        spin_lock(&bhead->lock);
-       tw->tw_tb = tcp_sk(sk)->bind_hash;
-       BUG_TRAP(tcp_sk(sk)->bind_hash);
+       tw->tw_tb = inet->bind_hash;
+       BUG_TRAP(inet->bind_hash);
        tw_add_bind_node(tw, &tw->tw_tb->owners);
        spin_unlock(&bhead->lock);
 
@@ -694,6 +694,7 @@ struct sock *tcp_create_openreq_child(struct sock *sk, struct request_sock *req,
        if(newsk != NULL) {
                struct inet_request_sock *ireq = inet_rsk(req);
                struct tcp_request_sock *treq = tcp_rsk(req);
+               struct inet_sock *newinet = inet_sk(newsk);
                struct tcp_sock *newtp;
                struct sk_filter *filter;
 
@@ -702,10 +703,10 @@ struct sock *tcp_create_openreq_child(struct sock *sk, struct request_sock *req,
 
                /* SANITY */
                sk_node_init(&newsk->sk_node);
-               tcp_sk(newsk)->bind_hash = NULL;
+               newinet->bind_hash = NULL;
 
                /* Clone the TCP header template */
-               inet_sk(newsk)->dport = ireq->rmt_port;
+               newinet->dport = ireq->rmt_port;
 
                sock_lock_init(newsk);
                bh_lock_sock(newsk);
index 31f50fb29ffb6451c58e055f8f86a21dbea90c4a..a8ca7ba06c1c571970aae1562bfbb90f8ceb87be 100644 (file)
@@ -204,9 +204,9 @@ tb_not_found:
                tb->fastreuse = 0;
 
 success:
-       if (!tcp_sk(sk)->bind_hash)
+       if (!inet_sk(sk)->bind_hash)
                tcp_bind_hash(sk, tb, snum);
-       BUG_TRAP(tcp_sk(sk)->bind_hash == tb);
+       BUG_TRAP(inet_sk(sk)->bind_hash == tb);
        ret = 0;
 
 fail_unlock:
@@ -613,8 +613,8 @@ ok:
                goto out;
        }
 
-       head  = &tcp_bhash[inet_bhashfn(snum, tcp_bhash_size)];
-       tb  = tcp_sk(sk)->bind_hash;
+       head = &tcp_bhash[inet_bhashfn(snum, tcp_bhash_size)];
+       tb   = inet_sk(sk)->bind_hash;
        spin_lock_bh(&head->lock);
 
        if (sk_head(&tb->owners) == sk && !sk->sk_bind_node.next) {