doc: add tested platforms with NXP SoCs
[dpdk.git] / examples / ipsec-secgw / ipsec-secgw.c
index cb170e4..bf3dbf6 100644 (file)
@@ -115,6 +115,9 @@ struct flow_info flow_info_tbl[RTE_MAX_ETHPORTS];
 #define CMD_LINE_OPT_REASSEMBLE                "reassemble"
 #define CMD_LINE_OPT_MTU               "mtu"
 #define CMD_LINE_OPT_FRAG_TTL          "frag-ttl"
+#define CMD_LINE_OPT_EVENT_VECTOR      "event-vector"
+#define CMD_LINE_OPT_VECTOR_SIZE       "vector-size"
+#define CMD_LINE_OPT_VECTOR_TIMEOUT    "vector-tmo"
 
 #define CMD_LINE_ARG_EVENT     "event"
 #define CMD_LINE_ARG_POLL      "poll"
@@ -139,6 +142,9 @@ enum {
        CMD_LINE_OPT_REASSEMBLE_NUM,
        CMD_LINE_OPT_MTU_NUM,
        CMD_LINE_OPT_FRAG_TTL_NUM,
+       CMD_LINE_OPT_EVENT_VECTOR_NUM,
+       CMD_LINE_OPT_VECTOR_SIZE_NUM,
+       CMD_LINE_OPT_VECTOR_TIMEOUT_NUM,
 };
 
 static const struct option lgopts[] = {
@@ -152,6 +158,9 @@ static const struct option lgopts[] = {
        {CMD_LINE_OPT_REASSEMBLE, 1, 0, CMD_LINE_OPT_REASSEMBLE_NUM},
        {CMD_LINE_OPT_MTU, 1, 0, CMD_LINE_OPT_MTU_NUM},
        {CMD_LINE_OPT_FRAG_TTL, 1, 0, CMD_LINE_OPT_FRAG_TTL_NUM},
+       {CMD_LINE_OPT_EVENT_VECTOR, 0, 0, CMD_LINE_OPT_EVENT_VECTOR_NUM},
+       {CMD_LINE_OPT_VECTOR_SIZE, 1, 0, CMD_LINE_OPT_VECTOR_SIZE_NUM},
+       {CMD_LINE_OPT_VECTOR_TIMEOUT, 1, 0, CMD_LINE_OPT_VECTOR_TIMEOUT_NUM},
        {NULL, 0, 0, 0}
 };
 
@@ -164,7 +173,7 @@ static int32_t promiscuous_on = 1;
 static int32_t numa_on = 1; /**< NUMA is enabled by default. */
 static uint32_t nb_lcores;
 static uint32_t single_sa;
-static uint32_t nb_bufs_in_pool;
+uint32_t nb_bufs_in_pool;
 
 /*
  * RX/TX HW offload capabilities to enable/use on ethernet ports.
@@ -1440,6 +1449,9 @@ print_usage(const char *prgname)
                " [--" CMD_LINE_OPT_TX_OFFLOAD " TX_OFFLOAD_MASK]"
                " [--" CMD_LINE_OPT_REASSEMBLE " REASSEMBLE_TABLE_SIZE]"
                " [--" CMD_LINE_OPT_MTU " MTU]"
+               " [--event-vector]"
+               " [--vector-size SIZE]"
+               " [--vector-tmo TIMEOUT in ns]"
                "\n\n"
                "  -p PORTMASK: Hexadecimal bitmask of ports to configure\n"
                "  -P : Enable promiscuous mode\n"
@@ -1495,6 +1507,10 @@ print_usage(const char *prgname)
                "  --" CMD_LINE_OPT_FRAG_TTL " FRAG_TTL_NS"
                ": fragments lifetime in nanoseconds, default\n"
                "    and maximum value is 10.000.000.000 ns (10 s)\n"
+               "  --event-vector enables event vectorization\n"
+               "  --vector-size Max vector size (default value: 16)\n"
+               "  --vector-tmo Max vector timeout in nanoseconds"
+               "    (default value: 102400)\n"
                "\n",
                prgname);
 }
@@ -1661,6 +1677,7 @@ parse_args(int32_t argc, char **argv, struct eh_conf *eh_conf)
        int32_t option_index;
        char *prgname = argv[0];
        int32_t f_present = 0;
+       struct eventmode_conf *em_conf = NULL;
 
        argvopt = argv;
 
@@ -1855,6 +1872,28 @@ parse_args(int32_t argc, char **argv, struct eh_conf *eh_conf)
                        }
                        frag_ttl_ns = ret;
                        break;
+               case CMD_LINE_OPT_EVENT_VECTOR_NUM:
+                       em_conf = eh_conf->mode_params;
+                       em_conf->ext_params.event_vector = 1;
+                       break;
+               case CMD_LINE_OPT_VECTOR_SIZE_NUM:
+                       ret = parse_decimal(optarg);
+
+                       if (ret > MAX_PKT_BURST) {
+                               printf("Invalid argument for \'%s\': %s\n",
+                                       CMD_LINE_OPT_VECTOR_SIZE, optarg);
+                               print_usage(prgname);
+                               return -1;
+                       }
+                       em_conf = eh_conf->mode_params;
+                       em_conf->ext_params.vector_size = ret;
+                       break;
+               case CMD_LINE_OPT_VECTOR_TIMEOUT_NUM:
+                       ret = parse_decimal(optarg);
+
+                       em_conf = eh_conf->mode_params;
+                       em_conf->vector_tmo_ns = ret;
+                       break;
                default:
                        print_usage(prgname);
                        return -1;
@@ -2551,6 +2590,17 @@ inline_ipsec_event_callback(uint16_t port_id, enum rte_eth_event_type type,
        return -1;
 }
 
+static int
+ethdev_reset_event_callback(uint16_t port_id,
+               enum rte_eth_event_type type,
+                void *param __rte_unused, void *ret_param __rte_unused)
+{
+       printf("Reset Event on port id %d type %d\n", port_id, type);
+       printf("Force quit application");
+       force_quit = true;
+       return 0;
+}
+
 static uint16_t
 rx_callback(__rte_unused uint16_t port, __rte_unused uint16_t queue,
        struct rte_mbuf *pkt[], uint16_t nb_pkts,
@@ -2597,7 +2647,7 @@ rx_callback(__rte_unused uint16_t port, __rte_unused uint16_t queue,
                                rte_cpu_to_be_16(RTE_ETHER_TYPE_IPV6)) {
 
                        struct rte_ipv6_hdr *iph;
-                       struct ipv6_extension_fragment *fh;
+                       struct rte_ipv6_fragment_ext *fh;
 
                        iph = (struct rte_ipv6_hdr *)(eth + 1);
                        fh = rte_ipv6_frag_get_ipv6_fragment_header(iph);
@@ -2975,12 +3025,14 @@ handle_telemetry_cmd_ipsec_secgw_stats_outbound(const char *cmd __rte_unused,
        struct rte_tel_data *spd4_data = rte_tel_data_alloc();
        struct rte_tel_data *spd6_data = rte_tel_data_alloc();
        struct rte_tel_data *sad_data = rte_tel_data_alloc();
-
        unsigned int coreid = UINT32_MAX;
+       int rc = 0;
 
        /* verify allocated telemetry data structures */
-       if (!spd4_data || !spd6_data || !sad_data)
-               return -ENOMEM;
+       if (!spd4_data || !spd6_data || !sad_data) {
+               rc = -ENOMEM;
+               goto exit;
+       }
 
        /* initialize telemetry data structs as dicts */
        rte_tel_data_start_dict(data);
@@ -2991,8 +3043,10 @@ handle_telemetry_cmd_ipsec_secgw_stats_outbound(const char *cmd __rte_unused,
 
        if (params) {
                coreid = (uint32_t)atoi(params);
-               if (rte_lcore_is_enabled(coreid) == 0)
-                       return -EINVAL;
+               if (rte_lcore_is_enabled(coreid) == 0) {
+                       rc = -EINVAL;
+                       goto exit;
+               }
        }
 
        update_statistics(&total_stats, coreid);
@@ -3026,7 +3080,13 @@ handle_telemetry_cmd_ipsec_secgw_stats_outbound(const char *cmd __rte_unused,
 
        rte_tel_data_add_dict_container(data, "sad", sad_data, 0);
 
-       return 0;
+exit:
+       if (rc) {
+               rte_tel_data_free(spd4_data);
+               rte_tel_data_free(spd6_data);
+               rte_tel_data_free(sad_data);
+       }
+       return rc;
 }
 
 static int
@@ -3038,12 +3098,14 @@ handle_telemetry_cmd_ipsec_secgw_stats_inbound(const char *cmd __rte_unused,
        struct rte_tel_data *spd4_data = rte_tel_data_alloc();
        struct rte_tel_data *spd6_data = rte_tel_data_alloc();
        struct rte_tel_data *sad_data = rte_tel_data_alloc();
-
        unsigned int coreid = UINT32_MAX;
+       int rc = 0;
 
        /* verify allocated telemetry data structures */
-       if (!spd4_data || !spd6_data || !sad_data)
-               return -ENOMEM;
+       if (!spd4_data || !spd6_data || !sad_data) {
+               rc = -ENOMEM;
+               goto exit;
+       }
 
        /* initialize telemetry data structs as dicts */
        rte_tel_data_start_dict(data);
@@ -3055,8 +3117,10 @@ handle_telemetry_cmd_ipsec_secgw_stats_inbound(const char *cmd __rte_unused,
 
        if (params) {
                coreid = (uint32_t)atoi(params);
-               if (rte_lcore_is_enabled(coreid) == 0)
-                       return -EINVAL;
+               if (rte_lcore_is_enabled(coreid) == 0) {
+                       rc = -EINVAL;
+                       goto exit;
+               }
        }
 
        update_statistics(&total_stats, coreid);
@@ -3090,7 +3154,13 @@ handle_telemetry_cmd_ipsec_secgw_stats_inbound(const char *cmd __rte_unused,
 
        rte_tel_data_add_dict_container(data, "spd6", spd6_data, 0);
 
-       return 0;
+exit:
+       if (rc) {
+               rte_tel_data_free(spd4_data);
+               rte_tel_data_free(spd6_data);
+               rte_tel_data_free(sad_data);
+       }
+       return rc;
 }
 
 static int
@@ -3101,8 +3171,14 @@ handle_telemetry_cmd_ipsec_secgw_stats_routing(const char *cmd __rte_unused,
 
        struct rte_tel_data *lpm4_data = rte_tel_data_alloc();
        struct rte_tel_data *lpm6_data = rte_tel_data_alloc();
-
        unsigned int coreid = UINT32_MAX;
+       int rc = 0;
+
+       /* verify allocated telemetry data structures */
+       if (!lpm4_data || !lpm6_data) {
+               rc = -ENOMEM;
+               goto exit;
+       }
 
        /* initialize telemetry data structs as dicts */
        rte_tel_data_start_dict(data);
@@ -3112,8 +3188,10 @@ handle_telemetry_cmd_ipsec_secgw_stats_routing(const char *cmd __rte_unused,
 
        if (params) {
                coreid = (uint32_t)atoi(params);
-               if (rte_lcore_is_enabled(coreid) == 0)
-                       return -EINVAL;
+               if (rte_lcore_is_enabled(coreid) == 0) {
+                       rc = -EINVAL;
+                       goto exit;
+               }
        }
 
        update_statistics(&total_stats, coreid);
@@ -3130,7 +3208,12 @@ handle_telemetry_cmd_ipsec_secgw_stats_routing(const char *cmd __rte_unused,
 
        rte_tel_data_add_dict_container(data, "IPv6 LPM", lpm6_data, 0);
 
-       return 0;
+exit:
+       if (rc) {
+               rte_tel_data_free(lpm4_data);
+               rte_tel_data_free(lpm6_data);
+       }
+       return rc;
 }
 
 static void
@@ -3317,6 +3400,9 @@ main(int32_t argc, char **argv)
                                        rte_strerror(-ret), portid);
                }
 
+               rte_eth_dev_callback_register(portid, RTE_ETH_EVENT_INTR_RESET,
+                       ethdev_reset_event_callback, NULL);
+
                rte_eth_dev_callback_register(portid,
                        RTE_ETH_EVENT_IPSEC, inline_ipsec_event_callback, NULL);
        }