| 572 | } while (0) |
| 573 | |
| 574 | static inline void |
| 575 | virtqueue_xmit_offload(struct virtio_net_hdr *hdr, struct rte_mbuf *cookie) |
| 576 | { |
| 577 | uint64_t csum_l4 = cookie->ol_flags & RTE_MBUF_F_TX_L4_MASK; |
| 578 | uint16_t o_l23_len = (cookie->ol_flags & RTE_MBUF_F_TX_TUNNEL_MASK) ? |
| 579 | cookie->outer_l2_len + cookie->outer_l3_len : 0; |
| 580 | |
| 581 | if (cookie->ol_flags & RTE_MBUF_F_TX_TCP_SEG) |
| 582 | csum_l4 |= RTE_MBUF_F_TX_TCP_CKSUM; |
| 583 | |
| 584 | switch (csum_l4) { |
| 585 | case RTE_MBUF_F_TX_UDP_CKSUM: |
| 586 | hdr->csum_start = o_l23_len + cookie->l2_len + cookie->l3_len; |
| 587 | hdr->csum_offset = offsetof(struct rte_udp_hdr, dgram_cksum); |
| 588 | hdr->flags = VIRTIO_NET_HDR_F_NEEDS_CSUM; |
| 589 | break; |
| 590 | |
| 591 | case RTE_MBUF_F_TX_TCP_CKSUM: |
| 592 | hdr->csum_start = o_l23_len + cookie->l2_len + cookie->l3_len; |
| 593 | hdr->csum_offset = offsetof(struct rte_tcp_hdr, cksum); |
| 594 | hdr->flags = VIRTIO_NET_HDR_F_NEEDS_CSUM; |
| 595 | break; |
| 596 | |
| 597 | default: |
| 598 | ASSIGN_UNLESS_EQUAL(hdr->csum_start, 0); |
| 599 | ASSIGN_UNLESS_EQUAL(hdr->csum_offset, 0); |
| 600 | ASSIGN_UNLESS_EQUAL(hdr->flags, 0); |
| 601 | break; |
| 602 | } |
| 603 | |
| 604 | /* TCP Segmentation Offload */ |
| 605 | if (cookie->ol_flags & RTE_MBUF_F_TX_TCP_SEG) { |
| 606 | hdr->gso_type = (cookie->ol_flags & RTE_MBUF_F_TX_IPV6) ? |
| 607 | VIRTIO_NET_HDR_GSO_TCPV6 : |
| 608 | VIRTIO_NET_HDR_GSO_TCPV4; |
| 609 | hdr->gso_size = cookie->tso_segsz; |
| 610 | hdr->hdr_len = o_l23_len + cookie->l2_len + cookie->l3_len + |
| 611 | cookie->l4_len; |
| 612 | } else { |
| 613 | ASSIGN_UNLESS_EQUAL(hdr->gso_type, 0); |
| 614 | ASSIGN_UNLESS_EQUAL(hdr->gso_size, 0); |
| 615 | ASSIGN_UNLESS_EQUAL(hdr->hdr_len, 0); |
| 616 | } |
| 617 | } |
| 618 | |
| 619 | static inline void |
| 620 | virtqueue_enqueue_xmit_packed(struct virtnet_tx *txvq, struct rte_mbuf *cookie, |
no outgoing calls
no test coverage detected