app/testpmd: adjust on the fly VLAN configuration
[dpdk.git] / app / test-pmd / config.c
index 5571cfe..20a31d0 100644 (file)
@@ -417,7 +417,6 @@ tx_queue_infos_display(portid_t port_id, uint16_t queue_id)
        printf("\nTX writeback threshold: %hhu", qinfo.conf.tx_thresh.wthresh);
        printf("\nTX RS threshold: %hu", qinfo.conf.tx_rs_thresh);
        printf("\nTX free threshold: %hu", qinfo.conf.tx_free_thresh);
-       printf("\nTX flags: %#x", qinfo.conf.txq_flags);
        printf("\nTX deferred start: %s",
                (qinfo.conf.tx_deferred_start != 0) ? "on" : "off");
        printf("\nNumber of TXDs: %hu", qinfo.nb_desc);
@@ -627,8 +626,8 @@ port_offload_cap_display(portid_t port_id)
 
        if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_VLAN_INSERT) {
                printf("VLAN insert:                   ");
-               if (ports[port_id].tx_ol_flags &
-                   TESTPMD_TX_OFFLOAD_INSERT_VLAN)
+               if (ports[port_id].dev_conf.txmode.offloads &
+                   DEV_TX_OFFLOAD_VLAN_INSERT)
                        printf("on\n");
                else
                        printf("off\n");
@@ -645,8 +644,8 @@ port_offload_cap_display(portid_t port_id)
 
        if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_QINQ_INSERT) {
                printf("Double VLANs insert:           ");
-               if (ports[port_id].tx_ol_flags &
-                   TESTPMD_TX_OFFLOAD_INSERT_QINQ)
+               if (ports[port_id].dev_conf.txmode.offloads &
+                   DEV_TX_OFFLOAD_QINQ_INSERT)
                        printf("on\n");
                else
                        printf("off\n");
@@ -654,7 +653,8 @@ port_offload_cap_display(portid_t port_id)
 
        if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_IPV4_CKSUM) {
                printf("TX IPv4 checksum:              ");
-               if (ports[port_id].tx_ol_flags & TESTPMD_TX_OFFLOAD_IP_CKSUM)
+               if (ports[port_id].dev_conf.txmode.offloads &
+                   DEV_TX_OFFLOAD_IPV4_CKSUM)
                        printf("on\n");
                else
                        printf("off\n");
@@ -662,7 +662,8 @@ port_offload_cap_display(portid_t port_id)
 
        if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_UDP_CKSUM) {
                printf("TX UDP checksum:               ");
-               if (ports[port_id].tx_ol_flags & TESTPMD_TX_OFFLOAD_UDP_CKSUM)
+               if (ports[port_id].dev_conf.txmode.offloads &
+                   DEV_TX_OFFLOAD_UDP_CKSUM)
                        printf("on\n");
                else
                        printf("off\n");
@@ -670,7 +671,8 @@ port_offload_cap_display(portid_t port_id)
 
        if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_CKSUM) {
                printf("TX TCP checksum:               ");
-               if (ports[port_id].tx_ol_flags & TESTPMD_TX_OFFLOAD_TCP_CKSUM)
+               if (ports[port_id].dev_conf.txmode.offloads &
+                   DEV_TX_OFFLOAD_TCP_CKSUM)
                        printf("on\n");
                else
                        printf("off\n");
@@ -678,7 +680,8 @@ port_offload_cap_display(portid_t port_id)
 
        if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_SCTP_CKSUM) {
                printf("TX SCTP checksum:              ");
-               if (ports[port_id].tx_ol_flags & TESTPMD_TX_OFFLOAD_SCTP_CKSUM)
+               if (ports[port_id].dev_conf.txmode.offloads &
+                   DEV_TX_OFFLOAD_SCTP_CKSUM)
                        printf("on\n");
                else
                        printf("off\n");
@@ -686,8 +689,8 @@ port_offload_cap_display(portid_t port_id)
 
        if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM) {
                printf("TX Outer IPv4 checksum:        ");
-               if (ports[port_id].tx_ol_flags &
-                   TESTPMD_TX_OFFLOAD_OUTER_IP_CKSUM)
+               if (ports[port_id].dev_conf.txmode.offloads &
+                   DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM)
                        printf("on\n");
                else
                        printf("off\n");
@@ -695,7 +698,8 @@ port_offload_cap_display(portid_t port_id)
 
        if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_TSO) {
                printf("TX TCP segmentation:           ");
-               if (ports[port_id].tso_segsz != 0)
+               if (ports[port_id].dev_conf.txmode.offloads &
+                   DEV_TX_OFFLOAD_TCP_TSO)
                        printf("on\n");
                else
                        printf("off\n");
@@ -703,7 +707,8 @@ port_offload_cap_display(portid_t port_id)
 
        if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_UDP_TSO) {
                printf("TX UDP segmentation:           ");
-               if (ports[port_id].tso_segsz != 0)
+               if (ports[port_id].dev_conf.txmode.offloads &
+                   DEV_TX_OFFLOAD_UDP_TSO)
                        printf("on\n");
                else
                        printf("off\n");
@@ -711,7 +716,8 @@ port_offload_cap_display(portid_t port_id)
 
        if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_VXLAN_TNL_TSO) {
                printf("TSO for VXLAN tunnel packet:   ");
-               if (ports[port_id].tunnel_tso_segsz)
+               if (ports[port_id].dev_conf.txmode.offloads &
+                   DEV_TX_OFFLOAD_VXLAN_TNL_TSO)
                        printf("on\n");
                else
                        printf("off\n");
@@ -719,7 +725,8 @@ port_offload_cap_display(portid_t port_id)
 
        if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_GRE_TNL_TSO) {
                printf("TSO for GRE tunnel packet:     ");
-               if (ports[port_id].tunnel_tso_segsz)
+               if (ports[port_id].dev_conf.txmode.offloads &
+                   DEV_TX_OFFLOAD_GRE_TNL_TSO)
                        printf("on\n");
                else
                        printf("off\n");
@@ -727,7 +734,8 @@ port_offload_cap_display(portid_t port_id)
 
        if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_IPIP_TNL_TSO) {
                printf("TSO for IPIP tunnel packet:    ");
-               if (ports[port_id].tunnel_tso_segsz)
+               if (ports[port_id].dev_conf.txmode.offloads &
+                   DEV_TX_OFFLOAD_IPIP_TNL_TSO)
                        printf("on\n");
                else
                        printf("off\n");
@@ -735,7 +743,8 @@ port_offload_cap_display(portid_t port_id)
 
        if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_GENEVE_TNL_TSO) {
                printf("TSO for GENEVE tunnel packet:  ");
-               if (ports[port_id].tunnel_tso_segsz)
+               if (ports[port_id].dev_conf.txmode.offloads &
+                   DEV_TX_OFFLOAD_GENEVE_TNL_TSO)
                        printf("on\n");
                else
                        printf("off\n");
@@ -1714,8 +1723,8 @@ rxtx_config_display(void)
                                tx_conf->tx_thresh.pthresh,
                                tx_conf->tx_thresh.hthresh,
                                tx_conf->tx_thresh.wthresh);
