app/testpmd: add Tx scheduling command
[dpdk.git] / app / test-pmd / config.c
index 3ac7d8f..fcbe6b6 100644 (file)
@@ -1052,6 +1052,15 @@ port_offload_cap_display(portid_t port_id)
                        printf("off\n");
        }
 
+       if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_SEND_ON_TIMESTAMP) {
+               printf("Tx scheduling on timestamp:    ");
+               if (ports[port_id].dev_conf.txmode.offloads &
+                   DEV_TX_OFFLOAD_SEND_ON_TIMESTAMP)
+                       printf("on\n");
+               else
+                       printf("off\n");
+       }
+
 }
 
 int
@@ -2565,55 +2574,6 @@ icmp_echo_config_setup(void)
        }
 }
 
-#if defined RTE_LIBRTE_PMD_SOFTNIC
-static void
-softnic_fwd_config_setup(void)
-{
-       struct rte_port *port;
-       portid_t pid, softnic_portid;
-       queueid_t i;
-       uint8_t softnic_enable = 0;
-
-       RTE_ETH_FOREACH_DEV(pid) {
-                       port = &ports[pid];
-                       const char *driver = port->dev_info.driver_name;
-
-                       if (strcmp(driver, "net_softnic") == 0) {
-                               softnic_portid = pid;
-                               softnic_enable = 1;
-                               break;
-                       }
-       }
-
-       if (softnic_enable == 0) {
-               printf("Softnic mode not configured(%s)!\n", __func__);
-               return;
-       }
-
-       cur_fwd_config.nb_fwd_ports = 1;
-       cur_fwd_config.nb_fwd_streams = (streamid_t) nb_rxq;
-
-       /* Re-initialize forwarding streams */
-       init_fwd_streams();
-
-       /*
-        * In the softnic forwarding test, the number of forwarding cores
-        * is set to one and remaining are used for softnic packet processing.
-        */
-       cur_fwd_config.nb_fwd_lcores = 1;
-       setup_fwd_config_of_each_lcore(&cur_fwd_config);
-
-       for (i = 0; i < cur_fwd_config.nb_fwd_streams; i++) {
-               fwd_streams[i]->rx_port   = softnic_portid;
-               fwd_streams[i]->rx_queue  = i;
-               fwd_streams[i]->tx_port   = softnic_portid;
-               fwd_streams[i]->tx_queue  = i;
-               fwd_streams[i]->peer_addr = fwd_streams[i]->tx_port;
-               fwd_streams[i]->retry_enabled = retry_enabled;
-       }
-}
-#endif
-
 void
 fwd_config_setup(void)
 {
@@ -2623,13 +2583,6 @@ fwd_config_setup(void)
                return;
        }
 
-#if defined RTE_LIBRTE_PMD_SOFTNIC
-       if (strcmp(cur_fwd_eng->fwd_mode_name, "softnic") == 0) {
-               softnic_fwd_config_setup();
-               return;
-       }
-#endif
-
        if ((nb_rxq > 1) && (nb_txq > 1)){
                if (dcb_config)
                        dcb_fwd_config_setup();
@@ -3072,6 +3025,58 @@ set_tx_pkt_segments(unsigned *seg_lengths, unsigned nb_segs)
        tx_pkt_nb_segs = (uint8_t) nb_segs;
 }
 
+void
+show_tx_pkt_times(void)
+{
+       printf("Interburst gap: %u\n", tx_pkt_times_inter);
+       printf("Intraburst gap: %u\n", tx_pkt_times_intra);
+}
+
+void
+set_tx_pkt_times(unsigned int *tx_times)
+{
+       uint16_t port_id;
+       int offload_found = 0;
+       int offset;
+       int flag;
+
+       static const struct rte_mbuf_dynfield desc_offs = {
+               .name = RTE_MBUF_DYNFIELD_TIMESTAMP_NAME,
+               .size = sizeof(uint64_t),
+               .align = __alignof__(uint64_t),
+       };
+       static const struct rte_mbuf_dynflag desc_flag = {
+               .name = RTE_MBUF_DYNFLAG_TX_TIMESTAMP_NAME,
+       };
+
+       RTE_ETH_FOREACH_DEV(port_id) {
+               struct rte_eth_dev_info dev_info = { 0 };
+               int ret;
+
+               ret = rte_eth_dev_info_get(port_id, &dev_info);
+               if (ret == 0 && dev_info.tx_offload_capa &
+                               DEV_TX_OFFLOAD_SEND_ON_TIMESTAMP) {
+                       offload_found = 1;
+                       break;
+               }
+       }
+       if (!offload_found) {
+               printf("No device supporting Tx timestamp scheduling found, "
+                      "dynamic flag and field not registered\n");
+               return;
+       }
+       offset = rte_mbuf_dynfield_register(&desc_offs);
+       if (offset < 0 && rte_errno != EEXIST)
+               printf("Dynamic timestamp field registration error: %d",
+                      rte_errno);
+       flag = rte_mbuf_dynflag_register(&desc_flag);
+       if (flag < 0 && rte_errno != EEXIST)
+               printf("Dynamic timestamp flag registration error: %d",
+                      rte_errno);
+       tx_pkt_times_inter = tx_times[0];
+       tx_pkt_times_intra = tx_times[1];
+}
+
 void
 setup_gro(const char *onoff, portid_t port_id)
 {