pipeline: support action annotations
[dpdk.git] / examples / l3fwd-power / main.c
index f8dfed1..21c7956 100644 (file)
@@ -24,7 +24,6 @@
 #include <rte_memcpy.h>
 #include <rte_eal.h>
 #include <rte_launch.h>
-#include <rte_atomic.h>
 #include <rte_cycles.h>
 #include <rte_prefetch.h>
 #include <rte_lcore.h>
@@ -207,6 +206,7 @@ enum appmode {
 enum appmode app_mode;
 
 static enum rte_power_pmd_mgmt_type pmgmt_type;
+bool baseline_enabled;
 
 enum freq_scale_hint_t
 {
@@ -249,22 +249,23 @@ uint16_t nb_lcore_params = RTE_DIM(lcore_params_array_default);
 
 static struct rte_eth_conf port_conf = {
        .rxmode = {
-               .mq_mode        = ETH_MQ_RX_RSS,
-               .max_rx_pkt_len = RTE_ETHER_MAX_LEN,
+               .mq_mode        = RTE_ETH_MQ_RX_RSS,
                .split_hdr_size = 0,
-               .offloads = DEV_RX_OFFLOAD_CHECKSUM,
+               .offloads = RTE_ETH_RX_OFFLOAD_CHECKSUM,
        },
        .rx_adv_conf = {
                .rss_conf = {
                        .rss_key = NULL,
-                       .rss_hf = ETH_RSS_UDP,
+                       .rss_hf = RTE_ETH_RSS_UDP,
                },
        },
        .txmode = {
-               .mq_mode = ETH_MQ_TX_NONE,
+               .mq_mode = RTE_ETH_MQ_TX_NONE,
        }
 };
 
+static uint32_t max_pkt_len;
+
 static struct rte_mempool * pktmbuf_pool[NB_SOCKETS];
 
 
@@ -716,7 +717,7 @@ l3fwd_simple_forward(struct rte_mbuf *m, uint16_t portid,
                        dst_port = portid;
 
                /* 02:00:00:00:00:xx */
-               d_addr_bytes = &eth_hdr->d_addr.addr_bytes[0];
+               d_addr_bytes = &eth_hdr->dst_addr.addr_bytes[0];
                *((uint64_t *)d_addr_bytes) =
                        0x000000000002 + ((uint64_t)dst_port << 40);
 
@@ -728,7 +729,7 @@ l3fwd_simple_forward(struct rte_mbuf *m, uint16_t portid,
 
                /* src addr */
                rte_ether_addr_copy(&ports_eth_addr[dst_port],
-                               &eth_hdr->s_addr);
+                               &eth_hdr->src_addr);
 
                send_single_packet(m, dst_port);
        } else if (RTE_ETH_IS_IPV6_HDR(m->packet_type)) {
@@ -748,13 +749,13 @@ l3fwd_simple_forward(struct rte_mbuf *m, uint16_t portid,
                        dst_port = portid;
 
                /* 02:00:00:00:00:xx */
-               d_addr_bytes = &eth_hdr->d_addr.addr_bytes[0];
+               d_addr_bytes = &eth_hdr->dst_addr.addr_bytes[0];
                *((uint64_t *)d_addr_bytes) =
                        0x000000000002 + ((uint64_t)dst_port << 40);
 
                /* src addr */
                rte_ether_addr_copy(&ports_eth_addr[dst_port],
-                               &eth_hdr->s_addr);
+                               &eth_hdr->src_addr);
 
                send_single_packet(m, dst_port);
 #else
@@ -910,7 +911,7 @@ static int event_register(struct lcore_conf *qconf)
        return 0;
 }
 
-/* main processing loop */
+/* Main processing loop. 8< */
 static int main_intr_loop(__rte_unused void *dummy)
 {
        struct rte_mbuf *pkts_burst[MAX_PKT_BURST];
@@ -1073,6 +1074,7 @@ start_rx:
 
        return 0;
 }
+/* >8 End of main processing loop. */
 
 /* main processing loop */
 static int
@@ -1599,16 +1601,15 @@ print_usage(const char *prgname)
                "  [--config (port,queue,lcore)[,(port,queue,lcore]]"
                "  [--high-perf-cores CORELIST"
                "  [--perf-config (port,queue,hi_perf,lcore_index)[,(port,queue,hi_perf,lcore_index]]"
-               "  [--enable-jumbo [--max-pkt-len PKTLEN]]\n"
+               "  [--max-pkt-len PKTLEN]\n"
                "  -p PORTMASK: hexadecimal bitmask of ports to configure\n"
-               "  -P : enable promiscuous mode\n"
+               "  -P: enable promiscuous mode\n"
                "  --config (port,queue,lcore): rx queues configuration\n"
                "  --high-perf-cores CORELIST: list of high performance cores\n"
                "  --perf-config: similar as config, cores specified as indices"
                " for bins containing high or regular performance cores\n"
                "  --no-numa: optional, disable numa awareness\n"
-               "  --enable-jumbo: enable jumbo frame"
-               " which max packet len is PKTLEN in decimal (64-9600)\n"
+               "  --max-pkt-len PKTLEN: maximum packet length in decimal (64-9600)\n"
                "  --parse-ptype: parse packet type by software\n"
                "  --legacy: use legacy interrupt-based scaling\n"
                "  --empty-poll: enable empty poll detection"
@@ -1617,7 +1618,7 @@ print_usage(const char *prgname)
                " empty polls, full polls, and core busyness to telemetry\n"
                " --interrupt-only: enable interrupt-only mode\n"
                " --pmd-mgmt MODE: enable PMD power management mode. "
-               "Currently supported modes: monitor, pause, scale\n",
+               "Currently supported modes: baseline, monitor, pause, scale\n",
                prgname);
 }
 