-               printf("  TX RS bit threshold=%d - TXQ flags=0x%"PRIx32"\n",
-                               tx_conf->tx_rs_thresh, tx_conf->txq_flags);
+               printf("  TX RS bit threshold=%d - TXQ offloads=0x%"PRIx64"\n",
+                               tx_conf->tx_rs_thresh, tx_conf->offloads);
        }
 }
 
@@ -2666,21 +2675,26 @@ vlan_extend_set(portid_t port_id, int on)
 {
        int diag;
        int vlan_offload;
+       uint64_t port_rx_offloads = ports[port_id].dev_conf.rxmode.offloads;
 
        if (port_id_is_invalid(port_id, ENABLED_WARN))
                return;
 
        vlan_offload = rte_eth_dev_get_vlan_offload(port_id);
 
-       if (on)
+       if (on) {
                vlan_offload |= ETH_VLAN_EXTEND_OFFLOAD;
-       else
+               port_rx_offloads |= DEV_RX_OFFLOAD_VLAN_EXTEND;
+       } else {
                vlan_offload &= ~ETH_VLAN_EXTEND_OFFLOAD;
+               port_rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_EXTEND;
+       }
 
        diag = rte_eth_dev_set_vlan_offload(port_id, vlan_offload);
        if (diag < 0)
                printf("rx_vlan_extend_set(port_pi=%d, on=%d) failed "
               "diag=%d\n", port_id, on, diag);
+       ports[port_id].dev_conf.rxmode.offloads = port_rx_offloads;
 }
 
 void
@@ -2688,21 +2702,26 @@ rx_vlan_strip_set(portid_t port_id, int on)
 {
        int diag;
        int vlan_offload;
+       uint64_t port_rx_offloads = ports[port_id].dev_conf.rxmode.offloads;
 
        if (port_id_is_invalid(port_id, ENABLED_WARN))
                return;
 
        vlan_offload = rte_eth_dev_get_vlan_offload(port_id);
 
-       if (on)
+       if (on) {
                vlan_offload |= ETH_VLAN_STRIP_OFFLOAD;
-       else
+               port_rx_offloads |= DEV_RX_OFFLOAD_VLAN_STRIP;
+       } else {
                vlan_offload &= ~ETH_VLAN_STRIP_OFFLOAD;
+               port_rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_STRIP;
+       }
 
        diag = rte_eth_dev_set_vlan_offload(port_id, vlan_offload);
        if (diag < 0)
                printf("rx_vlan_strip_set(port_pi=%d, on=%d) failed "
               "diag=%d\n", port_id, on, diag);
+       ports[port_id].dev_conf.rxmode.offloads = port_rx_offloads;
 }
 
 void
