raw/ifpga: fix file handle leak
[dpdk.git] / examples / l2fwd / main.c
index b775670..281c6b7 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>
@@ -44,6 +43,9 @@ static volatile bool force_quit;
 /* MAC updating enabled by default */
 static int mac_updating = 1;
 
+/* Ports set in promiscuous mode off by default. */
+static int promiscuous_on;
+
 #define RTE_LOGTYPE_L2FWD RTE_LOGTYPE_USER1
 
 #define MAX_PKT_BURST 32
@@ -80,11 +82,13 @@ static unsigned int l2fwd_rx_queue_per_lcore = 1;
 
 #define MAX_RX_QUEUE_PER_LCORE 16
 #define MAX_TX_QUEUE_PER_PORT 16
+/* List of queues to be polled for a given lcore. 8< */
 struct lcore_queue_conf {
        unsigned n_rx_port;
        unsigned rx_port_list[MAX_RX_QUEUE_PER_LCORE];
 } __rte_cache_aligned;
 struct lcore_queue_conf lcore_queue_conf[RTE_MAX_LCORE];
+/* >8 End of list of queues to be polled for a given lcore. */
 
 static struct rte_eth_dev_tx_buffer *tx_buffer[RTE_MAX_ETHPORTS];
 
@@ -93,7 +97,7 @@ static struct rte_eth_conf port_conf = {
                .split_hdr_size = 0,
        },
        .txmode = {
-               .mq_mode = ETH_MQ_TX_NONE,
+               .mq_mode = RTE_ETH_MQ_TX_NONE,
        },
 };
 
@@ -168,13 +172,14 @@ l2fwd_mac_updating(struct rte_mbuf *m, unsigned dest_portid)
        eth = rte_pktmbuf_mtod(m, struct rte_ether_hdr *);
 
        /* 02:00:00:00:00:xx */
-       tmp = &eth->d_addr.addr_bytes[0];
+       tmp = &eth->dst_addr.addr_bytes[0];
        *((uint64_t *)tmp) = 0x000000000002 + ((uint64_t)dest_portid << 40);
 
        /* src addr */
-       rte_ether_addr_copy(&l2fwd_ports_eth_addr[dest_portid], &eth->s_addr);
+       rte_ether_addr_copy(&l2fwd_ports_eth_addr[dest_portid], &eth->src_addr);
 }
 
+/* Simple forward. 8< */
 static void
 l2fwd_simple_forward(struct rte_mbuf *m, unsigned portid)
 {
@@ -192,6 +197,7 @@ l2fwd_simple_forward(struct rte_mbuf *m, unsigned portid)
        if (sent)
                port_statistics[dst_port].tx += sent;
 }
+/* >8 End of simple forward. */
 
 /* main processing loop */
 static void
@@ -231,6 +237,7 @@ l2fwd_main_loop(void)
 
        while (!force_quit) {
 
+               /* Drains TX queue in its main loop. 8< */
                cur_tsc = rte_rdtsc();
 
                /*
@@ -270,10 +277,9 @@ l2fwd_main_loop(void)
 
                        prev_tsc = cur_tsc;
                }
+               /* >8 End of draining TX queue. */
 
-               /*
-                * Read packet from RX queues
-                */
+               /* Read packet from RX queues. 8< */
                for (i = 0; i < qconf->n_rx_port; i++) {
 
                        portid = qconf->rx_port_list[i];
@@ -288,6 +294,7 @@ l2fwd_main_loop(void)
                                l2fwd_simple_forward(m, portid);
                        }
                }
+               /* >8 End of read packet from RX queues. */
        }
 }
 
@@ -302,8 +309,9 @@ l2fwd_launch_one_lcore(__rte_unused void *dummy)
 static void
 l2fwd_usage(const char *prgname)
 {
-       printf("%s [EAL options] -- -p PORTMASK [-q NQ]\n"
+       printf("%s [EAL options] -- -p PORTMASK [-P] [-q NQ]\n"
               "  -p PORTMASK: hexadecimal bitmask of ports to configure\n"
+              "  -P : Enable promiscuous mode\n"
               "  -q NQ: number of queue (=ports) per lcore (default is 1)\n"
               "  -T PERIOD: statistics will be refreshed each PERIOD seconds (0 to disable, 10 default, 86400 maximum)\n"
               "  --no-mac-updating: Disable MAC addresses updating (enabled by default)\n"
@@ -420,6 +428,7 @@ l2fwd_parse_timer_period(const char *q_arg)
 
 static const char short_options[] =
        "p:"  /* portmask */
+       "P"   /* promiscuous */
        "q:"  /* number of queues */
        "T:"  /* timer period */
        ;
@@ -468,6 +477,9 @@ l2fwd_parse_args(int argc, char **argv)
                                return -1;
                        }
                        break;
+               case 'P':
+                       promiscuous_on = 1;
+                       break;
 
                /* nqueue */
                case 'q':
@@ -601,7 +613,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;
                        }
@@ -647,7 +659,7 @@ main(int argc, char **argv)
        unsigned int nb_lcores = 0;
        unsigned int nb_mbufs;
 
-       /* init EAL */
+       /* Init EAL. 8< */
        ret = rte_eal_init(argc, argv);
        if (ret < 0)
                rte_exit(EXIT_FAILURE, "Invalid EAL arguments\n");
@@ -662,6 +674,7 @@ main(int argc, char **argv)
        ret = l2fwd_parse_args(argc, argv);
        if (ret < 0)
                rte_exit(EXIT_FAILURE, "Invalid L2FWD arguments\n");
+       /* >8 End of init EAL. */
 
        printf("MAC updating %s\n", mac_updating ? "enabled" : "disabled");
 
@@ -682,6 +695,8 @@ main(int argc, char **argv)
                rte_exit(EXIT_FAILURE, "Invalid portmask; possible (0x%x)\n",
                        (1 << nb_ports) - 1);
 
+       /* Initialization of the driver. 8< */
+
        /* reset l2fwd_dst_ports */
        for (portid = 0; portid < RTE_MAX_ETHPORTS; portid++)
                l2fwd_dst_ports[portid] = 0;
@@ -717,6 +732,7 @@ main(int argc, char **argv)
                        l2fwd_dst_ports[last_port] = last_port;
                }
        }