@@ -1714,6 +1715,7 @@ parse_pmd_mgmt_config(const char *name)
 #define PMD_MGMT_MONITOR "monitor"
 #define PMD_MGMT_PAUSE   "pause"
 #define PMD_MGMT_SCALE   "scale"
+#define PMD_MGMT_BASELINE  "baseline"
 
        if (strncmp(PMD_MGMT_MONITOR, name, sizeof(PMD_MGMT_MONITOR)) == 0) {
                pmgmt_type = RTE_POWER_MGMT_TYPE_MONITOR;
@@ -1729,6 +1731,10 @@ parse_pmd_mgmt_config(const char *name)
                pmgmt_type = RTE_POWER_MGMT_TYPE_SCALE;
                return 0;
        }
+       if (strncmp(PMD_MGMT_BASELINE, name, sizeof(PMD_MGMT_BASELINE)) == 0) {
+               baseline_enabled = true;
+               return 0;
+       }
        /* unknown PMD power management mode */
        return -1;
 }
@@ -1788,6 +1794,7 @@ parse_ep_config(const char *q_arg)
 #define CMD_LINE_OPT_INTERRUPT_ONLY "interrupt-only"
 #define CMD_LINE_OPT_TELEMETRY "telemetry"
 #define CMD_LINE_OPT_PMD_MGMT "pmd-mgmt"
+#define CMD_LINE_OPT_MAX_PKT_LEN "max-pkt-len"
 
 /* Parse the argument given in the command line of the application */
 static int
@@ -1803,7 +1810,7 @@ parse_args(int argc, char **argv)
                {"perf-config", 1, 0, 0},
                {"high-perf-cores", 1, 0, 0},
                {"no-numa", 0, 0, 0},
-               {"enable-jumbo", 0, 0, 0},
+               {CMD_LINE_OPT_MAX_PKT_LEN, 1, 0, 0},
                {CMD_LINE_OPT_EMPTY_POLL, 1, 0, 0},
                {CMD_LINE_OPT_PARSE_PTYPE, 0, 0, 0},
                {CMD_LINE_OPT_LEGACY, 0, 0, 0},
@@ -1947,36 +1954,10 @@ parse_args(int argc, char **argv)
                        }
 
                        if (!strncmp(lgopts[option_index].name,
-                                       "enable-jumbo", 12)) {
-                               struct option lenopts =
-                                       {"max-pkt-len", required_argument, \
-                                                                       0, 0};
-
-                               printf("jumbo frame is enabled \n");
-                               port_conf.rxmode.offloads |=
-                                               DEV_RX_OFFLOAD_JUMBO_FRAME;
-                               port_conf.txmode.offloads |=
-                                               DEV_TX_OFFLOAD_MULTI_SEGS;
-
-                               /**
-                                * if no max-pkt-len set, use the default value
-                                * RTE_ETHER_MAX_LEN
-                                */
-                               if (0 == getopt_long(argc, argvopt, "",
-                                               &lenopts, &option_index)) {
-                                       ret = parse_max_pkt_len(optarg);
-                                       if ((ret < 64) ||
-                                               (ret > MAX_JUMBO_PKT_LEN)){
-                                               printf("invalid packet "
-                                                               "length\n");
-                                               print_usage(prgname);
-                                               return -1;
-                                       }
-                                       port_conf.rxmode.max_rx_pkt_len = ret;
-                               }
-                               printf("set jumbo frame "
-                                       "max packet length to %u\n",
-                               (unsigned int)port_conf.rxmode.max_rx_pkt_len);
+                                       CMD_LINE_OPT_MAX_PKT_LEN,
+                                       sizeof(CMD_LINE_OPT_MAX_PKT_LEN))) {
+                               printf("Custom frame size is configured\n");
+                               max_pkt_len = parse_max_pkt_len(optarg);
                        }
 
                        if (!strncmp(lgopts[option_index].name,
@@ -2215,7 +2196,7 @@ check_all_ports_link_status(uint32_t port_mask)
                                continue;
                        }
                        /* clear all_ports_up flag if any link down */
-                       if (link.link_status == ETH_LINK_DOWN) {
+                       if (link.link_status == RTE_ETH_LINK_DOWN) {
                                all_ports_up = 0;
                                break;
                        }
@@ -2498,6 +2479,42 @@ mode_to_str(enum appmode mode)
        }
 }
 
