diff options
| author | Denis V. Lunev <den@openvz.org> | 2007-12-11 07:19:54 -0500 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2008-01-28 17:57:15 -0500 |
| commit | 2aaef4e47fef8a6c0bc7fc5d9d3eea4af290e04c (patch) | |
| tree | c78dfe5a76f1c19cf1167b94d623feed3f4cc9d5 | |
| parent | a0a53c8ba95451feef6c1975016f0a1eb3044ad4 (diff) | |
[NETNS]: separate af_packet netns data
Signed-off-by: Denis V. Lunev <den@openvz.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
| -rw-r--r-- | include/net/net_namespace.h | 6 | ||||
| -rw-r--r-- | include/net/netns/packet.h | 15 | ||||
| -rw-r--r-- | net/packet/af_packet.c | 28 |
3 files changed, 31 insertions, 18 deletions
diff --git a/include/net/net_namespace.h b/include/net/net_namespace.h index d943fd4eaba5..18da0af6192f 100644 --- a/include/net/net_namespace.h +++ b/include/net/net_namespace.h | |||
| @@ -9,6 +9,7 @@ | |||
| 9 | #include <linux/list.h> | 9 | #include <linux/list.h> |
| 10 | 10 | ||
| 11 | #include <net/netns/unix.h> | 11 | #include <net/netns/unix.h> |
| 12 | #include <net/netns/packet.h> | ||
| 12 | 13 | ||
| 13 | struct proc_dir_entry; | 14 | struct proc_dir_entry; |
| 14 | struct net_device; | 15 | struct net_device; |
| @@ -43,10 +44,7 @@ struct net { | |||
| 43 | struct ctl_table_header *sysctl_core_hdr; | 44 | struct ctl_table_header *sysctl_core_hdr; |
| 44 | int sysctl_somaxconn; | 45 | int sysctl_somaxconn; |
| 45 | 46 | ||
| 46 | /* List of all packet sockets. */ | 47 | struct netns_packet packet; |
| 47 | rwlock_t packet_sklist_lock; | ||
| 48 | struct hlist_head packet_sklist; | ||
| 49 | |||
| 50 | struct netns_unix unx; | 48 | struct netns_unix unx; |
| 51 | }; | 49 | }; |
| 52 | 50 | ||
diff --git a/include/net/netns/packet.h b/include/net/netns/packet.h new file mode 100644 index 000000000000..637daf698884 --- /dev/null +++ b/include/net/netns/packet.h | |||
| @@ -0,0 +1,15 @@ | |||
| 1 | /* | ||
| 2 | * Packet network namespace | ||
| 3 | */ | ||
| 4 | #ifndef __NETNS_PACKET_H__ | ||
| 5 | #define __NETNS_PACKET_H__ | ||
| 6 | |||
| 7 | #include <linux/list.h> | ||
| 8 | #include <linux/spinlock.h> | ||
| 9 | |||
| 10 | struct netns_packet { | ||
| 11 | rwlock_t sklist_lock; | ||
| 12 | struct hlist_head sklist; | ||
| 13 | }; | ||
| 14 | |||
| 15 | #endif /* __NETNS_PACKET_H__ */ | ||
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index ace29f1c4c5b..485af5691d64 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c | |||
| @@ -803,9 +803,9 @@ static int packet_release(struct socket *sock) | |||
| 803 | net = sk->sk_net; | 803 | net = sk->sk_net; |
| 804 | po = pkt_sk(sk); | 804 | po = pkt_sk(sk); |
| 805 | 805 | ||
| 806 | write_lock_bh(&net->packet_sklist_lock); | 806 | write_lock_bh(&net->packet.sklist_lock); |
| 807 | sk_del_node_init(sk); | 807 | sk_del_node_init(sk); |
| 808 | write_unlock_bh(&net->packet_sklist_lock); | 808 | write_unlock_bh(&net->packet.sklist_lock); |
| 809 | 809 | ||
| 810 | /* | 810 | /* |
| 811 | * Unhook packet receive handler. | 811 | * Unhook packet receive handler. |
| @@ -1015,9 +1015,9 @@ static int packet_create(struct net *net, struct socket *sock, int protocol) | |||
| 1015 | po->running = 1; | 1015 | po->running = 1; |
| 1016 | } | 1016 | } |
| 1017 | 1017 | ||
| 1018 | write_lock_bh(&net->packet_sklist_lock); | 1018 | write_lock_bh(&net->packet.sklist_lock); |
| 1019 | sk_add_node(sk, &net->packet_sklist); | 1019 | sk_add_node(sk, &net->packet.sklist); |
| 1020 | write_unlock_bh(&net->packet_sklist_lock); | 1020 | write_unlock_bh(&net->packet.sklist_lock); |
| 1021 | return(0); | 1021 | return(0); |
| 1022 | out: | 1022 | out: |
| 1023 | return err; | 1023 | return err; |
| @@ -1452,8 +1452,8 @@ static int packet_notifier(struct notifier_block *this, unsigned long msg, void | |||
| 1452 | struct net_device *dev = data; | 1452 | struct net_device *dev = data; |
| 1453 | struct net *net = dev->nd_net; | 1453 | struct net *net = dev->nd_net; |
| 1454 | 1454 | ||
| 1455 | read_lock(&net->packet_sklist_lock); | 1455 | read_lock(&net->packet.sklist_lock); |
| 1456 | sk_for_each(sk, node, &net->packet_sklist) { | 1456 | sk_for_each(sk, node, &net->packet.sklist) { |
| 1457 | struct packet_sock *po = pkt_sk(sk); | 1457 | struct packet_sock *po = pkt_sk(sk); |
| 1458 | 1458 | ||
| 1459 | switch (msg) { | 1459 | switch (msg) { |
| @@ -1492,7 +1492,7 @@ static int packet_notifier(struct notifier_block *this, unsigned long msg, void | |||
| 1492 | break; | 1492 | break; |
| 1493 | } | 1493 | } |
| 1494 | } | 1494 | } |
| 1495 | read_unlock(&net->packet_sklist_lock); | 1495 | read_unlock(&net->packet.sklist_lock); |
| 1496 | return NOTIFY_DONE; | 1496 | return NOTIFY_DONE; |
| 1497 | } | 1497 | } |
| 1498 | 1498 | ||
| @@ -1862,7 +1862,7 @@ static inline struct sock *packet_seq_idx(struct net *net, loff_t off) | |||
| 1862 | struct sock *s; | 1862 | struct sock *s; |
| 1863 | struct hlist_node *node; | 1863 | struct hlist_node *node; |
| 1864 | 1864 | ||
| 1865 | sk_for_each(s, node, &net->packet_sklist) { | 1865 | sk_for_each(s, node, &net->packet.sklist) { |
| 1866 | if (!off--) | 1866 | if (!off--) |
| 1867 | return s; | 1867 | return s; |
| 1868 | } | 1868 | } |
| @@ -1872,7 +1872,7 @@ static inline struct sock *packet_seq_idx(struct net *net, loff_t off) | |||
| 1872 | static void *packet_seq_start(struct seq_file *seq, loff_t *pos) | 1872 | static void *packet_seq_start(struct seq_file *seq, loff_t *pos) |
| 1873 | { | 1873 | { |
| 1874 | struct net *net = seq_file_net(seq); | 1874 | struct net *net = seq_file_net(seq); |
| 1875 | read_lock(&net->packet_sklist_lock); | 1875 | read_lock(&net->packet.sklist_lock); |
| 1876 | return *pos ? packet_seq_idx(net, *pos - 1) : SEQ_START_TOKEN; | 1876 | return *pos ? packet_seq_idx(net, *pos - 1) : SEQ_START_TOKEN; |
| 1877 | } | 1877 | } |
| 1878 | 1878 | ||
| @@ -1881,14 +1881,14 @@ static void *packet_seq_next(struct seq_file *seq, void *v, loff_t *pos) | |||
| 1881 | struct net *net = seq->private; | 1881 | struct net *net = seq->private; |
| 1882 | ++*pos; | 1882 | ++*pos; |
| 1883 | return (v == SEQ_START_TOKEN) | 1883 | return (v == SEQ_START_TOKEN) |
| 1884 | ? sk_head(&net->packet_sklist) | 1884 | ? sk_head(&net->packet.sklist) |
| 1885 | : sk_next((struct sock*)v) ; | 1885 | : sk_next((struct sock*)v) ; |
| 1886 | } | 1886 | } |
| 1887 | 1887 | ||
| 1888 | static void packet_seq_stop(struct seq_file *seq, void *v) | 1888 | static void packet_seq_stop(struct seq_file *seq, void *v) |
| 1889 | { | 1889 | { |
| 1890 | struct net *net = seq->private; | 1890 | struct net *net = seq->private; |
| 1891 | read_unlock(&net->packet_sklist_lock); | 1891 | read_unlock(&net->packet.sklist_lock); |
| 1892 | } | 1892 | } |
| 1893 | 1893 | ||
| 1894 | static int packet_seq_show(struct seq_file *seq, void *v) | 1894 | static int packet_seq_show(struct seq_file *seq, void *v) |
| @@ -1940,8 +1940,8 @@ static const struct file_operations packet_seq_fops = { | |||
| 1940 | 1940 | ||
| 1941 | static int packet_net_init(struct net *net) | 1941 | static int packet_net_init(struct net *net) |
| 1942 | { | 1942 | { |
| 1943 | rwlock_init(&net->packet_sklist_lock); | 1943 | rwlock_init(&net->packet.sklist_lock); |
| 1944 | INIT_HLIST_HEAD(&net->packet_sklist); | 1944 | INIT_HLIST_HEAD(&net->packet.sklist); |
| 1945 | 1945 | ||
| 1946 | if (!proc_net_fops_create(net, "packet", 0, &packet_seq_fops)) | 1946 | if (!proc_net_fops_create(net, "packet", 0, &packet_seq_fops)) |
| 1947 | return -ENOMEM; | 1947 | return -ENOMEM; |
