1d862c45bSRaslan Darawsheh /* SPDX-License-Identifier: BSD-3-Clause 2d862c45bSRaslan Darawsheh * Copyright(c) 2010-2014 Intel Corporation 3d862c45bSRaslan Darawsheh * Copyright(c) 2018 Mellanox Technology 4d862c45bSRaslan Darawsheh */ 5d862c45bSRaslan Darawsheh 6d862c45bSRaslan Darawsheh #include <stdio.h> 7d862c45bSRaslan Darawsheh 8d862c45bSRaslan Darawsheh #include <rte_net.h> 9d862c45bSRaslan Darawsheh #include <rte_mbuf.h> 10d862c45bSRaslan Darawsheh #include <rte_ether.h> 11d862c45bSRaslan Darawsheh #include <rte_ethdev.h> 12d862c45bSRaslan Darawsheh #include <rte_flow.h> 13d862c45bSRaslan Darawsheh 14d862c45bSRaslan Darawsheh #include "testpmd.h" 15d862c45bSRaslan Darawsheh 16d862c45bSRaslan Darawsheh static inline void 17d862c45bSRaslan Darawsheh print_ether_addr(const char *what, struct ether_addr *eth_addr) 18d862c45bSRaslan Darawsheh { 19d862c45bSRaslan Darawsheh char buf[ETHER_ADDR_FMT_SIZE]; 20d862c45bSRaslan Darawsheh ether_format_addr(buf, ETHER_ADDR_FMT_SIZE, eth_addr); 21d862c45bSRaslan Darawsheh printf("%s%s", what, buf); 22d862c45bSRaslan Darawsheh } 23d862c45bSRaslan Darawsheh 24*c77ad9deSRaslan Darawsheh static inline void 25d862c45bSRaslan Darawsheh dump_pkt_burst(uint16_t port_id, uint16_t queue, struct rte_mbuf *pkts[], 26d862c45bSRaslan Darawsheh uint16_t nb_pkts, int is_rx) 27d862c45bSRaslan Darawsheh { 28d862c45bSRaslan Darawsheh struct rte_mbuf *mb; 29d862c45bSRaslan Darawsheh struct ether_hdr *eth_hdr; 30d862c45bSRaslan Darawsheh uint16_t eth_type; 31d862c45bSRaslan Darawsheh uint64_t ol_flags; 32d862c45bSRaslan Darawsheh uint16_t i, packet_type; 33d862c45bSRaslan Darawsheh uint16_t is_encapsulation; 34d862c45bSRaslan Darawsheh char buf[256]; 35d862c45bSRaslan Darawsheh struct rte_net_hdr_lens hdr_lens; 36d862c45bSRaslan Darawsheh uint32_t sw_packet_type; 37d862c45bSRaslan Darawsheh uint16_t udp_port; 38d862c45bSRaslan Darawsheh uint32_t vx_vni; 39d862c45bSRaslan Darawsheh 40d862c45bSRaslan Darawsheh if (!nb_pkts) 41d862c45bSRaslan Darawsheh return; 42d862c45bSRaslan Darawsheh printf("port %u/queue %u: %s %u packets\n", 43d862c45bSRaslan Darawsheh port_id, queue, 44d862c45bSRaslan Darawsheh is_rx ? "received" : "sent", 45d862c45bSRaslan Darawsheh (unsigned int) nb_pkts); 46d862c45bSRaslan Darawsheh for (i = 0; i < nb_pkts; i++) { 47d862c45bSRaslan Darawsheh mb = pkts[i]; 48d862c45bSRaslan Darawsheh eth_hdr = rte_pktmbuf_mtod(mb, struct ether_hdr *); 49d862c45bSRaslan Darawsheh eth_type = RTE_BE_TO_CPU_16(eth_hdr->ether_type); 50d862c45bSRaslan Darawsheh ol_flags = mb->ol_flags; 51d862c45bSRaslan Darawsheh packet_type = mb->packet_type; 52d862c45bSRaslan Darawsheh is_encapsulation = RTE_ETH_IS_TUNNEL_PKT(packet_type); 53d862c45bSRaslan Darawsheh 54d862c45bSRaslan Darawsheh print_ether_addr(" src=", ð_hdr->s_addr); 55d862c45bSRaslan Darawsheh print_ether_addr(" - dst=", ð_hdr->d_addr); 56d862c45bSRaslan Darawsheh printf(" - type=0x%04x - length=%u - nb_segs=%d", 57d862c45bSRaslan Darawsheh eth_type, (unsigned int) mb->pkt_len, 58d862c45bSRaslan Darawsheh (int)mb->nb_segs); 59d862c45bSRaslan Darawsheh if (ol_flags & PKT_RX_RSS_HASH) { 60d862c45bSRaslan Darawsheh printf(" - RSS hash=0x%x", (unsigned int) mb->hash.rss); 61d862c45bSRaslan Darawsheh printf(" - RSS queue=0x%x", (unsigned int) queue); 62d862c45bSRaslan Darawsheh } 63d862c45bSRaslan Darawsheh if (ol_flags & PKT_RX_FDIR) { 64d862c45bSRaslan Darawsheh printf(" - FDIR matched "); 65d862c45bSRaslan Darawsheh if (ol_flags & PKT_RX_FDIR_ID) 66d862c45bSRaslan Darawsheh printf("ID=0x%x", 67d862c45bSRaslan Darawsheh mb->hash.fdir.hi); 68d862c45bSRaslan Darawsheh else if (ol_flags & PKT_RX_FDIR_FLX) 69d862c45bSRaslan Darawsheh printf("flex bytes=0x%08x %08x", 70d862c45bSRaslan Darawsheh mb->hash.fdir.hi, mb->hash.fdir.lo); 71d862c45bSRaslan Darawsheh else 72d862c45bSRaslan Darawsheh printf("hash=0x%x ID=0x%x ", 73d862c45bSRaslan Darawsheh mb->hash.fdir.hash, mb->hash.fdir.id); 74d862c45bSRaslan Darawsheh } 75d862c45bSRaslan Darawsheh if (ol_flags & PKT_RX_TIMESTAMP) 76d862c45bSRaslan Darawsheh printf(" - timestamp %"PRIu64" ", mb->timestamp); 77d862c45bSRaslan Darawsheh if (ol_flags & PKT_RX_QINQ) 78d862c45bSRaslan Darawsheh printf(" - QinQ VLAN tci=0x%x, VLAN tci outer=0x%x", 79d862c45bSRaslan Darawsheh mb->vlan_tci, mb->vlan_tci_outer); 80d862c45bSRaslan Darawsheh else if (ol_flags & PKT_RX_VLAN) 81d862c45bSRaslan Darawsheh printf(" - VLAN tci=0x%x", mb->vlan_tci); 82d862c45bSRaslan Darawsheh if (mb->packet_type) { 83d862c45bSRaslan Darawsheh rte_get_ptype_name(mb->packet_type, buf, sizeof(buf)); 84d862c45bSRaslan Darawsheh printf(" - hw ptype: %s", buf); 85d862c45bSRaslan Darawsheh } 86d862c45bSRaslan Darawsheh sw_packet_type = rte_net_get_ptype(mb, &hdr_lens, 87d862c45bSRaslan Darawsheh RTE_PTYPE_ALL_MASK); 88d862c45bSRaslan Darawsheh rte_get_ptype_name(sw_packet_type, buf, sizeof(buf)); 89d862c45bSRaslan Darawsheh printf(" - sw ptype: %s", buf); 90d862c45bSRaslan Darawsheh if (sw_packet_type & RTE_PTYPE_L2_MASK) 91d862c45bSRaslan Darawsheh printf(" - l2_len=%d", hdr_lens.l2_len); 92d862c45bSRaslan Darawsheh if (sw_packet_type & RTE_PTYPE_L3_MASK) 93d862c45bSRaslan Darawsheh printf(" - l3_len=%d", hdr_lens.l3_len); 94d862c45bSRaslan Darawsheh if (sw_packet_type & RTE_PTYPE_L4_MASK) 95d862c45bSRaslan Darawsheh printf(" - l4_len=%d", hdr_lens.l4_len); 96d862c45bSRaslan Darawsheh if (sw_packet_type & RTE_PTYPE_TUNNEL_MASK) 97d862c45bSRaslan Darawsheh printf(" - tunnel_len=%d", hdr_lens.tunnel_len); 98d862c45bSRaslan Darawsheh if (sw_packet_type & RTE_PTYPE_INNER_L2_MASK) 99d862c45bSRaslan Darawsheh printf(" - inner_l2_len=%d", hdr_lens.inner_l2_len); 100d862c45bSRaslan Darawsheh if (sw_packet_type & RTE_PTYPE_INNER_L3_MASK) 101d862c45bSRaslan Darawsheh printf(" - inner_l3_len=%d", hdr_lens.inner_l3_len); 102d862c45bSRaslan Darawsheh if (sw_packet_type & RTE_PTYPE_INNER_L4_MASK) 103d862c45bSRaslan Darawsheh printf(" - inner_l4_len=%d", hdr_lens.inner_l4_len); 104d862c45bSRaslan Darawsheh if (is_encapsulation) { 105d862c45bSRaslan Darawsheh struct ipv4_hdr *ipv4_hdr; 106d862c45bSRaslan Darawsheh struct ipv6_hdr *ipv6_hdr; 107d862c45bSRaslan Darawsheh struct udp_hdr *udp_hdr; 108d862c45bSRaslan Darawsheh uint8_t l2_len; 109d862c45bSRaslan Darawsheh uint8_t l3_len; 110d862c45bSRaslan Darawsheh uint8_t l4_len; 111d862c45bSRaslan Darawsheh uint8_t l4_proto; 112d862c45bSRaslan Darawsheh struct vxlan_hdr *vxlan_hdr; 113d862c45bSRaslan Darawsheh 114d862c45bSRaslan Darawsheh l2_len = sizeof(struct ether_hdr); 115d862c45bSRaslan Darawsheh 116d862c45bSRaslan Darawsheh /* Do not support ipv4 option field */ 117d862c45bSRaslan Darawsheh if (RTE_ETH_IS_IPV4_HDR(packet_type)) { 118d862c45bSRaslan Darawsheh l3_len = sizeof(struct ipv4_hdr); 119d862c45bSRaslan Darawsheh ipv4_hdr = rte_pktmbuf_mtod_offset(mb, 120d862c45bSRaslan Darawsheh struct ipv4_hdr *, 121d862c45bSRaslan Darawsheh l2_len); 122d862c45bSRaslan Darawsheh l4_proto = ipv4_hdr->next_proto_id; 123d862c45bSRaslan Darawsheh } else { 124d862c45bSRaslan Darawsheh l3_len = sizeof(struct ipv6_hdr); 125d862c45bSRaslan Darawsheh ipv6_hdr = rte_pktmbuf_mtod_offset(mb, 126d862c45bSRaslan Darawsheh struct ipv6_hdr *, 127d862c45bSRaslan Darawsheh l2_len); 128d862c45bSRaslan Darawsheh l4_proto = ipv6_hdr->proto; 129d862c45bSRaslan Darawsheh } 130d862c45bSRaslan Darawsheh if (l4_proto == IPPROTO_UDP) { 131d862c45bSRaslan Darawsheh udp_hdr = rte_pktmbuf_mtod_offset(mb, 132d862c45bSRaslan Darawsheh struct udp_hdr *, 133d862c45bSRaslan Darawsheh l2_len + l3_len); 134d862c45bSRaslan Darawsheh l4_len = sizeof(struct udp_hdr); 135d862c45bSRaslan Darawsheh vxlan_hdr = rte_pktmbuf_mtod_offset(mb, 136d862c45bSRaslan Darawsheh struct vxlan_hdr *, 137d862c45bSRaslan Darawsheh l2_len + l3_len + l4_len); 138d862c45bSRaslan Darawsheh udp_port = RTE_BE_TO_CPU_16(udp_hdr->dst_port); 139d862c45bSRaslan Darawsheh vx_vni = rte_be_to_cpu_32(vxlan_hdr->vx_vni); 140d862c45bSRaslan Darawsheh printf(" - VXLAN packet: packet type =%d, " 141d862c45bSRaslan Darawsheh "Destination UDP port =%d, VNI = %d", 142d862c45bSRaslan Darawsheh packet_type, udp_port, vx_vni >> 8); 143d862c45bSRaslan Darawsheh } 144d862c45bSRaslan Darawsheh } 145d862c45bSRaslan Darawsheh printf(" - %s queue=0x%x", is_rx ? "Receive" : "Send", 146d862c45bSRaslan Darawsheh (unsigned int) queue); 147d862c45bSRaslan Darawsheh printf("\n"); 148d862c45bSRaslan Darawsheh rte_get_rx_ol_flag_list(mb->ol_flags, buf, sizeof(buf)); 149d862c45bSRaslan Darawsheh printf(" ol_flags: %s\n", buf); 150d862c45bSRaslan Darawsheh } 151d862c45bSRaslan Darawsheh } 152*c77ad9deSRaslan Darawsheh 153*c77ad9deSRaslan Darawsheh uint16_t 154*c77ad9deSRaslan Darawsheh dump_rx_pkts(uint16_t port_id, uint16_t queue, struct rte_mbuf *pkts[], 155*c77ad9deSRaslan Darawsheh uint16_t nb_pkts, __rte_unused uint16_t max_pkts, 156*c77ad9deSRaslan Darawsheh __rte_unused void *user_param) 157*c77ad9deSRaslan Darawsheh { 158*c77ad9deSRaslan Darawsheh dump_pkt_burst(port_id, queue, pkts, nb_pkts, 1); 159*c77ad9deSRaslan Darawsheh return nb_pkts; 160*c77ad9deSRaslan Darawsheh } 161*c77ad9deSRaslan Darawsheh 162*c77ad9deSRaslan Darawsheh uint16_t 163*c77ad9deSRaslan Darawsheh dump_tx_pkts(uint16_t port_id, uint16_t queue, struct rte_mbuf *pkts[], 164*c77ad9deSRaslan Darawsheh uint16_t nb_pkts, __rte_unused void *user_param) 165*c77ad9deSRaslan Darawsheh { 166*c77ad9deSRaslan Darawsheh dump_pkt_burst(port_id, queue, pkts, nb_pkts, 0); 167*c77ad9deSRaslan Darawsheh return nb_pkts; 168*c77ad9deSRaslan Darawsheh } 169