]> err.no Git - linux-2.6/blobdiff - net/ipv4/tcp_ipv4.c
Merge branch 'master' of git://git.infradead.org/~kmpark/onenand-mtd-2.6
[linux-2.6] / net / ipv4 / tcp_ipv4.c
index dadf802724131d199117bd1dbf7c6ee0b12a2079..12de90a5047cf214cd4bd1851331ac14851c0783 100644 (file)
@@ -93,16 +93,18 @@ static struct socket *tcp_socket;
 void tcp_v4_send_check(struct sock *sk, int len, struct sk_buff *skb);
 
 #ifdef CONFIG_TCP_MD5SIG
-static struct tcp_md5sig_key *tcp_v4_md5_do_lookup(struct sock *sk, __be32 addr);
+static struct tcp_md5sig_key *tcp_v4_md5_do_lookup(struct sock *sk,
+                                                  __be32 addr);
 static int tcp_v4_do_calc_md5_hash(char *md5_hash, struct tcp_md5sig_key *key,
-                                  __be32 saddr, __be32 daddr, struct tcphdr *th,
-                                  int protocol, int tcplen);
+                                  __be32 saddr, __be32 daddr,
+                                  struct tcphdr *th, int protocol,
+                                  int tcplen);
 #endif
 
 struct inet_hashinfo __cacheline_aligned tcp_hashinfo = {
-       .lhash_lock     = __RW_LOCK_UNLOCKED(tcp_hashinfo.lhash_lock),
-       .lhash_users    = ATOMIC_INIT(0),
-       .lhash_wait     = __WAIT_QUEUE_HEAD_INITIALIZER(tcp_hashinfo.lhash_wait),
+       .lhash_lock  = __RW_LOCK_UNLOCKED(tcp_hashinfo.lhash_lock),
+       .lhash_users = ATOMIC_INIT(0),
+       .lhash_wait  = __WAIT_QUEUE_HEAD_INITIALIZER(tcp_hashinfo.lhash_wait),
 };
 
 static int tcp_v4_get_port(struct sock *sk, unsigned short snum)
@@ -215,13 +217,14 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
        if (tcp_death_row.sysctl_tw_recycle &&
            !tp->rx_opt.ts_recent_stamp && rt->rt_dst == daddr) {
                struct inet_peer *peer = rt_get_peer(rt);
-
-               /* VJ's idea. We save last timestamp seen from
-                * the destination in peer table, when entering state TIME-WAIT
-                * and initialize rx_opt.ts_recent from it, when trying new connection.
+               /*
+                * VJ's idea. We save last timestamp seen from
+                * the destination in peer table, when entering state
+                * TIME-WAIT * and initialize rx_opt.ts_recent from it,
+                * when trying new connection.
                 */
-
-               if (peer && peer->tcp_ts_stamp + TCP_PAWS_MSL >= xtime.tv_sec) {
+               if (peer != NULL &&
+                   peer->tcp_ts_stamp + TCP_PAWS_MSL >= xtime.tv_sec) {
                        tp->rx_opt.ts_recent_stamp = peer->tcp_ts_stamp;
                        tp->rx_opt.ts_recent = peer->tcp_ts;
                }
@@ -246,7 +249,8 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
        if (err)
                goto failure;
 
-       err = ip_route_newports(&rt, IPPROTO_TCP, inet->sport, inet->dport, sk);
+       err = ip_route_newports(&rt, IPPROTO_TCP,
+                               inet->sport, inet->dport, sk);
        if (err)
                goto failure;
 
@@ -270,7 +274,10 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
        return 0;
 
 failure:
-       /* This unhashes the socket and releases the local port, if necessary. */
+       /*
+        * This unhashes the socket and releases the local port,
+        * if necessary.
+        */
        tcp_set_state(sk, TCP_CLOSE);
        ip_rt_put(rt);
        sk->sk_route_caps = 0;
@@ -495,8 +502,9 @@ void tcp_v4_send_check(struct sock *sk, int len, struct sk_buff *skb)
        struct tcphdr *th = skb->h.th;
 
        if (skb->ip_summed == CHECKSUM_PARTIAL) {
-               th->check = ~tcp_v4_check(th, len, inet->saddr, inet->daddr, 0);
-               skb->csum = offsetof(struct tcphdr, check);
+               th->check = ~tcp_v4_check(th, len,
+                                         inet->saddr, inet->daddr, 0);
+               skb->csum_offset = offsetof(struct tcphdr, check);
        } else {
                th->check = tcp_v4_check(th, len, inet->saddr, inet->daddr,
                                         csum_partial((char *)th,
@@ -518,7 +526,7 @@ int tcp_v4_gso_send_check(struct sk_buff *skb)
 
        th->check = 0;
        th->check = ~tcp_v4_check(th, skb->len, iph->saddr, iph->daddr, 0);
-       skb->csum = offsetof(struct tcphdr, check);
+       skb->csum_offset = offsetof(struct tcphdr, check);
        skb->ip_summed = CHECKSUM_PARTIAL;
        return 0;
 }
@@ -572,7 +580,7 @@ static void tcp_v4_send_reset(struct sock *sk, struct sk_buff *skb)
                                       skb->len - (th->doff << 2));
        }
 
-       memset(&arg, 0, sizeof arg);
+       memset(&arg, 0, sizeof(arg));
        arg.iov[0].iov_base = (unsigned char *)&rep;
        arg.iov[0].iov_len  = sizeof(rep.th);
 
@@ -595,9 +603,8 @@ static void tcp_v4_send_reset(struct sock *sk, struct sk_buff *skb)
                                        arg.iov[0].iov_len);
        }
 #endif