@@ -2724,21 +2743,26 @@ rx_vlan_filter_set(portid_t port_id, int on)
 {
        int diag;
        int vlan_offload;
+       uint64_t port_rx_offloads = ports[port_id].dev_conf.rxmode.offloads;
 
        if (port_id_is_invalid(port_id, ENABLED_WARN))
                return;
 
        vlan_offload = rte_eth_dev_get_vlan_offload(port_id);
 
-       if (on)
+       if (on) {
                vlan_offload |= ETH_VLAN_FILTER_OFFLOAD;
-       else
+               port_rx_offloads |= DEV_RX_OFFLOAD_VLAN_FILTER;
+       } else {
                vlan_offload &= ~ETH_VLAN_FILTER_OFFLOAD;
+               port_rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_FILTER;
+       }
 
        diag = rte_eth_dev_set_vlan_offload(port_id, vlan_offload);
        if (diag < 0)
                printf("rx_vlan_filter_set(port_pi=%d, on=%d) failed "
               "diag=%d\n", port_id, on, diag);
+       ports[port_id].dev_conf.rxmode.offloads = port_rx_offloads;
 }
 
 int
@@ -2793,6 +2817,8 @@ void
 tx_vlan_set(portid_t port_id, uint16_t vlan_id)
 {
        int vlan_offload;
+       struct rte_eth_dev_info dev_info;
+
        if (port_id_is_invalid(port_id, ENABLED_WARN))
                return;
        if (vlan_id_is_invalid(vlan_id))
@@ -2803,9 +2829,15 @@ tx_vlan_set(portid_t port_id, uint16_t vlan_id)
                printf("Error, as QinQ has been enabled.\n");
                return;
        }
+       rte_eth_dev_info_get(port_id, &dev_info);
+       if ((dev_info.tx_offload_capa & DEV_TX_OFFLOAD_VLAN_INSERT) == 0) {
+               printf("Error: vlan insert is not supported by port %d\n",
+                       port_id);
+               return;
+       }
 
        tx_vlan_reset(port_id);
-       ports[port_id].tx_ol_flags |= TESTPMD_TX_OFFLOAD_INSERT_VLAN;
+       ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_VLAN_INSERT;
        ports[port_id].tx_vlan_id = vlan_id;
 }
 
@@ -2813,6 +2845,8 @@ void
 tx_qinq_set(portid_t port_id, uint16_t vlan_id, uint16_t vlan_id_outer)
 {
        int vlan_offload;
+       struct rte_eth_dev_info dev_info;
+
        if (port_id_is_invalid(port_id, ENABLED_WARN))
                return;
        if (vlan_id_is_invalid(vlan_id))
@@ -2825,9 +2859,15 @@ tx_qinq_set(portid_t port_id, uint16_t vlan_id, uint16_t vlan_id_outer)
                printf("Error, as QinQ hasn't been enabled.\n");
                return;
        }
+       rte_eth_dev_info_get(port_id, &dev_info);
+       if ((dev_info.tx_offload_capa & DEV_TX_OFFLOAD_QINQ_INSERT) == 0) {
+               printf("Error: qinq insert not supported by port %d\n",
+                       port_id);
+               return;
+       }
 
        tx_vlan_reset(port_id);
-       ports[port_id].tx_ol_flags |= TESTPMD_TX_OFFLOAD_INSERT_QINQ;
+       ports[port_id].dev_conf.txmode.offloads |= DEV_TX_OFFLOAD_QINQ_INSERT;
        ports[port_id].tx_vlan_id = vlan_id;
        ports[port_id].tx_vlan_id_outer = vlan_id_outer;
 }
@@ -2837,8 +2877,9 @@ tx_vlan_reset(portid_t port_id)
 {
        if (port_id_is_invalid(port_id, ENABLED_WARN))
                return;
-       ports[port_id].tx_ol_flags &= ~(TESTPMD_TX_OFFLOAD_INSERT_VLAN |
-                               TESTPMD_TX_OFFLOAD_INSERT_QINQ);
+       ports[port_id].dev_conf.txmode.offloads &=
+                               ~(DEV_TX_OFFLOAD_VLAN_INSERT |
+                                 DEV_TX_OFFLOAD_QINQ_INSERT);
        ports[port_id].tx_vlan_id = 0;
        ports[port_id].tx_vlan_id_outer = 0;
 }