aboutsummaryrefslogtreecommitdiffstats
path: root/net/phonet
diff options
context:
space:
mode:
Diffstat (limited to 'net/phonet')
-rw-r--r--net/phonet/af_phonet.c8
-rw-r--r--net/phonet/pep-gprs.c41
-rw-r--r--net/phonet/pn_dev.c6
-rw-r--r--net/phonet/socket.c11
-rw-r--r--net/phonet/sysctl.c4
5 files changed, 31 insertions, 39 deletions
diff --git a/net/phonet/af_phonet.c b/net/phonet/af_phonet.c
index 9d211f12582b..13cb323f8c38 100644
--- a/net/phonet/af_phonet.c
+++ b/net/phonet/af_phonet.c
@@ -67,9 +67,6 @@ static int pn_socket_create(struct net *net, struct socket *sock, int protocol)
67 struct phonet_protocol *pnp; 67 struct phonet_protocol *pnp;
68 int err; 68 int err;
69 69
70 if (net != &init_net)
71 return -EAFNOSUPPORT;
72
73 if (!capable(CAP_SYS_ADMIN)) 70 if (!capable(CAP_SYS_ADMIN))
74 return -EPERM; 71 return -EPERM;
75 72
@@ -352,9 +349,6 @@ static int phonet_rcv(struct sk_buff *skb, struct net_device *dev,
352 struct sockaddr_pn sa; 349 struct sockaddr_pn sa;
353 u16 len; 350 u16 len;
354 351
355 if (dev_net(dev) != &init_net)
356 goto out;
357
358 /* check we have at least a full Phonet header */ 352 /* check we have at least a full Phonet header */
359 if (!pskb_pull(skb, sizeof(struct phonethdr))) 353 if (!pskb_pull(skb, sizeof(struct phonethdr)))
360 goto out; 354 goto out;
@@ -373,7 +367,7 @@ static int phonet_rcv(struct sk_buff *skb, struct net_device *dev,
373 if (pn_sockaddr_get_addr(&sa) == 0) 367 if (pn_sockaddr_get_addr(&sa) == 0)
374 goto out; /* currently, we cannot be device 0 */ 368 goto out; /* currently, we cannot be device 0 */
375 369
376 sk = pn_find_sock_by_sa(&sa); 370 sk = pn_find_sock_by_sa(dev_net(dev), &sa);
377 if (sk == NULL) { 371 if (sk == NULL) {
378 if (can_respond(skb)) { 372 if (can_respond(skb)) {
379 send_obj_unreachable(skb); 373 send_obj_unreachable(skb);
diff --git a/net/phonet/pep-gprs.c b/net/phonet/pep-gprs.c
index 803eeef0aa85..22848dd7d67a 100644
--- a/net/phonet/pep-gprs.c
+++ b/net/phonet/pep-gprs.c
@@ -41,7 +41,6 @@ struct gprs_dev {
41 void (*old_write_space)(struct sock *); 41 void (*old_write_space)(struct sock *);
42 42
43 struct net_device *net; 43 struct net_device *net;
44 struct net_device_stats stats;
45 44
46 struct sk_buff_head tx_queue; 45 struct sk_buff_head tx_queue;
47 struct work_struct tx_work; 46 struct work_struct tx_work;
@@ -49,14 +48,14 @@ struct gprs_dev {
49 unsigned tx_max; 48 unsigned tx_max;
50}; 49};
51 50
52static int gprs_type_trans(struct sk_buff *skb) 51static __be16 gprs_type_trans(struct sk_buff *skb)
53{ 52{
54 const u8 *pvfc; 53 const u8 *pvfc;
55 u8 buf; 54 u8 buf;
56 55
57 pvfc = skb_header_pointer(skb, 0, 1, &buf); 56 pvfc = skb_header_pointer(skb, 0, 1, &buf);
58 if (!pvfc) 57 if (!pvfc)
59 return 0; 58 return htons(0);
60 /* Look at IP version field */ 59 /* Look at IP version field */
61 switch (*pvfc >> 4) { 60 switch (*pvfc >> 4) {
62 case 4: 61 case 4:
@@ -64,7 +63,7 @@ static int gprs_type_trans(struct sk_buff *skb)
64 case 6: 63 case 6:
65 return htons(ETH_P_IPV6); 64 return htons(ETH_P_IPV6);
66 } 65 }
67 return 0; 66 return htons(0);
68} 67}
69 68
70/* 69/*
@@ -83,8 +82,9 @@ static void gprs_state_change(struct sock *sk)
83 82
84static int gprs_recv(struct gprs_dev *dev, struct sk_buff *skb) 83static int gprs_recv(struct gprs_dev *dev, struct sk_buff *skb)
85{ 84{
85 struct net_device *net = dev->net;
86 int err = 0; 86 int err = 0;
87 u16 protocol = gprs_type_trans(skb); 87 __be16 protocol = gprs_type_trans(skb);
88 88
89 if (!protocol) { 89 if (!protocol) {
90 err = -EINVAL; 90 err = -EINVAL;
@@ -99,7 +99,7 @@ static int gprs_recv(struct gprs_dev *dev, struct sk_buff *skb)
99 * so wrap the IP packet as a single fragment of an head-less 99 * so wrap the IP packet as a single fragment of an head-less
100 * socket buffer. The network stack will pull what it needs, 100 * socket buffer. The network stack will pull what it needs,
101 * but at least, the whole IP payload is not memcpy'd. */ 101 * but at least, the whole IP payload is not memcpy'd. */
102 rskb = netdev_alloc_skb(dev->net, 0); 102 rskb = netdev_alloc_skb(net, 0);
103 if (!rskb) { 103 if (!rskb) {
104 err = -ENOBUFS; 104 err = -ENOBUFS;
105 goto drop; 105 goto drop;
@@ -123,11 +123,11 @@ static int gprs_recv(struct gprs_dev *dev, struct sk_buff *skb)
123 123
124 skb->protocol = protocol; 124 skb->protocol = protocol;
125 skb_reset_mac_header(skb); 125 skb_reset_mac_header(skb);
126 skb->dev = dev->net; 126 skb->dev = net;
127 127
128 if (likely(dev->net->flags & IFF_UP)) { 128 if (likely(net->flags & IFF_UP)) {
129 dev->stats.rx_packets++; 129 net->stats.rx_packets++;
130 dev->stats.rx_bytes += skb->len; 130 net->stats.rx_bytes += skb->len;
131 netif_rx(skb); 131 netif_rx(skb);
132 skb = NULL; 132 skb = NULL;
133 } else 133 } else
@@ -136,7 +136,7 @@ static int gprs_recv(struct gprs_dev *dev, struct sk_buff *skb)
136drop: 136drop:
137 if (skb) { 137 if (skb) {
138 dev_kfree_skb(skb); 138 dev_kfree_skb(skb);
139 dev->stats.rx_dropped++; 139 net->stats.rx_dropped++;
140 } 140 }
141 return err; 141 return err;
142} 142}
@@ -217,14 +217,15 @@ static int gprs_xmit(struct sk_buff *skb, struct net_device *net)
217static void gprs_tx(struct work_struct *work) 217static void gprs_tx(struct work_struct *work)
218{ 218{
219 struct gprs_dev *dev = container_of(work, struct gprs_dev, tx_work); 219 struct gprs_dev *dev = container_of(work, struct gprs_dev, tx_work);
220 struct net_device *net = dev->net;
220 struct sock *sk = dev->sk; 221 struct sock *sk = dev->sk;
221 struct sk_buff *skb; 222 struct sk_buff *skb;
222 223
223 while ((skb = skb_dequeue(&dev->tx_queue)) != NULL) { 224 while ((skb = skb_dequeue(&dev->tx_queue)) != NULL) {
224 int err; 225 int err;
225 226
226 dev->stats.tx_bytes += skb->len; 227 net->stats.tx_bytes += skb->len;
227 dev->stats.tx_packets++; 228 net->stats.tx_packets++;
228 229
229 skb_orphan(skb); 230 skb_orphan(skb);
230 skb_set_owner_w(skb, sk); 231 skb_set_owner_w(skb, sk);
@@ -233,9 +234,9 @@ static void gprs_tx(struct work_struct *work)
233 err = pep_write(sk, skb); 234 err = pep_write(sk, skb);
234 if (err) { 235 if (err) {
235 LIMIT_NETDEBUG(KERN_WARNING"%s: TX error (%d)\n", 236 LIMIT_NETDEBUG(KERN_WARNING"%s: TX error (%d)\n",
236 dev->net->name, err); 237 net->name, err);
237 dev->stats.tx_aborted_errors++; 238 net->stats.tx_aborted_errors++;
238 dev->stats.tx_errors++; 239 net->stats.tx_errors++;
239 } 240 }
240 release_sock(sk); 241 release_sock(sk);
241 } 242 }
@@ -254,13 +255,6 @@ static int gprs_set_mtu(struct net_device *net, int new_mtu)
254 return 0; 255 return 0;
255} 256}
256 257
257static struct net_device_stats *gprs_get_stats(struct net_device *net)
258{
259 struct gprs_dev *dev = netdev_priv(net);
260
261 return &dev->stats;
262}
263
264static void gprs_setup(struct net_device *net) 258static void gprs_setup(struct net_device *net)
265{ 259{
266 net->features = NETIF_F_FRAGLIST; 260 net->features = NETIF_F_FRAGLIST;
@@ -276,7 +270,6 @@ static void gprs_setup(struct net_device *net)
276 net->stop = gprs_close; 270 net->stop = gprs_close;
277 net->hard_start_xmit = gprs_xmit; /* mandatory */ 271 net->hard_start_xmit = gprs_xmit; /* mandatory */
278 net->change_mtu = gprs_set_mtu; 272 net->change_mtu = gprs_set_mtu;
279 net->get_stats = gprs_get_stats;
280} 273}
281 274
282/* 275/*
diff --git a/net/phonet/pn_dev.c b/net/phonet/pn_dev.c
index f93ff8ef47d0..5491bf5e354b 100644
--- a/net/phonet/pn_dev.c
+++ b/net/phonet/pn_dev.c
@@ -76,7 +76,7 @@ struct net_device *phonet_device_get(struct net *net)
76 dev = pnd->netdev; 76 dev = pnd->netdev;
77 BUG_ON(!dev); 77 BUG_ON(!dev);
78 78
79 if (dev_net(dev) == net && 79 if (net_eq(dev_net(dev), net) &&
80 (dev->reg_state == NETREG_REGISTERED) && 80 (dev->reg_state == NETREG_REGISTERED) &&
81 ((pnd->netdev->flags & IFF_UP)) == IFF_UP) 81 ((pnd->netdev->flags & IFF_UP)) == IFF_UP)
82 break; 82 break;
@@ -140,12 +140,14 @@ u8 phonet_address_get(struct net_device *dev, u8 addr)
140 return addr; 140 return addr;
141} 141}
142 142
143int phonet_address_lookup(u8 addr) 143int phonet_address_lookup(struct net *net, u8 addr)
144{ 144{
145 struct phonet_device *pnd; 145 struct phonet_device *pnd;
146 146
147 spin_lock_bh(&pndevs.lock); 147 spin_lock_bh(&pndevs.lock);
148 list_for_each_entry(pnd, &pndevs.list, list) { 148 list_for_each_entry(pnd, &pndevs.list, list) {
149 if (!net_eq(dev_net(pnd->netdev), net))
150 continue;
149 /* Don't allow unregistering devices! */ 151 /* Don't allow unregistering devices! */
150 if ((pnd->netdev->reg_state != NETREG_REGISTERED) || 152 if ((pnd->netdev->reg_state != NETREG_REGISTERED) ||
151 ((pnd->netdev->flags & IFF_UP)) != IFF_UP) 153 ((pnd->netdev->flags & IFF_UP)) != IFF_UP)
diff --git a/net/phonet/socket.c b/net/phonet/socket.c
index d81740187fb4..c75aa5cdead5 100644
--- a/net/phonet/socket.c
+++ b/net/phonet/socket.c
@@ -57,7 +57,7 @@ static struct {
57 * Find address based on socket address, match only certain fields. 57 * Find address based on socket address, match only certain fields.
58 * Also grab sock if it was found. Remember to sock_put it later. 58 * Also grab sock if it was found. Remember to sock_put it later.
59 */ 59 */
60struct sock *pn_find_sock_by_sa(const struct sockaddr_pn *spn) 60struct sock *pn_find_sock_by_sa(struct net *net, const struct sockaddr_pn *spn)
61{ 61{
62 struct hlist_node *node; 62 struct hlist_node *node;
63 struct sock *sknode; 63 struct sock *sknode;
@@ -71,6 +71,8 @@ struct sock *pn_find_sock_by_sa(const struct sockaddr_pn *spn)
71 struct pn_sock *pn = pn_sk(sknode); 71 struct pn_sock *pn = pn_sk(sknode);
72 BUG_ON(!pn->sobject); /* unbound socket */ 72 BUG_ON(!pn->sobject); /* unbound socket */
73 73
74 if (!net_eq(sock_net(sknode), net))
75 continue;
74 if (pn_port(obj)) { 76 if (pn_port(obj)) {
75 /* Look up socket by port */ 77 /* Look up socket by port */
76 if (pn_port(pn->sobject) != pn_port(obj)) 78 if (pn_port(pn->sobject) != pn_port(obj))
@@ -130,7 +132,7 @@ static int pn_socket_bind(struct socket *sock, struct sockaddr *addr, int len)
130 132
131 handle = pn_sockaddr_get_object((struct sockaddr_pn *)addr); 133 handle = pn_sockaddr_get_object((struct sockaddr_pn *)addr);
132 saddr = pn_addr(handle); 134 saddr = pn_addr(handle);
133 if (saddr && phonet_address_lookup(saddr)) 135 if (saddr && phonet_address_lookup(sock_net(sk), saddr))
134 return -EADDRNOTAVAIL; 136 return -EADDRNOTAVAIL;
135 137
136 lock_sock(sk); 138 lock_sock(sk);
@@ -361,6 +363,7 @@ static DEFINE_MUTEX(port_mutex);
361int pn_sock_get_port(struct sock *sk, unsigned short sport) 363int pn_sock_get_port(struct sock *sk, unsigned short sport)
362{ 364{
363 static int port_cur; 365 static int port_cur;
366 struct net *net = sock_net(sk);
364 struct pn_sock *pn = pn_sk(sk); 367 struct pn_sock *pn = pn_sk(sk);
365 struct sockaddr_pn try_sa; 368 struct sockaddr_pn try_sa;
366 struct sock *tmpsk; 369 struct sock *tmpsk;
@@ -381,7 +384,7 @@ int pn_sock_get_port(struct sock *sk, unsigned short sport)
381 port_cur = pmin; 384 port_cur = pmin;
382 385
383 pn_sockaddr_set_port(&try_sa, port_cur); 386 pn_sockaddr_set_port(&try_sa, port_cur);
384 tmpsk = pn_find_sock_by_sa(&try_sa); 387 tmpsk = pn_find_sock_by_sa(net, &try_sa);
385 if (tmpsk == NULL) { 388 if (tmpsk == NULL) {
386 sport = port_cur; 389 sport = port_cur;
387 goto found; 390 goto found;
@@ -391,7 +394,7 @@ int pn_sock_get_port(struct sock *sk, unsigned short sport)
391 } else { 394 } else {
392 /* try to find specific port */ 395 /* try to find specific port */
393 pn_sockaddr_set_port(&try_sa, sport); 396 pn_sockaddr_set_port(&try_sa, sport);
394 tmpsk = pn_find_sock_by_sa(&try_sa); 397 tmpsk = pn_find_sock_by_sa(net, &try_sa);
395 if (tmpsk == NULL) 398 if (tmpsk == NULL)
396 /* No sock there! We can use that port... */ 399 /* No sock there! We can use that port... */
397 goto found; 400 goto found;
diff --git a/net/phonet/sysctl.c b/net/phonet/sysctl.c
index 600a4309b8c8..7b5749ee2765 100644
--- a/net/phonet/sysctl.c
+++ b/net/phonet/sysctl.c
@@ -89,13 +89,13 @@ static struct ctl_table phonet_table[] = {
89 .data = &local_port_range, 89 .data = &local_port_range,
90 .maxlen = sizeof(local_port_range), 90 .maxlen = sizeof(local_port_range),
91 .mode = 0644, 91 .mode = 0644,
92 .proc_handler = &proc_local_port_range, 92 .proc_handler = proc_local_port_range,
93 .strategy = NULL, 93 .strategy = NULL,
94 }, 94 },
95 { .ctl_name = 0 } 95 { .ctl_name = 0 }
96}; 96};
97 97
98struct ctl_path phonet_ctl_path[] = { 98static struct ctl_path phonet_ctl_path[] = {
99 { .procname = "net", .ctl_name = CTL_NET, }, 99 { .procname = "net", .ctl_name = CTL_NET, },
100 { .procname = "phonet", .ctl_name = CTL_UNNUMBERED, }, 100 { .procname = "phonet", .ctl_name = CTL_UNNUMBERED, },
101 { }, 101 { },