| 8 | #include "macswap_common.h" |
| 9 | |
| 10 | static inline void |
| 11 | do_macswap(struct rte_mbuf *pkts[], uint16_t nb, |
| 12 | struct rte_port *txp) |
| 13 | { |
| 14 | struct rte_ether_hdr *eth_hdr[4]; |
| 15 | struct rte_mbuf *mb[4]; |
| 16 | uint64_t ol_flags; |
| 17 | int i; |
| 18 | int r; |
| 19 | __m128i addr0, addr1, addr2, addr3; |
| 20 | /** |
| 21 | * shuffle mask be used to shuffle the 16 bytes. |
| 22 | * byte 0-5 wills be swapped with byte 6-11. |
| 23 | * byte 12-15 will keep unchanged. |
| 24 | */ |
| 25 | __m128i shfl_msk = _mm_set_epi8(15, 14, 13, 12, |
| 26 | 5, 4, 3, 2, |
| 27 | 1, 0, 11, 10, |
| 28 | 9, 8, 7, 6); |
| 29 | |
| 30 | ol_flags = ol_flags_init(txp->dev_conf.txmode.offloads); |
| 31 | vlan_qinq_set(pkts, nb, ol_flags, |
| 32 | txp->tx_vlan_id, txp->tx_vlan_id_outer); |
| 33 | |
| 34 | i = 0; |
| 35 | r = nb; |
| 36 | |
| 37 | while (r >= 4) { |
| 38 | if (r >= 8) { |
| 39 | rte_prefetch0(rte_pktmbuf_mtod(pkts[i + 4], void *)); |
| 40 | rte_prefetch0(rte_pktmbuf_mtod(pkts[i + 5], void *)); |
| 41 | rte_prefetch0(rte_pktmbuf_mtod(pkts[i + 6], void *)); |
| 42 | rte_prefetch0(rte_pktmbuf_mtod(pkts[i + 7], void *)); |
| 43 | } |
| 44 | |
| 45 | mb[0] = pkts[i++]; |
| 46 | eth_hdr[0] = rte_pktmbuf_mtod(mb[0], struct rte_ether_hdr *); |
| 47 | addr0 = _mm_loadu_si128((__m128i *)eth_hdr[0]); |
| 48 | |
| 49 | mb[1] = pkts[i++]; |
| 50 | eth_hdr[1] = rte_pktmbuf_mtod(mb[1], struct rte_ether_hdr *); |
| 51 | addr1 = _mm_loadu_si128((__m128i *)eth_hdr[1]); |
| 52 | |
| 53 | |
| 54 | mb[2] = pkts[i++]; |
| 55 | eth_hdr[2] = rte_pktmbuf_mtod(mb[2], struct rte_ether_hdr *); |
| 56 | addr2 = _mm_loadu_si128((__m128i *)eth_hdr[2]); |
| 57 | |
| 58 | mb[3] = pkts[i++]; |
| 59 | eth_hdr[3] = rte_pktmbuf_mtod(mb[3], struct rte_ether_hdr *); |
| 60 | addr3 = _mm_loadu_si128((__m128i *)eth_hdr[3]); |
| 61 | |
| 62 | addr0 = _mm_shuffle_epi8(addr0, shfl_msk); |
| 63 | addr1 = _mm_shuffle_epi8(addr1, shfl_msk); |
| 64 | addr2 = _mm_shuffle_epi8(addr2, shfl_msk); |
| 65 | addr3 = _mm_shuffle_epi8(addr3, shfl_msk); |
| 66 | |
| 67 | _mm_storeu_si128((__m128i *)eth_hdr[0], addr0); |
nothing calls this directly
no test coverage detected