[dpdk-dev,v3] examples/ipsec_secgw: support jumbo frames
Checks
Commit Message
Added cmdline option for jumbo frames.
Switched port initialization to the new offload API.
Signed-off-by: Radu Nicolau <radu.nicolau@intel.com>
---
v2: updated commit message
v3: addressed feedback
doc/guides/sample_app_ug/ipsec_secgw.rst | 6 +++++-
examples/ipsec-secgw/ipsec-secgw.c | 35 +++++++++++++++++++++++++-------
2 files changed, 33 insertions(+), 8 deletions(-)
Comments
On 10/19/2017 6:58 PM, Radu Nicolau wrote:
> Added cmdline option for jumbo frames.
> Switched port initialization to the new offload API.
>
> Signed-off-by: Radu Nicolau <radu.nicolau@intel.com>
> ---
> v2: updated commit message
> v3: addressed feedback
>
> doc/guides/sample_app_ug/ipsec_secgw.rst | 6 +++++-
> examples/ipsec-secgw/ipsec-secgw.c | 35 +++++++++++++++++++++++++-------
> 2 files changed, 33 insertions(+), 8 deletions(-)
>
> diff --git a/doc/guides/sample_app_ug/ipsec_secgw.rst b/doc/guides/sample_app_ug/ipsec_secgw.rst
> index b675cba..a292859 100644
> --- a/doc/guides/sample_app_ug/ipsec_secgw.rst
> +++ b/doc/guides/sample_app_ug/ipsec_secgw.rst
> @@ -119,7 +119,7 @@ The application has a number of command line options::
>
>
> ./build/ipsec-secgw [EAL options] --
> - -p PORTMASK -P -u PORTMASK
> + -p PORTMASK -P -u PORTMASK -j FRAMESIZE
> --config (port,queue,lcore)[,(port,queue,lcore]
> --single-sa SAIDX
> -f CONFIG_FILE_PATH
> @@ -135,6 +135,10 @@ Where:
>
> * ``-u PORTMASK``: hexadecimal bitmask of unprotected ports
>
> +* ``-j FRAMESIZE``: *optional*. Enables jumbo frames with the maximum size
> + specified as FRAMESIZE. If an invalid value is provided as FRAMESIZE
> + then the default value 9000 is used.
> +
> * ``--config (port,queue,lcore)[,(port,queue,lcore)]``: determines which queues
> from which ports are mapped to which cores.
>
> diff --git a/examples/ipsec-secgw/ipsec-secgw.c b/examples/ipsec-secgw/ipsec-secgw.c
> index d451b3d..a6cb342 100644
> --- a/examples/ipsec-secgw/ipsec-secgw.c
> +++ b/examples/ipsec-secgw/ipsec-secgw.c
> @@ -161,6 +161,7 @@ static int32_t numa_on = 1; /**< NUMA is enabled by default. */
> static uint32_t nb_lcores;
> static uint32_t single_sa;
> static uint32_t single_sa_idx;
> +static uint32_t frame_size;
>
> struct lcore_rx_queue {
> uint16_t port_id;
> @@ -204,11 +205,9 @@ static struct rte_eth_conf port_conf = {
> .mq_mode = ETH_MQ_RX_RSS,
> .max_rx_pkt_len = ETHER_MAX_LEN,
> .split_hdr_size = 0,
> - .header_split = 0, /**< Header Split disabled */
> - .hw_ip_checksum = 1, /**< IP checksum offload enabled */
> - .hw_vlan_filter = 0, /**< VLAN filtering disabled */
> - .jumbo_frame = 0, /**< Jumbo Frame Support disabled */
> - .hw_strip_crc = 1, /**< CRC stripped by hardware */
> + .offloads = DEV_RX_OFFLOAD_CHECKSUM |
> + DEV_RX_OFFLOAD_CRC_STRIP,
> + .ignore_offload_bitfield = 1,
> },
IMO change the port_conf struct should be a different patch.
Thanks!
> .rx_adv_conf = {
> .rss_conf = {
> @@ -845,6 +844,7 @@ print_usage(const char *prgname)
> " -p PORTMASK: hexadecimal bitmask of ports to configure\n"
> " -P : enable promiscuous mode\n"
> " -u PORTMASK: hexadecimal bitmask of unprotected ports\n"
> + " -j FRAMESIZE: jumbo frame maximum size\n"
> " --"OPTION_CONFIG": (port,queue,lcore): "
> "rx queues configuration\n"
> " --single-sa SAIDX: use single SA index for outbound, "
> @@ -983,7 +983,7 @@ parse_args(int32_t argc, char **argv)
>
> argvopt = argv;
>
> - while ((opt = getopt_long(argc, argvopt, "p:Pu:f:",
> + while ((opt = getopt_long(argc, argvopt, "p:Pu:f:j:",
> lgopts, &option_index)) != EOF) {
>
> switch (opt) {
> @@ -1022,6 +1022,19 @@ parse_args(int32_t argc, char **argv)
> }
> f_present = 1;
> break;
> + case 'j':
> + {
> + int32_t size = parse_decimal(optarg);
> + if (size <= 1518) {
> + printf("Invalid jumbo frame size\n"
> + "Using default value 9000\n");
> + frame_size = 9000;
> + } else {
> + frame_size = size;
> + }
> + }
> + printf("Enabled jumbo frames size %u\n", frame_size);
> + break;
> case 0:
> if (parse_args_long_options(lgopts, option_index)) {
> print_usage(prgname);
> @@ -1359,6 +1372,11 @@ port_init(uint16_t portid)
> printf("Creating queues: nb_rx_queue=%d nb_tx_queue=%u...\n",
> nb_rx_queue, nb_tx_queue);
>
> + if (frame_size) {
> + port_conf.rxmode.max_rx_pkt_len = frame_size;
> + port_conf.rxmode.offloads |= DEV_RX_OFFLOAD_JUMBO_FRAME;
> + }
> +
> ret = rte_eth_dev_configure(portid, nb_rx_queue, nb_tx_queue,
> &port_conf);
> if (ret < 0)
> @@ -1423,11 +1441,14 @@ static void
> pool_init(struct socket_ctx *ctx, int32_t socket_id, uint32_t nb_mbuf)
> {
> char s[64];
> + uint32_t buff_size = frame_size ? (frame_size + RTE_PKTMBUF_HEADROOM) :
> + RTE_MBUF_DEFAULT_BUF_SIZE;
> +
>
> snprintf(s, sizeof(s), "mbuf_pool_%d", socket_id);
> ctx->mbuf_pool = rte_pktmbuf_pool_create(s, nb_mbuf,
> MEMPOOL_CACHE_SIZE, ipsec_metadata_size(),
> - RTE_MBUF_DEFAULT_BUF_SIZE,
> + buff_size,
> socket_id);
> if (ctx->mbuf_pool == NULL)
> rte_exit(EXIT_FAILURE, "Cannot init mbuf pool on socket %d\n",
@@ -119,7 +119,7 @@ The application has a number of command line options::
./build/ipsec-secgw [EAL options] --
- -p PORTMASK -P -u PORTMASK
+ -p PORTMASK -P -u PORTMASK -j FRAMESIZE
--config (port,queue,lcore)[,(port,queue,lcore]
--single-sa SAIDX
-f CONFIG_FILE_PATH
@@ -135,6 +135,10 @@ Where:
* ``-u PORTMASK``: hexadecimal bitmask of unprotected ports
+* ``-j FRAMESIZE``: *optional*. Enables jumbo frames with the maximum size
+ specified as FRAMESIZE. If an invalid value is provided as FRAMESIZE
+ then the default value 9000 is used.
+
* ``--config (port,queue,lcore)[,(port,queue,lcore)]``: determines which queues
from which ports are mapped to which cores.
@@ -161,6 +161,7 @@ static int32_t numa_on = 1; /**< NUMA is enabled by default. */
static uint32_t nb_lcores;
static uint32_t single_sa;
static uint32_t single_sa_idx;
+static uint32_t frame_size;
struct lcore_rx_queue {
uint16_t port_id;
@@ -204,11 +205,9 @@ static struct rte_eth_conf port_conf = {
.mq_mode = ETH_MQ_RX_RSS,
.max_rx_pkt_len = ETHER_MAX_LEN,
.split_hdr_size = 0,
- .header_split = 0, /**< Header Split disabled */
- .hw_ip_checksum = 1, /**< IP checksum offload enabled */
- .hw_vlan_filter = 0, /**< VLAN filtering disabled */
- .jumbo_frame = 0, /**< Jumbo Frame Support disabled */
- .hw_strip_crc = 1, /**< CRC stripped by hardware */
+ .offloads = DEV_RX_OFFLOAD_CHECKSUM |
+ DEV_RX_OFFLOAD_CRC_STRIP,
+ .ignore_offload_bitfield = 1,
},
.rx_adv_conf = {
.rss_conf = {
@@ -845,6 +844,7 @@ print_usage(const char *prgname)
" -p PORTMASK: hexadecimal bitmask of ports to configure\n"
" -P : enable promiscuous mode\n"
" -u PORTMASK: hexadecimal bitmask of unprotected ports\n"
+ " -j FRAMESIZE: jumbo frame maximum size\n"
" --"OPTION_CONFIG": (port,queue,lcore): "
"rx queues configuration\n"
" --single-sa SAIDX: use single SA index for outbound, "
@@ -983,7 +983,7 @@ parse_args(int32_t argc, char **argv)
argvopt = argv;
- while ((opt = getopt_long(argc, argvopt, "p:Pu:f:",
+ while ((opt = getopt_long(argc, argvopt, "p:Pu:f:j:",
lgopts, &option_index)) != EOF) {
switch (opt) {
@@ -1022,6 +1022,19 @@ parse_args(int32_t argc, char **argv)
}
f_present = 1;
break;
+ case 'j':
+ {
+ int32_t size = parse_decimal(optarg);
+ if (size <= 1518) {
+ printf("Invalid jumbo frame size\n"
+ "Using default value 9000\n");
+ frame_size = 9000;
+ } else {
+ frame_size = size;
+ }
+ }
+ printf("Enabled jumbo frames size %u\n", frame_size);
+ break;
case 0:
if (parse_args_long_options(lgopts, option_index)) {
print_usage(prgname);
@@ -1359,6 +1372,11 @@ port_init(uint16_t portid)
printf("Creating queues: nb_rx_queue=%d nb_tx_queue=%u...\n",
nb_rx_queue, nb_tx_queue);
+ if (frame_size) {
+ port_conf.rxmode.max_rx_pkt_len = frame_size;
+ port_conf.rxmode.offloads |= DEV_RX_OFFLOAD_JUMBO_FRAME;
+ }
+
ret = rte_eth_dev_configure(portid, nb_rx_queue, nb_tx_queue,
&port_conf);
if (ret < 0)
@@ -1423,11 +1441,14 @@ static void
pool_init(struct socket_ctx *ctx, int32_t socket_id, uint32_t nb_mbuf)
{
char s[64];
+ uint32_t buff_size = frame_size ? (frame_size + RTE_PKTMBUF_HEADROOM) :
+ RTE_MBUF_DEFAULT_BUF_SIZE;
+
snprintf(s, sizeof(s), "mbuf_pool_%d", socket_id);
ctx->mbuf_pool = rte_pktmbuf_pool_create(s, nb_mbuf,
MEMPOOL_CACHE_SIZE, ipsec_metadata_size(),
- RTE_MBUF_DEFAULT_BUF_SIZE,
+ buff_size,
socket_id);
if (ctx->mbuf_pool == NULL)
rte_exit(EXIT_FAILURE, "Cannot init mbuf pool on socket %d\n",