]> err.no Git - linux-2.6/blobdiff - net/ipv4/tcp_ipv4.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mingo/linux...
[linux-2.6] / net / ipv4 / tcp_ipv4.c
index c50dd1793643ea16db263f2b33ec6301cf03dace..0e9bc120707d469183facf86c33cf4b1b2446ce9 100644 (file)
@@ -1369,7 +1369,7 @@ int tcp_v4_conn_request(struct sock *sk, struct sk_buff *skb)
                         * to the moment of synflood.
                         */
                        LIMIT_NETDEBUG(KERN_DEBUG "TCP: drop open "
-                                      "request from %u.%u.%u.%u/%u\n",
+                                      "request from " NIPQUAD_FMT "/%u\n",
                                       NIPQUAD(saddr),
                                       ntohs(tcp_hdr(skb)->source));
                        goto drop_and_release;
@@ -2211,46 +2211,19 @@ static void tcp_seq_stop(struct seq_file *seq, void *v)
 static int tcp_seq_open(struct inode *inode, struct file *file)
 {
        struct tcp_seq_afinfo *afinfo = PDE(inode)->data;
-       struct seq_file *seq;
        struct tcp_iter_state *s;
-       struct net *net;
-       int rc;
+       int err;
 
        if (unlikely(afinfo == NULL))
                return -EINVAL;
 
-       s = kzalloc(sizeof(*s), GFP_KERNEL);
-       if (!s)
-               return -ENOMEM;
-
-       rc = -ENXIO;
-       net = get_proc_net(inode);
-       if (!net)
-               goto out_kfree;
+       err = seq_open_net(inode, file, &afinfo->seq_ops,
+                         sizeof(struct tcp_iter_state));
+       if (err < 0)
+               return err;
 
+       s = ((struct seq_file *)file->private_data)->private;
        s->family               = afinfo->family;
-       s->p.net                = net;
-
-       rc = seq_open(file, &afinfo->seq_ops);
-       if (rc)
-               goto out_put_net;
-       seq = file->private_data;
-       seq->private = s;
-out:
-       return rc;
-out_put_net:
-       put_net(net);
-out_kfree:
-       kfree(s);
-       goto out;
-}
-
-static int tcp_seq_release(struct inode *inode, struct file *file)
-{
-       struct seq_file *seq = file->private_data;
-
-       put_net(seq_file_net(seq));
-       seq_release_private(inode, file);
        return 0;
 }
 
@@ -2259,17 +2232,16 @@ int tcp_proc_register(struct net *net, struct tcp_seq_afinfo *afinfo)
        int rc = 0;
        struct proc_dir_entry *p;
 
-       afinfo->seq_fops->owner         = afinfo->owner;
-       afinfo->seq_fops->open          = tcp_seq_open;
-       afinfo->seq_fops->read          = seq_read;
-       afinfo->seq_fops->llseek        = seq_lseek;
-       afinfo->seq_fops->release       = tcp_seq_release;
+       afinfo->seq_fops.open           = tcp_seq_open;
+       afinfo->seq_fops.read           = seq_read;
+       afinfo->seq_fops.llseek         = seq_lseek;
+       afinfo->seq_fops.release        = seq_release_net;
 
        afinfo->seq_ops.start           = tcp_seq_start;
        afinfo->seq_ops.next            = tcp_seq_next;
        afinfo->seq_ops.stop            = tcp_seq_stop;
 
-       p = proc_net_fops_create(net, afinfo->name, S_IRUGO, afinfo->seq_fops);
+       p = proc_net_fops_create(net, afinfo->name, S_IRUGO, &afinfo->seq_fops);
        if (p)
                p->data = afinfo;
        else