+static uint32_t
+eth_dev_get_overhead_len(uint32_t max_rx_pktlen, uint16_t max_mtu)
+{
+       uint32_t overhead_len;
+
+       if (max_mtu != UINT16_MAX && max_rx_pktlen > max_mtu)
+               overhead_len = max_rx_pktlen - max_mtu;
+       else
+               overhead_len = RTE_ETHER_HDR_LEN + RTE_ETHER_CRC_LEN;
+
+       return overhead_len;
+}
+
+static int
+config_port_max_pkt_len(struct rte_eth_conf *conf,
+               struct rte_eth_dev_info *dev_info)
+{
+       uint32_t overhead_len;
+
+       if (max_pkt_len == 0)
+               return 0;
+
+       if (max_pkt_len < RTE_ETHER_MIN_LEN || max_pkt_len > MAX_JUMBO_PKT_LEN)
+               return -1;
+
+       overhead_len = eth_dev_get_overhead_len(dev_info->max_rx_pktlen,
+                       dev_info->max_mtu);
+       conf->rxmode.mtu = max_pkt_len - overhead_len;
+
+       if (conf->rxmode.mtu > RTE_ETHER_MTU)
+               conf->txmode.offloads |= RTE_ETH_TX_OFFLOAD_MULTI_SEGS;
+
+       return 0;
+}
+
+/* Power library initialized in the main routine. 8< */
 int
 main(int argc, char **argv)
 {
@@ -2528,6 +2545,9 @@ main(int argc, char **argv)
        /* init RTE timer library to be used late */
        rte_timer_subsystem_init();
 
+       /* if we're running pmd-mgmt mode, don't default to baseline mode */
+       baseline_enabled = false;
+
        /* parse application arguments (after the EAL ones) */
        ret = parse_args(argc, argv);
        if (ret < 0)
@@ -2611,9 +2631,15 @@ main(int argc, char **argv)
                                "Error during getting device (port %u) info: %s\n",
                                portid, strerror(-ret));
 
-               if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MBUF_FAST_FREE)
+               ret = config_port_max_pkt_len(&local_port_conf, &dev_info);
+               if (ret != 0)
+                       rte_exit(EXIT_FAILURE,
+                               "Invalid max packet length: %u (port %u)\n",
+                               max_pkt_len, portid);
+
+               if (dev_info.tx_offload_capa & RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE)
                        local_port_conf.txmode.offloads |=
-                               DEV_TX_OFFLOAD_MBUF_FAST_FREE;
+                               RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE;
 
                local_port_conf.rx_adv_conf.rss_conf.rss_hf &=
                        dev_info.flow_type_rss_offloads;
@@ -2723,12 +2749,6 @@ main(int argc, char **argv)
                printf("\nInitializing rx queues on lcore %u ... ", lcore_id );
                fflush(stdout);
 
-               /* PMD power management mode can only do 1 queue per core */
-               if (app_mode == APP_MODE_PMD_MGMT && qconf->n_rx_queue > 1) {
-                       rte_exit(EXIT_FAILURE,
-                               "In PMD power management mode, only one queue per lcore is allowed\n");
-               }
-
                /* init RX queues */
                for(queue = 0; queue < qconf->n_rx_queue; ++queue) {
                        struct rte_eth_rxconf rxq_conf;
@@ -2767,7 +2787,7 @@ main(int argc, char **argv)
                                                 "Fail to add ptype cb\n");
                        }
 
-                       if (app_mode == APP_MODE_PMD_MGMT) {
+                       if (app_mode == APP_MODE_PMD_MGMT && !baseline_enabled) {
                                ret = rte_power_ethdev_pmgmt_queue_enable(
                                                lcore_id, portid, queueid,
                                                pmgmt_type);
@@ -2778,6 +2798,7 @@ main(int argc, char **argv)
                        }
                }
        }
+       /* >8 End of power library initialization. */
 
        printf("\n");