examples/l2fwd-crypto: add cryptodev mask option
authorFan Zhang <roy.fan.zhang@intel.com>
Tue, 18 Apr 2017 11:34:31 +0000 (12:34 +0100)
committerPablo de Lara <pablo.de.lara.guarch@intel.com>
Thu, 20 Apr 2017 09:32:45 +0000 (11:32 +0200)
Previously, l2fwd-crypto application did not give user the
flexibility to decide which crypto device(s) will be used.

In this patch, a new cryptodev_mask option is added to the
application. Same as portmask, the cryptodev_mask avails the
user to mask out the unwanted crypto devices in the system.

Signed-off-by: Fan Zhang <roy.fan.zhang@intel.com>
doc/guides/sample_app_ug/l2_forward_crypto.rst
examples/l2fwd-crypto/main.c

index b3fd873..d6df36b 100644 (file)
@@ -89,7 +89,7 @@ The application requires a number of command line options:
     [--cipher_key_random_size SIZE] [--iv IV] [--iv_random_size SIZE] /
     [--auth_algo ALGO] [--auth_op GENERATE/VERIFY] [--auth_key KEY] /
     [--auth_key_random_size SIZE] [--aad AAD] [--aad_random_size SIZE] /
     [--cipher_key_random_size SIZE] [--iv IV] [--iv_random_size SIZE] /
     [--auth_algo ALGO] [--auth_op GENERATE/VERIFY] [--auth_key KEY] /
     [--auth_key_random_size SIZE] [--aad AAD] [--aad_random_size SIZE] /
-    [--digest size SIZE] [--sessionless]
+    [--digest size SIZE] [--sessionless] [--cryptodev_mask MASK]
 
 where,
 
 
 where,
 
@@ -157,6 +157,11 @@ where,
 
 *   sessionless: no crypto session will be created.
 
 
 *   sessionless: no crypto session will be created.
 
+*   cryptodev_mask: A hexadecimal bitmask of the cryptodevs to be used by the
+    application.
+
+    (default is all cryptodevs).
+
 
 The application requires that crypto devices capable of performing
 the specified crypto operation are available on application initialization.
 
 The application requires that crypto devices capable of performing
 the specified crypto operation are available on application initialization.
index 2eb14c1..720a1c2 100644 (file)
@@ -167,6 +167,8 @@ struct l2fwd_crypto_options {
 
        uint16_t block_size;
        char string_type[MAX_STR_LEN];
 
        uint16_t block_size;
        char string_type[MAX_STR_LEN];
+
+       uint64_t cryptodev_mask;
 };
 
 /** l2fwd crypto lcore params */
 };
 
 /** l2fwd crypto lcore params */
@@ -857,7 +859,8 @@ l2fwd_crypto_usage(const char *prgname)
                "  --aad_random_size SIZE: size of AAD when generated randomly\n"
                "  --digest_size SIZE: size of digest to be generated/verified\n"
 
                "  --aad_random_size SIZE: size of AAD when generated randomly\n"
                "  --digest_size SIZE: size of digest to be generated/verified\n"
 
-               "  --sessionless\n",
+               "  --sessionless\n"
+               "  --cryptodev_mask MASK: hexadecimal bitmask of crypto devices to configure\n",
               prgname);
 }
 
               prgname);
 }
 
@@ -1001,6 +1004,27 @@ parse_auth_op(enum rte_crypto_auth_operation *op, char *optarg)
        return -1;
 }
 
        return -1;
 }
 
+static int
+parse_cryptodev_mask(struct l2fwd_crypto_options *options,
+               const char *q_arg)
+{
+       char *end = NULL;
+       uint64_t pm;
+
+       /* parse hexadecimal string */
+       pm = strtoul(q_arg, &end, 16);
+       if ((pm == '\0') || (end == NULL) || (*end != '\0'))
+               pm = 0;
+
+       options->cryptodev_mask = pm;
+       if (options->cryptodev_mask == 0) {
+               printf("invalid cryptodev_mask specified\n");
+               return -1;
+       }
+
+       return 0;
+}
+
 /** Parse long options */
 static int
 l2fwd_crypto_parse_args_long_options(struct l2fwd_crypto_options *options,
 /** Parse long options */
 static int
 l2fwd_crypto_parse_args_long_options(struct l2fwd_crypto_options *options,
@@ -1101,6 +1125,9 @@ l2fwd_crypto_parse_args_long_options(struct l2fwd_crypto_options *options,
                return 0;
        }
 
                return 0;
        }
 
+       else if (strcmp(lgopts[option_index].name, "cryptodev_mask") == 0)
+               return parse_cryptodev_mask(options, optarg);
+
        return -1;
 }
 
        return -1;
 }
 
@@ -1215,6 +1242,7 @@ l2fwd_crypto_default_options(struct l2fwd_crypto_options *options)
        options->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
 
        options->type = CDEV_TYPE_ANY;
        options->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
 
        options->type = CDEV_TYPE_ANY;
+       options->cryptodev_mask = UINT64_MAX;
 }
 
 static void
 }
 
 static void
@@ -1337,6 +1365,7 @@ l2fwd_crypto_parse_args(struct l2fwd_crypto_options *options,
                        { "digest_size", required_argument, 0, 0 },
 
                        { "sessionless", no_argument, 0, 0 },
                        { "digest_size", required_argument, 0, 0 },
 
                        { "sessionless", no_argument, 0, 0 },
+                       { "cryptodev_mask", required_argument, 0, 0},
 
                        { NULL, 0, 0, 0 }
        };
 
                        { NULL, 0, 0, 0 }
        };
@@ -1477,6 +1506,17 @@ check_type(struct l2fwd_crypto_options *options, struct rte_cryptodev_info *dev_
        return -1;
 }
 
        return -1;
 }
 
+/* Check if the device is enabled by cryptodev_mask */
+static int
+check_cryptodev_mask(struct l2fwd_crypto_options *options,
+               uint8_t cdev_id)
+{
+       if (options->cryptodev_mask & (1 << cdev_id))
+               return 0;
+
+       return -1;
+}
+
 static inline int
 check_supported_size(uint16_t length, uint16_t min, uint16_t max,
                uint16_t increment)
 static inline int
 check_supported_size(uint16_t length, uint16_t min, uint16_t max,
                uint16_t increment)
@@ -1531,6 +1571,9 @@ initialize_cryptodevs(struct l2fwd_crypto_options *options, unsigned nb_ports,
                        }
                };
 
                        }
                };
 
+               if (check_cryptodev_mask(options, (uint8_t)cdev_id))
+                       continue;
+
                rte_cryptodev_info_get(cdev_id, &dev_info);
 
                /* Set cipher parameters */
                rte_cryptodev_info_get(cdev_id, &dev_info);
 
                /* Set cipher parameters */