aboutsummaryrefslogtreecommitdiffstats
path: root/net/packet/af_packet.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/packet/af_packet.c')
-rw-r--r--net/packet/af_packet.c31
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;