From: Pavan Nikhilesh <pbhagavatula@marvell.com> Increase the number of routes from 8 to 16 that are statically added for lpm and em mode as most of the SoCs support more than 8 interfaces. Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com> --- examples/l3fwd/l3fwd_em.c | 72 ++++++++++++++++++++++++++++++++++++++ examples/l3fwd/l3fwd_lpm.c | 16 +++++++++ 2 files changed, 88 insertions(+) diff --git a/examples/l3fwd/l3fwd_em.c b/examples/l3fwd/l3fwd_em.c index 74a7c8fa4..c07a5b937 100644 --- a/examples/l3fwd/l3fwd_em.c +++ b/examples/l3fwd/l3fwd_em.c @@ -103,6 +103,18 @@ static struct ipv4_l3fwd_em_route ipv4_l3fwd_em_route_array[] = { {{RTE_IPV4(201, 0, 0, 0), RTE_IPV4(200, 20, 0, 1), 102, 12, IPPROTO_TCP}, 1}, {{RTE_IPV4(111, 0, 0, 0), RTE_IPV4(100, 30, 0, 1), 101, 11, IPPROTO_TCP}, 2}, {{RTE_IPV4(211, 0, 0, 0), RTE_IPV4(200, 40, 0, 1), 102, 12, IPPROTO_TCP}, 3}, + {{RTE_IPV4(121, 0, 0, 0), RTE_IPV4(100, 10, 0, 1), 101, 11, IPPROTO_TCP}, 4}, + {{RTE_IPV4(221, 0, 0, 0), RTE_IPV4(200, 20, 0, 1), 102, 12, IPPROTO_TCP}, 5}, + {{RTE_IPV4(131, 0, 0, 0), RTE_IPV4(100, 30, 0, 1), 101, 11, IPPROTO_TCP}, 6}, + {{RTE_IPV4(231, 0, 0, 0), RTE_IPV4(200, 40, 0, 1), 102, 12, IPPROTO_TCP}, 7}, + {{RTE_IPV4(141, 0, 0, 0), RTE_IPV4(100, 30, 0, 1), 101, 11, IPPROTO_TCP}, 8}, + {{RTE_IPV4(241, 0, 0, 0), RTE_IPV4(200, 40, 0, 1), 102, 12, IPPROTO_TCP}, 9}, + {{RTE_IPV4(151, 0, 0, 0), RTE_IPV4(100, 30, 0, 1), 101, 11, IPPROTO_TCP}, 10}, + {{RTE_IPV4(251, 0, 0, 0), RTE_IPV4(200, 40, 0, 1), 102, 12, IPPROTO_TCP}, 11}, + {{RTE_IPV4(161, 0, 0, 0), RTE_IPV4(100, 30, 0, 1), 101, 11, IPPROTO_TCP}, 12}, + {{RTE_IPV4(261, 0, 0, 0), RTE_IPV4(200, 40, 0, 1), 102, 12, IPPROTO_TCP}, 13}, + {{RTE_IPV4(171, 0, 0, 0), RTE_IPV4(100, 30, 0, 1), 101, 11, IPPROTO_TCP}, 14}, + {{RTE_IPV4(271, 0, 0, 0), RTE_IPV4(200, 40, 0, 1), 102, 12, IPPROTO_TCP}, 15}, }; static struct ipv6_l3fwd_em_route ipv6_l3fwd_em_route_array[] = { @@ -125,6 +137,66 @@ static struct ipv6_l3fwd_em_route ipv6_l3fwd_em_route_array[] = { {0xfe, 0xb0, 0, 0, 0, 0, 0, 0, 0x02, 0x1e, 0x67, 0xff, 0xfe, 0, 0, 0}, {0xfe, 0xb0, 0, 0, 0, 0, 0, 0, 0x02, 0x1b, 0x21, 0xff, 0xfe, 0x91, 0x38, 0x05}, 102, 12, IPPROTO_TCP}, 3}, + + {{ + {0xfe, 0xc0, 0, 0, 0, 0, 0, 0, 0x02, 0x1e, 0x67, 0xff, 0xfe, 0, 0, 0}, + {0xfe, 0xc0, 0, 0, 0, 0, 0, 0, 0x02, 0x1b, 0x21, 0xff, 0xfe, 0x91, 0x38, 0x05}, + 101, 11, IPPROTO_TCP}, 4}, + + {{ + {0xfe, 0xd0, 0, 0, 0, 0, 0, 0, 0x02, 0x1e, 0x67, 0xff, 0xfe, 0, 0, 0}, + {0xfe, 0xd0, 0, 0, 0, 0, 0, 0, 0x02, 0x1b, 0x21, 0xff, 0xfe, 0x91, 0x38, 0x05}, + 102, 12, IPPROTO_TCP}, 5}, + + {{ + {0xfe, 0xe0, 0, 0, 0, 0, 0, 0, 0x02, 0x1e, 0x67, 0xff, 0xfe, 0, 0, 0}, + {0xfe, 0xe0, 0, 0, 0, 0, 0, 0, 0x02, 0x1b, 0x21, 0xff, 0xfe, 0x91, 0x38, 0x05}, + 101, 11, IPPROTO_TCP}, 6}, + + {{ + {0xfe, 0xf0, 0, 0, 0, 0, 0, 0, 0x02, 0x1e, 0x67, 0xff, 0xfe, 0, 0, 0}, + {0xfe, 0xf0, 0, 0, 0, 0, 0, 0, 0x02, 0x1b, 0x21, 0xff, 0xfe, 0x91, 0x38, 0x05}, + 102, 12, IPPROTO_TCP}, 7}, + + {{ + {0xfe, 0x81, 0, 0, 0, 0, 0, 0, 0x02, 0x1e, 0x67, 0xff, 0xfe, 0, 0, 0}, + {0xfe, 0x81, 0, 0, 0, 0, 0, 0, 0x02, 0x1b, 0x21, 0xff, 0xfe, 0x91, 0x38, 0x05}, + 101, 11, IPPROTO_TCP}, 8}, + + {{ + {0xfe, 0x92, 0, 0, 0, 0, 0, 0, 0x02, 0x1e, 0x67, 0xff, 0xfe, 0, 0, 0}, + {0xfe, 0x92, 0, 0, 0, 0, 0, 0, 0x02, 0x1b, 0x21, 0xff, 0xfe, 0x91, 0x38, 0x05}, + 102, 12, IPPROTO_TCP}, 9}, + + {{ + {0xfe, 0xa3, 0, 0, 0, 0, 0, 0, 0x02, 0x1e, 0x67, 0xff, 0xfe, 0, 0, 0}, + {0xfe, 0xa3, 0, 0, 0, 0, 0, 0, 0x02, 0x1b, 0x21, 0xff, 0xfe, 0x91, 0x38, 0x05}, + 101, 11, IPPROTO_TCP}, 10}, + + {{ + {0xfe, 0xb4, 0, 0, 0, 0, 0, 0, 0x02, 0x1e, 0x67, 0xff, 0xfe, 0, 0, 0}, + {0xfe, 0xb4, 0, 0, 0, 0, 0, 0, 0x02, 0x1b, 0x21, 0xff, 0xfe, 0x91, 0x38, 0x05}, + 102, 12, IPPROTO_TCP}, 11}, + + {{ + {0xfe, 0xc5, 0, 0, 0, 0, 0, 0, 0x02, 0x1e, 0x67, 0xff, 0xfe, 0, 0, 0}, + {0xfe, 0xc5, 0, 0, 0, 0, 0, 0, 0x02, 0x1b, 0x21, 0xff, 0xfe, 0x91, 0x38, 0x05}, + 101, 11, IPPROTO_TCP}, 12}, + + {{ + {0xfe, 0xd6, 0, 0, 0, 0, 0, 0, 0x02, 0x1e, 0x67, 0xff, 0xfe, 0, 0, 0}, + {0xfe, 0xd6, 0, 0, 0, 0, 0, 0, 0x02, 0x1b, 0x21, 0xff, 0xfe, 0x91, 0x38, 0x05}, + 102, 12, IPPROTO_TCP}, 13}, + + {{ + {0xfe, 0xe7, 0, 0, 0, 0, 0, 0, 0x02, 0x1e, 0x67, 0xff, 0xfe, 0, 0, 0}, + {0xfe, 0xe7, 0, 0, 0, 0, 0, 0, 0x02, 0x1b, 0x21, 0xff, 0xfe, 0x91, 0x38, 0x05}, + 101, 11, IPPROTO_TCP}, 14}, + + {{ + {0xfe, 0xf8, 0, 0, 0, 0, 0, 0, 0x02, 0x1e, 0x67, 0xff, 0xfe, 0, 0, 0}, + {0xfe, 0xf8, 0, 0, 0, 0, 0, 0, 0x02, 0x1b, 0x21, 0xff, 0xfe, 0x91, 0x38, 0x05}, + 102, 12, IPPROTO_TCP}, 15}, }; struct rte_hash *ipv4_l3fwd_em_lookup_struct[NB_SOCKETS]; diff --git a/examples/l3fwd/l3fwd_lpm.c b/examples/l3fwd/l3fwd_lpm.c index a3a65f7fc..ace5823b5 100644 --- a/examples/l3fwd/l3fwd_lpm.c +++ b/examples/l3fwd/l3fwd_lpm.c @@ -51,6 +51,14 @@ static struct ipv4_l3fwd_lpm_route ipv4_l3fwd_lpm_route_array[] = { {RTE_IPV4(192, 18, 5, 0), 24, 5}, {RTE_IPV4(192, 18, 6, 0), 24, 6}, {RTE_IPV4(192, 18, 7, 0), 24, 7}, + {RTE_IPV4(192, 18, 8, 0), 24, 8}, + {RTE_IPV4(192, 18, 9, 0), 24, 9}, + {RTE_IPV4(192, 18, 10, 0), 24, 10}, + {RTE_IPV4(192, 18, 11, 0), 24, 11}, + {RTE_IPV4(192, 18, 12, 0), 24, 12}, + {RTE_IPV4(192, 18, 13, 0), 24, 13}, + {RTE_IPV4(192, 18, 14, 0), 24, 14}, + {RTE_IPV4(192, 18, 15, 0), 24, 15}, }; /* 2001:0200::/48 is IANA reserved range for IPv6 benchmarking (RFC5180) */ @@ -63,6 +71,14 @@ static struct ipv6_l3fwd_lpm_route ipv6_l3fwd_lpm_route_array[] = { {{32, 1, 2, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0}, 48, 5}, {{32, 1, 2, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0}, 48, 6}, {{32, 1, 2, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0}, 48, 7}, + {{32, 1, 2, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0}, 48, 8}, + {{32, 1, 2, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0}, 48, 9}, + {{32, 1, 2, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0}, 48, 10}, + {{32, 1, 2, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0}, 48, 11}, + {{32, 1, 2, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0}, 48, 12}, + {{32, 1, 2, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0}, 48, 13}, + {{32, 1, 2, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0}, 48, 14}, + {{32, 1, 2, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0}, 48, 15}, }; #define IPV4_L3FWD_LPM_NUM_ROUTES \ -- 2.17.1
From: Pavan Nikhilesh <pbhagavatula@marvell.com> Since the number of Ethernet ports have gone up, print the pci bdf along with the routes. This is also helpful for cases where whitelisting order is honored. Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com> --- examples/l3fwd/l3fwd_lpm.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/examples/l3fwd/l3fwd_lpm.c b/examples/l3fwd/l3fwd_lpm.c index ace5823b5..707912a87 100644 --- a/examples/l3fwd/l3fwd_lpm.c +++ b/examples/l3fwd/l3fwd_lpm.c @@ -294,6 +294,7 @@ setup_lpm(const int socketid) /* populate the LPM table */ for (i = 0; i < IPV4_L3FWD_LPM_NUM_ROUTES; i++) { + struct rte_eth_dev_info dev_info; struct in_addr in; /* skip unused ports */ @@ -301,6 +302,8 @@ setup_lpm(const int socketid) enabled_port_mask) == 0) continue; + rte_eth_dev_info_get(ipv4_l3fwd_lpm_route_array[i].if_out, + &dev_info); ret = rte_lpm_add(ipv4_l3fwd_lpm_lookup_struct[socketid], ipv4_l3fwd_lpm_route_array[i].ip, ipv4_l3fwd_lpm_route_array[i].depth, @@ -313,10 +316,11 @@ setup_lpm(const int socketid) } in.s_addr = htonl(ipv4_l3fwd_lpm_route_array[i].ip); - printf("LPM: Adding route %s / %d (%d)\n", + printf("LPM: Adding route %s / %d (%d) [%s]\n", inet_ntop(AF_INET, &in, abuf, sizeof(abuf)), ipv4_l3fwd_lpm_route_array[i].depth, - ipv4_l3fwd_lpm_route_array[i].if_out); + ipv4_l3fwd_lpm_route_array[i].if_out, + dev_info.device->name); } /* create the LPM6 table */ @@ -334,12 +338,15 @@ setup_lpm(const int socketid) /* populate the LPM table */ for (i = 0; i < IPV6_L3FWD_LPM_NUM_ROUTES; i++) { + struct rte_eth_dev_info dev_info; /* skip unused ports */ if ((1 << ipv6_l3fwd_lpm_route_array[i].if_out & enabled_port_mask) == 0) continue; + rte_eth_dev_info_get(ipv4_l3fwd_lpm_route_array[i].if_out, + &dev_info); ret = rte_lpm6_add(ipv6_l3fwd_lpm_lookup_struct[socketid], ipv6_l3fwd_lpm_route_array[i].ip, ipv6_l3fwd_lpm_route_array[i].depth, @@ -351,11 +358,12 @@ setup_lpm(const int socketid) i, socketid); } - printf("LPM: Adding route %s / %d (%d)\n", + printf("LPM: Adding route %s / %d (%d) [%s]\n", inet_ntop(AF_INET6, ipv6_l3fwd_lpm_route_array[i].ip, abuf, sizeof(abuf)), ipv6_l3fwd_lpm_route_array[i].depth, - ipv6_l3fwd_lpm_route_array[i].if_out); + ipv6_l3fwd_lpm_route_array[i].if_out, + dev_info.device->name); } } -- 2.17.1
On Wed, Oct 30, 2019 at 6:23 AM <pbhagavatula@marvell.com> wrote:
>
> From: Pavan Nikhilesh <pbhagavatula@marvell.com>
>
> Increase the number of routes from 8 to 16 that are statically added for
> lpm and em mode as most of the SoCs support more than 8 interfaces.
>
> Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
> ---
> examples/l3fwd/l3fwd_em.c | 72 ++++++++++++++++++++++++++++++++++++++
> examples/l3fwd/l3fwd_lpm.c | 16 +++++++++
> 2 files changed, 88 insertions(+)
>
> diff --git a/examples/l3fwd/l3fwd_em.c b/examples/l3fwd/l3fwd_em.c
> index 74a7c8fa4..c07a5b937 100644
> --- a/examples/l3fwd/l3fwd_em.c
> +++ b/examples/l3fwd/l3fwd_em.c
> @@ -103,6 +103,18 @@ static struct ipv4_l3fwd_em_route ipv4_l3fwd_em_route_array[] = {
> {{RTE_IPV4(201, 0, 0, 0), RTE_IPV4(200, 20, 0, 1), 102, 12, IPPROTO_TCP}, 1},
> {{RTE_IPV4(111, 0, 0, 0), RTE_IPV4(100, 30, 0, 1), 101, 11, IPPROTO_TCP}, 2},
> {{RTE_IPV4(211, 0, 0, 0), RTE_IPV4(200, 40, 0, 1), 102, 12, IPPROTO_TCP}, 3},
> + {{RTE_IPV4(121, 0, 0, 0), RTE_IPV4(100, 10, 0, 1), 101, 11, IPPROTO_TCP}, 4},
> + {{RTE_IPV4(221, 0, 0, 0), RTE_IPV4(200, 20, 0, 1), 102, 12, IPPROTO_TCP}, 5},
> + {{RTE_IPV4(131, 0, 0, 0), RTE_IPV4(100, 30, 0, 1), 101, 11, IPPROTO_TCP}, 6},
> + {{RTE_IPV4(231, 0, 0, 0), RTE_IPV4(200, 40, 0, 1), 102, 12, IPPROTO_TCP}, 7},
> + {{RTE_IPV4(141, 0, 0, 0), RTE_IPV4(100, 30, 0, 1), 101, 11, IPPROTO_TCP}, 8},
> + {{RTE_IPV4(241, 0, 0, 0), RTE_IPV4(200, 40, 0, 1), 102, 12, IPPROTO_TCP}, 9},
> + {{RTE_IPV4(151, 0, 0, 0), RTE_IPV4(100, 30, 0, 1), 101, 11, IPPROTO_TCP}, 10},
> + {{RTE_IPV4(251, 0, 0, 0), RTE_IPV4(200, 40, 0, 1), 102, 12, IPPROTO_TCP}, 11},
> + {{RTE_IPV4(161, 0, 0, 0), RTE_IPV4(100, 30, 0, 1), 101, 11, IPPROTO_TCP}, 12},
> + {{RTE_IPV4(261, 0, 0, 0), RTE_IPV4(200, 40, 0, 1), 102, 12, IPPROTO_TCP}, 13},
Am I reading this correctly ? 261.0.0.0 ?
--
David Marchand
From: Pavan Nikhilesh <pbhagavatula@marvell.com> Increase the number of routes from 8 to 16 that are statically added for lpm and em mode as most of the SoCs support more than 8 interfaces. Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com> --- v2 Changes: - Fixup for EM mode. examples/l3fwd/l3fwd_lpm.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/examples/l3fwd/l3fwd_lpm.c b/examples/l3fwd/l3fwd_lpm.c index 91eb74272..00047c706 100644 --- a/examples/l3fwd/l3fwd_lpm.c +++ b/examples/l3fwd/l3fwd_lpm.c @@ -52,6 +52,14 @@ static const struct ipv4_l3fwd_lpm_route ipv4_l3fwd_lpm_route_array[] = { {RTE_IPV4(198, 18, 5, 0), 24, 5}, {RTE_IPV4(198, 18, 6, 0), 24, 6}, {RTE_IPV4(198, 18, 7, 0), 24, 7}, + {RTE_IPV4(198, 18, 8, 0), 24, 8}, + {RTE_IPV4(198, 18, 9, 0), 24, 9}, + {RTE_IPV4(198, 18, 10, 0), 24, 10}, + {RTE_IPV4(198, 18, 11, 0), 24, 11}, + {RTE_IPV4(198, 18, 12, 0), 24, 12}, + {RTE_IPV4(198, 18, 13, 0), 24, 13}, + {RTE_IPV4(198, 18, 14, 0), 24, 14}, + {RTE_IPV4(198, 18, 15, 0), 24, 15}, }; /* 2001:0200::/48 is IANA reserved range for IPv6 benchmarking (RFC5180) */ @@ -64,6 +72,14 @@ static const struct ipv6_l3fwd_lpm_route ipv6_l3fwd_lpm_route_array[] = { {{32, 1, 2, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0}, 48, 5}, {{32, 1, 2, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0}, 48, 6}, {{32, 1, 2, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0}, 48, 7}, + {{32, 1, 2, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0}, 48, 8}, + {{32, 1, 2, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0}, 48, 9}, + {{32, 1, 2, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0}, 48, 10}, + {{32, 1, 2, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0}, 48, 11}, + {{32, 1, 2, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0}, 48, 12}, + {{32, 1, 2, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0}, 48, 13}, + {{32, 1, 2, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0}, 48, 14}, + {{32, 1, 2, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0}, 48, 15}, }; #define IPV4_L3FWD_LPM_MAX_RULES 1024 -- 2.17.1
From: Pavan Nikhilesh <pbhagavatula@marvell.com> The l3fwd example should use the reserved IPv4/v6 reserved address ranges defined in RFC5735 and RFC5180 and RFC863 discard protocol for the port number in the exact match mode of L3 forwarding. Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com> --- examples/l3fwd/l3fwd_em.c | 87 ++++++++++++++++++++++++++------------- 1 file changed, 59 insertions(+), 28 deletions(-) diff --git a/examples/l3fwd/l3fwd_em.c b/examples/l3fwd/l3fwd_em.c index fdbee70b4..481b6dcce 100644 --- a/examples/l3fwd/l3fwd_em.c +++ b/examples/l3fwd/l3fwd_em.c @@ -99,33 +99,64 @@ struct ipv6_l3fwd_em_route { uint8_t if_out; }; -static struct ipv4_l3fwd_em_route ipv4_l3fwd_em_route_array[] = { - {{RTE_IPV4(101, 0, 0, 0), RTE_IPV4(100, 10, 0, 1), 101, 11, IPPROTO_TCP}, 0}, - {{RTE_IPV4(201, 0, 0, 0), RTE_IPV4(200, 20, 0, 1), 102, 12, IPPROTO_TCP}, 1}, - {{RTE_IPV4(111, 0, 0, 0), RTE_IPV4(100, 30, 0, 1), 101, 11, IPPROTO_TCP}, 2}, - {{RTE_IPV4(211, 0, 0, 0), RTE_IPV4(200, 40, 0, 1), 102, 12, IPPROTO_TCP}, 3}, +/* 198.18.0.0/16 are set aside for RFC2544 benchmarking (RFC5735). + * Use RFC863 Discard Protocol. + */ +static const struct ipv4_l3fwd_em_route ipv4_l3fwd_em_route_array[] = { + {{RTE_IPV4(198, 18, 0, 0), RTE_IPV4(198, 18, 0, 1), 9, 9, IPPROTO_TCP}, 0}, + {{RTE_IPV4(198, 18, 1, 0), RTE_IPV4(198, 18, 1, 1), 9, 9, IPPROTO_TCP}, 1}, + {{RTE_IPV4(198, 18, 2, 0), RTE_IPV4(198, 18, 2, 1), 9, 9, IPPROTO_TCP}, 2}, + {{RTE_IPV4(198, 18, 3, 0), RTE_IPV4(198, 18, 3, 1), 9, 9, IPPROTO_TCP}, 3}, + {{RTE_IPV4(198, 18, 4, 0), RTE_IPV4(198, 18, 4, 1), 9, 9, IPPROTO_TCP}, 4}, + {{RTE_IPV4(198, 18, 5, 0), RTE_IPV4(198, 18, 5, 1), 9, 9, IPPROTO_TCP}, 5}, + {{RTE_IPV4(198, 18, 6, 0), RTE_IPV4(198, 18, 6, 1), 9, 9, IPPROTO_TCP}, 6}, + {{RTE_IPV4(198, 18, 7, 0), RTE_IPV4(198, 18, 7, 1), 9, 9, IPPROTO_TCP}, 7}, + {{RTE_IPV4(198, 18, 8, 0), RTE_IPV4(198, 18, 8, 1), 9, 9, IPPROTO_TCP}, 8}, + {{RTE_IPV4(198, 18, 9, 0), RTE_IPV4(198, 18, 9, 1), 9, 9, IPPROTO_TCP}, 9}, + {{RTE_IPV4(198, 18, 10, 0), RTE_IPV4(198, 18, 10, 1), 9, 9, IPPROTO_TCP}, 10}, + {{RTE_IPV4(198, 18, 11, 0), RTE_IPV4(198, 18, 11, 1), 9, 9, IPPROTO_TCP}, 11}, + {{RTE_IPV4(198, 18, 12, 0), RTE_IPV4(198, 18, 12, 1), 9, 9, IPPROTO_TCP}, 12}, + {{RTE_IPV4(198, 18, 13, 0), RTE_IPV4(198, 18, 13, 1), 9, 9, IPPROTO_TCP}, 13}, + {{RTE_IPV4(198, 18, 14, 0), RTE_IPV4(198, 18, 14, 1), 9, 9, IPPROTO_TCP}, 14}, + {{RTE_IPV4(198, 18, 15, 0), RTE_IPV4(198, 18, 15, 1), 9, 9, IPPROTO_TCP}, 15}, }; -static struct ipv6_l3fwd_em_route ipv6_l3fwd_em_route_array[] = { - {{ - {0xfe, 0x80, 0, 0, 0, 0, 0, 0, 0x02, 0x1e, 0x67, 0xff, 0xfe, 0, 0, 0}, - {0xfe, 0x80, 0, 0, 0, 0, 0, 0, 0x02, 0x1b, 0x21, 0xff, 0xfe, 0x91, 0x38, 0x05}, - 101, 11, IPPROTO_TCP}, 0}, - - {{ - {0xfe, 0x90, 0, 0, 0, 0, 0, 0, 0x02, 0x1e, 0x67, 0xff, 0xfe, 0, 0, 0}, - {0xfe, 0x90, 0, 0, 0, 0, 0, 0, 0x02, 0x1b, 0x21, 0xff, 0xfe, 0x91, 0x38, 0x05}, - 102, 12, IPPROTO_TCP}, 1}, - - {{ - {0xfe, 0xa0, 0, 0, 0, 0, 0, 0, 0x02, 0x1e, 0x67, 0xff, 0xfe, 0, 0, 0}, - {0xfe, 0xa0, 0, 0, 0, 0, 0, 0, 0x02, 0x1b, 0x21, 0xff, 0xfe, 0x91, 0x38, 0x05}, - 101, 11, IPPROTO_TCP}, 2}, - - {{ - {0xfe, 0xb0, 0, 0, 0, 0, 0, 0, 0x02, 0x1e, 0x67, 0xff, 0xfe, 0, 0, 0}, - {0xfe, 0xb0, 0, 0, 0, 0, 0, 0, 0x02, 0x1b, 0x21, 0xff, 0xfe, 0x91, 0x38, 0x05}, - 102, 12, IPPROTO_TCP}, 3}, +/* 2001:0200::/48 is IANA reserved range for IPv6 benchmarking (RFC5180). + * Use RFC863 Discard Protocol. + */ +static const struct ipv6_l3fwd_em_route ipv6_l3fwd_em_route_array[] = { + {{{32, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_TCP}, 0}, + {{{32, 1, 2, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_TCP}, 1}, + {{{32, 1, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_TCP}, 2}, + {{{32, 1, 2, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_TCP}, 3}, + {{{32, 1, 2, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_TCP}, 4}, + {{{32, 1, 2, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_TCP}, 5}, + {{{32, 1, 2, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_TCP}, 6}, + {{{32, 1, 2, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_TCP}, 7}, + {{{32, 1, 2, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_TCP}, 8}, + {{{32, 1, 2, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_TCP}, 9}, + {{{32, 1, 2, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_TCP}, 10}, + {{{32, 1, 2, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_TCP}, 11}, + {{{32, 1, 2, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_TCP}, 12}, + {{{32, 1, 2, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_TCP}, 13}, + {{{32, 1, 2, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_TCP}, 14}, + {{{32, 1, 2, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_TCP}, 15}, }; struct rte_hash *ipv4_l3fwd_em_lookup_struct[NB_SOCKETS]; @@ -429,7 +460,7 @@ populate_ipv4_many_flow_into_table(const struct rte_hash *h, switch (i & (NUMBER_PORT_USED - 1)) { case 0: entry = ipv4_l3fwd_em_route_array[0]; - entry.key.ip_dst = RTE_IPV4(101, c, b, a); + entry.key.ip_dst = RTE_IPV4(9, c, b, a); break; case 1: entry = ipv4_l3fwd_em_route_array[1]; @@ -437,11 +468,11 @@ populate_ipv4_many_flow_into_table(const struct rte_hash *h, break; case 2: entry = ipv4_l3fwd_em_route_array[2]; - entry.key.ip_dst = RTE_IPV4(111, c, b, a); + entry.key.ip_dst = RTE_IPV4(91, c, b, a); break; case 3: entry = ipv4_l3fwd_em_route_array[3]; - entry.key.ip_dst = RTE_IPV4(211, c, b, a); + entry.key.ip_dst = RTE_IPV4(29, c, b, a); break; }; convert_ipv4_5tuple(&entry.key, &newkey); -- 2.17.1
From: Pavan Nikhilesh <pbhagavatula@marvell.com> Since the number of Ethernet ports have gone up, print the pci bdf along with the routes. This is also helpful for cases where whitelisting order is honored. Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com> --- examples/l3fwd/l3fwd_lpm.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/examples/l3fwd/l3fwd_lpm.c b/examples/l3fwd/l3fwd_lpm.c index 00047c706..65639d65a 100644 --- a/examples/l3fwd/l3fwd_lpm.c +++ b/examples/l3fwd/l3fwd_lpm.c @@ -496,6 +496,7 @@ setup_lpm(const int socketid) /* populate the LPM table */ for (i = 0; i < RTE_DIM(ipv4_l3fwd_lpm_route_array); i++) { + struct rte_eth_dev_info dev_info; struct in_addr in; /* skip unused ports */ @@ -503,6 +504,8 @@ setup_lpm(const int socketid) enabled_port_mask) == 0) continue; + rte_eth_dev_info_get(ipv4_l3fwd_lpm_route_array[i].if_out, + &dev_info); ret = rte_lpm_add(ipv4_l3fwd_lpm_lookup_struct[socketid], ipv4_l3fwd_lpm_route_array[i].ip, ipv4_l3fwd_lpm_route_array[i].depth, @@ -515,10 +518,11 @@ setup_lpm(const int socketid) } in.s_addr = htonl(ipv4_l3fwd_lpm_route_array[i].ip); - printf("LPM: Adding route %s / %d (%d)\n", + printf("LPM: Adding route %s / %d (%d) [%s]\n", inet_ntop(AF_INET, &in, abuf, sizeof(abuf)), ipv4_l3fwd_lpm_route_array[i].depth, - ipv4_l3fwd_lpm_route_array[i].if_out); + ipv4_l3fwd_lpm_route_array[i].if_out, + dev_info.device->name); } /* create the LPM6 table */ @@ -536,12 +540,15 @@ setup_lpm(const int socketid) /* populate the LPM table */ for (i = 0; i < RTE_DIM(ipv6_l3fwd_lpm_route_array); i++) { + struct rte_eth_dev_info dev_info; /* skip unused ports */ if ((1 << ipv6_l3fwd_lpm_route_array[i].if_out & enabled_port_mask) == 0) continue; + rte_eth_dev_info_get(ipv4_l3fwd_lpm_route_array[i].if_out, + &dev_info); ret = rte_lpm6_add(ipv6_l3fwd_lpm_lookup_struct[socketid], ipv6_l3fwd_lpm_route_array[i].ip, ipv6_l3fwd_lpm_route_array[i].depth, @@ -553,11 +560,12 @@ setup_lpm(const int socketid) i, socketid); } - printf("LPM: Adding route %s / %d (%d)\n", + printf("LPM: Adding route %s / %d (%d) [%s]\n", inet_ntop(AF_INET6, ipv6_l3fwd_lpm_route_array[i].ip, abuf, sizeof(abuf)), ipv6_l3fwd_lpm_route_array[i].depth, - ipv6_l3fwd_lpm_route_array[i].if_out); + ipv6_l3fwd_lpm_route_array[i].if_out, + dev_info.device->name); } } -- 2.17.1
On Sun, Aug 2, 2020 at 8:17 PM <pbhagavatula@marvell.com> wrote: > > From: Pavan Nikhilesh <pbhagavatula@marvell.com> > > The l3fwd example should use the reserved IPv4/v6 reserved address > ranges defined in RFC5735 and RFC5180 and RFC863 discard protocol for > the port number in the exact match mode of L3 forwarding. > > Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com> > --- > examples/l3fwd/l3fwd_em.c | 87 ++++++++++++++++++++++++++------------- > 1 file changed, 59 insertions(+), 28 deletions(-) Would such a change affect current users? If so, please add a release note update. I see DTS uses l3fwd. If the change has an impact, probably worth reporting it on the dts ml. > > diff --git a/examples/l3fwd/l3fwd_em.c b/examples/l3fwd/l3fwd_em.c > index fdbee70b4..481b6dcce 100644 > --- a/examples/l3fwd/l3fwd_em.c > +++ b/examples/l3fwd/l3fwd_em.c [snip] > @@ -429,7 +460,7 @@ populate_ipv4_many_flow_into_table(const struct rte_hash *h, > switch (i & (NUMBER_PORT_USED - 1)) { > case 0: > entry = ipv4_l3fwd_em_route_array[0]; > - entry.key.ip_dst = RTE_IPV4(101, c, b, a); > + entry.key.ip_dst = RTE_IPV4(9, c, b, a); > break; > case 1: > entry = ipv4_l3fwd_em_route_array[1]; > @@ -437,11 +468,11 @@ populate_ipv4_many_flow_into_table(const struct rte_hash *h, > break; > case 2: > entry = ipv4_l3fwd_em_route_array[2]; > - entry.key.ip_dst = RTE_IPV4(111, c, b, a); > + entry.key.ip_dst = RTE_IPV4(91, c, b, a); > break; > case 3: > entry = ipv4_l3fwd_em_route_array[3]; > - entry.key.ip_dst = RTE_IPV4(211, c, b, a); > + entry.key.ip_dst = RTE_IPV4(29, c, b, a); > break; > }; > convert_ipv4_5tuple(&entry.key, &newkey); Why such 9, 91, 29 values? Do they have special properties? -- David Marchand
From: Pavan Nikhilesh <pbhagavatula@marvell.com> Increase the number of routes from 8 to 16 that are statically added for lpm and em mode as most of the SoCs support more than 8 interfaces. The number of routes added is equal to the number of ethernet devices ports enabled through port mask. Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com> --- v3 Changes: (Finally!) - Add FIB to the list. - Update release notes. - Update EM route addition routine and use the correct IP addresses DTS need not be updated as EM test doesn't use IP addresses defined in l3fwd. v2 Changes: - Fixup for EM mode. examples/l3fwd/l3fwd_route.h | 4 ++-- examples/l3fwd/main.c | 20 ++++++++++++++++++-- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/examples/l3fwd/l3fwd_route.h b/examples/l3fwd/l3fwd_route.h index 89f8634443..c7eba06c4d 100644 --- a/examples/l3fwd/l3fwd_route.h +++ b/examples/l3fwd/l3fwd_route.h @@ -14,6 +14,6 @@ struct ipv6_l3fwd_route { uint8_t if_out; }; -extern const struct ipv4_l3fwd_route ipv4_l3fwd_route_array[8]; +extern const struct ipv4_l3fwd_route ipv4_l3fwd_route_array[16]; -extern const struct ipv6_l3fwd_route ipv6_l3fwd_route_array[8]; +extern const struct ipv6_l3fwd_route ipv6_l3fwd_route_array[16]; diff --git a/examples/l3fwd/main.c b/examples/l3fwd/main.c index 00ac267af1..194f6ac1a4 100644 --- a/examples/l3fwd/main.c +++ b/examples/l3fwd/main.c @@ -179,7 +179,7 @@ static struct l3fwd_lkp_mode l3fwd_fib_lkp = { /* * 198.18.0.0/16 are set aside for RFC2544 benchmarking (RFC5735). - * 198.18.{0-7}.0/24 = Port {0-7} + * 198.18.{0-15}.0/24 = Port {0-15} */ const struct ipv4_l3fwd_route ipv4_l3fwd_route_array[] = { {RTE_IPV4(198, 18, 0, 0), 24, 0}, @@ -190,11 +190,19 @@ const struct ipv4_l3fwd_route ipv4_l3fwd_route_array[] = { {RTE_IPV4(198, 18, 5, 0), 24, 5}, {RTE_IPV4(198, 18, 6, 0), 24, 6}, {RTE_IPV4(198, 18, 7, 0), 24, 7}, + {RTE_IPV4(198, 18, 8, 0), 24, 8}, + {RTE_IPV4(198, 18, 9, 0), 24, 9}, + {RTE_IPV4(198, 18, 10, 0), 24, 10}, + {RTE_IPV4(198, 18, 11, 0), 24, 11}, + {RTE_IPV4(198, 18, 12, 0), 24, 12}, + {RTE_IPV4(198, 18, 13, 0), 24, 13}, + {RTE_IPV4(198, 18, 14, 0), 24, 14}, + {RTE_IPV4(198, 18, 15, 0), 24, 15}, }; /* * 2001:200::/48 is IANA reserved range for IPv6 benchmarking (RFC5180). - * 2001:200:0:{0-7}::/64 = Port {0-7} + * 2001:200:0:{0-15}::/64 = Port {0-15} */ const struct ipv6_l3fwd_route ipv6_l3fwd_route_array[] = { {{32, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 0}, @@ -205,6 +213,14 @@ const struct ipv6_l3fwd_route ipv6_l3fwd_route_array[] = { {{32, 1, 2, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 5}, {{32, 1, 2, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 6}, {{32, 1, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 7}, + {{32, 1, 2, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 8}, + {{32, 1, 2, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 9}, + {{32, 1, 2, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 10}, + {{32, 1, 2, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 11}, + {{32, 1, 2, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 12}, + {{32, 1, 2, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 13}, + {{32, 1, 2, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 14}, + {{32, 1, 2, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 15}, }; /* -- 2.33.0
From: Pavan Nikhilesh <pbhagavatula@marvell.com> Since the number of Ethernet ports have gone up, print the pci bdf along with the routes. This is also helpful for cases where allow listing order is not honored. Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com> --- examples/l3fwd/l3fwd_fib.c | 16 ++++++++++------ examples/l3fwd/l3fwd_lpm.c | 9 ++++++--- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/examples/l3fwd/l3fwd_fib.c b/examples/l3fwd/l3fwd_fib.c index f8d6a3ac39..cc6054ca44 100644 --- a/examples/l3fwd/l3fwd_fib.c +++ b/examples/l3fwd/l3fwd_fib.c @@ -439,6 +439,7 @@ setup_fib(const int socketid) /* Populate the fib ipv4 table. */ for (i = 0; i < RTE_DIM(ipv4_l3fwd_route_array); i++) { + struct rte_eth_dev_info dev_info; struct in_addr in; /* Skip unused ports. */ @@ -446,6 +447,8 @@ setup_fib(const int socketid) enabled_port_mask) == 0) continue; + rte_eth_dev_info_get(ipv4_l3fwd_route_array[i].if_out, + &dev_info); ret = rte_fib_add(ipv4_l3fwd_fib_lookup_struct[socketid], ipv4_l3fwd_route_array[i].ip, ipv4_l3fwd_route_array[i].depth, @@ -459,13 +462,14 @@ setup_fib(const int socketid) in.s_addr = htonl(ipv4_l3fwd_route_array[i].ip); if (inet_ntop(AF_INET, &in, abuf, sizeof(abuf)) != NULL) { - printf("FIB: Adding route %s / %d (%d)\n", - abuf, - ipv4_l3fwd_route_array[i].depth, - ipv4_l3fwd_route_array[i].if_out); + printf("FIB: Adding route %s / %d (%d) [%s]\n", abuf, + ipv4_l3fwd_route_array[i].depth, + ipv4_l3fwd_route_array[i].if_out, + dev_info.device->name); } else { - printf("FIB: IPv4 route added to port %d\n", - ipv4_l3fwd_route_array[i].if_out); + printf("FIB: IPv4 route added to port %d [%s]\n", + ipv4_l3fwd_route_array[i].if_out, + dev_info.device->name); } } /* >8 End of setup fib. */ diff --git a/examples/l3fwd/l3fwd_lpm.c b/examples/l3fwd/l3fwd_lpm.c index 7200160164..582911c622 100644 --- a/examples/l3fwd/l3fwd_lpm.c +++ b/examples/l3fwd/l3fwd_lpm.c @@ -451,6 +451,7 @@ setup_lpm(const int socketid) /* populate the LPM table */ for (i = 0; i < RTE_DIM(ipv4_l3fwd_route_array); i++) { + struct rte_eth_dev_info dev_info; struct in_addr in; /* skip unused ports */ @@ -458,6 +459,8 @@ setup_lpm(const int socketid) enabled_port_mask) == 0) continue; + rte_eth_dev_info_get(ipv4_l3fwd_route_array[i].if_out, + &dev_info); ret = rte_lpm_add(ipv4_l3fwd_lpm_lookup_struct[socketid], ipv4_l3fwd_route_array[i].ip, ipv4_l3fwd_route_array[i].depth, @@ -470,10 +473,10 @@ setup_lpm(const int socketid) } in.s_addr = htonl(ipv4_l3fwd_route_array[i].ip); - printf("LPM: Adding route %s / %d (%d)\n", + printf("LPM: Adding route %s / %d (%d) [%s]\n", inet_ntop(AF_INET, &in, abuf, sizeof(abuf)), - ipv4_l3fwd_route_array[i].depth, - ipv4_l3fwd_route_array[i].if_out); + ipv4_l3fwd_route_array[i].depth, + ipv4_l3fwd_route_array[i].if_out, dev_info.device->name); } /* create the LPM6 table */ -- 2.33.0
From: Pavan Nikhilesh <pbhagavatula@marvell.com> The l3fwd example should use the reserved IPv4/v6 reserved address ranges defined in RFC5735, RFC5180 and RFC863 discard protocol for the port number in the exact match mode of L3 forwarding. Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com> --- doc/guides/rel_notes/release_21_11.rst | 6 ++ examples/l3fwd/l3fwd.h | 2 +- examples/l3fwd/l3fwd_em.c | 142 ++++++++++++------------- 3 files changed, 73 insertions(+), 77 deletions(-) diff --git a/doc/guides/rel_notes/release_21_11.rst b/doc/guides/rel_notes/release_21_11.rst index 37dc1a7786..ccdfa47baa 100644 --- a/doc/guides/rel_notes/release_21_11.rst +++ b/doc/guides/rel_notes/release_21_11.rst @@ -125,6 +125,12 @@ New Features * Added tests to validate packets hard expiry. * Added tests to verify tunnel header verification in IPsec inbound. +* **Increase number of routes configured in l3fwd lpm, em and fib lookups.** + + * Increase number of routes from 8 to 16 for all lookup modes of l3fwd, this + helps in validating SoC with more than 8 ethernet devices using l3fwd. + * Update EM mode to use RFC2544 reserved IP address space. + Removed Items ------------- diff --git a/examples/l3fwd/l3fwd.h b/examples/l3fwd/l3fwd.h index a808d60247..853a31d4c2 100644 --- a/examples/l3fwd/l3fwd.h +++ b/examples/l3fwd/l3fwd.h @@ -54,7 +54,7 @@ /* 32-bit has less address-space for hugepage memory, limit to 1M entries */ #define L3FWD_HASH_ENTRIES (1024*1024*1) #endif -#define HASH_ENTRY_NUMBER_DEFAULT 4 +#define HASH_ENTRY_NUMBER_DEFAULT 16 struct mbuf_table { uint16_t len; diff --git a/examples/l3fwd/l3fwd_em.c b/examples/l3fwd/l3fwd_em.c index 2a8ab6aab5..92998e26b2 100644 --- a/examples/l3fwd/l3fwd_em.c +++ b/examples/l3fwd/l3fwd_em.c @@ -99,33 +99,64 @@ struct ipv6_l3fwd_em_route { uint8_t if_out; }; -static struct ipv4_l3fwd_em_route ipv4_l3fwd_em_route_array[] = { - {{RTE_IPV4(101, 0, 0, 0), RTE_IPV4(100, 10, 0, 1), 101, 11, IPPROTO_TCP}, 0}, - {{RTE_IPV4(201, 0, 0, 0), RTE_IPV4(200, 20, 0, 1), 102, 12, IPPROTO_TCP}, 1}, - {{RTE_IPV4(111, 0, 0, 0), RTE_IPV4(100, 30, 0, 1), 101, 11, IPPROTO_TCP}, 2}, - {{RTE_IPV4(211, 0, 0, 0), RTE_IPV4(200, 40, 0, 1), 102, 12, IPPROTO_TCP}, 3}, +/* 198.18.0.0/16 are set aside for RFC2544 benchmarking (RFC5735). + * Use RFC863 Discard Protocol. + */ +static const struct ipv4_l3fwd_em_route ipv4_l3fwd_em_route_array[] = { + {{RTE_IPV4(198, 18, 0, 0), RTE_IPV4(198, 18, 0, 1), 9, 9, IPPROTO_UDP}, 0}, + {{RTE_IPV4(198, 18, 1, 0), RTE_IPV4(198, 18, 1, 1), 9, 9, IPPROTO_UDP}, 1}, + {{RTE_IPV4(198, 18, 2, 0), RTE_IPV4(198, 18, 2, 1), 9, 9, IPPROTO_UDP}, 2}, + {{RTE_IPV4(198, 18, 3, 0), RTE_IPV4(198, 18, 3, 1), 9, 9, IPPROTO_UDP}, 3}, + {{RTE_IPV4(198, 18, 4, 0), RTE_IPV4(198, 18, 4, 1), 9, 9, IPPROTO_UDP}, 4}, + {{RTE_IPV4(198, 18, 5, 0), RTE_IPV4(198, 18, 5, 1), 9, 9, IPPROTO_UDP}, 5}, + {{RTE_IPV4(198, 18, 6, 0), RTE_IPV4(198, 18, 6, 1), 9, 9, IPPROTO_UDP}, 6}, + {{RTE_IPV4(198, 18, 7, 0), RTE_IPV4(198, 18, 7, 1), 9, 9, IPPROTO_UDP}, 7}, + {{RTE_IPV4(198, 18, 8, 0), RTE_IPV4(198, 18, 8, 1), 9, 9, IPPROTO_UDP}, 8}, + {{RTE_IPV4(198, 18, 9, 0), RTE_IPV4(198, 18, 9, 1), 9, 9, IPPROTO_UDP}, 9}, + {{RTE_IPV4(198, 18, 10, 0), RTE_IPV4(198, 18, 10, 1), 9, 9, IPPROTO_UDP}, 10}, + {{RTE_IPV4(198, 18, 11, 0), RTE_IPV4(198, 18, 11, 1), 9, 9, IPPROTO_UDP}, 11}, + {{RTE_IPV4(198, 18, 12, 0), RTE_IPV4(198, 18, 12, 1), 9, 9, IPPROTO_UDP}, 12}, + {{RTE_IPV4(198, 18, 13, 0), RTE_IPV4(198, 18, 13, 1), 9, 9, IPPROTO_UDP}, 13}, + {{RTE_IPV4(198, 18, 14, 0), RTE_IPV4(198, 18, 14, 1), 9, 9, IPPROTO_UDP}, 14}, + {{RTE_IPV4(198, 18, 15, 0), RTE_IPV4(198, 18, 15, 1), 9, 9, IPPROTO_UDP}, 15}, }; -static struct ipv6_l3fwd_em_route ipv6_l3fwd_em_route_array[] = { - {{ - {0xfe, 0x80, 0, 0, 0, 0, 0, 0, 0x02, 0x1e, 0x67, 0xff, 0xfe, 0, 0, 0}, - {0xfe, 0x80, 0, 0, 0, 0, 0, 0, 0x02, 0x1b, 0x21, 0xff, 0xfe, 0x91, 0x38, 0x05}, - 101, 11, IPPROTO_TCP}, 0}, - - {{ - {0xfe, 0x90, 0, 0, 0, 0, 0, 0, 0x02, 0x1e, 0x67, 0xff, 0xfe, 0, 0, 0}, - {0xfe, 0x90, 0, 0, 0, 0, 0, 0, 0x02, 0x1b, 0x21, 0xff, 0xfe, 0x91, 0x38, 0x05}, - 102, 12, IPPROTO_TCP}, 1}, - - {{ - {0xfe, 0xa0, 0, 0, 0, 0, 0, 0, 0x02, 0x1e, 0x67, 0xff, 0xfe, 0, 0, 0}, - {0xfe, 0xa0, 0, 0, 0, 0, 0, 0, 0x02, 0x1b, 0x21, 0xff, 0xfe, 0x91, 0x38, 0x05}, - 101, 11, IPPROTO_TCP}, 2}, - - {{ - {0xfe, 0xb0, 0, 0, 0, 0, 0, 0, 0x02, 0x1e, 0x67, 0xff, 0xfe, 0, 0, 0}, - {0xfe, 0xb0, 0, 0, 0, 0, 0, 0, 0x02, 0x1b, 0x21, 0xff, 0xfe, 0x91, 0x38, 0x05}, - 102, 12, IPPROTO_TCP}, 3}, +/* 2001:0200::/48 is IANA reserved range for IPv6 benchmarking (RFC5180). + * Use RFC863 Discard Protocol. + */ +static const struct ipv6_l3fwd_em_route ipv6_l3fwd_em_route_array[] = { + {{{32, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 0}, + {{{32, 1, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 1}, + {{{32, 1, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 2}, + {{{32, 1, 2, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 3}, + {{{32, 1, 2, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 4}, + {{{32, 1, 2, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 5}, + {{{32, 1, 2, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 6}, + {{{32, 1, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 7}, + {{{32, 1, 2, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 8}, + {{{32, 1, 2, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 9}, + {{{32, 1, 2, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 10}, + {{{32, 1, 2, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 11}, + {{{32, 1, 2, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 12}, + {{{32, 1, 2, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 13}, + {{{32, 1, 2, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 14}, + {{{32, 1, 2, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 15}, }; struct rte_hash *ipv4_l3fwd_em_lookup_struct[NB_SOCKETS]; @@ -405,7 +436,7 @@ populate_ipv6_few_flow_into_table(const struct rte_hash *h) (uint64_t)IPV6_L3FWD_EM_NUM_ROUTES); } -#define NUMBER_PORT_USED 4 +#define NUMBER_PORT_USED 16 static inline void populate_ipv4_many_flow_into_table(const struct rte_hash *h, unsigned int nr_flow) @@ -416,36 +447,16 @@ populate_ipv4_many_flow_into_table(const struct rte_hash *h, ALL_32_BITS, ALL_32_BITS} }; for (i = 0; i < nr_flow; i++) { + uint8_t port = i % NUMBER_PORT_USED; struct ipv4_l3fwd_em_route entry; union ipv4_5tuple_host newkey; - uint8_t a = (uint8_t) - ((i/NUMBER_PORT_USED)%BYTE_VALUE_MAX); - uint8_t b = (uint8_t) - (((i/NUMBER_PORT_USED)/BYTE_VALUE_MAX)%BYTE_VALUE_MAX); - uint8_t c = (uint8_t) - ((i/NUMBER_PORT_USED)/(BYTE_VALUE_MAX*BYTE_VALUE_MAX)); + uint8_t a = (uint8_t)((port + 1) % BYTE_VALUE_MAX); /* Create the ipv4 exact match flow */ memset(&entry, 0, sizeof(entry)); - switch (i & (NUMBER_PORT_USED - 1)) { - case 0: - entry = ipv4_l3fwd_em_route_array[0]; - entry.key.ip_dst = RTE_IPV4(101, c, b, a); - break; - case 1: - entry = ipv4_l3fwd_em_route_array[1]; - entry.key.ip_dst = RTE_IPV4(201, c, b, a); - break; - case 2: - entry = ipv4_l3fwd_em_route_array[2]; - entry.key.ip_dst = RTE_IPV4(111, c, b, a); - break; - case 3: - entry = ipv4_l3fwd_em_route_array[3]; - entry.key.ip_dst = RTE_IPV4(211, c, b, a); - break; - }; + entry = ipv4_l3fwd_em_route_array[port]; + entry.key.ip_dst = RTE_IPV4(198, 18, port, a); convert_ipv4_5tuple(&entry.key, &newkey); int32_t ret = rte_hash_add_key(h, (void *) &newkey); @@ -469,35 +480,14 @@ populate_ipv6_many_flow_into_table(const struct rte_hash *h, mask2 = (rte_xmm_t){.u32 = {ALL_32_BITS, ALL_32_BITS, 0, 0} }; for (i = 0; i < nr_flow; i++) { + uint8_t port = i % NUMBER_PORT_USED; struct ipv6_l3fwd_em_route entry; union ipv6_5tuple_host newkey; - uint8_t a = (uint8_t) - ((i/NUMBER_PORT_USED)%BYTE_VALUE_MAX); - uint8_t b = (uint8_t) - (((i/NUMBER_PORT_USED)/BYTE_VALUE_MAX)%BYTE_VALUE_MAX); - uint8_t c = (uint8_t) - ((i/NUMBER_PORT_USED)/(BYTE_VALUE_MAX*BYTE_VALUE_MAX)); - /* Create the ipv6 exact match flow */ memset(&entry, 0, sizeof(entry)); - switch (i & (NUMBER_PORT_USED - 1)) { - case 0: - entry = ipv6_l3fwd_em_route_array[0]; - break; - case 1: - entry = ipv6_l3fwd_em_route_array[1]; - break; - case 2: - entry = ipv6_l3fwd_em_route_array[2]; - break; - case 3: - entry = ipv6_l3fwd_em_route_array[3]; - break; - }; - entry.key.ip_dst[13] = c; - entry.key.ip_dst[14] = b; - entry.key.ip_dst[15] = a; + entry = ipv6_l3fwd_em_route_array[port]; + entry.key.ip_dst[15] = (port + 1) % BYTE_VALUE_MAX; convert_ipv6_5tuple(&entry.key, &newkey); int32_t ret = rte_hash_add_key(h, (void *) &newkey); @@ -584,7 +574,7 @@ em_parse_ptype(struct rte_mbuf *m) hdr_len = rte_ipv4_hdr_len(ipv4_hdr); if (hdr_len == sizeof(struct rte_ipv4_hdr)) { packet_type |= RTE_PTYPE_L3_IPV4; - if (ipv4_hdr->next_proto_id == IPPROTO_TCP) + if (ipv4_hdr->next_proto_id == IPPROTO_UDP) packet_type |= RTE_PTYPE_L4_TCP; else if (ipv4_hdr->next_proto_id == IPPROTO_UDP) packet_type |= RTE_PTYPE_L4_UDP; @@ -592,7 +582,7 @@ em_parse_ptype(struct rte_mbuf *m) packet_type |= RTE_PTYPE_L3_IPV4_EXT; } else if (ether_type == rte_cpu_to_be_16(RTE_ETHER_TYPE_IPV6)) { ipv6_hdr = (struct rte_ipv6_hdr *)l3; - if (ipv6_hdr->proto == IPPROTO_TCP) + if (ipv6_hdr->proto == IPPROTO_UDP) packet_type |= RTE_PTYPE_L3_IPV6 | RTE_PTYPE_L4_TCP; else if (ipv6_hdr->proto == IPPROTO_UDP) packet_type |= RTE_PTYPE_L3_IPV6 | RTE_PTYPE_L4_UDP; -- 2.33.0
From: Pavan Nikhilesh <pbhagavatula@marvell.com> Increase the number of routes from 8 to 16 that are statically added for lpm and em mode as most of the SoCs support more than 8 interfaces. The number of routes added is equal to the number of ethernet devices ports enabled through port mask. Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com> --- v4 Changes: - Use correct patch version and prefix. v3 Changes: (Finally!) - Add FIB to the list. - Update release notes. - Update EM route addition routine and use the correct IP addresses DTS need not be updated as EM test doesn't use IP addresses defined in l3fwd. v2 Changes: - Fixup for EM mode. examples/l3fwd/l3fwd_route.h | 4 ++-- examples/l3fwd/main.c | 20 ++++++++++++++++++-- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/examples/l3fwd/l3fwd_route.h b/examples/l3fwd/l3fwd_route.h index 89f8634443..c7eba06c4d 100644 --- a/examples/l3fwd/l3fwd_route.h +++ b/examples/l3fwd/l3fwd_route.h @@ -14,6 +14,6 @@ struct ipv6_l3fwd_route { uint8_t if_out; }; -extern const struct ipv4_l3fwd_route ipv4_l3fwd_route_array[8]; +extern const struct ipv4_l3fwd_route ipv4_l3fwd_route_array[16]; -extern const struct ipv6_l3fwd_route ipv6_l3fwd_route_array[8]; +extern const struct ipv6_l3fwd_route ipv6_l3fwd_route_array[16]; diff --git a/examples/l3fwd/main.c b/examples/l3fwd/main.c index 00ac267af1..194f6ac1a4 100644 --- a/examples/l3fwd/main.c +++ b/examples/l3fwd/main.c @@ -179,7 +179,7 @@ static struct l3fwd_lkp_mode l3fwd_fib_lkp = { /* * 198.18.0.0/16 are set aside for RFC2544 benchmarking (RFC5735). - * 198.18.{0-7}.0/24 = Port {0-7} + * 198.18.{0-15}.0/24 = Port {0-15} */ const struct ipv4_l3fwd_route ipv4_l3fwd_route_array[] = { {RTE_IPV4(198, 18, 0, 0), 24, 0}, @@ -190,11 +190,19 @@ const struct ipv4_l3fwd_route ipv4_l3fwd_route_array[] = { {RTE_IPV4(198, 18, 5, 0), 24, 5}, {RTE_IPV4(198, 18, 6, 0), 24, 6}, {RTE_IPV4(198, 18, 7, 0), 24, 7}, + {RTE_IPV4(198, 18, 8, 0), 24, 8}, + {RTE_IPV4(198, 18, 9, 0), 24, 9}, + {RTE_IPV4(198, 18, 10, 0), 24, 10}, + {RTE_IPV4(198, 18, 11, 0), 24, 11}, + {RTE_IPV4(198, 18, 12, 0), 24, 12}, + {RTE_IPV4(198, 18, 13, 0), 24, 13}, + {RTE_IPV4(198, 18, 14, 0), 24, 14}, + {RTE_IPV4(198, 18, 15, 0), 24, 15}, }; /* * 2001:200::/48 is IANA reserved range for IPv6 benchmarking (RFC5180). - * 2001:200:0:{0-7}::/64 = Port {0-7} + * 2001:200:0:{0-15}::/64 = Port {0-15} */ const struct ipv6_l3fwd_route ipv6_l3fwd_route_array[] = { {{32, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 0}, @@ -205,6 +213,14 @@ const struct ipv6_l3fwd_route ipv6_l3fwd_route_array[] = { {{32, 1, 2, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 5}, {{32, 1, 2, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 6}, {{32, 1, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 7}, + {{32, 1, 2, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 8}, + {{32, 1, 2, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 9}, + {{32, 1, 2, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 10}, + {{32, 1, 2, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 11}, + {{32, 1, 2, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 12}, + {{32, 1, 2, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 13}, + {{32, 1, 2, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 14}, + {{32, 1, 2, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 15}, }; /* -- 2.17.1
From: Pavan Nikhilesh <pbhagavatula@marvell.com> Since the number of Ethernet ports have gone up, print the pci bdf along with the routes. This is also helpful for cases where allow listing order is not honored. Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com> --- examples/l3fwd/l3fwd_fib.c | 16 ++++++++++------ examples/l3fwd/l3fwd_lpm.c | 9 ++++++--- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/examples/l3fwd/l3fwd_fib.c b/examples/l3fwd/l3fwd_fib.c index f8d6a3ac39..cc6054ca44 100644 --- a/examples/l3fwd/l3fwd_fib.c +++ b/examples/l3fwd/l3fwd_fib.c @@ -439,6 +439,7 @@ setup_fib(const int socketid) /* Populate the fib ipv4 table. */ for (i = 0; i < RTE_DIM(ipv4_l3fwd_route_array); i++) { + struct rte_eth_dev_info dev_info; struct in_addr in; /* Skip unused ports. */ @@ -446,6 +447,8 @@ setup_fib(const int socketid) enabled_port_mask) == 0) continue; + rte_eth_dev_info_get(ipv4_l3fwd_route_array[i].if_out, + &dev_info); ret = rte_fib_add(ipv4_l3fwd_fib_lookup_struct[socketid], ipv4_l3fwd_route_array[i].ip, ipv4_l3fwd_route_array[i].depth, @@ -459,13 +462,14 @@ setup_fib(const int socketid) in.s_addr = htonl(ipv4_l3fwd_route_array[i].ip); if (inet_ntop(AF_INET, &in, abuf, sizeof(abuf)) != NULL) { - printf("FIB: Adding route %s / %d (%d)\n", - abuf, - ipv4_l3fwd_route_array[i].depth, - ipv4_l3fwd_route_array[i].if_out); + printf("FIB: Adding route %s / %d (%d) [%s]\n", abuf, + ipv4_l3fwd_route_array[i].depth, + ipv4_l3fwd_route_array[i].if_out, + dev_info.device->name); } else { - printf("FIB: IPv4 route added to port %d\n", - ipv4_l3fwd_route_array[i].if_out); + printf("FIB: IPv4 route added to port %d [%s]\n", + ipv4_l3fwd_route_array[i].if_out, + dev_info.device->name); } } /* >8 End of setup fib. */ diff --git a/examples/l3fwd/l3fwd_lpm.c b/examples/l3fwd/l3fwd_lpm.c index 7200160164..582911c622 100644 --- a/examples/l3fwd/l3fwd_lpm.c +++ b/examples/l3fwd/l3fwd_lpm.c @@ -451,6 +451,7 @@ setup_lpm(const int socketid) /* populate the LPM table */ for (i = 0; i < RTE_DIM(ipv4_l3fwd_route_array); i++) { + struct rte_eth_dev_info dev_info; struct in_addr in; /* skip unused ports */ @@ -458,6 +459,8 @@ setup_lpm(const int socketid) enabled_port_mask) == 0) continue; + rte_eth_dev_info_get(ipv4_l3fwd_route_array[i].if_out, + &dev_info); ret = rte_lpm_add(ipv4_l3fwd_lpm_lookup_struct[socketid], ipv4_l3fwd_route_array[i].ip, ipv4_l3fwd_route_array[i].depth, @@ -470,10 +473,10 @@ setup_lpm(const int socketid) } in.s_addr = htonl(ipv4_l3fwd_route_array[i].ip); - printf("LPM: Adding route %s / %d (%d)\n", + printf("LPM: Adding route %s / %d (%d) [%s]\n", inet_ntop(AF_INET, &in, abuf, sizeof(abuf)), - ipv4_l3fwd_route_array[i].depth, - ipv4_l3fwd_route_array[i].if_out); + ipv4_l3fwd_route_array[i].depth, + ipv4_l3fwd_route_array[i].if_out, dev_info.device->name); } /* create the LPM6 table */ -- 2.17.1
From: Pavan Nikhilesh <pbhagavatula@marvell.com> The l3fwd example should use the reserved IPv4/v6 reserved address ranges defined in RFC5735, RFC5180 and RFC863 discard protocol for the port number in the exact match mode of L3 forwarding. Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com> --- doc/guides/rel_notes/release_21_11.rst | 6 ++ examples/l3fwd/l3fwd.h | 2 +- examples/l3fwd/l3fwd_em.c | 142 ++++++++++++------------- 3 files changed, 73 insertions(+), 77 deletions(-) diff --git a/doc/guides/rel_notes/release_21_11.rst b/doc/guides/rel_notes/release_21_11.rst index 37dc1a7786..ccdfa47baa 100644 --- a/doc/guides/rel_notes/release_21_11.rst +++ b/doc/guides/rel_notes/release_21_11.rst @@ -125,6 +125,12 @@ New Features * Added tests to validate packets hard expiry. * Added tests to verify tunnel header verification in IPsec inbound. +* **Increase number of routes configured in l3fwd lpm, em and fib lookups.** + + * Increase number of routes from 8 to 16 for all lookup modes of l3fwd, this + helps in validating SoC with more than 8 ethernet devices using l3fwd. + * Update EM mode to use RFC2544 reserved IP address space. + Removed Items ------------- diff --git a/examples/l3fwd/l3fwd.h b/examples/l3fwd/l3fwd.h index a808d60247..853a31d4c2 100644 --- a/examples/l3fwd/l3fwd.h +++ b/examples/l3fwd/l3fwd.h @@ -54,7 +54,7 @@ /* 32-bit has less address-space for hugepage memory, limit to 1M entries */ #define L3FWD_HASH_ENTRIES (1024*1024*1) #endif -#define HASH_ENTRY_NUMBER_DEFAULT 4 +#define HASH_ENTRY_NUMBER_DEFAULT 16 struct mbuf_table { uint16_t len; diff --git a/examples/l3fwd/l3fwd_em.c b/examples/l3fwd/l3fwd_em.c index 2a8ab6aab5..92998e26b2 100644 --- a/examples/l3fwd/l3fwd_em.c +++ b/examples/l3fwd/l3fwd_em.c @@ -99,33 +99,64 @@ struct ipv6_l3fwd_em_route { uint8_t if_out; }; -static struct ipv4_l3fwd_em_route ipv4_l3fwd_em_route_array[] = { - {{RTE_IPV4(101, 0, 0, 0), RTE_IPV4(100, 10, 0, 1), 101, 11, IPPROTO_TCP}, 0}, - {{RTE_IPV4(201, 0, 0, 0), RTE_IPV4(200, 20, 0, 1), 102, 12, IPPROTO_TCP}, 1}, - {{RTE_IPV4(111, 0, 0, 0), RTE_IPV4(100, 30, 0, 1), 101, 11, IPPROTO_TCP}, 2}, - {{RTE_IPV4(211, 0, 0, 0), RTE_IPV4(200, 40, 0, 1), 102, 12, IPPROTO_TCP}, 3}, +/* 198.18.0.0/16 are set aside for RFC2544 benchmarking (RFC5735). + * Use RFC863 Discard Protocol. + */ +static const struct ipv4_l3fwd_em_route ipv4_l3fwd_em_route_array[] = { + {{RTE_IPV4(198, 18, 0, 0), RTE_IPV4(198, 18, 0, 1), 9, 9, IPPROTO_UDP}, 0}, + {{RTE_IPV4(198, 18, 1, 0), RTE_IPV4(198, 18, 1, 1), 9, 9, IPPROTO_UDP}, 1}, + {{RTE_IPV4(198, 18, 2, 0), RTE_IPV4(198, 18, 2, 1), 9, 9, IPPROTO_UDP}, 2}, + {{RTE_IPV4(198, 18, 3, 0), RTE_IPV4(198, 18, 3, 1), 9, 9, IPPROTO_UDP}, 3}, + {{RTE_IPV4(198, 18, 4, 0), RTE_IPV4(198, 18, 4, 1), 9, 9, IPPROTO_UDP}, 4}, + {{RTE_IPV4(198, 18, 5, 0), RTE_IPV4(198, 18, 5, 1), 9, 9, IPPROTO_UDP}, 5}, + {{RTE_IPV4(198, 18, 6, 0), RTE_IPV4(198, 18, 6, 1), 9, 9, IPPROTO_UDP}, 6}, + {{RTE_IPV4(198, 18, 7, 0), RTE_IPV4(198, 18, 7, 1), 9, 9, IPPROTO_UDP}, 7}, + {{RTE_IPV4(198, 18, 8, 0), RTE_IPV4(198, 18, 8, 1), 9, 9, IPPROTO_UDP}, 8}, + {{RTE_IPV4(198, 18, 9, 0), RTE_IPV4(198, 18, 9, 1), 9, 9, IPPROTO_UDP}, 9}, + {{RTE_IPV4(198, 18, 10, 0), RTE_IPV4(198, 18, 10, 1), 9, 9, IPPROTO_UDP}, 10}, + {{RTE_IPV4(198, 18, 11, 0), RTE_IPV4(198, 18, 11, 1), 9, 9, IPPROTO_UDP}, 11}, + {{RTE_IPV4(198, 18, 12, 0), RTE_IPV4(198, 18, 12, 1), 9, 9, IPPROTO_UDP}, 12}, + {{RTE_IPV4(198, 18, 13, 0), RTE_IPV4(198, 18, 13, 1), 9, 9, IPPROTO_UDP}, 13}, + {{RTE_IPV4(198, 18, 14, 0), RTE_IPV4(198, 18, 14, 1), 9, 9, IPPROTO_UDP}, 14}, + {{RTE_IPV4(198, 18, 15, 0), RTE_IPV4(198, 18, 15, 1), 9, 9, IPPROTO_UDP}, 15}, }; -static struct ipv6_l3fwd_em_route ipv6_l3fwd_em_route_array[] = { - {{ - {0xfe, 0x80, 0, 0, 0, 0, 0, 0, 0x02, 0x1e, 0x67, 0xff, 0xfe, 0, 0, 0}, - {0xfe, 0x80, 0, 0, 0, 0, 0, 0, 0x02, 0x1b, 0x21, 0xff, 0xfe, 0x91, 0x38, 0x05}, - 101, 11, IPPROTO_TCP}, 0}, - - {{ - {0xfe, 0x90, 0, 0, 0, 0, 0, 0, 0x02, 0x1e, 0x67, 0xff, 0xfe, 0, 0, 0}, - {0xfe, 0x90, 0, 0, 0, 0, 0, 0, 0x02, 0x1b, 0x21, 0xff, 0xfe, 0x91, 0x38, 0x05}, - 102, 12, IPPROTO_TCP}, 1}, - - {{ - {0xfe, 0xa0, 0, 0, 0, 0, 0, 0, 0x02, 0x1e, 0x67, 0xff, 0xfe, 0, 0, 0}, - {0xfe, 0xa0, 0, 0, 0, 0, 0, 0, 0x02, 0x1b, 0x21, 0xff, 0xfe, 0x91, 0x38, 0x05}, - 101, 11, IPPROTO_TCP}, 2}, - - {{ - {0xfe, 0xb0, 0, 0, 0, 0, 0, 0, 0x02, 0x1e, 0x67, 0xff, 0xfe, 0, 0, 0}, - {0xfe, 0xb0, 0, 0, 0, 0, 0, 0, 0x02, 0x1b, 0x21, 0xff, 0xfe, 0x91, 0x38, 0x05}, - 102, 12, IPPROTO_TCP}, 3}, +/* 2001:0200::/48 is IANA reserved range for IPv6 benchmarking (RFC5180). + * Use RFC863 Discard Protocol. + */ +static const struct ipv6_l3fwd_em_route ipv6_l3fwd_em_route_array[] = { + {{{32, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 0}, + {{{32, 1, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 1}, + {{{32, 1, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 2}, + {{{32, 1, 2, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 3}, + {{{32, 1, 2, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 4}, + {{{32, 1, 2, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 5}, + {{{32, 1, 2, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 6}, + {{{32, 1, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 7}, + {{{32, 1, 2, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 8}, + {{{32, 1, 2, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 9}, + {{{32, 1, 2, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 10}, + {{{32, 1, 2, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 11}, + {{{32, 1, 2, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 12}, + {{{32, 1, 2, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 13}, + {{{32, 1, 2, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 14}, + {{{32, 1, 2, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 15}, }; struct rte_hash *ipv4_l3fwd_em_lookup_struct[NB_SOCKETS]; @@ -405,7 +436,7 @@ populate_ipv6_few_flow_into_table(const struct rte_hash *h) (uint64_t)IPV6_L3FWD_EM_NUM_ROUTES); } -#define NUMBER_PORT_USED 4 +#define NUMBER_PORT_USED 16 static inline void populate_ipv4_many_flow_into_table(const struct rte_hash *h, unsigned int nr_flow) @@ -416,36 +447,16 @@ populate_ipv4_many_flow_into_table(const struct rte_hash *h, ALL_32_BITS, ALL_32_BITS} }; for (i = 0; i < nr_flow; i++) { + uint8_t port = i % NUMBER_PORT_USED; struct ipv4_l3fwd_em_route entry; union ipv4_5tuple_host newkey; - uint8_t a = (uint8_t) - ((i/NUMBER_PORT_USED)%BYTE_VALUE_MAX); - uint8_t b = (uint8_t) - (((i/NUMBER_PORT_USED)/BYTE_VALUE_MAX)%BYTE_VALUE_MAX); - uint8_t c = (uint8_t) - ((i/NUMBER_PORT_USED)/(BYTE_VALUE_MAX*BYTE_VALUE_MAX)); + uint8_t a = (uint8_t)((port + 1) % BYTE_VALUE_MAX); /* Create the ipv4 exact match flow */ memset(&entry, 0, sizeof(entry)); - switch (i & (NUMBER_PORT_USED - 1)) { - case 0: - entry = ipv4_l3fwd_em_route_array[0]; - entry.key.ip_dst = RTE_IPV4(101, c, b, a); - break; - case 1: - entry = ipv4_l3fwd_em_route_array[1]; - entry.key.ip_dst = RTE_IPV4(201, c, b, a); - break; - case 2: - entry = ipv4_l3fwd_em_route_array[2]; - entry.key.ip_dst = RTE_IPV4(111, c, b, a); - break; - case 3: - entry = ipv4_l3fwd_em_route_array[3]; - entry.key.ip_dst = RTE_IPV4(211, c, b, a); - break; - }; + entry = ipv4_l3fwd_em_route_array[port]; + entry.key.ip_dst = RTE_IPV4(198, 18, port, a); convert_ipv4_5tuple(&entry.key, &newkey); int32_t ret = rte_hash_add_key(h, (void *) &newkey); @@ -469,35 +480,14 @@ populate_ipv6_many_flow_into_table(const struct rte_hash *h, mask2 = (rte_xmm_t){.u32 = {ALL_32_BITS, ALL_32_BITS, 0, 0} }; for (i = 0; i < nr_flow; i++) { + uint8_t port = i % NUMBER_PORT_USED; struct ipv6_l3fwd_em_route entry; union ipv6_5tuple_host newkey; - uint8_t a = (uint8_t) - ((i/NUMBER_PORT_USED)%BYTE_VALUE_MAX); - uint8_t b = (uint8_t) - (((i/NUMBER_PORT_USED)/BYTE_VALUE_MAX)%BYTE_VALUE_MAX); - uint8_t c = (uint8_t) - ((i/NUMBER_PORT_USED)/(BYTE_VALUE_MAX*BYTE_VALUE_MAX)); - /* Create the ipv6 exact match flow */ memset(&entry, 0, sizeof(entry)); - switch (i & (NUMBER_PORT_USED - 1)) { - case 0: - entry = ipv6_l3fwd_em_route_array[0]; - break; - case 1: - entry = ipv6_l3fwd_em_route_array[1]; - break; - case 2: - entry = ipv6_l3fwd_em_route_array[2]; - break; - case 3: - entry = ipv6_l3fwd_em_route_array[3]; - break; - }; - entry.key.ip_dst[13] = c; - entry.key.ip_dst[14] = b; - entry.key.ip_dst[15] = a; + entry = ipv6_l3fwd_em_route_array[port]; + entry.key.ip_dst[15] = (port + 1) % BYTE_VALUE_MAX; convert_ipv6_5tuple(&entry.key, &newkey); int32_t ret = rte_hash_add_key(h, (void *) &newkey); @@ -584,7 +574,7 @@ em_parse_ptype(struct rte_mbuf *m) hdr_len = rte_ipv4_hdr_len(ipv4_hdr); if (hdr_len == sizeof(struct rte_ipv4_hdr)) { packet_type |= RTE_PTYPE_L3_IPV4; - if (ipv4_hdr->next_proto_id == IPPROTO_TCP) + if (ipv4_hdr->next_proto_id == IPPROTO_UDP) packet_type |= RTE_PTYPE_L4_TCP; else if (ipv4_hdr->next_proto_id == IPPROTO_UDP) packet_type |= RTE_PTYPE_L4_UDP; @@ -592,7 +582,7 @@ em_parse_ptype(struct rte_mbuf *m) packet_type |= RTE_PTYPE_L3_IPV4_EXT; } else if (ether_type == rte_cpu_to_be_16(RTE_ETHER_TYPE_IPV6)) { ipv6_hdr = (struct rte_ipv6_hdr *)l3; - if (ipv6_hdr->proto == IPPROTO_TCP) + if (ipv6_hdr->proto == IPPROTO_UDP) packet_type |= RTE_PTYPE_L3_IPV6 | RTE_PTYPE_L4_TCP; else if (ipv6_hdr->proto == IPPROTO_UDP) packet_type |= RTE_PTYPE_L3_IPV6 | RTE_PTYPE_L4_UDP; -- 2.17.1
On Mon, 4 Oct 2021 01:41:08 +0530
<pbhagavatula@marvell.com> wrote:
> From: Pavan Nikhilesh <pbhagavatula@marvell.com>
>
> Increase the number of routes from 8 to 16 that are statically added for
> lpm and em mode as most of the SoCs support more than 8 interfaces.
> The number of routes added is equal to the number of ethernet devices
> ports enabled through port mask.
>
> Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
> ---
> v3 Changes: (Finally!)
> - Add FIB to the list.
> - Update release notes.
> - Update EM route addition routine and use the correct IP addresses
> DTS need not be updated as EM test doesn't use IP addresses defined
> in l3fwd.
>
> v2 Changes:
> - Fixup for EM mode.
>
> examples/l3fwd/l3fwd_route.h | 4 ++--
> examples/l3fwd/main.c | 20 ++++++++++++++++++--
> 2 files changed, 20 insertions(+), 4 deletions(-)
>
> diff --git a/examples/l3fwd/l3fwd_route.h b/examples/l3fwd/l3fwd_route.h
> index 89f8634443..c7eba06c4d 100644
> --- a/examples/l3fwd/l3fwd_route.h
> +++ b/examples/l3fwd/l3fwd_route.h
> @@ -14,6 +14,6 @@ struct ipv6_l3fwd_route {
> uint8_t if_out;
> };
>
> -extern const struct ipv4_l3fwd_route ipv4_l3fwd_route_array[8];
> +extern const struct ipv4_l3fwd_route ipv4_l3fwd_route_array[16];
>
> -extern const struct ipv6_l3fwd_route ipv6_l3fwd_route_array[8];
> +extern const struct ipv6_l3fwd_route ipv6_l3fwd_route_array[16];
> diff --git a/examples/l3fwd/main.c b/examples/l3fwd/main.c
> index 00ac267af1..194f6ac1a4 100644
> --- a/examples/l3fwd/main.c
> +++ b/examples/l3fwd/main.c
> @@ -179,7 +179,7 @@ static struct l3fwd_lkp_mode l3fwd_fib_lkp = {
>
> /*
> * 198.18.0.0/16 are set aside for RFC2544 benchmarking (RFC5735).
> - * 198.18.{0-7}.0/24 = Port {0-7}
> + * 198.18.{0-15}.0/24 = Port {0-15}
> */
> const struct ipv4_l3fwd_route ipv4_l3fwd_route_array[] = {
> {RTE_IPV4(198, 18, 0, 0), 24, 0},
> @@ -190,11 +190,19 @@ const struct ipv4_l3fwd_route ipv4_l3fwd_route_array[] = {
> {RTE_IPV4(198, 18, 5, 0), 24, 5},
> {RTE_IPV4(198, 18, 6, 0), 24, 6},
> {RTE_IPV4(198, 18, 7, 0), 24, 7},
> + {RTE_IPV4(198, 18, 8, 0), 24, 8},
> + {RTE_IPV4(198, 18, 9, 0), 24, 9},
> + {RTE_IPV4(198, 18, 10, 0), 24, 10},
> + {RTE_IPV4(198, 18, 11, 0), 24, 11},
> + {RTE_IPV4(198, 18, 12, 0), 24, 12},
> + {RTE_IPV4(198, 18, 13, 0), 24, 13},
> + {RTE_IPV4(198, 18, 14, 0), 24, 14},
> + {RTE_IPV4(198, 18, 15, 0), 24, 15},
> };
>
> /*
> * 2001:200::/48 is IANA reserved range for IPv6 benchmarking (RFC5180).
> - * 2001:200:0:{0-7}::/64 = Port {0-7}
> + * 2001:200:0:{0-15}::/64 = Port {0-15}
> */
> const struct ipv6_l3fwd_route ipv6_l3fwd_route_array[] = {
> {{32, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 0},
> @@ -205,6 +213,14 @@ const struct ipv6_l3fwd_route ipv6_l3fwd_route_array[] = {
> {{32, 1, 2, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 5},
> {{32, 1, 2, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 6},
> {{32, 1, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 7},
> + {{32, 1, 2, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 8},
> + {{32, 1, 2, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 9},
> + {{32, 1, 2, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 10},
> + {{32, 1, 2, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 11},
> + {{32, 1, 2, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 12},
> + {{32, 1, 2, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 13},
> + {{32, 1, 2, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 14},
> + {{32, 1, 2, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 15},
> };
>
> /*
> --
> 2.33.0
>
Maybe the table should be generated or take an input file generated by a script.
On Sun, Oct 3, 2021 at 10:25 PM <pbhagavatula@marvell.com> wrote: > > From: Pavan Nikhilesh <pbhagavatula@marvell.com> > > The l3fwd example should use the reserved IPv4/v6 reserved address > ranges defined in RFC5735, RFC5180 and RFC863 discard protocol for > the port number in the exact match mode of L3 forwarding. > > Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com> > --- > doc/guides/rel_notes/release_21_11.rst | 6 ++ > examples/l3fwd/l3fwd.h | 2 +- > examples/l3fwd/l3fwd_em.c | 142 ++++++++++++------------- > 3 files changed, 73 insertions(+), 77 deletions(-) > > diff --git a/doc/guides/rel_notes/release_21_11.rst b/doc/guides/rel_notes/release_21_11.rst > index 37dc1a7786..ccdfa47baa 100644 > --- a/doc/guides/rel_notes/release_21_11.rst > +++ b/doc/guides/rel_notes/release_21_11.rst > @@ -125,6 +125,12 @@ New Features > * Added tests to validate packets hard expiry. > * Added tests to verify tunnel header verification in IPsec inbound. > > +* **Increase number of routes configured in l3fwd lpm, em and fib lookups.** > + > + * Increase number of routes from 8 to 16 for all lookup modes of l3fwd, this > + helps in validating SoC with more than 8 ethernet devices using l3fwd. It should be in patch1. > + * Update EM mode to use RFC2544 reserved IP address space. > + > > Removed Items > ------------- > diff --git a/examples/l3fwd/l3fwd.h b/examples/l3fwd/l3fwd.h > index a808d60247..853a31d4c2 100644 > --- a/examples/l3fwd/l3fwd.h > +++ b/examples/l3fwd/l3fwd.h > @@ -54,7 +54,7 @@ > /* 32-bit has less address-space for hugepage memory, limit to 1M entries */ > #define L3FWD_HASH_ENTRIES (1024*1024*1) > #endif > -#define HASH_ENTRY_NUMBER_DEFAULT 4 > +#define HASH_ENTRY_NUMBER_DEFAULT 16 > > struct mbuf_table { > uint16_t len; > diff --git a/examples/l3fwd/l3fwd_em.c b/examples/l3fwd/l3fwd_em.c > index 2a8ab6aab5..92998e26b2 100644 > --- a/examples/l3fwd/l3fwd_em.c > +++ b/examples/l3fwd/l3fwd_em.c > @@ -99,33 +99,64 @@ struct ipv6_l3fwd_em_route { > uint8_t if_out; > }; > > -static struct ipv4_l3fwd_em_route ipv4_l3fwd_em_route_array[] = { > - {{RTE_IPV4(101, 0, 0, 0), RTE_IPV4(100, 10, 0, 1), 101, 11, IPPROTO_TCP}, 0}, > - {{RTE_IPV4(201, 0, 0, 0), RTE_IPV4(200, 20, 0, 1), 102, 12, IPPROTO_TCP}, 1}, > - {{RTE_IPV4(111, 0, 0, 0), RTE_IPV4(100, 30, 0, 1), 101, 11, IPPROTO_TCP}, 2}, > - {{RTE_IPV4(211, 0, 0, 0), RTE_IPV4(200, 40, 0, 1), 102, 12, IPPROTO_TCP}, 3}, > +/* 198.18.0.0/16 are set aside for RFC2544 benchmarking (RFC5735). > + * Use RFC863 Discard Protocol. > + */ > +static const struct ipv4_l3fwd_em_route ipv4_l3fwd_em_route_array[] = { > + {{RTE_IPV4(198, 18, 0, 0), RTE_IPV4(198, 18, 0, 1), 9, 9, IPPROTO_UDP}, 0}, > + {{RTE_IPV4(198, 18, 1, 0), RTE_IPV4(198, 18, 1, 1), 9, 9, IPPROTO_UDP}, 1}, > + {{RTE_IPV4(198, 18, 2, 0), RTE_IPV4(198, 18, 2, 1), 9, 9, IPPROTO_UDP}, 2}, > + {{RTE_IPV4(198, 18, 3, 0), RTE_IPV4(198, 18, 3, 1), 9, 9, IPPROTO_UDP}, 3}, > + {{RTE_IPV4(198, 18, 4, 0), RTE_IPV4(198, 18, 4, 1), 9, 9, IPPROTO_UDP}, 4}, > + {{RTE_IPV4(198, 18, 5, 0), RTE_IPV4(198, 18, 5, 1), 9, 9, IPPROTO_UDP}, 5}, > + {{RTE_IPV4(198, 18, 6, 0), RTE_IPV4(198, 18, 6, 1), 9, 9, IPPROTO_UDP}, 6}, > + {{RTE_IPV4(198, 18, 7, 0), RTE_IPV4(198, 18, 7, 1), 9, 9, IPPROTO_UDP}, 7}, > + {{RTE_IPV4(198, 18, 8, 0), RTE_IPV4(198, 18, 8, 1), 9, 9, IPPROTO_UDP}, 8}, > + {{RTE_IPV4(198, 18, 9, 0), RTE_IPV4(198, 18, 9, 1), 9, 9, IPPROTO_UDP}, 9}, > + {{RTE_IPV4(198, 18, 10, 0), RTE_IPV4(198, 18, 10, 1), 9, 9, IPPROTO_UDP}, 10}, > + {{RTE_IPV4(198, 18, 11, 0), RTE_IPV4(198, 18, 11, 1), 9, 9, IPPROTO_UDP}, 11}, > + {{RTE_IPV4(198, 18, 12, 0), RTE_IPV4(198, 18, 12, 1), 9, 9, IPPROTO_UDP}, 12}, > + {{RTE_IPV4(198, 18, 13, 0), RTE_IPV4(198, 18, 13, 1), 9, 9, IPPROTO_UDP}, 13}, > + {{RTE_IPV4(198, 18, 14, 0), RTE_IPV4(198, 18, 14, 1), 9, 9, IPPROTO_UDP}, 14}, > + {{RTE_IPV4(198, 18, 15, 0), RTE_IPV4(198, 18, 15, 1), 9, 9, IPPROTO_UDP}, 15}, > }; > > -static struct ipv6_l3fwd_em_route ipv6_l3fwd_em_route_array[] = { > - {{ > - {0xfe, 0x80, 0, 0, 0, 0, 0, 0, 0x02, 0x1e, 0x67, 0xff, 0xfe, 0, 0, 0}, > - {0xfe, 0x80, 0, 0, 0, 0, 0, 0, 0x02, 0x1b, 0x21, 0xff, 0xfe, 0x91, 0x38, 0x05}, > - 101, 11, IPPROTO_TCP}, 0}, > - > - {{ > - {0xfe, 0x90, 0, 0, 0, 0, 0, 0, 0x02, 0x1e, 0x67, 0xff, 0xfe, 0, 0, 0}, > - {0xfe, 0x90, 0, 0, 0, 0, 0, 0, 0x02, 0x1b, 0x21, 0xff, 0xfe, 0x91, 0x38, 0x05}, > - 102, 12, IPPROTO_TCP}, 1}, > - > - {{ > - {0xfe, 0xa0, 0, 0, 0, 0, 0, 0, 0x02, 0x1e, 0x67, 0xff, 0xfe, 0, 0, 0}, > - {0xfe, 0xa0, 0, 0, 0, 0, 0, 0, 0x02, 0x1b, 0x21, 0xff, 0xfe, 0x91, 0x38, 0x05}, > - 101, 11, IPPROTO_TCP}, 2}, > - > - {{ > - {0xfe, 0xb0, 0, 0, 0, 0, 0, 0, 0x02, 0x1e, 0x67, 0xff, 0xfe, 0, 0, 0}, > - {0xfe, 0xb0, 0, 0, 0, 0, 0, 0, 0x02, 0x1b, 0x21, 0xff, 0xfe, 0x91, 0x38, 0x05}, > - 102, 12, IPPROTO_TCP}, 3}, > +/* 2001:0200::/48 is IANA reserved range for IPv6 benchmarking (RFC5180). > + * Use RFC863 Discard Protocol. > + */ > +static const struct ipv6_l3fwd_em_route ipv6_l3fwd_em_route_array[] = { > + {{{32, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, > + {32, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 0}, > + {{{32, 1, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0}, > + {32, 1, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 1}, > + {{{32, 1, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0}, > + {32, 1, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 2}, > + {{{32, 1, 2, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0}, > + {32, 1, 2, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 3}, > + {{{32, 1, 2, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0}, > + {32, 1, 2, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 4}, > + {{{32, 1, 2, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0}, > + {32, 1, 2, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 5}, > + {{{32, 1, 2, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0}, > + {32, 1, 2, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 6}, > + {{{32, 1, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0}, > + {32, 1, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 7}, > + {{{32, 1, 2, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0}, > + {32, 1, 2, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 8}, > + {{{32, 1, 2, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0}, > + {32, 1, 2, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 9}, > + {{{32, 1, 2, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0}, > + {32, 1, 2, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 10}, > + {{{32, 1, 2, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0}, > + {32, 1, 2, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 11}, > + {{{32, 1, 2, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0}, > + {32, 1, 2, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 12}, > + {{{32, 1, 2, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0}, > + {32, 1, 2, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 13}, > + {{{32, 1, 2, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0}, > + {32, 1, 2, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 14}, > + {{{32, 1, 2, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0}, > + {32, 1, 2, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 15}, > }; > > struct rte_hash *ipv4_l3fwd_em_lookup_struct[NB_SOCKETS]; > @@ -405,7 +436,7 @@ populate_ipv6_few_flow_into_table(const struct rte_hash *h) > (uint64_t)IPV6_L3FWD_EM_NUM_ROUTES); > } > > -#define NUMBER_PORT_USED 4 > +#define NUMBER_PORT_USED 16 > static inline void > populate_ipv4_many_flow_into_table(const struct rte_hash *h, > unsigned int nr_flow) > @@ -416,36 +447,16 @@ populate_ipv4_many_flow_into_table(const struct rte_hash *h, > ALL_32_BITS, ALL_32_BITS} }; > > for (i = 0; i < nr_flow; i++) { > + uint8_t port = i % NUMBER_PORT_USED; > struct ipv4_l3fwd_em_route entry; > union ipv4_5tuple_host newkey; > > - uint8_t a = (uint8_t) > - ((i/NUMBER_PORT_USED)%BYTE_VALUE_MAX); > - uint8_t b = (uint8_t) > - (((i/NUMBER_PORT_USED)/BYTE_VALUE_MAX)%BYTE_VALUE_MAX); > - uint8_t c = (uint8_t) > - ((i/NUMBER_PORT_USED)/(BYTE_VALUE_MAX*BYTE_VALUE_MAX)); > + uint8_t a = (uint8_t)((port + 1) % BYTE_VALUE_MAX); > > /* Create the ipv4 exact match flow */ > memset(&entry, 0, sizeof(entry)); > - switch (i & (NUMBER_PORT_USED - 1)) { > - case 0: > - entry = ipv4_l3fwd_em_route_array[0]; > - entry.key.ip_dst = RTE_IPV4(101, c, b, a); > - break; > - case 1: > - entry = ipv4_l3fwd_em_route_array[1]; > - entry.key.ip_dst = RTE_IPV4(201, c, b, a); > - break; > - case 2: > - entry = ipv4_l3fwd_em_route_array[2]; > - entry.key.ip_dst = RTE_IPV4(111, c, b, a); > - break; > - case 3: > - entry = ipv4_l3fwd_em_route_array[3]; > - entry.key.ip_dst = RTE_IPV4(211, c, b, a); > - break; > - }; > + entry = ipv4_l3fwd_em_route_array[port]; > + entry.key.ip_dst = RTE_IPV4(198, 18, port, a); > convert_ipv4_5tuple(&entry.key, &newkey); > int32_t ret = rte_hash_add_key(h, (void *) &newkey); > > @@ -469,35 +480,14 @@ populate_ipv6_many_flow_into_table(const struct rte_hash *h, > mask2 = (rte_xmm_t){.u32 = {ALL_32_BITS, ALL_32_BITS, 0, 0} }; > > for (i = 0; i < nr_flow; i++) { > + uint8_t port = i % NUMBER_PORT_USED; > struct ipv6_l3fwd_em_route entry; > union ipv6_5tuple_host newkey; > > - uint8_t a = (uint8_t) > - ((i/NUMBER_PORT_USED)%BYTE_VALUE_MAX); > - uint8_t b = (uint8_t) > - (((i/NUMBER_PORT_USED)/BYTE_VALUE_MAX)%BYTE_VALUE_MAX); > - uint8_t c = (uint8_t) > - ((i/NUMBER_PORT_USED)/(BYTE_VALUE_MAX*BYTE_VALUE_MAX)); > - > /* Create the ipv6 exact match flow */ > memset(&entry, 0, sizeof(entry)); > - switch (i & (NUMBER_PORT_USED - 1)) { > - case 0: > - entry = ipv6_l3fwd_em_route_array[0]; > - break; > - case 1: > - entry = ipv6_l3fwd_em_route_array[1]; > - break; > - case 2: > - entry = ipv6_l3fwd_em_route_array[2]; > - break; > - case 3: > - entry = ipv6_l3fwd_em_route_array[3]; > - break; > - }; > - entry.key.ip_dst[13] = c; > - entry.key.ip_dst[14] = b; > - entry.key.ip_dst[15] = a; > + entry = ipv6_l3fwd_em_route_array[port]; > + entry.key.ip_dst[15] = (port + 1) % BYTE_VALUE_MAX; > convert_ipv6_5tuple(&entry.key, &newkey); > int32_t ret = rte_hash_add_key(h, (void *) &newkey); > > @@ -584,7 +574,7 @@ em_parse_ptype(struct rte_mbuf *m) > hdr_len = rte_ipv4_hdr_len(ipv4_hdr); > if (hdr_len == sizeof(struct rte_ipv4_hdr)) { > packet_type |= RTE_PTYPE_L3_IPV4; > - if (ipv4_hdr->next_proto_id == IPPROTO_TCP) > + if (ipv4_hdr->next_proto_id == IPPROTO_UDP) I don't understand the intention here. > packet_type |= RTE_PTYPE_L4_TCP; > else if (ipv4_hdr->next_proto_id == IPPROTO_UDP) > packet_type |= RTE_PTYPE_L4_UDP; > @@ -592,7 +582,7 @@ em_parse_ptype(struct rte_mbuf *m) > packet_type |= RTE_PTYPE_L3_IPV4_EXT; > } else if (ether_type == rte_cpu_to_be_16(RTE_ETHER_TYPE_IPV6)) { > ipv6_hdr = (struct rte_ipv6_hdr *)l3; > - if (ipv6_hdr->proto == IPPROTO_TCP) > + if (ipv6_hdr->proto == IPPROTO_UDP) > packet_type |= RTE_PTYPE_L3_IPV6 | RTE_PTYPE_L4_TCP; Idem. > else if (ipv6_hdr->proto == IPPROTO_UDP) > packet_type |= RTE_PTYPE_L3_IPV6 | RTE_PTYPE_L4_UDP; > -- > 2.17.1 > -- David Marchand
> From: dev <dev-bounces@dpdk.org> On Behalf Of > pbhagavatula@marvell.com > Sent: Sunday 3 October 2021 21:25 > To: david.marchand@redhat.com; jerinj@marvell.com > Cc: dev@dpdk.org; Pavan Nikhilesh <pbhagavatula@marvell.com> > Subject: [dpdk-dev] [PATCH v4 1/3] examples/l3fwd: increase number of > routes > > From: Pavan Nikhilesh <pbhagavatula@marvell.com> > > Increase the number of routes from 8 to 16 that are statically added for > lpm and em mode as most of the SoCs support more than 8 interfaces. > The number of routes added is equal to the number of ethernet devices > ports enabled through port mask. > > Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com> > --- <snip> > /* > * 2001:200::/48 is IANA reserved range for IPv6 benchmarking (RFC5180). > - * 2001:200:0:{0-7}::/64 = Port {0-7} > + * 2001:200:0:{0-15}::/64 = Port {0-15} Hi Pavan, IPv6 addresses are given in hex so the above comment should be: 2001:200:0:{0-f}::/64 = Port {0-15} The ipv6_l3fwd_route_array below is correct however. Thanks, Conor. > */ > const struct ipv6_l3fwd_route ipv6_l3fwd_route_array[] = { > {{32, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 0}, > @@ -205,6 +213,14 @@ const struct ipv6_l3fwd_route > ipv6_l3fwd_route_array[] = { > {{32, 1, 2, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 5}, > {{32, 1, 2, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 6}, > {{32, 1, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 7}, > + {{32, 1, 2, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 8}, > + {{32, 1, 2, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 9}, > + {{32, 1, 2, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 10}, > + {{32, 1, 2, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 11}, > + {{32, 1, 2, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 12}, > + {{32, 1, 2, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 13}, > + {{32, 1, 2, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 14}, > + {{32, 1, 2, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 15}, > };
> From: dev <dev-bounces@dpdk.org> On Behalf Of
> pbhagavatula@marvell.com
> Sent: Sunday 3 October 2021 21:11
> To: jerinj@marvell.com
> Cc: dev@dpdk.org; Pavan Nikhilesh <pbhagavatula@marvell.com>
> Subject: [dpdk-dev] [PATCH 2/3] examples/l3fwd: print port bdf when
> adding routes
>
> From: Pavan Nikhilesh <pbhagavatula@marvell.com>
>
> Since the number of Ethernet ports have gone up, print the pci bdf along
> with the routes.
> This is also helpful for cases where allow listing order is not honored.
>
> Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
> ---
> examples/l3fwd/l3fwd_fib.c | 16 ++++++++++------
> examples/l3fwd/l3fwd_lpm.c | 9 ++++++---
> 2 files changed, 16 insertions(+), 9 deletions(-)
>
> diff --git a/examples/l3fwd/l3fwd_fib.c b/examples/l3fwd/l3fwd_fib.c
> index f8d6a3ac39..cc6054ca44 100644
> --- a/examples/l3fwd/l3fwd_fib.c
> +++ b/examples/l3fwd/l3fwd_fib.c
> @@ -439,6 +439,7 @@ setup_fib(const int socketid)
>
> /* Populate the fib ipv4 table. */
> for (i = 0; i < RTE_DIM(ipv4_l3fwd_route_array); i++) {
> + struct rte_eth_dev_info dev_info;
> struct in_addr in;
>
> /* Skip unused ports. */
> @@ -446,6 +447,8 @@ setup_fib(const int socketid)
> enabled_port_mask) == 0)
> continue;
>
> + rte_eth_dev_info_get(ipv4_l3fwd_route_array[i].if_out,
> + &dev_info);
> ret = rte_fib_add(ipv4_l3fwd_fib_lookup_struct[socketid],
> ipv4_l3fwd_route_array[i].ip,
> ipv4_l3fwd_route_array[i].depth,
> @@ -459,13 +462,14 @@ setup_fib(const int socketid)
>
> in.s_addr = htonl(ipv4_l3fwd_route_array[i].ip);
> if (inet_ntop(AF_INET, &in, abuf, sizeof(abuf)) != NULL) {
> - printf("FIB: Adding route %s / %d (%d)\n",
> - abuf,
> - ipv4_l3fwd_route_array[i].depth,
> - ipv4_l3fwd_route_array[i].if_out);
> + printf("FIB: Adding route %s / %d (%d) [%s]\n", abuf,
> + ipv4_l3fwd_route_array[i].depth,
> + ipv4_l3fwd_route_array[i].if_out,
> + dev_info.device->name);
> } else {
> - printf("FIB: IPv4 route added to port %d\n",
> - ipv4_l3fwd_route_array[i].if_out);
> + printf("FIB: IPv4 route added to port %d [%s]\n",
> + ipv4_l3fwd_route_array[i].if_out,
> + dev_info.device->name);
> }
> }
> /* >8 End of setup fib. */
> diff --git a/examples/l3fwd/l3fwd_lpm.c b/examples/l3fwd/l3fwd_lpm.c
> index 7200160164..582911c622 100644
> --- a/examples/l3fwd/l3fwd_lpm.c
> +++ b/examples/l3fwd/l3fwd_lpm.c
> @@ -451,6 +451,7 @@ setup_lpm(const int socketid)
>
> /* populate the LPM table */
> for (i = 0; i < RTE_DIM(ipv4_l3fwd_route_array); i++) {
> + struct rte_eth_dev_info dev_info;
> struct in_addr in;
>
> /* skip unused ports */
> @@ -458,6 +459,8 @@ setup_lpm(const int socketid)
> enabled_port_mask) == 0)
> continue;
>
> + rte_eth_dev_info_get(ipv4_l3fwd_route_array[i].if_out,
> + &dev_info);
> ret = rte_lpm_add(ipv4_l3fwd_lpm_lookup_struct[socketid],
> ipv4_l3fwd_route_array[i].ip,
> ipv4_l3fwd_route_array[i].depth,
> @@ -470,10 +473,10 @@ setup_lpm(const int socketid)
> }
>
> in.s_addr = htonl(ipv4_l3fwd_route_array[i].ip);
> - printf("LPM: Adding route %s / %d (%d)\n",
> + printf("LPM: Adding route %s / %d (%d) [%s]\n",
> inet_ntop(AF_INET, &in, abuf, sizeof(abuf)),
> - ipv4_l3fwd_route_array[i].depth,
> - ipv4_l3fwd_route_array[i].if_out);
> + ipv4_l3fwd_route_array[i].depth,
> + ipv4_l3fwd_route_array[i].if_out, dev_info.device-
> >name);
> }
>
> /* create the LPM6 table */
Hi Pavan,
If this is to be added it should probably print the BDF for the IPv6 routes as well as the IPv4 routes for consistency.
Otherwise I think this is a good addition.
Thanks,
Conor.
>> From: dev <dev-bounces@dpdk.org> On Behalf Of >> pbhagavatula@marvell.com >> Sent: Sunday 3 October 2021 21:11 >> To: jerinj@marvell.com >> Cc: dev@dpdk.org; Pavan Nikhilesh <pbhagavatula@marvell.com> >> Subject: [dpdk-dev] [PATCH 2/3] examples/l3fwd: print port bdf >when >> adding routes >> >> From: Pavan Nikhilesh <pbhagavatula@marvell.com> >> >> Since the number of Ethernet ports have gone up, print the pci bdf >along >> with the routes. >> This is also helpful for cases where allow listing order is not honored. >> >> Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com> >> --- >> examples/l3fwd/l3fwd_fib.c | 16 ++++++++++------ >> examples/l3fwd/l3fwd_lpm.c | 9 ++++++--- >> 2 files changed, 16 insertions(+), 9 deletions(-) >> >> diff --git a/examples/l3fwd/l3fwd_fib.c >b/examples/l3fwd/l3fwd_fib.c >> index f8d6a3ac39..cc6054ca44 100644 >> --- a/examples/l3fwd/l3fwd_fib.c >> +++ b/examples/l3fwd/l3fwd_fib.c >> @@ -439,6 +439,7 @@ setup_fib(const int socketid) >> >> /* Populate the fib ipv4 table. */ >> for (i = 0; i < RTE_DIM(ipv4_l3fwd_route_array); i++) { >> + struct rte_eth_dev_info dev_info; >> struct in_addr in; >> >> /* Skip unused ports. */ >> @@ -446,6 +447,8 @@ setup_fib(const int socketid) >> enabled_port_mask) == 0) >> continue; >> >> + > rte_eth_dev_info_get(ipv4_l3fwd_route_array[i].if_out, >> + &dev_info); >> ret = >rte_fib_add(ipv4_l3fwd_fib_lookup_struct[socketid], >> ipv4_l3fwd_route_array[i].ip, >> ipv4_l3fwd_route_array[i].depth, >> @@ -459,13 +462,14 @@ setup_fib(const int socketid) >> >> in.s_addr = htonl(ipv4_l3fwd_route_array[i].ip); >> if (inet_ntop(AF_INET, &in, abuf, sizeof(abuf)) != NULL) >{ >> - printf("FIB: Adding route %s / %d (%d)\n", >> - abuf, >> - ipv4_l3fwd_route_array[i].depth, >> - ipv4_l3fwd_route_array[i].if_out); >> + printf("FIB: Adding route %s / %d (%d) [%s]\n", >abuf, >> + ipv4_l3fwd_route_array[i].depth, >> + ipv4_l3fwd_route_array[i].if_out, >> + dev_info.device->name); >> } else { >> - printf("FIB: IPv4 route added to port %d\n", >> - ipv4_l3fwd_route_array[i].if_out); >> + printf("FIB: IPv4 route added to port %d >[%s]\n", >> + ipv4_l3fwd_route_array[i].if_out, >> + dev_info.device->name); >> } >> } >> /* >8 End of setup fib. */ >> diff --git a/examples/l3fwd/l3fwd_lpm.c >b/examples/l3fwd/l3fwd_lpm.c >> index 7200160164..582911c622 100644 >> --- a/examples/l3fwd/l3fwd_lpm.c >> +++ b/examples/l3fwd/l3fwd_lpm.c >> @@ -451,6 +451,7 @@ setup_lpm(const int socketid) >> >> /* populate the LPM table */ >> for (i = 0; i < RTE_DIM(ipv4_l3fwd_route_array); i++) { >> + struct rte_eth_dev_info dev_info; >> struct in_addr in; >> >> /* skip unused ports */ >> @@ -458,6 +459,8 @@ setup_lpm(const int socketid) >> enabled_port_mask) == 0) >> continue; >> >> + > rte_eth_dev_info_get(ipv4_l3fwd_route_array[i].if_out, >> + &dev_info); >> ret = >rte_lpm_add(ipv4_l3fwd_lpm_lookup_struct[socketid], >> ipv4_l3fwd_route_array[i].ip, >> ipv4_l3fwd_route_array[i].depth, >> @@ -470,10 +473,10 @@ setup_lpm(const int socketid) >> } >> >> in.s_addr = htonl(ipv4_l3fwd_route_array[i].ip); >> - printf("LPM: Adding route %s / %d (%d)\n", >> + printf("LPM: Adding route %s / %d (%d) [%s]\n", >> inet_ntop(AF_INET, &in, abuf, sizeof(abuf)), >> - ipv4_l3fwd_route_array[i].depth, >> - ipv4_l3fwd_route_array[i].if_out); >> + ipv4_l3fwd_route_array[i].depth, >> + ipv4_l3fwd_route_array[i].if_out, dev_info.device- >> >name); >> } >> >> /* create the LPM6 table */ > >Hi Pavan, > >If this is to be added it should probably print the BDF for the IPv6 routes >as well as the IPv4 routes for consistency. >Otherwise I think this is a good addition. Sure, I will add it in the next version. > >Thanks, >Conor. Thanks, Pavan.
>> From: dev <dev-bounces@dpdk.org> On Behalf Of >> pbhagavatula@marvell.com >> Sent: Sunday 3 October 2021 21:25 >> To: david.marchand@redhat.com; jerinj@marvell.com >> Cc: dev@dpdk.org; Pavan Nikhilesh <pbhagavatula@marvell.com> >> Subject: [dpdk-dev] [PATCH v4 1/3] examples/l3fwd: increase >number of >> routes >> >> From: Pavan Nikhilesh <pbhagavatula@marvell.com> >> >> Increase the number of routes from 8 to 16 that are statically added >for >> lpm and em mode as most of the SoCs support more than 8 >interfaces. >> The number of routes added is equal to the number of ethernet >devices >> ports enabled through port mask. >> >> Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com> >> --- > ><snip> > >> /* >> * 2001:200::/48 is IANA reserved range for IPv6 benchmarking >(RFC5180). >> - * 2001:200:0:{0-7}::/64 = Port {0-7} >> + * 2001:200:0:{0-15}::/64 = Port {0-15} > >Hi Pavan, > >IPv6 addresses are given in hex so the above comment should be: >2001:200:0:{0-f}::/64 = Port {0-15} > Ack, I will fix the comment in the next version. Thanks, Pavan. >The ipv6_l3fwd_route_array below is correct however. > >Thanks, >Conor. > >> */ >> const struct ipv6_l3fwd_route ipv6_l3fwd_route_array[] = { >> {{32, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 0}, >> @@ -205,6 +213,14 @@ const struct ipv6_l3fwd_route >> ipv6_l3fwd_route_array[] = { >> {{32, 1, 2, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 5}, >> {{32, 1, 2, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 6}, >> {{32, 1, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 7}, >> + {{32, 1, 2, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 8}, >> + {{32, 1, 2, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 9}, >> + {{32, 1, 2, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 10}, >> + {{32, 1, 2, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 11}, >> + {{32, 1, 2, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 12}, >> + {{32, 1, 2, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 13}, >> + {{32, 1, 2, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 14}, >> + {{32, 1, 2, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 15}, >> }; >
>On Sun, Oct 3, 2021 at 10:25 PM <pbhagavatula@marvell.com> wrote: >> >> From: Pavan Nikhilesh <pbhagavatula@marvell.com> >> >> The l3fwd example should use the reserved IPv4/v6 reserved address >> ranges defined in RFC5735, RFC5180 and RFC863 discard protocol for >> the port number in the exact match mode of L3 forwarding. >> >> Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com> >> --- >> doc/guides/rel_notes/release_21_11.rst | 6 ++ >> examples/l3fwd/l3fwd.h | 2 +- >> examples/l3fwd/l3fwd_em.c | 142 ++++++++++++------------- >> 3 files changed, 73 insertions(+), 77 deletions(-) >> >> diff --git a/doc/guides/rel_notes/release_21_11.rst >b/doc/guides/rel_notes/release_21_11.rst >> index 37dc1a7786..ccdfa47baa 100644 >> --- a/doc/guides/rel_notes/release_21_11.rst >> +++ b/doc/guides/rel_notes/release_21_11.rst >> @@ -125,6 +125,12 @@ New Features >> * Added tests to validate packets hard expiry. >> * Added tests to verify tunnel header verification in IPsec inbound. >> >> +* **Increase number of routes configured in l3fwd lpm, em and fib >lookups.** >> + >> + * Increase number of routes from 8 to 16 for all lookup modes of >l3fwd, this >> + helps in validating SoC with more than 8 ethernet devices using >l3fwd. > >It should be in patch1. > Ack. > >> + * Update EM mode to use RFC2544 reserved IP address space. >> + >> >> Removed Items >> ------------- >> diff --git a/examples/l3fwd/l3fwd.h b/examples/l3fwd/l3fwd.h >> index a808d60247..853a31d4c2 100644 >> --- a/examples/l3fwd/l3fwd.h >> +++ b/examples/l3fwd/l3fwd.h >> @@ -54,7 +54,7 @@ >> /* 32-bit has less address-space for hugepage memory, limit to 1M >entries */ >> #define L3FWD_HASH_ENTRIES (1024*1024*1) >> #endif >> -#define HASH_ENTRY_NUMBER_DEFAULT 4 >> +#define HASH_ENTRY_NUMBER_DEFAULT 16 >> >> struct mbuf_table { >> uint16_t len; >> diff --git a/examples/l3fwd/l3fwd_em.c >b/examples/l3fwd/l3fwd_em.c >> index 2a8ab6aab5..92998e26b2 100644 >> --- a/examples/l3fwd/l3fwd_em.c >> +++ b/examples/l3fwd/l3fwd_em.c >> @@ -99,33 +99,64 @@ struct ipv6_l3fwd_em_route { >> uint8_t if_out; >> }; >> >> -static struct ipv4_l3fwd_em_route ipv4_l3fwd_em_route_array[] = { >> - {{RTE_IPV4(101, 0, 0, 0), RTE_IPV4(100, 10, 0, 1), 101, 11, >IPPROTO_TCP}, 0}, >> - {{RTE_IPV4(201, 0, 0, 0), RTE_IPV4(200, 20, 0, 1), 102, 12, >IPPROTO_TCP}, 1}, >> - {{RTE_IPV4(111, 0, 0, 0), RTE_IPV4(100, 30, 0, 1), 101, 11, >IPPROTO_TCP}, 2}, >> - {{RTE_IPV4(211, 0, 0, 0), RTE_IPV4(200, 40, 0, 1), 102, 12, >IPPROTO_TCP}, 3}, >> +/* 198.18.0.0/16 are set aside for RFC2544 benchmarking (RFC5735). >> + * Use RFC863 Discard Protocol. >> + */ >> +static const struct ipv4_l3fwd_em_route >ipv4_l3fwd_em_route_array[] = { >> + {{RTE_IPV4(198, 18, 0, 0), RTE_IPV4(198, 18, 0, 1), 9, 9, >IPPROTO_UDP}, 0}, >> + {{RTE_IPV4(198, 18, 1, 0), RTE_IPV4(198, 18, 1, 1), 9, 9, >IPPROTO_UDP}, 1}, >> + {{RTE_IPV4(198, 18, 2, 0), RTE_IPV4(198, 18, 2, 1), 9, 9, >IPPROTO_UDP}, 2}, >> + {{RTE_IPV4(198, 18, 3, 0), RTE_IPV4(198, 18, 3, 1), 9, 9, >IPPROTO_UDP}, 3}, >> + {{RTE_IPV4(198, 18, 4, 0), RTE_IPV4(198, 18, 4, 1), 9, 9, >IPPROTO_UDP}, 4}, >> + {{RTE_IPV4(198, 18, 5, 0), RTE_IPV4(198, 18, 5, 1), 9, 9, >IPPROTO_UDP}, 5}, >> + {{RTE_IPV4(198, 18, 6, 0), RTE_IPV4(198, 18, 6, 1), 9, 9, >IPPROTO_UDP}, 6}, >> + {{RTE_IPV4(198, 18, 7, 0), RTE_IPV4(198, 18, 7, 1), 9, 9, >IPPROTO_UDP}, 7}, >> + {{RTE_IPV4(198, 18, 8, 0), RTE_IPV4(198, 18, 8, 1), 9, 9, >IPPROTO_UDP}, 8}, >> + {{RTE_IPV4(198, 18, 9, 0), RTE_IPV4(198, 18, 9, 1), 9, 9, >IPPROTO_UDP}, 9}, >> + {{RTE_IPV4(198, 18, 10, 0), RTE_IPV4(198, 18, 10, 1), 9, 9, >IPPROTO_UDP}, 10}, >> + {{RTE_IPV4(198, 18, 11, 0), RTE_IPV4(198, 18, 11, 1), 9, 9, >IPPROTO_UDP}, 11}, >> + {{RTE_IPV4(198, 18, 12, 0), RTE_IPV4(198, 18, 12, 1), 9, 9, >IPPROTO_UDP}, 12}, >> + {{RTE_IPV4(198, 18, 13, 0), RTE_IPV4(198, 18, 13, 1), 9, 9, >IPPROTO_UDP}, 13}, >> + {{RTE_IPV4(198, 18, 14, 0), RTE_IPV4(198, 18, 14, 1), 9, 9, >IPPROTO_UDP}, 14}, >> + {{RTE_IPV4(198, 18, 15, 0), RTE_IPV4(198, 18, 15, 1), 9, 9, >IPPROTO_UDP}, 15}, >> }; >> >> -static struct ipv6_l3fwd_em_route ipv6_l3fwd_em_route_array[] = { >> - {{ >> - {0xfe, 0x80, 0, 0, 0, 0, 0, 0, 0x02, 0x1e, 0x67, 0xff, 0xfe, 0, 0, 0}, >> - {0xfe, 0x80, 0, 0, 0, 0, 0, 0, 0x02, 0x1b, 0x21, 0xff, 0xfe, 0x91, 0x38, >0x05}, >> - 101, 11, IPPROTO_TCP}, 0}, >> - >> - {{ >> - {0xfe, 0x90, 0, 0, 0, 0, 0, 0, 0x02, 0x1e, 0x67, 0xff, 0xfe, 0, 0, 0}, >> - {0xfe, 0x90, 0, 0, 0, 0, 0, 0, 0x02, 0x1b, 0x21, 0xff, 0xfe, 0x91, 0x38, >0x05}, >> - 102, 12, IPPROTO_TCP}, 1}, >> - >> - {{ >> - {0xfe, 0xa0, 0, 0, 0, 0, 0, 0, 0x02, 0x1e, 0x67, 0xff, 0xfe, 0, 0, 0}, >> - {0xfe, 0xa0, 0, 0, 0, 0, 0, 0, 0x02, 0x1b, 0x21, 0xff, 0xfe, 0x91, 0x38, >0x05}, >> - 101, 11, IPPROTO_TCP}, 2}, >> - >> - {{ >> - {0xfe, 0xb0, 0, 0, 0, 0, 0, 0, 0x02, 0x1e, 0x67, 0xff, 0xfe, 0, 0, 0}, >> - {0xfe, 0xb0, 0, 0, 0, 0, 0, 0, 0x02, 0x1b, 0x21, 0xff, 0xfe, 0x91, 0x38, >0x05}, >> - 102, 12, IPPROTO_TCP}, 3}, >> +/* 2001:0200::/48 is IANA reserved range for IPv6 benchmarking >(RFC5180). >> + * Use RFC863 Discard Protocol. >> + */ >> +static const struct ipv6_l3fwd_em_route >ipv6_l3fwd_em_route_array[] = { >> + {{{32, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, >> + {32, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 0}, >> + {{{32, 1, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0}, >> + {32, 1, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 1}, >> + {{{32, 1, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0}, >> + {32, 1, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 2}, >> + {{{32, 1, 2, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0}, >> + {32, 1, 2, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 3}, >> + {{{32, 1, 2, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0}, >> + {32, 1, 2, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 4}, >> + {{{32, 1, 2, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0}, >> + {32, 1, 2, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 5}, >> + {{{32, 1, 2, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0}, >> + {32, 1, 2, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 6}, >> + {{{32, 1, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0}, >> + {32, 1, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 7}, >> + {{{32, 1, 2, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0}, >> + {32, 1, 2, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 8}, >> + {{{32, 1, 2, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0}, >> + {32, 1, 2, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 9}, >> + {{{32, 1, 2, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0}, >> + {32, 1, 2, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, >10}, >> + {{{32, 1, 2, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0}, >> + {32, 1, 2, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, >11}, >> + {{{32, 1, 2, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0}, >> + {32, 1, 2, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, >12}, >> + {{{32, 1, 2, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0}, >> + {32, 1, 2, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, >13}, >> + {{{32, 1, 2, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0}, >> + {32, 1, 2, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, >14}, >> + {{{32, 1, 2, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0}, >> + {32, 1, 2, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, >15}, >> }; >> >> struct rte_hash *ipv4_l3fwd_em_lookup_struct[NB_SOCKETS]; >> @@ -405,7 +436,7 @@ populate_ipv6_few_flow_into_table(const >struct rte_hash *h) >> (uint64_t)IPV6_L3FWD_EM_NUM_ROUTES); >> } >> >> -#define NUMBER_PORT_USED 4 >> +#define NUMBER_PORT_USED 16 >> static inline void >> populate_ipv4_many_flow_into_table(const struct rte_hash *h, >> unsigned int nr_flow) >> @@ -416,36 +447,16 @@ >populate_ipv4_many_flow_into_table(const struct rte_hash *h, >> ALL_32_BITS, ALL_32_BITS} }; >> >> for (i = 0; i < nr_flow; i++) { >> + uint8_t port = i % NUMBER_PORT_USED; >> struct ipv4_l3fwd_em_route entry; >> union ipv4_5tuple_host newkey; >> >> - uint8_t a = (uint8_t) >> - ((i/NUMBER_PORT_USED)%BYTE_VALUE_MAX); >> - uint8_t b = (uint8_t) >> - >(((i/NUMBER_PORT_USED)/BYTE_VALUE_MAX)%BYTE_VALUE_MAX); >> - uint8_t c = (uint8_t) >> - >((i/NUMBER_PORT_USED)/(BYTE_VALUE_MAX*BYTE_VALUE_MAX)); >> + uint8_t a = (uint8_t)((port + 1) % BYTE_VALUE_MAX); >> >> /* Create the ipv4 exact match flow */ >> memset(&entry, 0, sizeof(entry)); >> - switch (i & (NUMBER_PORT_USED - 1)) { >> - case 0: >> - entry = ipv4_l3fwd_em_route_array[0]; >> - entry.key.ip_dst = RTE_IPV4(101, c, b, a); >> - break; >> - case 1: >> - entry = ipv4_l3fwd_em_route_array[1]; >> - entry.key.ip_dst = RTE_IPV4(201, c, b, a); >> - break; >> - case 2: >> - entry = ipv4_l3fwd_em_route_array[2]; >> - entry.key.ip_dst = RTE_IPV4(111, c, b, a); >> - break; >> - case 3: >> - entry = ipv4_l3fwd_em_route_array[3]; >> - entry.key.ip_dst = RTE_IPV4(211, c, b, a); >> - break; >> - }; >> + entry = ipv4_l3fwd_em_route_array[port]; >> + entry.key.ip_dst = RTE_IPV4(198, 18, port, a); >> convert_ipv4_5tuple(&entry.key, &newkey); >> int32_t ret = rte_hash_add_key(h, (void *) &newkey); >> >> @@ -469,35 +480,14 @@ >populate_ipv6_many_flow_into_table(const struct rte_hash *h, >> mask2 = (rte_xmm_t){.u32 = {ALL_32_BITS, ALL_32_BITS, 0, 0} }; >> >> for (i = 0; i < nr_flow; i++) { >> + uint8_t port = i % NUMBER_PORT_USED; >> struct ipv6_l3fwd_em_route entry; >> union ipv6_5tuple_host newkey; >> >> - uint8_t a = (uint8_t) >> - ((i/NUMBER_PORT_USED)%BYTE_VALUE_MAX); >> - uint8_t b = (uint8_t) >> - >(((i/NUMBER_PORT_USED)/BYTE_VALUE_MAX)%BYTE_VALUE_MAX); >> - uint8_t c = (uint8_t) >> - >((i/NUMBER_PORT_USED)/(BYTE_VALUE_MAX*BYTE_VALUE_MAX)); >> - >> /* Create the ipv6 exact match flow */ >> memset(&entry, 0, sizeof(entry)); >> - switch (i & (NUMBER_PORT_USED - 1)) { >> - case 0: >> - entry = ipv6_l3fwd_em_route_array[0]; >> - break; >> - case 1: >> - entry = ipv6_l3fwd_em_route_array[1]; >> - break; >> - case 2: >> - entry = ipv6_l3fwd_em_route_array[2]; >> - break; >> - case 3: >> - entry = ipv6_l3fwd_em_route_array[3]; >> - break; >> - }; >> - entry.key.ip_dst[13] = c; >> - entry.key.ip_dst[14] = b; >> - entry.key.ip_dst[15] = a; >> + entry = ipv6_l3fwd_em_route_array[port]; >> + entry.key.ip_dst[15] = (port + 1) % BYTE_VALUE_MAX; >> convert_ipv6_5tuple(&entry.key, &newkey); >> int32_t ret = rte_hash_add_key(h, (void *) &newkey); >> >> @@ -584,7 +574,7 @@ em_parse_ptype(struct rte_mbuf *m) >> hdr_len = rte_ipv4_hdr_len(ipv4_hdr); >> if (hdr_len == sizeof(struct rte_ipv4_hdr)) { >> packet_type |= RTE_PTYPE_L3_IPV4; >> - if (ipv4_hdr->next_proto_id == IPPROTO_TCP) >> + if (ipv4_hdr->next_proto_id == IPPROTO_UDP) > >I don't understand the intention here. Routes are installed for UDP proto, I think this was an unintended substitution mistake, I will fix in next version. Thanks, Pavan. > > >> packet_type |= RTE_PTYPE_L4_TCP; >> else if (ipv4_hdr->next_proto_id == IPPROTO_UDP) >> packet_type |= RTE_PTYPE_L4_UDP; >> @@ -592,7 +582,7 @@ em_parse_ptype(struct rte_mbuf *m) >> packet_type |= RTE_PTYPE_L3_IPV4_EXT; >> } else if (ether_type == >rte_cpu_to_be_16(RTE_ETHER_TYPE_IPV6)) { >> ipv6_hdr = (struct rte_ipv6_hdr *)l3; >> - if (ipv6_hdr->proto == IPPROTO_TCP) >> + if (ipv6_hdr->proto == IPPROTO_UDP) >> packet_type |= RTE_PTYPE_L3_IPV6 | >RTE_PTYPE_L4_TCP; > >Idem. > > >> else if (ipv6_hdr->proto == IPPROTO_UDP) >> packet_type |= RTE_PTYPE_L3_IPV6 | >RTE_PTYPE_L4_UDP; >> -- >> 2.17.1 >> > > >-- >David Marchand
From: Pavan Nikhilesh <pbhagavatula@marvell.com> Increase the number of routes from 8 to 16 that are statically added for lpm and em mode as most of the SoCs support more than 8 interfaces. The number of routes added is equal to the number of ethernet devices ports enabled through port mask. Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com> --- v5 Changes: - Fix comments, missing IPv6 bdf prints (Conor). - Fix unintended change to em_parse_ptype (David). v4 Changes: - Use correct patch version and prefix. v3 Changes: (Finally!) - Add FIB to the list. - Update release notes. - Update EM route addition routine and use the correct IP addresses DTS need not be updated as EM test doesn't use IP addresses defined in l3fwd. v2 Changes: - Fixup for EM mode. doc/guides/rel_notes/release_21_11.rst | 6 ++++++ examples/l3fwd/l3fwd_route.h | 4 ++-- examples/l3fwd/main.c | 20 ++++++++++++++++++-- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/doc/guides/rel_notes/release_21_11.rst b/doc/guides/rel_notes/release_21_11.rst index d95bab5582..e8ee00d552 100644 --- a/doc/guides/rel_notes/release_21_11.rst +++ b/doc/guides/rel_notes/release_21_11.rst @@ -322,6 +322,12 @@ New Features overruns in C/C++ programs, and other similar errors, as well as printing out detailed debug information whenever an error is detected. +* **Increase number of routes configured in l3fwd lpm, em and fib lookups.** + + * Increase number of routes from 8 to 16 for all lookup modes of l3fwd, this + helps in validating SoC with more than 8 ethernet devices using l3fwd. + * Update EM mode to use RFC2544 reserved IP address space. + Removed Items ------------- diff --git a/examples/l3fwd/l3fwd_route.h b/examples/l3fwd/l3fwd_route.h index 89f8634443..c7eba06c4d 100644 --- a/examples/l3fwd/l3fwd_route.h +++ b/examples/l3fwd/l3fwd_route.h @@ -14,6 +14,6 @@ struct ipv6_l3fwd_route { uint8_t if_out; }; -extern const struct ipv4_l3fwd_route ipv4_l3fwd_route_array[8]; +extern const struct ipv4_l3fwd_route ipv4_l3fwd_route_array[16]; -extern const struct ipv6_l3fwd_route ipv6_l3fwd_route_array[8]; +extern const struct ipv6_l3fwd_route ipv6_l3fwd_route_array[16]; diff --git a/examples/l3fwd/main.c b/examples/l3fwd/main.c index d69373f881..eb68ffc5aa 100644 --- a/examples/l3fwd/main.c +++ b/examples/l3fwd/main.c @@ -180,7 +180,7 @@ static struct l3fwd_lkp_mode l3fwd_fib_lkp = { /* * 198.18.0.0/16 are set aside for RFC2544 benchmarking (RFC5735). - * 198.18.{0-7}.0/24 = Port {0-7} + * 198.18.{0-15}.0/24 = Port {0-15} */ const struct ipv4_l3fwd_route ipv4_l3fwd_route_array[] = { {RTE_IPV4(198, 18, 0, 0), 24, 0}, @@ -191,11 +191,19 @@ const struct ipv4_l3fwd_route ipv4_l3fwd_route_array[] = { {RTE_IPV4(198, 18, 5, 0), 24, 5}, {RTE_IPV4(198, 18, 6, 0), 24, 6}, {RTE_IPV4(198, 18, 7, 0), 24, 7}, + {RTE_IPV4(198, 18, 8, 0), 24, 8}, + {RTE_IPV4(198, 18, 9, 0), 24, 9}, + {RTE_IPV4(198, 18, 10, 0), 24, 10}, + {RTE_IPV4(198, 18, 11, 0), 24, 11}, + {RTE_IPV4(198, 18, 12, 0), 24, 12}, + {RTE_IPV4(198, 18, 13, 0), 24, 13}, + {RTE_IPV4(198, 18, 14, 0), 24, 14}, + {RTE_IPV4(198, 18, 15, 0), 24, 15}, }; /* * 2001:200::/48 is IANA reserved range for IPv6 benchmarking (RFC5180). - * 2001:200:0:{0-7}::/64 = Port {0-7} + * 2001:200:0:{0-f}::/64 = Port {0-15} */ const struct ipv6_l3fwd_route ipv6_l3fwd_route_array[] = { {{32, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 0}, @@ -206,6 +214,14 @@ const struct ipv6_l3fwd_route ipv6_l3fwd_route_array[] = { {{32, 1, 2, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 5}, {{32, 1, 2, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 6}, {{32, 1, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 7}, + {{32, 1, 2, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 8}, + {{32, 1, 2, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 9}, + {{32, 1, 2, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 10}, + {{32, 1, 2, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 11}, + {{32, 1, 2, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 12}, + {{32, 1, 2, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 13}, + {{32, 1, 2, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 14}, + {{32, 1, 2, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 15}, }; /* -- 2.17.1
From: Pavan Nikhilesh <pbhagavatula@marvell.com> Since the number of Ethernet ports have gone up, print the pci bdf along with the routes. This is also helpful for cases where allow listing order is not honored. Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com> --- examples/l3fwd/l3fwd_fib.c | 31 +++++++++++++++++++------------ examples/l3fwd/l3fwd_lpm.c | 19 ++++++++++++------- 2 files changed, 31 insertions(+), 19 deletions(-) diff --git a/examples/l3fwd/l3fwd_fib.c b/examples/l3fwd/l3fwd_fib.c index f5c685a4f3..2110459cc3 100644 --- a/examples/l3fwd/l3fwd_fib.c +++ b/examples/l3fwd/l3fwd_fib.c @@ -580,6 +580,7 @@ fib_event_main_loop_tx_q_burst_vector(__rte_unused void *dummy) void setup_fib(const int socketid) { + struct rte_eth_dev_info dev_info; struct rte_fib6_conf config; struct rte_fib_conf config_ipv4; unsigned int i; @@ -611,6 +612,8 @@ setup_fib(const int socketid) enabled_port_mask) == 0) continue; + rte_eth_dev_info_get(ipv4_l3fwd_route_array[i].if_out, + &dev_info); ret = rte_fib_add(ipv4_l3fwd_fib_lookup_struct[socketid], ipv4_l3fwd_route_array[i].ip, ipv4_l3fwd_route_array[i].depth, @@ -624,13 +627,14 @@ setup_fib(const int socketid) in.s_addr = htonl(ipv4_l3fwd_route_array[i].ip); if (inet_ntop(AF_INET, &in, abuf, sizeof(abuf)) != NULL) { - printf("FIB: Adding route %s / %d (%d)\n", - abuf, - ipv4_l3fwd_route_array[i].depth, - ipv4_l3fwd_route_array[i].if_out); + printf("FIB: Adding route %s / %d (%d) [%s]\n", abuf, + ipv4_l3fwd_route_array[i].depth, + ipv4_l3fwd_route_array[i].if_out, + dev_info.device->name); } else { - printf("FIB: IPv4 route added to port %d\n", - ipv4_l3fwd_route_array[i].if_out); + printf("FIB: IPv4 route added to port %d [%s]\n", + ipv4_l3fwd_route_array[i].if_out, + dev_info.device->name); } } /* >8 End of setup fib. */ @@ -659,6 +663,8 @@ setup_fib(const int socketid) enabled_port_mask) == 0) continue; + rte_eth_dev_info_get(ipv6_l3fwd_route_array[i].if_out, + &dev_info); ret = rte_fib6_add(ipv6_l3fwd_fib_lookup_struct[socketid], ipv6_l3fwd_route_array[i].ip, ipv6_l3fwd_route_array[i].depth, @@ -672,13 +678,14 @@ setup_fib(const int socketid) if (inet_ntop(AF_INET6, ipv6_l3fwd_route_array[i].ip, abuf, sizeof(abuf)) != NULL) { - printf("FIB: Adding route %s / %d (%d)\n", - abuf, - ipv6_l3fwd_route_array[i].depth, - ipv6_l3fwd_route_array[i].if_out); + printf("FIB: Adding route %s / %d (%d) [%s]\n", abuf, + ipv6_l3fwd_route_array[i].depth, + ipv6_l3fwd_route_array[i].if_out, + dev_info.device->name); } else { - printf("FIB: IPv6 route added to port %d\n", - ipv6_l3fwd_route_array[i].if_out); + printf("FIB: IPv6 route added to port %d [%s]\n", + ipv6_l3fwd_route_array[i].if_out, + dev_info.device->name); } } } diff --git a/examples/l3fwd/l3fwd_lpm.c b/examples/l3fwd/l3fwd_lpm.c index 9ae288780c..a5b476ced3 100644 --- a/examples/l3fwd/l3fwd_lpm.c +++ b/examples/l3fwd/l3fwd_lpm.c @@ -551,6 +551,7 @@ lpm_event_main_loop_tx_q_burst_vector(__rte_unused void *dummy) void setup_lpm(const int socketid) { + struct rte_eth_dev_info dev_info; struct rte_lpm6_config config; struct rte_lpm_config config_ipv4; unsigned i; @@ -579,6 +580,8 @@ setup_lpm(const int socketid) enabled_port_mask) == 0) continue; + rte_eth_dev_info_get(ipv4_l3fwd_route_array[i].if_out, + &dev_info); ret = rte_lpm_add(ipv4_l3fwd_lpm_lookup_struct[socketid], ipv4_l3fwd_route_array[i].ip, ipv4_l3fwd_route_array[i].depth, @@ -591,10 +594,10 @@ setup_lpm(const int socketid) } in.s_addr = htonl(ipv4_l3fwd_route_array[i].ip); - printf("LPM: Adding route %s / %d (%d)\n", + printf("LPM: Adding route %s / %d (%d) [%s]\n", inet_ntop(AF_INET, &in, abuf, sizeof(abuf)), - ipv4_l3fwd_route_array[i].depth, - ipv4_l3fwd_route_array[i].if_out); + ipv4_l3fwd_route_array[i].depth, + ipv4_l3fwd_route_array[i].if_out, dev_info.device->name); } /* create the LPM6 table */ @@ -618,6 +621,8 @@ setup_lpm(const int socketid) enabled_port_mask) == 0) continue; + rte_eth_dev_info_get(ipv4_l3fwd_route_array[i].if_out, + &dev_info); ret = rte_lpm6_add(ipv6_l3fwd_lpm_lookup_struct[socketid], ipv6_l3fwd_route_array[i].ip, ipv6_l3fwd_route_array[i].depth, @@ -629,11 +634,11 @@ setup_lpm(const int socketid) i, socketid); } - printf("LPM: Adding route %s / %d (%d)\n", - inet_ntop(AF_INET6, ipv6_l3fwd_route_array[i].ip, - abuf, sizeof(abuf)), + printf("LPM: Adding route %s / %d (%d) [%s]\n", + inet_ntop(AF_INET6, ipv6_l3fwd_route_array[i].ip, abuf, + sizeof(abuf)), ipv6_l3fwd_route_array[i].depth, - ipv6_l3fwd_route_array[i].if_out); + ipv6_l3fwd_route_array[i].if_out, dev_info.device->name); } } -- 2.17.1
From: Pavan Nikhilesh <pbhagavatula@marvell.com> The l3fwd example should use the reserved IPv4/v6 reserved address ranges defined in RFC5735, RFC5180 and RFC863 discard protocol for the port number in the exact match mode of L3 forwarding. Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com> --- examples/l3fwd/l3fwd.h | 2 +- examples/l3fwd/l3fwd_em.c | 138 ++++++++++++++++++-------------------- 2 files changed, 65 insertions(+), 75 deletions(-) diff --git a/examples/l3fwd/l3fwd.h b/examples/l3fwd/l3fwd.h index 9607ee0fbb..38ca19133c 100644 --- a/examples/l3fwd/l3fwd.h +++ b/examples/l3fwd/l3fwd.h @@ -56,7 +56,7 @@ /* 32-bit has less address-space for hugepage memory, limit to 1M entries */ #define L3FWD_HASH_ENTRIES (1024*1024*1) #endif -#define HASH_ENTRY_NUMBER_DEFAULT 4 +#define HASH_ENTRY_NUMBER_DEFAULT 16 struct mbuf_table { uint16_t len; diff --git a/examples/l3fwd/l3fwd_em.c b/examples/l3fwd/l3fwd_em.c index ff5e56766c..5cc4a4d979 100644 --- a/examples/l3fwd/l3fwd_em.c +++ b/examples/l3fwd/l3fwd_em.c @@ -99,33 +99,64 @@ struct ipv6_l3fwd_em_route { uint8_t if_out; }; -static struct ipv4_l3fwd_em_route ipv4_l3fwd_em_route_array[] = { - {{RTE_IPV4(101, 0, 0, 0), RTE_IPV4(100, 10, 0, 1), 101, 11, IPPROTO_TCP}, 0}, - {{RTE_IPV4(201, 0, 0, 0), RTE_IPV4(200, 20, 0, 1), 102, 12, IPPROTO_TCP}, 1}, - {{RTE_IPV4(111, 0, 0, 0), RTE_IPV4(100, 30, 0, 1), 101, 11, IPPROTO_TCP}, 2}, - {{RTE_IPV4(211, 0, 0, 0), RTE_IPV4(200, 40, 0, 1), 102, 12, IPPROTO_TCP}, 3}, +/* 198.18.0.0/16 are set aside for RFC2544 benchmarking (RFC5735). + * Use RFC863 Discard Protocol. + */ +static const struct ipv4_l3fwd_em_route ipv4_l3fwd_em_route_array[] = { + {{RTE_IPV4(198, 18, 0, 0), RTE_IPV4(198, 18, 0, 1), 9, 9, IPPROTO_UDP}, 0}, + {{RTE_IPV4(198, 18, 1, 0), RTE_IPV4(198, 18, 1, 1), 9, 9, IPPROTO_UDP}, 1}, + {{RTE_IPV4(198, 18, 2, 0), RTE_IPV4(198, 18, 2, 1), 9, 9, IPPROTO_UDP}, 2}, + {{RTE_IPV4(198, 18, 3, 0), RTE_IPV4(198, 18, 3, 1), 9, 9, IPPROTO_UDP}, 3}, + {{RTE_IPV4(198, 18, 4, 0), RTE_IPV4(198, 18, 4, 1), 9, 9, IPPROTO_UDP}, 4}, + {{RTE_IPV4(198, 18, 5, 0), RTE_IPV4(198, 18, 5, 1), 9, 9, IPPROTO_UDP}, 5}, + {{RTE_IPV4(198, 18, 6, 0), RTE_IPV4(198, 18, 6, 1), 9, 9, IPPROTO_UDP}, 6}, + {{RTE_IPV4(198, 18, 7, 0), RTE_IPV4(198, 18, 7, 1), 9, 9, IPPROTO_UDP}, 7}, + {{RTE_IPV4(198, 18, 8, 0), RTE_IPV4(198, 18, 8, 1), 9, 9, IPPROTO_UDP}, 8}, + {{RTE_IPV4(198, 18, 9, 0), RTE_IPV4(198, 18, 9, 1), 9, 9, IPPROTO_UDP}, 9}, + {{RTE_IPV4(198, 18, 10, 0), RTE_IPV4(198, 18, 10, 1), 9, 9, IPPROTO_UDP}, 10}, + {{RTE_IPV4(198, 18, 11, 0), RTE_IPV4(198, 18, 11, 1), 9, 9, IPPROTO_UDP}, 11}, + {{RTE_IPV4(198, 18, 12, 0), RTE_IPV4(198, 18, 12, 1), 9, 9, IPPROTO_UDP}, 12}, + {{RTE_IPV4(198, 18, 13, 0), RTE_IPV4(198, 18, 13, 1), 9, 9, IPPROTO_UDP}, 13}, + {{RTE_IPV4(198, 18, 14, 0), RTE_IPV4(198, 18, 14, 1), 9, 9, IPPROTO_UDP}, 14}, + {{RTE_IPV4(198, 18, 15, 0), RTE_IPV4(198, 18, 15, 1), 9, 9, IPPROTO_UDP}, 15}, }; -static struct ipv6_l3fwd_em_route ipv6_l3fwd_em_route_array[] = { - {{ - {0xfe, 0x80, 0, 0, 0, 0, 0, 0, 0x02, 0x1e, 0x67, 0xff, 0xfe, 0, 0, 0}, - {0xfe, 0x80, 0, 0, 0, 0, 0, 0, 0x02, 0x1b, 0x21, 0xff, 0xfe, 0x91, 0x38, 0x05}, - 101, 11, IPPROTO_TCP}, 0}, - - {{ - {0xfe, 0x90, 0, 0, 0, 0, 0, 0, 0x02, 0x1e, 0x67, 0xff, 0xfe, 0, 0, 0}, - {0xfe, 0x90, 0, 0, 0, 0, 0, 0, 0x02, 0x1b, 0x21, 0xff, 0xfe, 0x91, 0x38, 0x05}, - 102, 12, IPPROTO_TCP}, 1}, - - {{ - {0xfe, 0xa0, 0, 0, 0, 0, 0, 0, 0x02, 0x1e, 0x67, 0xff, 0xfe, 0, 0, 0}, - {0xfe, 0xa0, 0, 0, 0, 0, 0, 0, 0x02, 0x1b, 0x21, 0xff, 0xfe, 0x91, 0x38, 0x05}, - 101, 11, IPPROTO_TCP}, 2}, - - {{ - {0xfe, 0xb0, 0, 0, 0, 0, 0, 0, 0x02, 0x1e, 0x67, 0xff, 0xfe, 0, 0, 0}, - {0xfe, 0xb0, 0, 0, 0, 0, 0, 0, 0x02, 0x1b, 0x21, 0xff, 0xfe, 0x91, 0x38, 0x05}, - 102, 12, IPPROTO_TCP}, 3}, +/* 2001:0200::/48 is IANA reserved range for IPv6 benchmarking (RFC5180). + * Use RFC863 Discard Protocol. + */ +static const struct ipv6_l3fwd_em_route ipv6_l3fwd_em_route_array[] = { + {{{32, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 0}, + {{{32, 1, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 1}, + {{{32, 1, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 2}, + {{{32, 1, 2, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 3}, + {{{32, 1, 2, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 4}, + {{{32, 1, 2, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 5}, + {{{32, 1, 2, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 6}, + {{{32, 1, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 7}, + {{{32, 1, 2, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 8}, + {{{32, 1, 2, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 9}, + {{{32, 1, 2, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 10}, + {{{32, 1, 2, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 11}, + {{{32, 1, 2, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 12}, + {{{32, 1, 2, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 13}, + {{{32, 1, 2, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 14}, + {{{32, 1, 2, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0}, + {32, 1, 2, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 1}, 9, 9, IPPROTO_UDP}, 15}, }; struct rte_hash *ipv4_l3fwd_em_lookup_struct[NB_SOCKETS]; @@ -405,7 +436,7 @@ populate_ipv6_few_flow_into_table(const struct rte_hash *h) (uint64_t)IPV6_L3FWD_EM_NUM_ROUTES); } -#define NUMBER_PORT_USED 4 +#define NUMBER_PORT_USED 16 static inline void populate_ipv4_many_flow_into_table(const struct rte_hash *h, unsigned int nr_flow) @@ -416,36 +447,16 @@ populate_ipv4_many_flow_into_table(const struct rte_hash *h, ALL_32_BITS, ALL_32_BITS} }; for (i = 0; i < nr_flow; i++) { + uint8_t port = i % NUMBER_PORT_USED; struct ipv4_l3fwd_em_route entry; union ipv4_5tuple_host newkey; - uint8_t a = (uint8_t) - ((i/NUMBER_PORT_USED)%BYTE_VALUE_MAX); - uint8_t b = (uint8_t) - (((i/NUMBER_PORT_USED)/BYTE_VALUE_MAX)%BYTE_VALUE_MAX); - uint8_t c = (uint8_t) - ((i/NUMBER_PORT_USED)/(BYTE_VALUE_MAX*BYTE_VALUE_MAX)); + uint8_t a = (uint8_t)((port + 1) % BYTE_VALUE_MAX); /* Create the ipv4 exact match flow */ memset(&entry, 0, sizeof(entry)); - switch (i & (NUMBER_PORT_USED - 1)) { - case 0: - entry = ipv4_l3fwd_em_route_array[0]; - entry.key.ip_dst = RTE_IPV4(101, c, b, a); - break; - case 1: - entry = ipv4_l3fwd_em_route_array[1]; - entry.key.ip_dst = RTE_IPV4(201, c, b, a); - break; - case 2: - entry = ipv4_l3fwd_em_route_array[2]; - entry.key.ip_dst = RTE_IPV4(111, c, b, a); - break; - case 3: - entry = ipv4_l3fwd_em_route_array[3]; - entry.key.ip_dst = RTE_IPV4(211, c, b, a); - break; - }; + entry = ipv4_l3fwd_em_route_array[port]; + entry.key.ip_dst = RTE_IPV4(198, 18, port, a); convert_ipv4_5tuple(&entry.key, &newkey); int32_t ret = rte_hash_add_key(h, (void *) &newkey); @@ -469,35 +480,14 @@ populate_ipv6_many_flow_into_table(const struct rte_hash *h, mask2 = (rte_xmm_t){.u32 = {ALL_32_BITS, ALL_32_BITS, 0, 0} }; for (i = 0; i < nr_flow; i++) { + uint8_t port = i % NUMBER_PORT_USED; struct ipv6_l3fwd_em_route entry; union ipv6_5tuple_host newkey; - uint8_t a = (uint8_t) - ((i/NUMBER_PORT_USED)%BYTE_VALUE_MAX); - uint8_t b = (uint8_t) - (((i/NUMBER_PORT_USED)/BYTE_VALUE_MAX)%BYTE_VALUE_MAX); - uint8_t c = (uint8_t) - ((i/NUMBER_PORT_USED)/(BYTE_VALUE_MAX*BYTE_VALUE_MAX)); - /* Create the ipv6 exact match flow */ memset(&entry, 0, sizeof(entry)); - switch (i & (NUMBER_PORT_USED - 1)) { - case 0: - entry = ipv6_l3fwd_em_route_array[0]; - break; - case 1: - entry = ipv6_l3fwd_em_route_array[1]; - break; - case 2: - entry = ipv6_l3fwd_em_route_array[2]; - break; - case 3: - entry = ipv6_l3fwd_em_route_array[3]; - break; - }; - entry.key.ip_dst[13] = c; - entry.key.ip_dst[14] = b; - entry.key.ip_dst[15] = a; + entry = ipv6_l3fwd_em_route_array[port]; + entry.key.ip_dst[15] = (port + 1) % BYTE_VALUE_MAX; convert_ipv6_5tuple(&entry.key, &newkey); int32_t ret = rte_hash_add_key(h, (void *) &newkey); -- 2.17.1
> From: pbhagavatula@marvell.com <pbhagavatula@marvell.com>
> Sent: Friday 5 November 2021 08:39
> To: Walsh, Conor <conor.walsh@intel.com>; david.marchand@redhat.com;
> jerinj@marvell.com
> Cc: dev@dpdk.org; Pavan Nikhilesh <pbhagavatula@marvell.com>
> Subject: [dpdk-dev] [PATCH v5 1/3] examples/l3fwd: increase number of
> routes
>
> From: Pavan Nikhilesh <pbhagavatula@marvell.com>
>
> Increase the number of routes from 8 to 16 that are statically added for
> lpm and em mode as most of the SoCs support more than 8 interfaces.
> The number of routes added is equal to the number of ethernet devices
> ports enabled through port mask.
>
> Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
> ---
Reviewed-by: Conor Walsh <conor.walsh@intel.com>
> From: pbhagavatula@marvell.com <pbhagavatula@marvell.com>
> Sent: Friday 5 November 2021 08:39
> To: Walsh, Conor <conor.walsh@intel.com>; david.marchand@redhat.com;
> jerinj@marvell.com
> Cc: dev@dpdk.org; Pavan Nikhilesh <pbhagavatula@marvell.com>
> Subject: [dpdk-dev] [PATCH v5 2/3] examples/l3fwd: print port bdf when
> adding routes
>
> From: Pavan Nikhilesh <pbhagavatula@marvell.com>
>
> Since the number of Ethernet ports have gone up, print the pci bdf along
> with the routes.
> This is also helpful for cases where allow listing order is not honored.
>
> Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
> ---
Reviewed-by: Conor Walsh <conor.walsh@intel.com>
On Fri, Nov 5, 2021 at 9:39 AM <pbhagavatula@marvell.com> wrote:
>
> From: Pavan Nikhilesh <pbhagavatula@marvell.com>
>
> The l3fwd example should use the reserved IPv4/v6 reserved address
> ranges defined in RFC5735, RFC5180 and RFC863 discard protocol for
> the port number in the exact match mode of L3 forwarding.
>
> Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
For the series,
Reviewed-by: David Marchand <david.marchand@redhat.com>
I reworded a bit the RN update.
I also split the EM mention in the RN, from patch 1 to patch 3.
Applied, thanks.
--
David Marchand