aboutsummaryrefslogtreecommitdiffstats
path: root/net/packet/af_packet.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2009-12-08 10:55:01 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2009-12-08 10:55:01 -0500
commitd7fc02c7bae7b1cf69269992cf880a43a350cdaa (patch)
treea43d56fa72913a1cc98a0bbebe054d08581b3a7c /net/packet/af_packet.c
parentee1262dbc65ce0b6234a915d8432171e8d77f518 (diff)
parent28b4d5cc17c20786848cdc07b7ea237a309776bb (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6: (1815 commits) mac80211: fix reorder buffer release iwmc3200wifi: Enable wimax core through module parameter iwmc3200wifi: Add wifi-wimax coexistence mode as a module parameter iwmc3200wifi: Coex table command does not expect a response iwmc3200wifi: Update wiwi priority table iwlwifi: driver version track kernel version iwlwifi: indicate uCode type when fail dump error/event log iwl3945: remove duplicated event logging code b43: fix two warnings ipw2100: fix rebooting hang with driver loaded cfg80211: indent regulatory messages with spaces iwmc3200wifi: fix NULL pointer dereference in pmkid update mac80211: Fix TX status reporting for injected data frames ath9k: enable 2GHz band only if the device supports it airo: Fix integer overflow warning rt2x00: Fix padding bug on L2PAD devices. WE: Fix set events not propagated b43legacy: avoid PPC fault during resume b43: avoid PPC fault during resume tcp: fix a timewait refcnt race ... Fix up conflicts due to sysctl cleanups (dead sysctl_check code and CTL_UNNUMBERED removed) in kernel/sysctl_check.c net/ipv4/sysctl_net_ipv4.c net/ipv6/addrconf.c net/sctp/sysctl.c
Diffstat (limited to 'net/packet/af_packet.c')
-rw-r--r--net/packet/af_packet.c71
1 files changed, 37 insertions, 34 deletions
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
index f2d116a5cb3..020562164b5 100644
--- a/net/packet/af_packet.c
+++ b/net/packet/af_packet.c
@@ -79,6 +79,7 @@
79#include <linux/module.h> 79#include <linux/module.h>
80#include <linux/init.h> 80#include <linux/init.h>
81#include <linux/mutex.h> 81#include <linux/mutex.h>
82#include <linux/if_vlan.h>
82 83
83#ifdef CONFIG_INET 84#ifdef CONFIG_INET
84#include <net/inet_common.h> 85#include <net/inet_common.h>
@@ -188,7 +189,6 @@ struct packet_sock {
188 struct packet_ring_buffer tx_ring; 189 struct packet_ring_buffer tx_ring;
189 int copy_thresh; 190 int copy_thresh;
190#endif 191#endif
191 struct packet_type prot_hook;
192 spinlock_t bind_lock; 192 spinlock_t bind_lock;
193 struct mutex pg_vec_lock; 193 struct mutex pg_vec_lock;
194 unsigned int running:1, /* prot_hook is attached*/ 194 unsigned int running:1, /* prot_hook is attached*/
@@ -204,6 +204,7 @@ struct packet_sock {
204 unsigned int tp_reserve; 204 unsigned int tp_reserve;
205 unsigned int tp_loss:1; 205 unsigned int tp_loss:1;
206#endif 206#endif
207 struct packet_type prot_hook ____cacheline_aligned_in_smp;
207}; 208};
208 209
209struct packet_skb_cb { 210struct packet_skb_cb {
@@ -364,7 +365,7 @@ static int packet_rcv_spkt(struct sk_buff *skb, struct net_device *dev,
364 if (skb->pkt_type == PACKET_LOOPBACK) 365 if (skb->pkt_type == PACKET_LOOPBACK)
365 goto out; 366 goto out;
366 367
367 if (dev_net(dev) != sock_net(sk)) 368 if (!net_eq(dev_net(dev), sock_net(sk)))
368 goto out; 369 goto out;
369 370
370 skb = skb_share_check(skb, GFP_ATOMIC); 371 skb = skb_share_check(skb, GFP_ATOMIC);
@@ -436,7 +437,8 @@ static int packet_sendmsg_spkt(struct kiocb *iocb, struct socket *sock,
436 */ 437 */
437 438
438 saddr->spkt_device[13] = 0; 439 saddr->spkt_device[13] = 0;
439 dev = dev_get_by_name(sock_net(sk), saddr->spkt_device); 440 rcu_read_lock();
441 dev = dev_get_by_name_rcu(sock_net(sk), saddr->spkt_device);
440 err = -ENODEV; 442 err = -ENODEV;
441 if (dev == NULL) 443 if (dev == NULL)
442 goto out_unlock; 444 goto out_unlock;
@@ -490,6 +492,7 @@ static int packet_sendmsg_spkt(struct kiocb *iocb, struct socket *sock,
490 skb->protocol = proto; 492 skb->protocol = proto;
491 skb->dev = dev; 493 skb->dev = dev;
492 skb->priority = sk->sk_priority; 494 skb->priority = sk->sk_priority;
495 skb->mark = sk->sk_mark;
493 if (err) 496 if (err)
494 goto out_free; 497 goto out_free;
495 498
@@ -498,14 +501,13 @@ static int packet_sendmsg_spkt(struct kiocb *iocb, struct socket *sock,
498 */ 501 */
499 502
500 dev_queue_xmit(skb); 503 dev_queue_xmit(skb);
501 dev_put(dev); 504 rcu_read_unlock();
502 return len; 505 return len;
503 506
504out_free: 507out_free:
505 kfree_skb(skb); 508 kfree_skb(skb);
506out_unlock: 509out_unlock:
507 if (dev) 510 rcu_read_unlock();
508 dev_put(dev);
509 return err; 511 return err;
510} 512}
511 513
@@ -551,7 +553,7 @@ static int packet_rcv(struct sk_buff *skb, struct net_device *dev,
551 sk = pt->af_packet_priv; 553 sk = pt->af_packet_priv;
552 po = pkt_sk(sk); 554 po = pkt_sk(sk);
553 555
554 if (dev_net(dev) != sock_net(sk)) 556 if (!net_eq(dev_net(dev), sock_net(sk)))
555 goto drop; 557 goto drop;
556 558
557 skb->dev = dev; 559 skb->dev = dev;
@@ -626,15 +628,14 @@ static int packet_rcv(struct sk_buff *skb, struct net_device *dev,
626 628
627 spin_lock(&sk->sk_receive_queue.lock); 629 spin_lock(&sk->sk_receive_queue.lock);
628 po->stats.tp_packets++; 630 po->stats.tp_packets++;
631 skb->dropcount = atomic_read(&sk->sk_drops);
629 __skb_queue_tail(&sk->sk_receive_queue, skb); 632 __skb_queue_tail(&sk->sk_receive_queue, skb);
630 spin_unlock(&sk->sk_receive_queue.lock); 633 spin_unlock(&sk->sk_receive_queue.lock);
631 sk->sk_data_ready(sk, skb->len); 634 sk->sk_data_ready(sk, skb->len);
632 return 0; 635 return 0;
633 636
634drop_n_acct: 637drop_n_acct:
635 spin_lock(&sk->sk_receive_queue.lock); 638 po->stats.tp_drops = atomic_inc_return(&sk->sk_drops);
636 po->stats.tp_drops++;
637 spin_unlock(&sk->sk_receive_queue.lock);
638 639
639drop_n_restore: 640drop_n_restore:
640 if (skb_head != skb->data && skb_shared(skb)) { 641 if (skb_head != skb->data && skb_shared(skb)) {
@@ -673,7 +674,7 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev,
673 sk = pt->af_packet_priv; 674 sk = pt->af_packet_priv;
674 po = pkt_sk(sk); 675 po = pkt_sk(sk);
675 676
676 if (dev_net(dev) != sock_net(sk)) 677 if (!net_eq(dev_net(dev), sock_net(sk)))
677 goto drop; 678 goto drop;
678 679
679 if (dev->header_ops) { 680 if (dev->header_ops) {
@@ -766,7 +767,7 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev,
766 getnstimeofday(&ts); 767 getnstimeofday(&ts);
767 h.h2->tp_sec = ts.tv_sec; 768 h.h2->tp_sec = ts.tv_sec;
768 h.h2->tp_nsec = ts.tv_nsec; 769 h.h2->tp_nsec = ts.tv_nsec;
769 h.h2->tp_vlan_tci = skb->vlan_tci; 770 h.h2->tp_vlan_tci = vlan_tx_tag_get(skb);
770 hdrlen = sizeof(*h.h2); 771 hdrlen = sizeof(*h.h2);
771 break; 772 break;
772 default: 773 default:
@@ -856,6 +857,7 @@ static int tpacket_fill_skb(struct packet_sock *po, struct sk_buff *skb,
856 skb->protocol = proto; 857 skb->protocol = proto;
857 skb->dev = dev; 858 skb->dev = dev;
858 skb->priority = po->sk.sk_priority; 859 skb->priority = po->sk.sk_priority;
860 skb->mark = po->sk.sk_mark;
859 skb_shinfo(skb)->destructor_arg = ph.raw; 861 skb_shinfo(skb)->destructor_arg = ph.raw;
860 862
861 switch (po->tp_version) { 863 switch (po->tp_version) {
@@ -1032,9 +1034,10 @@ static int tpacket_snd(struct packet_sock *po, struct msghdr *msg)
1032 goto out_xmit; 1034 goto out_xmit;
1033 packet_increment_head(&po->tx_ring); 1035 packet_increment_head(&po->tx_ring);
1034 len_sum += tp_len; 1036 len_sum += tp_len;
1035 } while (likely((ph != NULL) || ((!(msg->msg_flags & MSG_DONTWAIT)) 1037 } while (likely((ph != NULL) ||
1036 && (atomic_read(&po->tx_ring.pending)))) 1038 ((!(msg->msg_flags & MSG_DONTWAIT)) &&
1037 ); 1039 (atomic_read(&po->tx_ring.pending))))
1040 );
1038 1041
1039 err = len_sum; 1042 err = len_sum;
1040 goto out_put; 1043 goto out_put;
@@ -1122,6 +1125,7 @@ static int packet_snd(struct socket *sock,
1122 skb->protocol = proto; 1125 skb->protocol = proto;
1123 skb->dev = dev; 1126 skb->dev = dev;
1124 skb->priority = sk->sk_priority; 1127 skb->priority = sk->sk_priority;
1128 skb->mark = sk->sk_mark;
1125 1129
1126 /* 1130 /*
1127 * Now send it 1131 * Now send it
@@ -1341,7 +1345,8 @@ static struct proto packet_proto = {
1341 * Create a packet of type SOCK_PACKET. 1345 * Create a packet of type SOCK_PACKET.
1342 */ 1346 */
1343 1347
1344static int packet_create(struct net *net, struct socket *sock, int protocol) 1348static int packet_create(struct net *net, struct socket *sock, int protocol,
1349 int kern)
1345{ 1350{
1346 struct sock *sk; 1351 struct sock *sk;
1347 struct packet_sock *po; 1352 struct packet_sock *po;
@@ -1472,7 +1477,7 @@ static int packet_recvmsg(struct kiocb *iocb, struct socket *sock,
1472 if (err) 1477 if (err)
1473 goto out_free; 1478 goto out_free;
1474 1479
1475 sock_recv_timestamp(msg, sk, skb); 1480 sock_recv_ts_and_drops(msg, sk, skb);
1476 1481
1477 if (msg->msg_name) 1482 if (msg->msg_name)
1478 memcpy(msg->msg_name, &PACKET_SKB_CB(skb)->sa, 1483 memcpy(msg->msg_name, &PACKET_SKB_CB(skb)->sa,
@@ -1488,7 +1493,7 @@ static int packet_recvmsg(struct kiocb *iocb, struct socket *sock,
1488 aux.tp_snaplen = skb->len; 1493 aux.tp_snaplen = skb->len;
1489 aux.tp_mac = 0; 1494 aux.tp_mac = 0;
1490 aux.tp_net = skb_network_offset(skb); 1495 aux.tp_net = skb_network_offset(skb);
1491 aux.tp_vlan_tci = skb->vlan_tci; 1496 aux.tp_vlan_tci = vlan_tx_tag_get(skb);
1492 1497
1493 put_cmsg(msg, SOL_PACKET, PACKET_AUXDATA, sizeof(aux), &aux); 1498 put_cmsg(msg, SOL_PACKET, PACKET_AUXDATA, sizeof(aux), &aux);
1494 } 1499 }
@@ -1515,12 +1520,13 @@ static int packet_getname_spkt(struct socket *sock, struct sockaddr *uaddr,
1515 return -EOPNOTSUPP; 1520 return -EOPNOTSUPP;
1516 1521
1517 uaddr->sa_family = AF_PACKET; 1522 uaddr->sa_family = AF_PACKET;
1518 dev = dev_get_by_index(sock_net(sk), pkt_sk(sk)->ifindex); 1523 rcu_read_lock();
1519 if (dev) { 1524 dev = dev_get_by_index_rcu(sock_net(sk), pkt_sk(sk)->ifindex);
1525 if (dev)
1520 strlcpy(uaddr->sa_data, dev->name, 15); 1526 strlcpy(uaddr->sa_data, dev->name, 15);
1521 dev_put(dev); 1527 else
1522 } else
1523 memset(uaddr->sa_data, 0, 14); 1528 memset(uaddr->sa_data, 0, 14);
1529 rcu_read_unlock();
1524 *uaddr_len = sizeof(*uaddr); 1530 *uaddr_len = sizeof(*uaddr);
1525 1531
1526 return 0; 1532 return 0;
@@ -1532,7 +1538,7 @@ static int packet_getname(struct socket *sock, struct sockaddr *uaddr,
1532 struct net_device *dev; 1538 struct net_device *dev;
1533 struct sock *sk = sock->sk; 1539 struct sock *sk = sock->sk;
1534 struct packet_sock *po = pkt_sk(sk); 1540 struct packet_sock *po = pkt_sk(sk);
1535 struct sockaddr_ll *sll = (struct sockaddr_ll *)uaddr; 1541 DECLARE_SOCKADDR(struct sockaddr_ll *, sll, uaddr);
1536 1542
1537 if (peer) 1543 if (peer)
1538 return -EOPNOTSUPP; 1544 return -EOPNOTSUPP;
@@ -1540,16 +1546,17 @@ static int packet_getname(struct socket *sock, struct sockaddr *uaddr,
1540 sll->sll_family = AF_PACKET; 1546 sll->sll_family = AF_PACKET;
1541 sll->sll_ifindex = po->ifindex; 1547 sll->sll_ifindex = po->ifindex;
1542 sll->sll_protocol = po->num; 1548 sll->sll_protocol = po->num;
1543 dev = dev_get_by_index(sock_net(sk), po->ifindex); 1549 rcu_read_lock();
1550 dev = dev_get_by_index_rcu(sock_net(sk), po->ifindex);
1544 if (dev) { 1551 if (dev) {
1545 sll->sll_hatype = dev->type; 1552 sll->sll_hatype = dev->type;
1546 sll->sll_halen = dev->addr_len; 1553 sll->sll_halen = dev->addr_len;
1547 memcpy(sll->sll_addr, dev->dev_addr, dev->addr_len); 1554 memcpy(sll->sll_addr, dev->dev_addr, dev->addr_len);
1548 dev_put(dev);
1549 } else { 1555 } else {
1550 sll->sll_hatype = 0; /* Bad: we have no ARPHRD_UNSPEC */ 1556 sll->sll_hatype = 0; /* Bad: we have no ARPHRD_UNSPEC */
1551 sll->sll_halen = 0; 1557 sll->sll_halen = 0;
1552 } 1558 }
1559 rcu_read_unlock();
1553 *uaddr_len = offsetof(struct sockaddr_ll, sll_addr) + sll->sll_halen; 1560 *uaddr_len = offsetof(struct sockaddr_ll, sll_addr) + sll->sll_halen;
1554 1561
1555 return 0; 1562 return 0;
@@ -1659,11 +1666,9 @@ static int packet_mc_drop(struct sock *sk, struct packet_mreq_max *mreq)
1659 if (--ml->count == 0) { 1666 if (--ml->count == 0) {
1660 struct net_device *dev; 1667 struct net_device *dev;
1661 *mlp = ml->next; 1668 *mlp = ml->next;
1662 dev = dev_get_by_index(sock_net(sk), ml->ifindex); 1669 dev = __dev_get_by_index(sock_net(sk), ml->ifindex);
1663 if (dev) { 1670 if (dev)
1664 packet_dev_mc(dev, ml, -1); 1671 packet_dev_mc(dev, ml, -1);
1665 dev_put(dev);
1666 }
1667 kfree(ml); 1672 kfree(ml);
1668 } 1673 }
1669 rtnl_unlock(); 1674 rtnl_unlock();
@@ -1687,11 +1692,9 @@ static void packet_flush_mclist(struct sock *sk)
1687 struct net_device *dev; 1692 struct net_device *dev;
1688 1693
1689 po->mclist = ml->next; 1694 po->mclist = ml->next;
1690 dev = dev_get_by_index(sock_net(sk), ml->ifindex); 1695 dev = __dev_get_by_index(sock_net(sk), ml->ifindex);
1691 if (dev != NULL) { 1696 if (dev != NULL)
1692 packet_dev_mc(dev, ml, -1); 1697 packet_dev_mc(dev, ml, -1);
1693 dev_put(dev);
1694 }
1695 kfree(ml); 1698 kfree(ml);
1696 } 1699 }
1697 rtnl_unlock(); 1700 rtnl_unlock();
@@ -2360,7 +2363,7 @@ static const struct proto_ops packet_ops = {
2360 .sendpage = sock_no_sendpage, 2363 .sendpage = sock_no_sendpage,
2361}; 2364};
2362 2365
2363static struct net_proto_family packet_family_ops = { 2366static const struct net_proto_family packet_family_ops = {
2364 .family = PF_PACKET, 2367 .family = PF_PACKET,
2365 .create = packet_create, 2368 .create = packet_create,
2366 .owner = THIS_MODULE, 2369 .owner = THIS_MODULE,