@@ -2280,17 +2252,16 @@ int tcp_proc_register(struct net *net, struct tcp_seq_afinfo *afinfo)
 void tcp_proc_unregister(struct net *net, struct tcp_seq_afinfo *afinfo)
 {
        proc_net_remove(net, afinfo->name);
-       memset(afinfo->seq_fops, 0, sizeof(*afinfo->seq_fops));
 }
 
 static void get_openreq4(struct sock *sk, struct request_sock *req,
-                        char *tmpbuf, int i, int uid)
+                        struct seq_file *f, int i, int uid, int *len)
 {
        const struct inet_request_sock *ireq = inet_rsk(req);
        int ttd = req->expires - jiffies;
 
-       sprintf(tmpbuf, "%4d: %08X:%04X %08X:%04X"
-               " %02X %08X:%08X %02X:%08lX %08X %5d %8d %u %d %p",
+       seq_printf(f, "%4d: %08X:%04X %08X:%04X"
+               " %02X %08X:%08X %02X:%08lX %08X %5d %8d %u %d %p%n",
                i,
                ireq->loc_addr,
                ntohs(inet_sk(sk)->sport),
@@ -2305,10 +2276,11 @@ static void get_openreq4(struct sock *sk, struct request_sock *req,
                0,  /* non standard timer */
                0, /* open_requests have no inode */
                atomic_read(&sk->sk_refcnt),
-               req);
+               req,
+               len);
 }
 
-static void get_tcp4_sock(struct sock *sk, char *tmpbuf, int i)
+static void get_tcp4_sock(struct sock *sk, struct seq_file *f, int i, int *len)
 {
        int timer_active;
        unsigned long timer_expires;
@@ -2334,8 +2306,8 @@ static void get_tcp4_sock(struct sock *sk, char *tmpbuf, int i)
                timer_expires = jiffies;
        }
 
-       sprintf(tmpbuf, "%4d: %08X:%04X %08X:%04X %02X %08X:%08X %02X:%08lX "
-                       "%08X %5d %8d %lu %d %p %u %u %u %u %d",
+       seq_printf(f, "%4d: %08X:%04X %08X:%04X %02X %08X:%08X %02X:%08lX "
+                       "%08X %5d %8d %lu %d %p %u %u %u %u %d%n",
                i, src, srcp, dest, destp, sk->sk_state,
                tp->write_seq - tp->snd_una,
                sk->sk_state == TCP_LISTEN ? sk->sk_ack_backlog :
@@ -2351,11 +2323,12 @@ static void get_tcp4_sock(struct sock *sk, char *tmpbuf, int i)
                icsk->icsk_ack.ato,
                (icsk->icsk_ack.quick << 1) | icsk->icsk_ack.pingpong,
                tp->snd_cwnd,
-               tp->snd_ssthresh >= 0xFFFF ? -1 : tp->snd_ssthresh);
+               tp->snd_ssthresh >= 0xFFFF ? -1 : tp->snd_ssthresh,
+               len);
 }
 
 static void get_timewait4_sock(struct inet_timewait_sock *tw,
-                              char *tmpbuf, int i)
+                              struct seq_file *f, int i, int *len)
 {
        __be32 dest, src;
        __u16 destp, srcp;
@@ -2369,11 +2342,11 @@ static void get_timewait4_sock(struct inet_timewait_sock *tw,
        destp = ntohs(tw->tw_dport);
        srcp  = ntohs(tw->tw_sport);
 
-       sprintf(tmpbuf, "%4d: %08X:%04X %08X:%04X"
-               " %02X %08X:%08X %02X:%08lX %08X %5d %8d %d %d %p",
+       seq_printf(f, "%4d: %08X:%04X %08X:%04X"
+               " %02X %08X:%08X %02X:%08lX %08X %5d %8d %d %d %p%n",
                i, src, srcp, dest, destp, tw->tw_substate, 0, 0,
                3, jiffies_to_clock_t(ttd), 0, 0, 0, 0,
-               atomic_read(&tw->tw_refcnt), tw);
+               atomic_read(&tw->tw_refcnt), tw, len);
 }
 
 #define TMPSZ 150
@@ -2381,7 +2354,7 @@ static void get_timewait4_sock(struct inet_timewait_sock *tw,
 static int tcp4_seq_show(struct seq_file *seq, void *v)
 {
        struct tcp_iter_state* st;
-       char tmpbuf[TMPSZ + 1];
+       int len;
 
        if (v == SEQ_START_TOKEN) {
                seq_printf(seq, "%-*s\n", TMPSZ - 1,
@@ -2395,26 +2368,26 @@ static int tcp4_seq_show(struct seq_file *seq, void *v)
        switch (st->state) {
        case TCP_SEQ_STATE_LISTENING:
        case TCP_SEQ_STATE_ESTABLISHED:
-               get_tcp4_sock(v, tmpbuf, st->num);
+               get_tcp4_sock(v, seq, st->num, &len);
                break;
        case TCP_SEQ_STATE_OPENREQ:
-               get_openreq4(st->syn_wait_sk, v, tmpbuf, st->num, st->uid);
+               get_openreq4(st->syn_wait_sk, v, seq, st->num, st->uid, &len);
                break;
        case TCP_SEQ_STATE_TIME_WAIT:
-               get_timewait4_sock(v, tmpbuf, st->num);
+               get_timewait4_sock(v, seq, st->num, &len);
                break;
        }
-       seq_printf(seq, "%-*s\n", TMPSZ - 1, tmpbuf);
+       seq_printf(seq, "%*s\n", TMPSZ - 1 - len, "");
 out:
        return 0;
 }
 
-static struct file_operations tcp4_seq_fops;
 static struct tcp_seq_afinfo tcp4_seq_afinfo = {
-       .owner          = THIS_MODULE,
        .name           = "tcp",
        .family         = AF_INET,
-       .seq_fops       = &tcp4_seq_fops,
+       .seq_fops       = {
+               .owner          = THIS_MODULE,
+       },
        .seq_ops        = {
                .show           = tcp4_seq_show,
        },