ethdev: add siblings iterators
[dpdk.git] / drivers / net / softnic / rte_eth_softnic_cli.c
index c6640d6..410eb54 100644 (file)
@@ -1092,7 +1092,7 @@ cmd_tap(struct pmd_internals *softnic,
 
 /**
  * cryptodev <tap_name> dev <device_name> | dev_id <device_id>
- * queue <n_queues> <queue_size>
+ * queue <n_queues> <queue_size> max_sessions <n_sessions>
  **/
 
 static void
@@ -1106,7 +1106,7 @@ cmd_cryptodev(struct pmd_internals *softnic,
        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;
        }
@@ -1145,6 +1145,19 @@ cmd_cryptodev(struct pmd_internals *softnic,
                return;
        }
 
+       if (strcmp(tokens[7], "max_sessions")) {
+               snprintf(out, out_size, MSG_ARG_NOT_FOUND,
+                       "4");
+               return;
+       }
+
+       if (softnic_parser_read_uint32(&params.session_pool_size, tokens[8])
+                       < 0) {
+               snprintf(out, out_size, MSG_ARG_INVALID,
+                       "q");
+               return;
+       }
+
        if (softnic_cryptodev_create(softnic, name, &params) == NULL) {
                snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
                return;
@@ -1335,7 +1348,7 @@ cmd_port_in_action_profile(struct pmd_internals *softnic,
  *      tc <n_tc>
  *      stats none | pkts | bytes | both]
  *  [tm spp <n_subports_per_port> pps <n_pipes_per_subport>]
- *  [encap ether | vlan | qinq | mpls | pppoe |
+ *  [encap ether | vlan | qinq | mpls | pppoe | qinq_pppoe |
  *      vxlan offset <ether_offset> ipv4 | ipv6 vlan on | off]
  *  [nat src | dst
  *      proto udp | tcp]
@@ -1612,10 +1625,14 @@ cmd_table_action_profile(struct pmd_internals *softnic,
                        p.encap.encap_mask = 1LLU << RTE_TABLE_ACTION_ENCAP_VXLAN;
                        n_extra_tokens = 5;
 
+               } 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;
                }
+
                p.action_mask |= 1LLU << RTE_TABLE_ACTION_ENCAP;
                t0 += 2 + n_extra_tokens;
        } /* encap */
@@ -1739,6 +1756,41 @@ cmd_table_action_profile(struct pmd_internals *softnic,
                t0 += 1;
        } /* decap */
 
+       if (t0 < n_tokens && (strcmp(tokens[t0], "sym_crypto") == 0)) {
+               struct softnic_cryptodev *cryptodev;
+
+               if (n_tokens < t0 + 5 ||
+                               strcmp(tokens[t0 + 1], "dev") ||
+                               strcmp(tokens[t0 + 3], "offset")) {
+                       snprintf(out, out_size, MSG_ARG_MISMATCH,
+                               "table action profile sym_crypto");
+                       return;
+               }
+
+               cryptodev = softnic_cryptodev_find(softnic, tokens[t0 + 2]);
+               if (cryptodev == NULL) {
+                       snprintf(out, out_size, MSG_ARG_INVALID,
+                               "table action profile sym_crypto");
+                       return;
+               }
+
+               p.sym_crypto.cryptodev_id = cryptodev->dev_id;
+
+               if (softnic_parser_read_uint32(&p.sym_crypto.op_offset,
+                               tokens[t0 + 4]) != 0) {
+                       snprintf(out, out_size, MSG_ARG_INVALID,
+                                       "table action profile sym_crypto");
+                       return;
+               }
+
+               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 += 5;
+       } /* sym_crypto */
+
        if (t0 < n_tokens) {
                snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
                return;
@@ -1867,7 +1919,7 @@ cmd_pipeline_port_in(struct pmd_internals *softnic,
 
                p.type = PORT_IN_RXQ;
 
-               strcpy(p.dev_name, tokens[t0 + 1]);
+               strlcpy(p.dev_name, tokens[t0 + 1], sizeof(p.dev_name));
 
                if (strcmp(tokens[t0 + 2], "rxq") != 0) {
                        snprintf(out, out_size, MSG_ARG_NOT_FOUND, "rxq");
@@ -1890,7 +1942,7 @@ cmd_pipeline_port_in(struct pmd_internals *softnic,
 
                p.type = PORT_IN_SWQ;
 
-               strcpy(p.dev_name, tokens[t0 + 1]);
+               strlcpy(p.dev_name, tokens[t0 + 1], sizeof(p.dev_name));
 
                t0 += 2;
        } else if (strcmp(tokens[t0], "tmgr") == 0) {
@@ -1902,7 +1954,7 @@ cmd_pipeline_port_in(struct pmd_internals *softnic,
 
                p.type = PORT_IN_TMGR;
 
-               strcpy(p.dev_name, tokens[t0 + 1]);
+               strlcpy(p.dev_name, tokens[t0 + 1], sizeof(p.dev_name));
 
                t0 += 2;
        } else if (strcmp(tokens[t0], "tap") == 0) {
@@ -1914,7 +1966,7 @@ cmd_pipeline_port_in(struct pmd_internals *softnic,
 
                p.type = PORT_IN_TAP;
 
-               strcpy(p.dev_name, tokens[t0 + 1]);
+               strlcpy(p.dev_name, tokens[t0 + 1], sizeof(p.dev_name));
 
                if (strcmp(tokens[t0 + 2], "mempool") != 0) {
                        snprintf(out, out_size, MSG_ARG_NOT_FOUND,
@@ -2009,7 +2061,8 @@ cmd_pipeline_port_in(struct pmd_internals *softnic,
                        return;
                }
 
-               strcpy(p.action_profile_name, tokens[t0 + 1]);
+               strlcpy(p.action_profile_name, tokens[t0 + 1],
+                       sizeof(p.action_profile_name));
 
                t0 += 2;
        }
@@ -2096,7 +2149,7 @@ cmd_pipeline_port_out(struct pmd_internals *softnic,
 
                p.type = PORT_OUT_TXQ;
 
-               strcpy(p.dev_name, tokens[7]);
+               strlcpy(p.dev_name, tokens[7], sizeof(p.dev_name));
 
                if (strcmp(tokens[8], "txq") != 0) {
                        snprintf(out, out_size, MSG_ARG_NOT_FOUND, "txq");
@@ -2117,7 +2170,7 @@ cmd_pipeline_port_out(struct pmd_internals *softnic,
 
                p.type = PORT_OUT_SWQ;
 
-               strcpy(p.dev_name, tokens[7]);
+               strlcpy(p.dev_name, tokens[7], sizeof(p.dev_name));
        } else if (strcmp(tokens[6], "tmgr") == 0) {
                if (n_tokens != 8) {
                        snprintf(out, out_size, MSG_ARG_MISMATCH,
@@ -2127,7 +2180,7 @@ cmd_pipeline_port_out(struct pmd_internals *softnic,
 
                p.type = PORT_OUT_TMGR;
 
-               strcpy(p.dev_name, tokens[7]);
+               strlcpy(p.dev_name, tokens[7], sizeof(p.dev_name));
        } else if (strcmp(tokens[6], "tap") == 0) {
                if (n_tokens != 8) {
                        snprintf(out, out_size, MSG_ARG_MISMATCH,
@@ -2137,7 +2190,7 @@ cmd_pipeline_port_out(struct pmd_internals *softnic,
 
                p.type = PORT_OUT_TAP;
 
-               strcpy(p.dev_name, tokens[7]);
+               strlcpy(p.dev_name, tokens[7], sizeof(p.dev_name));
        } else if (strcmp(tokens[6], "sink") == 0) {
                if ((n_tokens != 7) && (n_tokens != 11)) {
                        snprintf(out, out_size, MSG_ARG_MISMATCH,
@@ -2485,7 +2538,8 @@ cmd_pipeline_table(struct pmd_internals *softnic,
                        return;
                }
 
-               strcpy(p.action_profile_name, tokens[t0 + 1]);
+               strlcpy(p.action_profile_name, tokens[t0 + 1],
+                       sizeof(p.action_profile_name));
 
                t0 += 2;
        }
@@ -3351,6 +3405,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>
@@ -3656,6 +3711,43 @@ 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 ||
+                       softnic_parse_mac_addr(tokens[1],
+                               &a->encap.qinq_pppoe.ether.da) ||
+                       softnic_parse_mac_addr(tokens[2],
+                               &a->encap.qinq_pppoe.ether.sa) ||
+                       softnic_parser_read_uint32(&svlan_pcp, tokens[3]) ||
+                       svlan_pcp > 0x7 ||
+                       softnic_parser_read_uint32(&svlan_dei, tokens[4]) ||
+                       svlan_dei > 0x1 ||
+                       softnic_parser_read_uint32(&svlan_vid, tokens[5]) ||
+                       svlan_vid > 0xFFF ||
+                       softnic_parser_read_uint32(&cvlan_pcp, tokens[6]) ||
+                       cvlan_pcp > 0x7 ||
+                       softnic_parser_read_uint32(&cvlan_dei, tokens[7]) ||
+                       cvlan_dei > 0x1 ||
+                       softnic_parser_read_uint32(&cvlan_vid, tokens[8]) ||
+                       cvlan_vid > 0xFFF ||
+                       softnic_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;