On Tue, Dec 13, 2016 at 02:28:34AM +0100, Michał Mirosław wrote:
> Signed-off-by: Michał Mirosław <michal.miros...@atendesoftware.pl>

Acked-by: John W. Linville <linvi...@tuxdriver.com>

> ---
>  drivers/net/af_packet/rte_eth_af_packet.c | 20 +++++++++++++++-----
>  1 file changed, 15 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/net/af_packet/rte_eth_af_packet.c 
> b/drivers/net/af_packet/rte_eth_af_packet.c
> index 5599e02..fc2dc4a 100644
> --- a/drivers/net/af_packet/rte_eth_af_packet.c
> +++ b/drivers/net/af_packet/rte_eth_af_packet.c
> @@ -83,6 +83,7 @@ struct pkt_rx_queue {
>  
>  struct pkt_tx_queue {
>       int sockfd;
> +     unsigned int frame_data_size;
>  
>       struct iovec *rd;
>       uint8_t *map;
> @@ -206,13 +207,20 @@ eth_af_packet_tx(void *queue, struct rte_mbuf **bufs, 
> uint16_t nb_pkts)
>       framenum = pkt_q->framenum;
>       ppd = (struct tpacket2_hdr *) pkt_q->rd[framenum].iov_base;
>       for (i = 0; i < nb_pkts; i++) {
> +             mbuf = *bufs++;
> +
> +             /* drop oversized packets */
> +             if (rte_pktmbuf_data_len(mbuf) > pkt_q->frame_data_size) {
> +                     rte_pktmbuf_free(mbuf);
> +                     continue;
> +             }
> +
>               /* point at the next incoming frame */
>               if ((ppd->tp_status != TP_STATUS_AVAILABLE) &&
>                   (poll(&pfd, 1, -1) < 0))
> -                             continue;
> +                     break;
>  
>               /* copy the tx frame data */
> -             mbuf = bufs[num_tx];
>               pbuf = (uint8_t *) ppd + TPACKET2_HDRLEN -
>                       sizeof(struct sockaddr_ll);
>               memcpy(pbuf, rte_pktmbuf_mtod(mbuf, void*), 
> rte_pktmbuf_data_len(mbuf));
> @@ -231,13 +239,13 @@ eth_af_packet_tx(void *queue, struct rte_mbuf **bufs, 
> uint16_t nb_pkts)
>  
>       /* kick-off transmits */
>       if (sendto(pkt_q->sockfd, NULL, 0, MSG_DONTWAIT, NULL, 0) == -1)
> -             return 0; /* error sending -- no packets transmitted */
> +             num_tx = 0; /* error sending -- no packets transmitted */
>  
>       pkt_q->framenum = framenum;
>       pkt_q->tx_pkts += num_tx;
> -     pkt_q->err_pkts += nb_pkts - num_tx;
> +     pkt_q->err_pkts += i - num_tx;
>       pkt_q->tx_bytes += num_tx_bytes;
> -     return num_tx;
> +     return i;
>  }
>  
>  static int
> @@ -634,6 +642,8 @@ rte_pmd_init_internals(const char *name,
>  
>               tx_queue = &((*internals)->tx_queue[q]);
>               tx_queue->framecount = req->tp_frame_nr;
> +             tx_queue->frame_data_size = req->tp_frame_size;
> +             tx_queue->frame_data_size -= TPACKET2_HDRLEN - sizeof(struct 
> sockaddr_ll);
>  
>               tx_queue->map = rx_queue->map + req->tp_block_size * 
> req->tp_block_nr;
>  
> -- 
> 2.10.2
> 
> 

-- 
John W. Linville                Someday the world will need a hero, and you
linvi...@tuxdriver.com                  might be all we have.  Be ready.

Reply via email to