diff options
author | James Morris <james.l.morris@oracle.com> | 2014-11-19 05:32:12 -0500 |
---|---|---|
committer | James Morris <james.l.morris@oracle.com> | 2014-11-19 05:32:12 -0500 |
commit | b10778a00d40b3d9fdaaf5891e802794781ff71c (patch) | |
tree | 6ba4cbac86eecedc3f30650e7f764ecf00c83898 /net/packet/af_packet.c | |
parent | 594081ee7145cc30a3977cb4e218f81213b63dc5 (diff) | |
parent | bfe01a5ba2490f299e1d2d5508cbbbadd897bbe9 (diff) |
Merge commit 'v3.17' into next
Diffstat (limited to 'net/packet/af_packet.c')
-rw-r--r-- | net/packet/af_packet.c | 31 |
1 files changed, 21 insertions, 10 deletions
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index b85c67ccb797..93896d2092f6 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c | |||
@@ -441,14 +441,10 @@ static __u32 tpacket_get_timestamp(struct sk_buff *skb, struct timespec *ts, | |||
441 | { | 441 | { |
442 | struct skb_shared_hwtstamps *shhwtstamps = skb_hwtstamps(skb); | 442 | struct skb_shared_hwtstamps *shhwtstamps = skb_hwtstamps(skb); |
443 | 443 | ||
444 | if (shhwtstamps) { | 444 | if (shhwtstamps && |
445 | if ((flags & SOF_TIMESTAMPING_SYS_HARDWARE) && | 445 | (flags & SOF_TIMESTAMPING_RAW_HARDWARE) && |
446 | ktime_to_timespec_cond(shhwtstamps->syststamp, ts)) | 446 | ktime_to_timespec_cond(shhwtstamps->hwtstamp, ts)) |
447 | return TP_STATUS_TS_SYS_HARDWARE; | 447 | return TP_STATUS_TS_RAW_HARDWARE; |
448 | if ((flags & SOF_TIMESTAMPING_RAW_HARDWARE) && | ||
449 | ktime_to_timespec_cond(shhwtstamps->hwtstamp, ts)) | ||
450 | return TP_STATUS_TS_RAW_HARDWARE; | ||
451 | } | ||
452 | 448 | ||
453 | if (ktime_to_timespec_cond(skb->tstamp, ts)) | 449 | if (ktime_to_timespec_cond(skb->tstamp, ts)) |
454 | return TP_STATUS_TS_SOFTWARE; | 450 | return TP_STATUS_TS_SOFTWARE; |
@@ -636,6 +632,7 @@ static void init_prb_bdqc(struct packet_sock *po, | |||
636 | p1->tov_in_jiffies = msecs_to_jiffies(p1->retire_blk_tov); | 632 | p1->tov_in_jiffies = msecs_to_jiffies(p1->retire_blk_tov); |
637 | p1->blk_sizeof_priv = req_u->req3.tp_sizeof_priv; | 633 | p1->blk_sizeof_priv = req_u->req3.tp_sizeof_priv; |
638 | 634 | ||
635 | p1->max_frame_len = p1->kblk_size - BLK_PLUS_PRIV(p1->blk_sizeof_priv); | ||
639 | prb_init_ft_ops(p1, req_u); | 636 | prb_init_ft_ops(p1, req_u); |
640 | prb_setup_retire_blk_timer(po, tx_ring); | 637 | prb_setup_retire_blk_timer(po, tx_ring); |
641 | prb_open_block(p1, pbd); | 638 | prb_open_block(p1, pbd); |
@@ -1946,6 +1943,18 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev, | |||
1946 | if ((int)snaplen < 0) | 1943 | if ((int)snaplen < 0) |
1947 | snaplen = 0; | 1944 | snaplen = 0; |
1948 | } | 1945 | } |
1946 | } else if (unlikely(macoff + snaplen > | ||
1947 | GET_PBDQC_FROM_RB(&po->rx_ring)->max_frame_len)) { | ||
1948 | u32 nval; | ||
1949 | |||
1950 | nval = GET_PBDQC_FROM_RB(&po->rx_ring)->max_frame_len - macoff; | ||
1951 | pr_err_once("tpacket_rcv: packet too big, clamped from %u to %u. macoff=%u\n", | ||
1952 | snaplen, nval, macoff); | ||
1953 | snaplen = nval; | ||
1954 | if (unlikely((int)snaplen < 0)) { | ||
1955 | snaplen = 0; | ||
1956 | macoff = GET_PBDQC_FROM_RB(&po->rx_ring)->max_frame_len; | ||
1957 | } | ||
1949 | } | 1958 | } |
1950 | spin_lock(&sk->sk_receive_queue.lock); | 1959 | spin_lock(&sk->sk_receive_queue.lock); |
1951 | h.raw = packet_current_rx_frame(po, skb, | 1960 | h.raw = packet_current_rx_frame(po, skb, |
@@ -3071,10 +3080,8 @@ static int packet_dev_mc(struct net_device *dev, struct packet_mclist *i, | |||
3071 | break; | 3080 | break; |
3072 | case PACKET_MR_PROMISC: | 3081 | case PACKET_MR_PROMISC: |
3073 | return dev_set_promiscuity(dev, what); | 3082 | return dev_set_promiscuity(dev, what); |
3074 | break; | ||
3075 | case PACKET_MR_ALLMULTI: | 3083 | case PACKET_MR_ALLMULTI: |
3076 | return dev_set_allmulti(dev, what); | 3084 | return dev_set_allmulti(dev, what); |
3077 | break; | ||
3078 | case PACKET_MR_UNICAST: | 3085 | case PACKET_MR_UNICAST: |
3079 | if (i->alen != dev->addr_len) | 3086 | if (i->alen != dev->addr_len) |
3080 | return -EINVAL; | 3087 | return -EINVAL; |
@@ -3789,6 +3796,10 @@ static int packet_set_ring(struct sock *sk, union tpacket_req_u *req_u, | |||
3789 | goto out; | 3796 | goto out; |
3790 | if (unlikely(req->tp_block_size & (PAGE_SIZE - 1))) | 3797 | if (unlikely(req->tp_block_size & (PAGE_SIZE - 1))) |
3791 | goto out; | 3798 | goto out; |
3799 | if (po->tp_version >= TPACKET_V3 && | ||
3800 | (int)(req->tp_block_size - | ||
3801 | BLK_PLUS_PRIV(req_u->req3.tp_sizeof_priv)) <= 0) | ||
3802 | goto out; | ||
3792 | if (unlikely(req->tp_frame_size < po->tp_hdrlen + | 3803 | if (unlikely(req->tp_frame_size < po->tp_hdrlen + |
3793 | po->tp_reserve)) | 3804 | po->tp_reserve)) |
3794 | goto out; | 3805 | goto out; |