./dpdk-l3fwd [EAL options] -- -p PORTMASK
[-P]
- [-E]
- [-L]
+ [--lookup LOOKUP_METHOD]
--config(port,queue,lcore)[,(port,queue,lcore)]
[--eth-dest=X,MM:MM:MM:MM:MM:MM]
[--enable-jumbo [--max-pkt-len PKTLEN]]
[--mode]
[--eventq-sched]
[--event-eth-rxqs]
+ [-E]
+ [-L]
Where,
* ``-P:`` Optional, sets all ports to promiscuous mode so that packets are accepted regardless of the packet's Ethernet MAC destination address.
Without this option, only packets with the Ethernet MAC destination address set to the Ethernet address of the port are accepted.
-* ``-E:`` Optional, enable exact match.
-
-* ``-L:`` Optional, enable longest prefix match.
+* ``--lookup:`` Optional, select the lookup method.
+ Accepted options:
+ ``em`` (Exact Match),
+ ``lpm`` (Longest Prefix Match),
+ ``fib`` (Forwarding Information Base).
+ Default is ``lpm``.
* ``--config (port,queue,lcore)[,(port,queue,lcore)]:`` Determines which queues from which ports are mapped to which cores.
* ``--event-eth-rxqs:`` Optional, Number of ethernet RX queues per device. Only valid if --mode=eventdev.
+* ``-E:`` Optional, enable exact match,
+ legacy flag, please use ``--lookup=em`` instead.
+
+* ``-L:`` Optional, enable longest prefix match,
+ legacy flag, please use ``--lookup=lpm`` instead.
+
For example, consider a dual processor socket platform with 8 physical cores, where cores 0-7 and 16-23 appear on socket 0,
while cores 8-15 and 24-31 appear on socket 1.
/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2016 Intel Corporation
+ * Copyright(c) 2010-2021 Intel Corporation
*/
#include <stdio.h>
/**< Ports set in promiscuous mode off by default. */
static int promiscuous_on;
-/* Select Longest-Prefix or Exact match. */
-static int l3fwd_lpm_on;
-static int l3fwd_em_on;
+/* Select Longest-Prefix, Exact match or Forwarding Information Base. */
+enum L3FWD_LOOKUP_MODE {
+ L3FWD_LOOKUP_DEFAULT,
+ L3FWD_LOOKUP_LPM,
+ L3FWD_LOOKUP_EM,
+ L3FWD_LOOKUP_FIB
+};
+static enum L3FWD_LOOKUP_MODE lookup_mode;
/* Global variables. */
.get_ipv6_lookup_struct = lpm_get_ipv6_l3fwd_lookup_struct,
};
+static struct l3fwd_lkp_mode l3fwd_fib_lkp = {
+ .setup = setup_fib,
+ .check_ptype = lpm_check_ptype,
+ .cb_parse_ptype = lpm_cb_parse_ptype,
+ .main_loop = fib_main_loop,
+ .get_ipv4_lookup_struct = fib_get_ipv4_l3fwd_lookup_struct,
+ .get_ipv6_lookup_struct = fib_get_ipv6_l3fwd_lookup_struct,
+};
+
/*
* 198.18.0.0/16 are set aside for RFC2544 benchmarking (RFC5735).
* 198.18.{0-7}.0/24 = Port {0-7}
/*
* Setup lookup methods for forwarding.
- * Currently exact-match and longest-prefix-match
- * are supported ones.
+ * Currently exact-match, longest-prefix-match and forwarding information
+ * base are the supported ones.
*/
static void
setup_l3fwd_lookup_tables(void)
{
/* Setup HASH lookup functions. */
- if (l3fwd_em_on)
+ if (lookup_mode == L3FWD_LOOKUP_EM)
l3fwd_lkp = l3fwd_em_lkp;
+ /* Setup FIB lookup functions. */
+ else if (lookup_mode == L3FWD_LOOKUP_FIB)
+ l3fwd_lkp = l3fwd_fib_lkp;
/* Setup LPM lookup functions. */
else
l3fwd_lkp = l3fwd_lpm_lkp;
fprintf(stderr, "%s [EAL options] --"
" -p PORTMASK"
" [-P]"
- " [-E]"
- " [-L]"
+ " [--lookup]"
" --config (port,queue,lcore)[,(port,queue,lcore)]"
" [--eth-dest=X,MM:MM:MM:MM:MM:MM]"
" [--enable-jumbo [--max-pkt-len PKTLEN]]"
" [--parse-ptype]"
" [--per-port-pool]"
" [--mode]"
- " [--eventq-sched]\n\n"
+ " [--eventq-sched]"
+ " [-E]"
+ " [-L]\n\n"
" -p PORTMASK: Hexadecimal bitmask of ports to configure\n"
" -P : Enable promiscuous mode\n"
- " -E : Enable exact match\n"
- " -L : Enable longest prefix match (default)\n"
+ " --lookup: Select the lookup method\n"
+ " Default: lpm\n"
+ " Accepted: em (Exact Match), lpm (Longest Prefix Match), fib (Forwarding Information Base)\n"
" --config (port,queue,lcore): Rx queue configuration\n"
" --eth-dest=X,MM:MM:MM:MM:MM:MM: Ethernet destination for port X\n"
" --enable-jumbo: Enable jumbo frames\n"
" Valid only if --mode=eventdev\n"
" --event-eth-rxqs: Number of ethernet RX queues per device.\n"
" Default: 1\n"
- " Valid only if --mode=eventdev\n\n",
+ " Valid only if --mode=eventdev\n"
+ " -E : Enable exact match, legacy flag please use --lookup=em instead\n"
+ " -L : Enable longest prefix match, legacy flag please use --lookup=lpm instead\n\n",
prgname);
}
evt_rsrc->eth_rx_queues = num_eth_rx_queues;
}
+static int
+parse_lookup(const char *optarg)
+{
+ if (!strcmp(optarg, "em"))
+ lookup_mode = L3FWD_LOOKUP_EM;
+ else if (!strcmp(optarg, "lpm"))
+ lookup_mode = L3FWD_LOOKUP_LPM;
+ else if (!strcmp(optarg, "fib"))
+ lookup_mode = L3FWD_LOOKUP_FIB;
+ else {
+ fprintf(stderr, "Invalid lookup option! Accepted options: em, lpm, fib\n");
+ return -1;
+ }
+ return 0;
+}
+
#define MAX_JUMBO_PKT_LEN 9600
static const char short_options[] =
"p:" /* portmask */
"P" /* promiscuous */
- "L" /* enable long prefix match */
- "E" /* enable exact match */
+ "L" /* legacy enable long prefix match */
+ "E" /* legacy enable exact match */
;
#define CMD_LINE_OPT_CONFIG "config"
#define CMD_LINE_OPT_MODE "mode"
#define CMD_LINE_OPT_EVENTQ_SYNC "eventq-sched"
#define CMD_LINE_OPT_EVENT_ETH_RX_QUEUES "event-eth-rxqs"
+#define CMD_LINE_OPT_LOOKUP "lookup"
enum {
/* long options mapped to a short option */
CMD_LINE_OPT_MODE_NUM,
CMD_LINE_OPT_EVENTQ_SYNC_NUM,
CMD_LINE_OPT_EVENT_ETH_RX_QUEUES_NUM,
+ CMD_LINE_OPT_LOOKUP_NUM,
};
static const struct option lgopts[] = {
{CMD_LINE_OPT_EVENTQ_SYNC, 1, 0, CMD_LINE_OPT_EVENTQ_SYNC_NUM},
{CMD_LINE_OPT_EVENT_ETH_RX_QUEUES, 1, 0,
CMD_LINE_OPT_EVENT_ETH_RX_QUEUES_NUM},
+ {CMD_LINE_OPT_LOOKUP, 1, 0, CMD_LINE_OPT_LOOKUP_NUM},
{NULL, 0, 0, 0}
};
break;
case 'E':
- l3fwd_em_on = 1;
+ if (lookup_mode != L3FWD_LOOKUP_DEFAULT) {
+ fprintf(stderr, "Only one lookup mode is allowed at a time!\n");
+ return -1;
+ }
+ lookup_mode = L3FWD_LOOKUP_EM;
break;
case 'L':
- l3fwd_lpm_on = 1;
+ if (lookup_mode != L3FWD_LOOKUP_DEFAULT) {
+ fprintf(stderr, "Only one lookup mode is allowed at a time!\n");
+ return -1;
+ }
+ lookup_mode = L3FWD_LOOKUP_LPM;
break;
/* long options */
eth_rx_q = 1;
break;
+ case CMD_LINE_OPT_LOOKUP_NUM:
+ if (lookup_mode != L3FWD_LOOKUP_DEFAULT) {
+ fprintf(stderr, "Only one lookup mode is allowed at a time!\n");
+ return -1;
+ }
+ ret = parse_lookup(optarg);
+ /*
+ * If parse_lookup was passed an invalid lookup type
+ * then return -1. Error log included within
+ * parse_lookup for simplicity.
+ */
+ if (ret)
+ return -1;
+ break;
+
default:
print_usage(prgname);
return -1;
}
}
- /* If both LPM and EM are selected, return error. */
- if (l3fwd_lpm_on && l3fwd_em_on) {
- fprintf(stderr, "LPM and EM are mutually exclusive, select only one\n");
- return -1;
- }
-
if (evt_rsrc->enabled && lcore_params) {
fprintf(stderr, "lcore config is not valid when event mode is selected\n");
return -1;
* Nothing is selected, pick longest-prefix match
* as default match.
*/
- if (!l3fwd_lpm_on && !l3fwd_em_on) {
- fprintf(stderr, "LPM or EM none selected, default LPM on\n");
- l3fwd_lpm_on = 1;
+ if (lookup_mode == L3FWD_LOOKUP_DEFAULT) {
+ fprintf(stderr, "Neither LPM, EM, or FIB selected, defaulting to LPM\n");
+ lookup_mode = L3FWD_LOOKUP_LPM;
}
/*
* ipv6 and hash flags are valid only for
- * exact macth, reset them to default for
+ * exact match, reset them to default for
* longest-prefix match.
*/
- if (l3fwd_lpm_on) {
+ if (lookup_mode == L3FWD_LOOKUP_LPM) {
ipv6 = 0;
hash_entry_number = HASH_ENTRY_NUMBER_DEFAULT;
}
printf("Allocated mbuf pool on socket %d\n",
socketid);
- /* Setup either LPM or EM(f.e Hash). But, only once per
+ /* Setup LPM, EM(f.e Hash) or FIB. But, only once per
* available socket.
*/
if (!lkp_per_socket[socketid]) {
/* Configure eventdev parameters if user has requested */
if (evt_rsrc->enabled) {
l3fwd_event_resource_setup(&port_conf);
- if (l3fwd_em_on)
+ if (lookup_mode == L3FWD_LOOKUP_EM)
l3fwd_lkp.main_loop = evt_rsrc->ops.em_event_loop;
+ else if (lookup_mode == L3FWD_LOOKUP_FIB)
+ l3fwd_lkp.main_loop = evt_rsrc->ops.fib_event_loop;
else
l3fwd_lkp.main_loop = evt_rsrc->ops.lpm_event_loop;
l3fwd_event_service_setup();