-
        arg.csum = csum_tcpudp_nofold(skb->nh.iph->daddr,
-                                     skb->nh.iph->saddr, /*XXX*/
+                                     skb->nh.iph->saddr, /* XXX */
                                      sizeof(struct tcphdr), IPPROTO_TCP, 0);
        arg.csumoffset = offsetof(struct tcphdr, check) / 2;
 
@@ -631,7 +638,7 @@ static void tcp_v4_send_ack(struct tcp_timewait_sock *twsk,
 #endif
 
        memset(&rep.th, 0, sizeof(struct tcphdr));
-       memset(&arg, 0, sizeof arg);
+       memset(&arg, 0, sizeof(arg));
 
        arg.iov[0].iov_base = (unsigned char *)&rep;
        arg.iov[0].iov_len  = sizeof(rep.th);
@@ -641,7 +648,7 @@ static void tcp_v4_send_ack(struct tcp_timewait_sock *twsk,
                                   TCPOLEN_TIMESTAMP);
                rep.opt[1] = htonl(tcp_time_stamp);
                rep.opt[2] = htonl(ts);
-               arg.iov[0].iov_len = TCPOLEN_TSTAMP_ALIGNED;
+               arg.iov[0].iov_len += TCPOLEN_TSTAMP_ALIGNED;
        }
 
        /* Swap the send and the receive. */
@@ -668,9 +675,8 @@ static void tcp_v4_send_ack(struct tcp_timewait_sock *twsk,
                tw_key.key = twsk->tw_md5_key;
                tw_key.keylen = twsk->tw_md5_keylen;
                key = &tw_key;
-       } else {
+       } else
                key = NULL;
-       }
 
        if (key) {
                int offset = (ts) ? 3 : 0;
@@ -690,9 +696,8 @@ static void tcp_v4_send_ack(struct tcp_timewait_sock *twsk,
                                        arg.iov[0].iov_len);
        }
 #endif
-
        arg.csum = csum_tcpudp_nofold(skb->nh.iph->daddr,
-                                     skb->nh.iph->saddr, /*XXX*/
+                                     skb->nh.iph->saddr, /* XXX */
                                      arg.iov[0].iov_len, IPPROTO_TCP, 0);
        arg.csumoffset = offsetof(struct tcphdr, check) / 2;
 
@@ -707,12 +712,14 @@ static void tcp_v4_timewait_ack(struct sock *sk, struct sk_buff *skb)
        struct tcp_timewait_sock *tcptw = tcp_twsk(sk);
 
        tcp_v4_send_ack(tcptw, skb, tcptw->tw_snd_nxt, tcptw->tw_rcv_nxt,
-                       tcptw->tw_rcv_wnd >> tw->tw_rcv_wscale, tcptw->tw_ts_recent);
+                       tcptw->tw_rcv_wnd >> tw->tw_rcv_wscale,
+                       tcptw->tw_ts_recent);
 
        inet_twsk_put(tw);
 }
 
