|
@@ -785,6 +785,7 @@ static void prb_close_block(struct tpacket_kbdq_core *pkc1,
|
|
|
|
|
|
struct tpacket3_hdr *last_pkt;
|
|
|
struct tpacket_hdr_v1 *h1 = &pbd1->hdr.bh1;
|
|
|
+ struct sock *sk = &po->sk;
|
|
|
|
|
|
if (po->stats.stats3.tp_drops)
|
|
|
status |= TP_STATUS_LOSING;
|
|
@@ -809,6 +810,8 @@ static void prb_close_block(struct tpacket_kbdq_core *pkc1,
|
|
|
/* Flush the block */
|
|
|
prb_flush_block(pkc1, pbd1, status);
|
|
|
|
|
|
+ sk->sk_data_ready(sk);
|
|
|
+
|
|
|
pkc1->kactive_blk_num = GET_NEXT_PRB_BLK_NUM(pkc1);
|
|
|
}
|
|
|
|
|
@@ -2052,12 +2055,12 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev,
|
|
|
smp_wmb();
|
|
|
#endif
|
|
|
|
|
|
- if (po->tp_version <= TPACKET_V2)
|
|
|
+ if (po->tp_version <= TPACKET_V2) {
|
|
|
__packet_set_status(po, h.raw, status);
|
|
|
- else
|
|
|
+ sk->sk_data_ready(sk);
|
|
|
+ } else {
|
|
|
prb_clear_blk_fill_status(&po->rx_ring);
|
|
|
-
|
|
|
- sk->sk_data_ready(sk);
|
|
|
+ }
|
|
|
|
|
|
drop_n_restore:
|
|
|
if (skb_head != skb->data && skb_shared(skb)) {
|