+       /* >8 End of initialization of the driver. */
 
        rx_lcore_id = 0;
        qconf = NULL;
@@ -751,12 +767,13 @@ main(int argc, char **argv)
        nb_mbufs = RTE_MAX(nb_ports * (nb_rxd + nb_txd + MAX_PKT_BURST +
                nb_lcores * MEMPOOL_CACHE_SIZE), 8192U);
 
-       /* create the mbuf pool */
+       /* Create the mbuf pool. 8< */
        l2fwd_pktmbuf_pool = rte_pktmbuf_pool_create("mbuf_pool", nb_mbufs,
                MEMPOOL_CACHE_SIZE, 0, RTE_MBUF_DEFAULT_BUF_SIZE,
                rte_socket_id());
        if (l2fwd_pktmbuf_pool == NULL)
                rte_exit(EXIT_FAILURE, "Cannot init mbuf pool\n");
+       /* >8 End of create the mbuf pool. */
 
        /* Initialise each port */
        RTE_ETH_FOREACH_DEV(portid) {
@@ -782,13 +799,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)
+               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;
+               /* Configure the number of queues for a port. */
                ret = rte_eth_dev_configure(portid, 1, 1, &local_port_conf);
                if (ret < 0)
                        rte_exit(EXIT_FAILURE, "Cannot configure device: err=%d, port=%u\n",
                                  ret, portid);
+               /* >8 End of configuration of the number of queues for a port. */
 
                ret = rte_eth_dev_adjust_nb_rx_tx_desc(portid, &nb_rxd,
                                                       &nb_txd);
@@ -808,6 +827,7 @@ main(int argc, char **argv)
                fflush(stdout);
                rxq_conf = dev_info.default_rxconf;
                rxq_conf.offloads = local_port_conf.rxmode.offloads;
+               /* RX queue setup. 8< */
                ret = rte_eth_rx_queue_setup(portid, 0, nb_rxd,
                                             rte_eth_dev_socket_id(portid),
                                             &rxq_conf,
@@ -815,8 +835,9 @@ main(int argc, char **argv)
                if (ret < 0)
                        rte_exit(EXIT_FAILURE, "rte_eth_rx_queue_setup:err=%d, port=%u\n",
                                  ret, portid);
+               /* >8 End of RX queue setup. */
 
-               /* init one TX queue on each port */
+               /* Init one TX queue on each port. 8< */
                fflush(stdout);
                txq_conf = dev_info.default_txconf;
                txq_conf.offloads = local_port_conf.txmode.offloads;
@@ -826,6 +847,7 @@ main(int argc, char **argv)
                if (ret < 0)
                        rte_exit(EXIT_FAILURE, "rte_eth_tx_queue_setup:err=%d, port=%u\n",
                                ret, portid);
+               /* >8 End of init one TX queue on each port. */
 
                /* Initialize TX buffers */
                tx_buffer[portid] = rte_zmalloc_socket("tx_buffer",
@@ -857,21 +879,17 @@ main(int argc, char **argv)
                                  ret, portid);
 
                printf("done: \n");
+               if (promiscuous_on) {
+                       ret = rte_eth_promiscuous_enable(portid);
+                       if (ret != 0)
+                               rte_exit(EXIT_FAILURE,
+                                       "rte_eth_promiscuous_enable:err=%s, port=%u\n",
+                                       rte_strerror(-ret), portid);
+               }
 
-               ret = rte_eth_promiscuous_enable(portid);
-               if (ret != 0)
-                       rte_exit(EXIT_FAILURE,
-                                "rte_eth_promiscuous_enable:err=%s, port=%u\n",
-                                rte_strerror(-ret), portid);
-
-               printf("Port %u, MAC address: %02X:%02X:%02X:%02X:%02X:%02X\n\n",
-                               portid,
-                               l2fwd_ports_eth_addr[portid].addr_bytes[0],
-                               l2fwd_ports_eth_addr[portid].addr_bytes[1],
-                               l2fwd_ports_eth_addr[portid].addr_bytes[2],
-                               l2fwd_ports_eth_addr[portid].addr_bytes[3],
-                               l2fwd_ports_eth_addr[portid].addr_bytes[4],
-                               l2fwd_ports_eth_addr[portid].addr_bytes[5]);
+               printf("Port %u, MAC address: " RTE_ETHER_ADDR_PRT_FMT "\n\n",
+                       portid,
+                       RTE_ETHER_ADDR_BYTES(&l2fwd_ports_eth_addr[portid]));
 
                /* initialize port stats */
                memset(&port_statistics, 0, sizeof(port_statistics));