-static void tcp_v4_reqsk_send_ack(struct sk_buff *skb, struct request_sock *req)
+static void tcp_v4_reqsk_send_ack(struct sk_buff *skb,
+                                 struct request_sock *req)
 {
        tcp_v4_send_ack(NULL, skb, tcp_rsk(req)->snt_isn + 1,
                        tcp_rsk(req)->rcv_isn + 1, req->rcv_wnd,
@@ -809,7 +816,8 @@ static struct ip_options *tcp_v4_save_options(struct sock *sk,
  */
 
 /* Find the Key structure for an address.  */
-static struct tcp_md5sig_key *tcp_v4_md5_do_lookup(struct sock *sk, __be32 addr)
+static struct tcp_md5sig_key *
+                       tcp_v4_md5_do_lookup(struct sock *sk, __be32 addr)
 {
        struct tcp_sock *tp = tcp_sk(sk);
        int i;
@@ -818,7 +826,8 @@ static struct tcp_md5sig_key *tcp_v4_md5_do_lookup(struct sock *sk, __be32 addr)
                return NULL;
        for (i = 0; i < tp->md5sig_info->entries4; i++) {
                if (tp->md5sig_info->keys4[i].addr == addr)
-                       return (struct tcp_md5sig_key *)&tp->md5sig_info->keys4[i];
+                       return (struct tcp_md5sig_key *)
+                                               &tp->md5sig_info->keys4[i];
        }
        return NULL;
 }
@@ -831,8 +840,8 @@ struct tcp_md5sig_key *tcp_v4_md5_lookup(struct sock *sk,
 
 EXPORT_SYMBOL(tcp_v4_md5_lookup);
 
-struct tcp_md5sig_key *tcp_v4_reqsk_md5_lookup(struct sock *sk,
-                                              struct request_sock *req)
+static struct tcp_md5sig_key *tcp_v4_reqsk_md5_lookup(struct sock *sk,
+                                                     struct request_sock *req)
 {
        return tcp_v4_md5_do_lookup(sk, inet_rsk(req)->rmt_addr);
 }
@@ -846,15 +855,18 @@ int tcp_v4_md5_do_add(struct sock *sk, __be32 addr,
        struct tcp_sock *tp = tcp_sk(sk);
        struct tcp4_md5sig_key *keys;
 
-       key = (struct tcp4_md5sig_key *) tcp_v4_md5_do_lookup(sk, addr);
+       key = (struct tcp4_md5sig_key *)tcp_v4_md5_do_lookup(sk, addr);
        if (key) {
                /* Pre-existing entry - just update that one. */
-               kfree (key->key);
+               kfree(key->key);
                key->key = newkey;
                key->keylen = newkeylen;
        } else {
+               struct tcp_md5sig_info *md5sig;
+
                if (!tp->md5sig_info) {
-                       tp->md5sig_info = kzalloc(sizeof(*tp->md5sig_info), GFP_ATOMIC);
+                       tp->md5sig_info = kzalloc(sizeof(*tp->md5sig_info),
+                                                 GFP_ATOMIC);
                        if (!tp->md5sig_info) {
                                kfree(newkey);
                                return -ENOMEM;
@@ -864,30 +876,31 @@ int tcp_v4_md5_do_add(struct sock *sk, __be32 addr,
                        kfree(newkey);
                        return -ENOMEM;
                }
-               if (tp->md5sig_info->alloced4 == tp->md5sig_info->entries4) {
-                       keys = kmalloc((sizeof(struct tcp4_md5sig_key) *
-                                      (tp->md5sig_info->entries4 + 1)), GFP_ATOMIC);
+               md5sig = tp->md5sig_info;
+
+               if (md5sig->alloced4 == md5sig->entries4) {
+                       keys = kmalloc((sizeof(*keys) *
+                                       (md5sig->entries4 + 1)), GFP_ATOMIC);
                        if (!keys) {
                                kfree(newkey);
                                tcp_free_md5sig_pool();
                                return -ENOMEM;
                        }
 
-                       if (tp->md5sig_info->entries4)
-                               memcpy(keys, tp->md5sig_info->keys4,
-                                      (sizeof (struct tcp4_md5sig_key) *
-                                       tp->md5sig_info->entries4));
+                       if (md5sig->entries4)
+                               memcpy(keys, md5sig->keys4,
+                                      sizeof(*keys) * md5sig->entries4);
 
                        /* Free old key list, and reference new one */
-                       if (tp->md5sig_info->keys4)
-                               kfree(tp->md5sig_info->keys4);
-                       tp->md5sig_info->keys4 = keys;
-                       tp->md5sig_info->alloced4++;
+                       if (md5sig->keys4)
+                               kfree(md5sig->keys4);
+                       md5sig->keys4 = keys;
+                       md5sig->alloced4++;
                }
-               tp->md5sig_info->entries4++;
-               tp->md5sig_info->keys4[tp->md5sig_info->entries4 - 1].addr = addr;
-               tp->md5sig_info->keys4[tp->md5sig_info->entries4 - 1].key = newkey;
-               tp->md5sig_info->keys4[tp->md5sig_info->entries4 - 1].keylen = newkeylen;
+               md5sig->entries4++;
+               md5sig->keys4[md5sig->entries4 - 1].addr   = addr;
+               md5sig->keys4[md5sig->entries4 - 1].key    = newkey;
+               md5sig->keys4[md5sig->entries4 - 1].keylen = newkeylen;
        }
        return 0;
 }
@@ -915,13 +928,13 @@ int tcp_v4_md5_do_del(struct sock *sk, __be32 addr)
                        if (tp->md5sig_info->entries4 == 0) {
                                kfree(tp->md5sig_info->keys4);
                                tp->md5sig_info->keys4 = NULL;
-                       } else {
+                               tp->md5sig_info->alloced4 = 0;
+                       } else if (tp->md5sig_info->entries4 != i) {
                                /* Need to do some manipulation */
-                               if (tp->md5sig_info->entries4 != i)
-                                       memcpy(&tp->md5sig_info->keys4[i],
-                                              &tp->md5sig_info->keys4[i+1],
-                                              (tp->md5sig_info->entries4 - i)
-                                               * sizeof (struct tcp4_md5sig_key));
+                               memcpy(&tp->md5sig_info->keys4[i],
+                                      &tp->md5sig_info->keys4[i+1],
+                                      (tp->md5sig_info->entries4 - i) *
+                                       sizeof(struct tcp4_md5sig_key));
                        }
                        tcp_free_md5sig_pool();
                        return 0;
@@ -932,7 +945,7 @@ int tcp_v4_md5_do_del(struct sock *sk, __be32 addr)
 
 EXPORT_SYMBOL(tcp_v4_md5_do_del);
 
-static void tcp_v4_clear_md5_list (struct sock *sk)
+static void tcp_v4_clear_md5_list(struct sock *sk)
 {
        struct tcp_sock *tp = tcp_sk(sk);
 
@@ -954,8 +967,8 @@ static void tcp_v4_clear_md5_list (struct sock *sk)
        }
 }
 
-static int tcp_v4_parse_md5_keys (struct sock *sk, char __user *optval,
-                                 int optlen)
+static int tcp_v4_parse_md5_keys(struct sock *sk, char __user *optval,
+                                int optlen)
 {
        struct tcp_md5sig cmd;
        struct sockaddr_in *sin = (struct sockaddr_in *)&cmd.tcpm_addr;
@@ -964,7 +977,7 @@ static int tcp_v4_parse_md5_keys (struct sock *sk, char __user *optval,
        if (optlen < sizeof(cmd))
                return -EINVAL;
 
-       if (copy_from_user (&cmd, optval, sizeof(cmd)))
+       if (copy_from_user(&cmd, optval, sizeof(cmd)))
                return -EFAULT;
 
        if (sin->sin_family != AF_INET)
@@ -981,9 +994,8 @@ static int tcp_v4_parse_md5_keys (struct sock *sk, char __user *optval,
 
        if (!tcp_sk(sk)->md5sig_info) {
                struct tcp_sock *tp = tcp_sk(sk);
-               struct tcp_md5sig_info *p;
+               struct tcp_md5sig_info *p = kzalloc(sizeof(*p), GFP_KERNEL);
 
-               p = kzalloc(sizeof(struct tcp_md5sig_info), GFP_KERNEL);
                if (!p)
                        return -EINVAL;
 
@@ -991,10 +1003,9 @@ static int tcp_v4_parse_md5_keys (struct sock *sk, char __user *optval,
 
        }
 
-       newkey = kmalloc(cmd.tcpm_keylen, GFP_KERNEL);
+       newkey = kmemdup(cmd.tcpm_key, cmd.tcpm_keylen, GFP_KERNEL);
        if (!newkey)
                return -ENOMEM;
-       memcpy(newkey, cmd.tcpm_key, cmd.tcpm_keylen);
        return tcp_v4_md5_do_add(sk, sin->sin_addr.s_addr,
                                 newkey, cmd.tcpm_keylen);
 }
@@ -1007,10 +1018,7 @@ static int tcp_v4_do_calc_md5_hash(char *md5_hash, struct tcp_md5sig_key *key,
        struct scatterlist sg[4];
        __u16 data_len;
        int block = 0;
-#ifdef CONFIG_TCP_MD5SIG_DEBUG
-       int i;
-#endif
-       __u16 old_checksum;
+       __sum16 old_checksum;
        struct tcp_md5sig_pool *hp;
        struct tcp4_pseudohdr *bp;
        struct hash_desc *desc;
@@ -1042,13 +1050,6 @@ static int tcp_v4_do_calc_md5_hash(char *md5_hash, struct tcp_md5sig_key *key,
        sg_set_buf(&sg[block++], bp, sizeof(*bp));
        nbytes += sizeof(*bp);
 
-#ifdef CONFIG_TCP_MD5SIG_DEBUG
-       printk("Calcuating hash for: ");
-       for (i = 0; i < sizeof (*bp); i++)
-               printk ("%02x ", (unsigned int)((unsigned char *)bp)[i]);
-       printk(" ");
-#endif
-
        /* 2. the TCP header, excluding options, and assuming a
         * checksum of zero/
         */
@@ -1056,10 +1057,7 @@ static int tcp_v4_do_calc_md5_hash(char *md5_hash, struct tcp_md5sig_key *key,
        th->check = 0;
        sg_set_buf(&sg[block++], th, sizeof(struct tcphdr));
        nbytes += sizeof(struct tcphdr);
-#ifdef CONFIG_TCP_MD5SIG_DEBUG
-       for (i = 0; i < sizeof (struct tcphdr); i++)
-               printk (" %02x", (unsigned int)((unsigned char *)th)[i]);
-#endif
+
        /* 3. the TCP segment data (if any) */
        data_len = tcplen - (th->doff << 2);
        if (data_len > 0) {
@@ -1074,12 +1072,6 @@ static int tcp_v4_do_calc_md5_hash(char *md5_hash, struct tcp_md5sig_key *key,
        sg_set_buf(&sg[block++], key->key, key->keylen);
        nbytes += key->keylen;
 
-#ifdef CONFIG_TCP_MD5SIG_DEBUG
-       printk ("  and password: ");
-       for (i = 0; i < key->keylen; i++)
-               printk ("%02x ", (unsigned int)key->key[i]);
-#endif
-
        /* Now store the Hash into the packet */
        err = crypto_hash_init(desc);
        if (err)
@@ -1096,12 +1088,6 @@ static int tcp_v4_do_calc_md5_hash(char *md5_hash, struct tcp_md5sig_key *key,
        th->check = old_checksum;
 
 out:
-#ifdef CONFIG_TCP_MD5SIG_DEBUG
-       printk(" result:");
-       for (i = 0; i < 16; i++)
-               printk (" %02x", (unsigned int)(((u8*)md5_hash)[i]));
-       printk("\n");
-#endif
        return 0;
 clear_hash:
        tcp_put_md5sig_pool();
@@ -1135,7 +1121,7 @@ int tcp_v4_calc_md5_hash(char *md5_hash, struct tcp_md5sig_key *key,
 
 EXPORT_SYMBOL(tcp_v4_calc_md5_hash);
 
-static int tcp_v4_inbound_md5_hash (struct sock *sk, struct sk_buff *skb)
+static int tcp_v4_inbound_md5_hash(struct sock *sk, struct sk_buff *skb)
 {
        /*
         * This gets called for each TCP segment that arrives
@@ -1149,7 +1135,7 @@ static int tcp_v4_inbound_md5_hash (struct sock *sk, struct sk_buff *skb)
        struct tcp_md5sig_key *hash_expected;
        struct iphdr *iph = skb->nh.iph;
        struct tcphdr *th = skb->h.th;
-       int length = (th->doff << 2) - sizeof (struct tcphdr);
+       int length = (th->doff << 2) - sizeof(struct tcphdr);
        int genhash;
        unsigned char *ptr;
        unsigned char newhash[16];
@@ -1200,22 +1186,18 @@ done_opts:
                return 0;
 
        if (hash_expected && !hash_location) {
-               if (net_ratelimit()) {
-                       printk(KERN_INFO "MD5 Hash NOT expected but found "
+               LIMIT_NETDEBUG(KERN_INFO "MD5 Hash expected but NOT found "
                               "(" NIPQUAD_FMT ", %d)->(" NIPQUAD_FMT ", %d)\n",
-                              NIPQUAD (iph->saddr), ntohs(th->source),
-                              NIPQUAD (iph->daddr), ntohs(th->dest));
-               }
+                              NIPQUAD(iph->saddr), ntohs(th->source),
+                              NIPQUAD(iph->daddr), ntohs(th->dest));
                return 1;
        }
 
        if (!hash_expected && hash_location) {
-               if (net_ratelimit()) {
-                       printk(KERN_INFO "MD5 Hash NOT expected but found "
+               LIMIT_NETDEBUG(KERN_INFO "MD5 Hash NOT expected but found "
                               "(" NIPQUAD_FMT ", %d)->(" NIPQUAD_FMT ", %d)\n",
-                              NIPQUAD (iph->saddr), ntohs(th->source),
-                              NIPQUAD (iph->daddr), ntohs(th->dest));
-               }
+                              NIPQUAD(iph->saddr), ntohs(th->source),
+                              NIPQUAD(iph->daddr), ntohs(th->dest));
                return 1;
        }
 
@@ -1232,22 +1214,9 @@ done_opts:
                if (net_ratelimit()) {
                        printk(KERN_INFO "MD5 Hash failed for "
                               "(" NIPQUAD_FMT ", %d)->(" NIPQUAD_FMT ", %d)%s\n",
-                              NIPQUAD (iph->saddr), ntohs(th->source),
-                              NIPQUAD (iph->daddr), ntohs(th->dest),
+                              NIPQUAD(iph->saddr), ntohs(th->source),
+                              NIPQUAD(iph->daddr), ntohs(th->dest),
                               genhash ? " tcp_v4_calc_md5_hash failed" : "");
-#ifdef CONFIG_TCP_MD5SIG_DEBUG
-                       do {
-                               int i;
-                               printk("Received: ");
-                               for (i = 0; i < 16; i++)
-                                       printk("%02x ", 0xff & (int)hash_location[i]);
-                               printk("\n");
-                               printk("Calculated: ");
-                               for (i = 0; i < 16; i++)
-                                       printk("%02x ", 0xff & (int)newhash[i]);
-                               printk("\n");
-                       } while(0);
-#endif
                }
                return 1;
        }
@@ -1265,11 +1234,11 @@ struct request_sock_ops tcp_request_sock_ops __read_mostly = {
        .send_reset     =       tcp_v4_send_reset,
 };
 
-struct tcp_request_sock_ops tcp_request_sock_ipv4_ops = {
 #ifdef CONFIG_TCP_MD5SIG
+static struct tcp_request_sock_ops tcp_request_sock_ipv4_ops = {
        .md5_lookup     =       tcp_v4_reqsk_md5_lookup,
-#endif
 };
+#endif
 
 static struct timewait_sock_ops tcp_timewait_sock_ops = {
        .twsk_obj_size  = sizeof(struct tcp_timewait_sock),
@@ -1490,12 +1459,10 @@ struct sock *tcp_v4_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
                 * memory, then we end up not copying the key
                 * across. Shucks.
                 */
-               char *newkey = kmalloc(key->keylen, GFP_ATOMIC);
-               if (newkey) {
-                       memcpy(newkey, key->key, key->keylen);
+               char *newkey = kmemdup(key->key, key->keylen, GFP_ATOMIC);
+               if (newkey != NULL)
                        tcp_v4_md5_do_add(newsk, inet_sk(sk)->daddr,
                                          newkey, key->keylen);
-               }
        }
 #endif
 
@@ -1582,7 +1549,7 @@ int tcp_v4_do_rcv(struct sock *sk, struct sk_buff *skb)
         *  o We're expecting an MD5'd packet and this is no MD5 tcp option
         *  o There is an MD5 option and we're not expecting one
         */
-       if (tcp_v4_inbound_md5_hash (sk, skb))
+       if (tcp_v4_inbound_md5_hash(sk, skb))
                goto discard;
 #endif
 
@@ -1854,14 +1821,14 @@ struct inet_connection_sock_af_ops ipv4_specific = {
 #endif
 };
 
-struct tcp_sock_af_ops tcp_sock_ipv4_specific = {
 #ifdef CONFIG_TCP_MD5SIG
+static struct tcp_sock_af_ops tcp_sock_ipv4_specific = {
        .md5_lookup             = tcp_v4_md5_lookup,
        .calc_md5_hash          = tcp_v4_calc_md5_hash,
        .md5_add                = tcp_v4_md5_add_func,
        .md5_parse              = tcp_v4_parse_md5_keys,
-#endif
 };
+#endif
 
 /* NOTE: A lot of things set to zero explicitly by call to
  *       sk_alloc() so need not be done here.
@@ -2155,7 +2122,7 @@ static void *established_get_idx(struct seq_file *seq, loff_t pos)
        while (rc && pos) {
                rc = established_get_next(seq, rc);
                --pos;
-       }               
+       }
        return rc;
 }
 
@@ -2284,7 +2251,7 @@ int tcp_proc_register(struct tcp_seq_afinfo *afinfo)
        afinfo->seq_fops->read          = seq_read;
        afinfo->seq_fops->llseek        = seq_lseek;
        afinfo->seq_fops->release       = seq_release_private;
-       
+
        p = proc_net_fops_create(afinfo->name, S_IRUGO, afinfo->seq_fops);
        if (p)
                p->data = afinfo;
@@ -2298,7 +2265,7 @@ void tcp_proc_unregister(struct tcp_seq_afinfo *afinfo)
        if (!afinfo)
                return;
        proc_net_remove(afinfo->name);
-       memset(afinfo->seq_fops, 0, sizeof(*afinfo->seq_fops)); 
+       memset(afinfo->seq_fops, 0, sizeof(*afinfo->seq_fops));
 }
 
 static void get_openreq4(struct sock *sk, struct request_sock *req,
@@ -2356,7 +2323,8 @@ static void get_tcp4_sock(struct sock *sp, char *tmpbuf, int i)
                        "%08X %5d %8d %lu %d %p %u %u %u %u %d",
                i, src, srcp, dest, destp, sp->sk_state,
                tp->write_seq - tp->snd_una,
-               (sp->sk_state == TCP_LISTEN) ? sp->sk_ack_backlog : (tp->rcv_nxt - tp->copied_seq),
+               sp->sk_state == TCP_LISTEN ? sp->sk_ack_backlog :
+                                            (tp->rcv_nxt - tp->copied_seq),
                timer_active,
                jiffies_to_clock_t(timer_expires - jiffies),
                icsk->icsk_retransmits,
@@ -2371,7 +2339,8 @@ static void get_tcp4_sock(struct sock *sp, char *tmpbuf, int i)
                tp->snd_ssthresh >= 0xFFFF ? -1 : tp->snd_ssthresh);
 }
 
-static void get_timewait4_sock(struct inet_timewait_sock *tw, char *tmpbuf, int i)
+static void get_timewait4_sock(struct inet_timewait_sock *tw,
+                              char *tmpbuf, int i)
 {
        __be32 dest, src;
        __u16 destp, srcp;
@@ -2484,7 +2453,8 @@ struct proto tcp_prot = {
 
 void __init tcp_v4_init(struct net_proto_family *ops)
 {
-       if (inet_csk_ctl_sock_create(&tcp_socket, PF_INET, SOCK_RAW, IPPROTO_TCP) < 0)
+       if (inet_csk_ctl_sock_create(&tcp_socket, PF_INET, SOCK_RAW,
+                                    IPPROTO_TCP) < 0)
                panic("Failed to create the TCP control socket.\n");
 }