- else {
- ipv6_hdr = (struct ipv6_hdr *) (rte_pktmbuf_mtod(mb,
- unsigned char *) + l2_len);
- l3_len = sizeof(struct ipv6_hdr) ;
- l4_proto = ipv6_hdr->proto;
-
- if (l4_proto == IPPROTO_UDP) {
- udp_hdr = (struct udp_hdr*) (rte_pktmbuf_mtod(mb,
- unsigned char *) + l2_len + l3_len);
- if (tx_ol_flags & 0x2) {
- /* HW Offload */
- ol_flags |= PKT_TX_UDP_CKSUM;
- udp_hdr->dgram_cksum = get_ipv6_psd_sum(ipv6_hdr);
- }
- else {
- /* SW Implementation */
- /* checksum field need be clear first */
- udp_hdr->dgram_cksum = 0;
- udp_hdr->dgram_cksum = get_ipv6_udptcp_checksum(ipv6_hdr,
- (uint16_t*)udp_hdr);
- }
- }
- else if (l4_proto == IPPROTO_TCP) {
- tcp_hdr = (struct tcp_hdr*) (rte_pktmbuf_mtod(mb,
- unsigned char *) + l2_len + l3_len);
- if (tx_ol_flags & 0x4) {
- ol_flags |= PKT_TX_TCP_CKSUM;
- tcp_hdr->cksum = get_ipv6_psd_sum(ipv6_hdr);
- }
- else {
- tcp_hdr->cksum = 0;
- tcp_hdr->cksum = get_ipv6_udptcp_checksum(ipv6_hdr,
- (uint16_t*)tcp_hdr);
- }
- }
- else if (l4_proto == IPPROTO_SCTP) {
- sctp_hdr = (struct sctp_hdr*) (rte_pktmbuf_mtod(mb,
- unsigned char *) + l2_len + l3_len);
-
- if (tx_ol_flags & 0x8) {
- ol_flags |= PKT_TX_SCTP_CKSUM;
- sctp_hdr->cksum = 0;
- /* Sanity check, only number of 4 bytes supported by HW */
- if ((rte_be_to_cpu_16(ipv6_hdr->payload_len) % 4) != 0)
- printf("sctp payload must be a multiple "
- "of 4 bytes for checksum offload");
- }
- else {
- /* CRC32c sample code available in RFC3309 */
- sctp_hdr->cksum = 0;
- }
- } else {
- printf("Test flow control for 1G PMD \n");
+ /* if verbose mode is enabled, dump debug info */
+ if (verbose_level > 0) {
+ struct {
+ uint64_t flag;
+ uint64_t mask;
+ } tx_flags[] = {
+ { PKT_TX_IP_CKSUM, PKT_TX_IP_CKSUM },
+ { PKT_TX_UDP_CKSUM, PKT_TX_L4_MASK },
+ { PKT_TX_TCP_CKSUM, PKT_TX_L4_MASK },
+ { PKT_TX_SCTP_CKSUM, PKT_TX_L4_MASK },
+ { PKT_TX_IPV4, PKT_TX_IPV4 },
+ { PKT_TX_IPV6, PKT_TX_IPV6 },
+ { PKT_TX_OUTER_IP_CKSUM, PKT_TX_OUTER_IP_CKSUM },
+ { PKT_TX_OUTER_IPV4, PKT_TX_OUTER_IPV4 },
+ { PKT_TX_OUTER_IPV6, PKT_TX_OUTER_IPV6 },
+ { PKT_TX_TCP_SEG, PKT_TX_TCP_SEG },
+ };
+ unsigned j;
+ const char *name;
+
+ printf("-----------------\n");
+ printf("mbuf=%p, pkt_len=%u, nb_segs=%hhu:\n",
+ m, m->pkt_len, m->nb_segs);
+ /* dump rx parsed packet info */
+ printf("rx: l2_len=%d ethertype=%x l3_len=%d "
+ "l4_proto=%d l4_len=%d\n",
+ info.l2_len, rte_be_to_cpu_16(info.ethertype),
+ info.l3_len, info.l4_proto, info.l4_len);
+ if (info.is_tunnel == 1)
+ printf("rx: outer_l2_len=%d outer_ethertype=%x "
+ "outer_l3_len=%d\n", info.outer_l2_len,
+ rte_be_to_cpu_16(info.outer_ethertype),
+ info.outer_l3_len);
+ /* dump tx packet info */
+ if ((testpmd_ol_flags & (TESTPMD_TX_OFFLOAD_IP_CKSUM |
+ TESTPMD_TX_OFFLOAD_UDP_CKSUM |
+ TESTPMD_TX_OFFLOAD_TCP_CKSUM |
+ TESTPMD_TX_OFFLOAD_SCTP_CKSUM)) ||
+ info.tso_segsz != 0)
+ printf("tx: m->l2_len=%d m->l3_len=%d "
+ "m->l4_len=%d\n",
+ m->l2_len, m->l3_len, m->l4_len);
+ if ((info.is_tunnel == 1) &&
+ (testpmd_ol_flags & TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM))
+ printf("tx: m->outer_l2_len=%d m->outer_l3_len=%d\n",
+ m->outer_l2_len, m->outer_l3_len);
+ if (info.tso_segsz != 0)
+ printf("tx: m->tso_segsz=%d\n", m->tso_segsz);
+ printf("tx: flags=");
+ for (j = 0; j < sizeof(tx_flags)/sizeof(*tx_flags); j++) {
+ name = rte_get_tx_ol_flag_name(tx_flags[j].flag);
+ if ((m->ol_flags & tx_flags[j].mask) ==
+ tx_flags[j].flag)
+ printf("%s ", name);