net/sfc: periodic management EVQ polling using alarm
[dpdk.git] / app / test-pmd / cmdline.c
index 23f4b48..b4f35c3 100644 (file)
@@ -275,6 +275,18 @@ static void cmd_help_long_parsed(void *parsed_result,
 
                        "set vf mac antispoof (port_id) (vf_id) (on|off).\n"
                        "    Set MAC antispoof for a VF from the PF.\n\n"
+
+                       "set macsec offload (port_id) on encrypt (on|off) replay-protect (on|off)\n"
+                       "    Enable MACsec offload.\n\n"
+
+                       "set macsec offload (port_id) off\n"
+                       "    Disable MACsec offload.\n\n"
+
+                       "set macsec sc (tx|rx) (port_id) (mac) (pi)\n"
+                       "    Configure MACsec secure connection (SC).\n\n"
+
+                       "set macsec sa (tx|rx) (port_id) (idx) (an) (pn) (key)\n"
+                       "    Configure MACsec secure association (SA).\n\n"
 #endif
 
                        "vlan set strip (on|off) (port_id)\n"
@@ -831,6 +843,9 @@ static void cmd_help_long_parsed(void *parsed_result,
                        "flow flush {port_id}\n"
                        "    Destroy all flow rules.\n\n"
 
+                       "flow query {port_id} {rule_id} {action}\n"
+                       "    Query an existing flow rule.\n\n"
+
                        "flow list {port_id} [group {group_id}] [...]\n"
                        "    List existing flow rules sorted by priority,"
                        " filtered by group identifiers.\n\n"
@@ -10883,6 +10898,9 @@ cmd_set_vf_vlan_anti_spoof_parsed(
        int ret = 0;
        int is_on = (strcmp(res->on_off, "on") == 0) ? 1 : 0;
 
+       if (port_id_is_invalid(res->port_id, ENABLED_WARN))
+               return;
+
        ret = rte_pmd_ixgbe_set_vf_vlan_anti_spoof(res->port_id, res->vf_id,
                        is_on);
        switch (ret) {
@@ -10968,6 +10986,9 @@ cmd_set_vf_mac_anti_spoof_parsed(
        int ret;
        int is_on = (strcmp(res->on_off, "on") == 0) ? 1 : 0;
 
+       if (port_id_is_invalid(res->port_id, ENABLED_WARN))
+               return;
+
        ret = rte_pmd_ixgbe_set_vf_mac_anti_spoof(res->port_id, res->vf_id,
                        is_on);
        switch (ret) {
@@ -11053,6 +11074,9 @@ cmd_set_vf_vlan_stripq_parsed(
        int ret = 0;
        int is_on = (strcmp(res->on_off, "on") == 0) ? 1 : 0;
 
+       if (port_id_is_invalid(res->port_id, ENABLED_WARN))
+               return;
+
        ret = rte_pmd_ixgbe_set_vf_vlan_stripq(res->port_id, res->vf_id, is_on);
        switch (ret) {
        case 0:
@@ -11136,6 +11160,9 @@ cmd_set_vf_vlan_insert_parsed(
        struct cmd_vf_vlan_insert_result *res = parsed_result;
        int ret;
 
+       if (port_id_is_invalid(res->port_id, ENABLED_WARN))
+               return;
+
        ret = rte_pmd_ixgbe_set_vf_vlan_insert(res->port_id, res->vf_id, res->vlan_id);
        switch (ret) {
        case 0:
@@ -11210,6 +11237,9 @@ cmd_set_tx_loopback_parsed(
        int ret;
        int is_on = (strcmp(res->on_off, "on") == 0) ? 1 : 0;
 
+       if (port_id_is_invalid(res->port_id, ENABLED_WARN))
+               return;
+
        ret = rte_pmd_ixgbe_set_tx_loopback(res->port_id, is_on);
        switch (ret) {
        case 0:
@@ -11287,6 +11317,9 @@ cmd_set_all_queues_drop_en_parsed(
        int ret = 0;
        int is_on = (strcmp(res->on_off, "on") == 0) ? 1 : 0;
 
+       if (port_id_is_invalid(res->port_id, ENABLED_WARN))
+               return;
+
        ret = rte_pmd_ixgbe_set_all_queues_drop_en(res->port_id, is_on);
        switch (ret) {
        case 0:
@@ -11370,6 +11403,9 @@ cmd_set_vf_split_drop_en_parsed(
        int ret;
        int is_on = (strcmp(res->on_off, "on") == 0) ? 1 : 0;
 
+       if (port_id_is_invalid(res->port_id, ENABLED_WARN))
+               return;
+
        ret = rte_pmd_ixgbe_set_vf_split_drop_en(res->port_id, res->vf_id,
                        is_on);
        switch (ret) {
@@ -11454,6 +11490,9 @@ cmd_set_vf_mac_addr_parsed(
        struct cmd_set_vf_mac_addr_result *res = parsed_result;
        int ret;
 
+       if (port_id_is_invalid(res->port_id, ENABLED_WARN))
+               return;
+
        ret = rte_pmd_ixgbe_set_vf_mac_addr(res->port_id, res->vf_id,
                        &res->mac_addr);
        switch (ret) {
@@ -11485,6 +11524,379 @@ cmdline_parse_inst_t cmd_set_vf_mac_addr = {
                NULL,
        },
 };
+
+/* MACsec configuration */
+
+/* Common result structure for MACsec offload enable */
+struct cmd_macsec_offload_on_result {
+       cmdline_fixed_string_t set;
+       cmdline_fixed_string_t macsec;
+       cmdline_fixed_string_t offload;
+       uint8_t port_id;
+       cmdline_fixed_string_t on;
+       cmdline_fixed_string_t encrypt;
+       cmdline_fixed_string_t en_on_off;
+       cmdline_fixed_string_t replay_protect;
+       cmdline_fixed_string_t rp_on_off;
+};
+
+/* Common CLI fields for MACsec offload disable */
+cmdline_parse_token_string_t cmd_macsec_offload_on_set =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_macsec_offload_on_result,
+                set, "set");
+cmdline_parse_token_string_t cmd_macsec_offload_on_macsec =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_macsec_offload_on_result,
+                macsec, "macsec");
+cmdline_parse_token_string_t cmd_macsec_offload_on_offload =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_macsec_offload_on_result,
+                offload, "offload");
+cmdline_parse_token_num_t cmd_macsec_offload_on_port_id =
+       TOKEN_NUM_INITIALIZER
+               (struct cmd_macsec_offload_on_result,
+                port_id, UINT8);
+cmdline_parse_token_string_t cmd_macsec_offload_on_on =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_macsec_offload_on_result,
+                on, "on");
+cmdline_parse_token_string_t cmd_macsec_offload_on_encrypt =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_macsec_offload_on_result,
+                encrypt, "encrypt");
+cmdline_parse_token_string_t cmd_macsec_offload_on_en_on_off =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_macsec_offload_on_result,
+                en_on_off, "on#off");
+cmdline_parse_token_string_t cmd_macsec_offload_on_replay_protect =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_macsec_offload_on_result,
+                replay_protect, "replay-protect");
+cmdline_parse_token_string_t cmd_macsec_offload_on_rp_on_off =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_macsec_offload_on_result,
+                rp_on_off, "on#off");
+
+static void
+cmd_set_macsec_offload_on_parsed(
+       void *parsed_result,
+       __attribute__((unused)) struct cmdline *cl,
+       __attribute__((unused)) void *data)
+{
+       struct cmd_macsec_offload_on_result *res = parsed_result;
+       int ret;
+       portid_t port_id = res->port_id;
+       int en = (strcmp(res->en_on_off, "on") == 0) ? 1 : 0;
+       int rp = (strcmp(res->rp_on_off, "on") == 0) ? 1 : 0;
+
+       if (port_id_is_invalid(port_id, ENABLED_WARN))
+               return;
+
+       ports[port_id].tx_ol_flags |= TESTPMD_TX_OFFLOAD_MACSEC;
+       ret = rte_pmd_ixgbe_macsec_enable(port_id, en, rp);
+
+       switch (ret) {
+       case 0:
+               break;
+       case -ENODEV:
+               printf("invalid port_id %d\n", port_id);
+               break;
+       default:
+               printf("programming error: (%s)\n", strerror(-ret));
+       }
+}
+
+cmdline_parse_inst_t cmd_set_macsec_offload_on = {
+       .f = cmd_set_macsec_offload_on_parsed,
+       .data = NULL,
+       .help_str = "set macsec offload <port_id> on "
+               "encrypt on|off replay-protect on|off",
+       .tokens = {
+               (void *)&cmd_macsec_offload_on_set,
+               (void *)&cmd_macsec_offload_on_macsec,
+               (void *)&cmd_macsec_offload_on_offload,
+               (void *)&cmd_macsec_offload_on_port_id,
+               (void *)&cmd_macsec_offload_on_on,
+               (void *)&cmd_macsec_offload_on_encrypt,
+               (void *)&cmd_macsec_offload_on_en_on_off,
+               (void *)&cmd_macsec_offload_on_replay_protect,
+               (void *)&cmd_macsec_offload_on_rp_on_off,
+               NULL,
+       },
+};
+
+/* Common result structure for MACsec offload disable */
+struct cmd_macsec_offload_off_result {
+       cmdline_fixed_string_t set;
+       cmdline_fixed_string_t macsec;
+       cmdline_fixed_string_t offload;
+       uint8_t port_id;
+       cmdline_fixed_string_t off;
+};
+
+/* Common CLI fields for MACsec offload disable */
+cmdline_parse_token_string_t cmd_macsec_offload_off_set =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_macsec_offload_off_result,
+                set, "set");
+cmdline_parse_token_string_t cmd_macsec_offload_off_macsec =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_macsec_offload_off_result,
+                macsec, "macsec");
+cmdline_parse_token_string_t cmd_macsec_offload_off_offload =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_macsec_offload_off_result,
+                offload, "offload");
+cmdline_parse_token_num_t cmd_macsec_offload_off_port_id =
+       TOKEN_NUM_INITIALIZER
+               (struct cmd_macsec_offload_off_result,
+                port_id, UINT8);
+cmdline_parse_token_string_t cmd_macsec_offload_off_off =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_macsec_offload_off_result,
+                off, "off");
+
+static void
+cmd_set_macsec_offload_off_parsed(
+       void *parsed_result,
+       __attribute__((unused)) struct cmdline *cl,
+       __attribute__((unused)) void *data)
+{
+       struct cmd_macsec_offload_off_result *res = parsed_result;
+       int ret;
+       portid_t port_id = res->port_id;
+
+       if (port_id_is_invalid(port_id, ENABLED_WARN))
+               return;
+
+       ports[port_id].tx_ol_flags &= ~TESTPMD_TX_OFFLOAD_MACSEC;
+       ret = rte_pmd_ixgbe_macsec_disable(port_id);
+
+       switch (ret) {
+       case 0:
+               break;
+       case -ENODEV:
+               printf("invalid port_id %d\n", port_id);
+               break;
+       default:
+               printf("programming error: (%s)\n", strerror(-ret));
+       }
+}
+
+cmdline_parse_inst_t cmd_set_macsec_offload_off = {
+       .f = cmd_set_macsec_offload_off_parsed,
+       .data = NULL,
+       .help_str = "set macsec offload <port_id> off",
+       .tokens = {
+               (void *)&cmd_macsec_offload_off_set,
+               (void *)&cmd_macsec_offload_off_macsec,
+               (void *)&cmd_macsec_offload_off_offload,
+               (void *)&cmd_macsec_offload_off_port_id,
+               (void *)&cmd_macsec_offload_off_off,
+               NULL,
+       },
+};
+
+/* Common result structure for MACsec secure connection configure */
+struct cmd_macsec_sc_result {
+       cmdline_fixed_string_t set;
+       cmdline_fixed_string_t macsec;
+       cmdline_fixed_string_t sc;
+       cmdline_fixed_string_t tx_rx;
+       uint8_t port_id;
+       struct ether_addr mac;
+       uint16_t pi;
+};
+
+/* Common CLI fields for MACsec secure connection configure */
+cmdline_parse_token_string_t cmd_macsec_sc_set =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_macsec_sc_result,
+                set, "set");
+cmdline_parse_token_string_t cmd_macsec_sc_macsec =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_macsec_sc_result,
+                macsec, "macsec");
+cmdline_parse_token_string_t cmd_macsec_sc_sc =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_macsec_sc_result,
+                sc, "sc");
+cmdline_parse_token_string_t cmd_macsec_sc_tx_rx =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_macsec_sc_result,
+                tx_rx, "tx#rx");
+cmdline_parse_token_num_t cmd_macsec_sc_port_id =
+       TOKEN_NUM_INITIALIZER
+               (struct cmd_macsec_sc_result,
+                port_id, UINT8);
+cmdline_parse_token_etheraddr_t cmd_macsec_sc_mac =
+       TOKEN_ETHERADDR_INITIALIZER
+               (struct cmd_macsec_sc_result,
+                mac);
+cmdline_parse_token_num_t cmd_macsec_sc_pi =
+       TOKEN_NUM_INITIALIZER
+               (struct cmd_macsec_sc_result,
+                pi, UINT16);
+
+static void
+cmd_set_macsec_sc_parsed(
+       void *parsed_result,
+       __attribute__((unused)) struct cmdline *cl,
+       __attribute__((unused)) void *data)
+{
+       struct cmd_macsec_sc_result *res = parsed_result;
+       int ret;
+       int is_tx = (strcmp(res->tx_rx, "tx") == 0) ? 1 : 0;
+
+       ret = is_tx ?
+               rte_pmd_ixgbe_macsec_config_txsc(res->port_id,
+                               res->mac.addr_bytes) :
+               rte_pmd_ixgbe_macsec_config_rxsc(res->port_id,
+                               res->mac.addr_bytes, res->pi);
+       switch (ret) {
+       case 0:
+               break;
+       case -ENODEV:
+               printf("invalid port_id %d\n", res->port_id);
+               break;
+       default:
+               printf("programming error: (%s)\n", strerror(-ret));
+       }
+}
+
+cmdline_parse_inst_t cmd_set_macsec_sc = {
+       .f = cmd_set_macsec_sc_parsed,
+       .data = NULL,
+       .help_str = "set macsec sc tx|rx <port_id> <mac> <pi>",
+       .tokens = {
+               (void *)&cmd_macsec_sc_set,
+               (void *)&cmd_macsec_sc_macsec,
+               (void *)&cmd_macsec_sc_sc,
+               (void *)&cmd_macsec_sc_tx_rx,
+               (void *)&cmd_macsec_sc_port_id,
+               (void *)&cmd_macsec_sc_mac,
+               (void *)&cmd_macsec_sc_pi,
+               NULL,
+       },
+};
+
+/* Common result structure for MACsec secure connection configure */
+struct cmd_macsec_sa_result {
+       cmdline_fixed_string_t set;
+       cmdline_fixed_string_t macsec;
+       cmdline_fixed_string_t sa;
+       cmdline_fixed_string_t tx_rx;
+       uint8_t port_id;
+       uint8_t idx;
+       uint8_t an;
+       uint32_t pn;
+       cmdline_fixed_string_t key;
+};
+
+/* Common CLI fields for MACsec secure connection configure */
+cmdline_parse_token_string_t cmd_macsec_sa_set =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_macsec_sa_result,
+                set, "set");
+cmdline_parse_token_string_t cmd_macsec_sa_macsec =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_macsec_sa_result,
+                macsec, "macsec");
+cmdline_parse_token_string_t cmd_macsec_sa_sa =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_macsec_sa_result,
+                sa, "sa");
+cmdline_parse_token_string_t cmd_macsec_sa_tx_rx =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_macsec_sa_result,
+                tx_rx, "tx#rx");
+cmdline_parse_token_num_t cmd_macsec_sa_port_id =
+       TOKEN_NUM_INITIALIZER
+               (struct cmd_macsec_sa_result,
+                port_id, UINT8);
+cmdline_parse_token_num_t cmd_macsec_sa_idx =
+       TOKEN_NUM_INITIALIZER
+               (struct cmd_macsec_sa_result,
+                idx, UINT8);
+cmdline_parse_token_num_t cmd_macsec_sa_an =
+       TOKEN_NUM_INITIALIZER
+               (struct cmd_macsec_sa_result,
+                an, UINT8);
+cmdline_parse_token_num_t cmd_macsec_sa_pn =
+       TOKEN_NUM_INITIALIZER
+               (struct cmd_macsec_sa_result,
+                pn, UINT32);
+cmdline_parse_token_string_t cmd_macsec_sa_key =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_macsec_sa_result,
+                key, NULL);
+
+static void
+cmd_set_macsec_sa_parsed(
+       void *parsed_result,
+       __attribute__((unused)) struct cmdline *cl,
+       __attribute__((unused)) void *data)
+{
+       struct cmd_macsec_sa_result *res = parsed_result;
+       int ret;
+       int is_tx = (strcmp(res->tx_rx, "tx") == 0) ? 1 : 0;
+       uint8_t key[16] = { 0 };
+       uint8_t xdgt0;
+       uint8_t xdgt1;
+       int key_len;
+       int i;
+
+       key_len = strlen(res->key) / 2;
+       if (key_len > 16)
+               key_len = 16;
+
+       for (i = 0; i < key_len; i++) {
+               xdgt0 = parse_and_check_key_hexa_digit(res->key, (i * 2));
+               if (xdgt0 == 0xFF)
+                       return;
+               xdgt1 = parse_and_check_key_hexa_digit(res->key, (i * 2) + 1);
+               if (xdgt1 == 0xFF)
+                       return;
+               key[i] = (uint8_t) ((xdgt0 * 16) + xdgt1);
+       }
+
+       ret = is_tx ?
+               rte_pmd_ixgbe_macsec_select_txsa(res->port_id,
+                       res->idx, res->an, res->pn, key) :
+               rte_pmd_ixgbe_macsec_select_rxsa(res->port_id,
+                       res->idx, res->an, res->pn, key);
+       switch (ret) {
+       case 0:
+               break;
+       case -EINVAL:
+               printf("invalid idx %d or an %d\n", res->idx, res->an);
+               break;
+       case -ENODEV:
+               printf("invalid port_id %d\n", res->port_id);
+               break;
+       default:
+               printf("programming error: (%s)\n", strerror(-ret));
+       }
+}
+
+cmdline_parse_inst_t cmd_set_macsec_sa = {
+       .f = cmd_set_macsec_sa_parsed,
+       .data = NULL,
+       .help_str = "set macsec sa tx|rx <port_id> <idx> <an> <pn> <key>",
+       .tokens = {
+               (void *)&cmd_macsec_sa_set,
+               (void *)&cmd_macsec_sa_macsec,
+               (void *)&cmd_macsec_sa_sa,
+               (void *)&cmd_macsec_sa_tx_rx,
+               (void *)&cmd_macsec_sa_port_id,
+               (void *)&cmd_macsec_sa_idx,
+               (void *)&cmd_macsec_sa_an,
+               (void *)&cmd_macsec_sa_pn,
+               (void *)&cmd_macsec_sa_key,
+               NULL,
+       },
+};
 #endif
 
 /* ******************************************************************************** */
@@ -11653,6 +12065,10 @@ cmdline_parse_ctx_t main_ctx[] = {
        (cmdline_parse_inst_t *)&cmd_set_all_queues_drop_en,
        (cmdline_parse_inst_t *)&cmd_set_vf_split_drop_en,
        (cmdline_parse_inst_t *)&cmd_set_vf_mac_addr,
+       (cmdline_parse_inst_t *)&cmd_set_macsec_offload_on,
+       (cmdline_parse_inst_t *)&cmd_set_macsec_offload_off,
+       (cmdline_parse_inst_t *)&cmd_set_macsec_sc,
+       (cmdline_parse_inst_t *)&cmd_set_macsec_sa,
 #endif
        NULL,
 };