diff options
Diffstat (limited to 'net/packet/af_packet.c')
-rw-r--r-- | net/packet/af_packet.c | 71 |
1 files changed, 37 insertions, 34 deletions
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index f2d116a5cb35..020562164b56 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 | ||
209 | struct packet_skb_cb { | 210 | struct 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 | ||
504 | out_free: | 507 | out_free: |
505 | kfree_skb(skb); | 508 | kfree_skb(skb); |
506 | out_unlock: | 509 | out_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 | ||
634 | drop_n_acct: | 637 | drop_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 | ||
639 | drop_n_restore: | 640 | drop_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 | ||
1344 | static int packet_create(struct net *net, struct socket *sock, int protocol) | 1348 | static 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 | ||
2363 | static struct net_proto_family packet_family_ops = { | 2366 | static 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, |