{ "tcp", ETH_RSS_TCP },
{ "sctp", ETH_RSS_SCTP },
{ "tunnel", ETH_RSS_TUNNEL },
+ { "l3-pre32", RTE_ETH_RSS_L3_PRE32 },
+ { "l3-pre40", RTE_ETH_RSS_L3_PRE40 },
+ { "l3-pre48", RTE_ETH_RSS_L3_PRE48 },
+ { "l3-pre56", RTE_ETH_RSS_L3_PRE56 },
+ { "l3-pre64", RTE_ETH_RSS_L3_PRE64 },
+ { "l3-pre96", RTE_ETH_RSS_L3_PRE96 },
{ "l3-src-only", ETH_RSS_L3_SRC_ONLY },
{ "l3-dst-only", ETH_RSS_L3_DST_ONLY },
{ "l4-src-only", ETH_RSS_L4_SRC_ONLY },
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
}
}
-#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)
{
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();
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)
{