examples/ip_pipeline: support QinQ PPPoE encapsulation
[dpdk.git] / examples / ip_pipeline / cli.c
index 3de6206..7421585 100644 (file)
@@ -790,7 +790,8 @@ cmd_kni(char **tokens,
 static const char cmd_cryptodev_help[] =
 "cryptodev <cryptodev_name>\n"
 "   dev <device_name> | dev_id <device_id>\n"
-"   queue <n_queues> <queue_size>\n";
+"   queue <n_queues> <queue_size>\n"
+"   max_sessions <n_sessions>";
 
 static void
 cmd_cryptodev(char **tokens,
@@ -802,7 +803,7 @@ cmd_cryptodev(char **tokens,
        char *name;
 
        memset(&params, 0, sizeof(params));
-       if (n_tokens != 7) {
+       if (n_tokens != 9) {
                snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
                return;
        }
@@ -825,7 +826,7 @@ cmd_cryptodev(char **tokens,
 
        if (strcmp(tokens[4], "queue")) {
                snprintf(out, out_size, MSG_ARG_NOT_FOUND,
-                       "4");
+                       "queue");
                return;
        }
 
@@ -841,6 +842,18 @@ cmd_cryptodev(char **tokens,
                return;
        }
 
+       if (strcmp(tokens[7], "max_sessions")) {
+               snprintf(out, out_size, MSG_ARG_NOT_FOUND,
+                       "max_sessions");
+               return;
+       }
+
+       if (parser_read_uint32(&params.session_pool_size, tokens[8]) < 0) {
+               snprintf(out, out_size, MSG_ARG_INVALID,
+                       "queue_size");
+               return;
+       }
+
        if (cryptodev_create(name, &params) == NULL) {
                snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
                return;
@@ -1022,7 +1035,7 @@ static const char cmd_table_action_profile_help[] =
 "       tc <n_tc>\n"
 "       stats none | pkts | bytes | both]\n"
 "   [tm spp <n_subports_per_port> pps <n_pipes_per_subport>]\n"
-"   [encap ether | vlan | qinq | mpls | pppoe |\n"
+"   [encap ether | vlan | qinq | mpls | pppoe | qinq_pppoe \n"
 "       vxlan offset <ether_offset> ipv4 | ipv6 vlan on | off]\n"
 "   [nat src | dst\n"
 "       proto udp | tcp]\n"
@@ -1030,9 +1043,7 @@ static const char cmd_table_action_profile_help[] =
 "       stats none | pkts]\n"
 "   [stats pkts | bytes | both]\n"
 "   [time]\n"
-"   [sym_crypto dev <CRYPTODEV_NAME> offset <op_offset> "
-"       mempool_create <mempool_name>\n"
-"       mempool_init <mempool_name>]\n"
+"   [sym_crypto dev <CRYPTODEV_NAME> offset <op_offset>]\n"
 "   [tag]\n"
 "   [decap]\n";
 
@@ -1290,7 +1301,10 @@ cmd_table_action_profile(char **tokens,
 
                        p.encap.encap_mask = 1LLU << RTE_TABLE_ACTION_ENCAP_VXLAN;
                        n_extra_tokens = 5;
-               } else {
+               } else if (strcmp(tokens[t0 + 1], "qinq_pppoe") == 0)
+                       p.encap.encap_mask =
+                               1LLU << RTE_TABLE_ACTION_ENCAP_QINQ_PPPOE;
+               else {
                        snprintf(out, out_size, MSG_ARG_MISMATCH, "encap");
                        return;
                }
@@ -1404,13 +1418,10 @@ cmd_table_action_profile(char **tokens,
 
        if ((t0 < n_tokens) && (strcmp(tokens[t0], "sym_crypto") == 0)) {
                struct cryptodev *cryptodev;
-               struct mempool *mempool;
 
-               if (n_tokens < t0 + 9 ||
+               if (n_tokens < t0 + 5 ||
                                strcmp(tokens[t0 + 1], "dev") ||
-                               strcmp(tokens[t0 + 3], "offset") ||
-                               strcmp(tokens[t0 + 5], "mempool_create") ||
-                               strcmp(tokens[t0 + 7], "mempool_init")) {
+                               strcmp(tokens[t0 + 3], "offset")) {
                        snprintf(out, out_size, MSG_ARG_MISMATCH,
                                "table action profile sym_crypto");
                        return;
@@ -1432,25 +1443,12 @@ cmd_table_action_profile(char **tokens,
                        return;
                }
 
-               mempool = mempool_find(tokens[t0 + 6]);
-               if (mempool == NULL) {
-                       snprintf(out, out_size, MSG_ARG_INVALID,
-                               "table action profile sym_crypto");
-                       return;
-               }
-               p.sym_crypto.mp_create = mempool->m;
-
-               mempool = mempool_find(tokens[t0 + 8]);
-               if (mempool == NULL) {
-                       snprintf(out, out_size, MSG_ARG_INVALID,
-                               "table action profile sym_crypto");
-                       return;
-               }
-               p.sym_crypto.mp_init = mempool->m;
+               p.sym_crypto.mp_create = cryptodev->mp_create;
+               p.sym_crypto.mp_init = cryptodev->mp_init;
 
                p.action_mask |= 1LLU << RTE_TABLE_ACTION_SYM_CRYPTO;
 
-               t0 += 9;
+               t0 += 5;
        } /* sym_crypto */
 
        if ((t0 < n_tokens) && (strcmp(tokens[t0], "tag") == 0)) {
@@ -3090,6 +3088,7 @@ parse_match(char **tokens,
  *       ether <da> <sa>
  *       | vlan <da> <sa> <pcp> <dei> <vid>
  *       | qinq <da> <sa> <pcp> <dei> <vid> <pcp> <dei> <vid>
+ *       | qinq_pppoe <da> <sa> <pcp> <dei> <vid> <pcp> <dei> <vid> <session_id>
  *       | mpls unicast | multicast
  *          <da> <sa>
  *          label0 <label> <tc> <ttl>
@@ -3391,6 +3390,44 @@ parse_table_action_encap(char **tokens,
                return 1 + 9;
        }
 
+       /* qinq_pppoe */
+       if (n_tokens && (strcmp(tokens[0], "qinq_pppoe") == 0)) {
+               uint32_t svlan_pcp, svlan_dei, svlan_vid;
+               uint32_t cvlan_pcp, cvlan_dei, cvlan_vid;
+
+               if ((n_tokens < 10) ||
+                       parse_mac_addr(tokens[1],
+                               &a->encap.qinq_pppoe.ether.da) ||
+                       parse_mac_addr(tokens[2],
+                               &a->encap.qinq_pppoe.ether.sa) ||
+                       parser_read_uint32(&svlan_pcp, tokens[3]) ||
+                       (svlan_pcp > 0x7) ||
+                       parser_read_uint32(&svlan_dei, tokens[4]) ||
+                       (svlan_dei > 0x1) ||
+                       parser_read_uint32(&svlan_vid, tokens[5]) ||
+                       (svlan_vid > 0xFFF) ||
+                       parser_read_uint32(&cvlan_pcp, tokens[6]) ||
+                       (cvlan_pcp > 0x7) ||
+                       parser_read_uint32(&cvlan_dei, tokens[7]) ||
+                       (cvlan_dei > 0x1) ||
+                       parser_read_uint32(&cvlan_vid, tokens[8]) ||
+                       (cvlan_vid > 0xFFF) ||
+                       parser_read_uint16(&a->encap.qinq_pppoe.pppoe.session_id,
+                               tokens[9]))
+                       return 0;
+
+               a->encap.qinq_pppoe.svlan.pcp = svlan_pcp & 0x7;
+               a->encap.qinq_pppoe.svlan.dei = svlan_dei & 0x1;
+               a->encap.qinq_pppoe.svlan.vid = svlan_vid & 0xFFF;
+               a->encap.qinq_pppoe.cvlan.pcp = cvlan_pcp & 0x7;
+               a->encap.qinq_pppoe.cvlan.dei = cvlan_dei & 0x1;
+               a->encap.qinq_pppoe.cvlan.vid = cvlan_vid & 0xFFF;
+               a->encap.type = RTE_TABLE_ACTION_ENCAP_QINQ_PPPOE;
+               a->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;
+               return 1 + 10;
+
+       }
+
        /* mpls */
        if (n_tokens && (strcmp(tokens[0], "mpls") == 0)) {
                uint32_t label, tc, ttl;
@@ -6841,20 +6878,26 @@ cli_rule_file_process(const char *file_name,
        return 0;
 
 cli_rule_file_process_free:
-       *rule_list = NULL;
-       *n_rules = rule_id;
-       *line_number = line_id;
+       if (rule_list != NULL)
+               *rule_list = NULL;
 
-       for ( ; ; ) {
-               struct table_rule *rule;
+       if (n_rules != NULL)
+               *n_rules = rule_id;
 
-               rule = TAILQ_FIRST(list);
-               if (rule == NULL)
-                       break;
+       if (line_number != NULL)
+               *line_number = line_id;
 
-               TAILQ_REMOVE(list, rule, node);
-               free(rule);
-       }
+       if (list != NULL)
+               for ( ; ; ) {
+                       struct table_rule *rule;
+
+                       rule = TAILQ_FIRST(list);
+                       if (rule == NULL)
+                               break;
+
+                       TAILQ_REMOVE(list, rule, node);
+                       free(rule);
+               }
 
        if (f)
                fclose(f);