Soft Patch Panel
 help / color / mirror / Atom feed
From: Yasufumi Ogawa <yasufum.o@gmail.com>
To: spp@dpdk.org, ferruh.yigit@intel.com, yasufum.o@gmail.com
Subject: [spp] [PATCH 12/29] tools/sppc: setup spp_pri opts in app_helper
Date: Tue, 25 Feb 2020 19:34:29 +0900
Message-ID: <20200225103446.8243-13-yasufum.o@gmail.com> (raw)
In-Reply-To: <20200225103446.8243-1-yasufum.o@gmail.com>

Setup options for spp_primary is separated with other apps because
name of devices are a bit different, although steps of building options
are similar. It should be merged considering maintainability.

This update is to add setup of spp_primary into `lib/app_helper.py`
module to merge them.

* Setup options of apps including spp_primary is done in add_sppc_args()
  in app_helper.py.

* Add attaching TAP interfaces in the method, mainly for spp_primary.

Signed-off-by: Yasufumi Ogawa <yasufum.o@gmail.com>
---
 tools/sppc/lib/app_helper.py | 119 +++++++++++++++++++++++++----------
 1 file changed, 87 insertions(+), 32 deletions(-)

diff --git a/tools/sppc/lib/app_helper.py b/tools/sppc/lib/app_helper.py
index b918aeb..411b3f5 100644
--- a/tools/sppc/lib/app_helper.py
+++ b/tools/sppc/lib/app_helper.py
@@ -9,7 +9,10 @@ import sys
 
 
 # Supported vdev types of SPP Container.
-VDEV_TYPES = ['vhost', 'memif']
+VDEV_TYPES = ['vhost', 'memif', 'tap']
+
+# Prefix of tap interface which is named as 'spp_tap0', 'spp_tap1' or so.
+TAP_PREFIX = 'spp_tap'
 
 
 def add_eal_args(parser, mem_size=1024, mem_channel=4):
@@ -73,6 +76,10 @@ def add_sppc_args(parser):
         '--workdir',
         type=str,
         help="Path of directory in which the command is launched")
+    parser.add_argument(
+        '--name',
+        type=str,
+        help='Name of container')
     parser.add_argument(
         '-ci', '--container-image',
         type=str,
@@ -99,10 +106,6 @@ def add_appc_args(parser):
         '-v', '--volume',
         nargs='*', type=str,
         help='Bind mount a volume (for docker)')
-    parser.add_argument(
-        '--name',
-        type=str,
-        help='Name of container')
     parser.add_argument(
         '-nq', '--nof-queues',
         type=int,
@@ -128,7 +131,9 @@ def is_valid_dev_uids(dev_uids):
         return False
 
     for dev_uid in dev_uids.split(','):
-        if dev_uid.split(':')[0] not in VDEV_TYPES:
+        dtype = dev_uid.split(':')[0]
+        if dtype not in VDEV_TYPES:
+            print('Error: `{}` is not supported.'.format(dtype))
             return False
 
     return True
@@ -154,7 +159,8 @@ def get_mem_opt(args):
     return mem_opt
 
 
-def setup_eal_opts(args, file_prefix, proc_type='auto', hugedir=None):
+def setup_eal_opts(args, file_prefix, proc_type='auto', is_spp_pri=False,
+                   hugedir=None):
     core_opt = get_core_opt(args)
     mem_opt = get_mem_opt(args)
 
@@ -167,19 +173,44 @@ def setup_eal_opts(args, file_prefix, proc_type='auto', hugedir=None):
     if args.dev_uids is not None:
         dev_uids_list = args.dev_uids.split(',')
 
-        socks = sock_files(dev_uids_list)
+        socks = sock_files(dev_uids_list, is_spp_pri)
 
         # Configure '--vdev' options
         for i in range(len(dev_uids_list)):
             dev_uid = dev_uids_list[i].split(':')
             if dev_uid[0] == 'vhost':
+                if not is_spp_pri:
+                    eal_opts += [
+                            '--vdev',
+                            'virtio_user{0:s},queues={1:d},path={2:s}'.
+                            format(dev_uid[1], args.nof_queues,
+                                   socks[i]['guest']),
+                            '\\']
+                else:
+                    # TODO(yasufum) Support `queues` option.
+                    eal_opts += [
+                            '--vdev',
+                            'eth_vhost{0:s},iface={1:s}'.
+                            format(dev_uid[1], socks[i]['guest']),
+                            '\\']
+            elif dev_uid[0] == 'memif':
+                if not is_spp_pri:
+                    eal_opts += [
+                            '--vdev',
+                            'net_memif{0:s},id={0:s},socket={1:s}'.
+                            format(dev_uid[1], socks[0]['guest']),
+                            '\\']
+                else:
+                    eal_opts += [
+                            '--vdev',
+                            'net_memif{0:s},id={0:s},role={1:s},socket={2:s}'.
+                            format(dev_uid[1], 'master', socks[0]['guest']),
+                            '\\']
+            elif dev_uid[0] == 'tap':
                 eal_opts += [
-                    '--vdev', 'virtio_user{},queues={},path={}'.format(
-                        dev_uid[1], args.nof_queues, socks[i]['guest']), '\\']
-            elif dev_uid[0] == 'memif':  # Only 'slave' role is supported.
-                eal_opts += [
-                    '--vdev', 'net_memif{0},id={0},socket={1}'.format(
-                        dev_uid[1], socks[0]['guest']), '\\']
+                        '--vdev',
+                        'net_tap{0:s},iface={1:s}{0:s}'.
+                        format(dev_uid[1], TAP_PREFIX), '\\']
 
     if (args.pci_blacklist is not None) and (args.pci_whitelist is not None):
         common.error_exit("Cannot use both of '-b' and '-w' at once")
@@ -200,7 +231,7 @@ def setup_eal_opts(args, file_prefix, proc_type='auto', hugedir=None):
     return eal_opts
 
 
-def setup_docker_opts(args, container_image, sock_files, workdir=None):
+def setup_docker_opts(args, container_image, socks, workdir=None):
     docker_opts = []
 
     if args.foreground is True:
@@ -217,8 +248,8 @@ def setup_docker_opts(args, container_image, sock_files, workdir=None):
     if args.no_privileged is not True:
         docker_opts += ['--privileged', '\\']
 
-    if sock_files is not None:
-        for sock in sock_files:
+    if socks is not None:
+        for sock in socks:
             docker_opts += [
                 '-v', '%s:%s' % (sock['host'], sock['guest']), '\\']
 
@@ -251,12 +282,15 @@ def is_sufficient_ports(args):
         return False
 
 
-def sock_files(dev_uids_list):
+def sock_files(dev_uids_list, is_spp_pri=False):
     """Return list of socket files on host and containers.
 
     The name of socket files is defined with a conventional ones described
     in DPDK doc, though you can use any name actually.
 
+    For spp_primary, path of sock file is just bit different because it is
+    shared among other SPP processes.
+
     Here is an example of two vhost devices.
         [vhost:0, vhost:1]
         => [
@@ -264,23 +298,44 @@ def sock_files(dev_uids_list):
               {'host': '/tmp/sock1, 'guest': '/var/run/usvhost1'}
             ]
     """
-    socks = []
+
+    socks = {
+            'vhost': {
+                'host': '/tmp/sock{:s}',
+                'guest': '/var/run/usvhost{:s}'},
+            'memif': {
+                'host': '/tmp/spp-memif.sock',
+                'guest': '/var/run/spp-memif.sock'}}
+
+    res = []
+    is_memif_added = False
     for dev_uid in dev_uids_list:
         dev_uid = dev_uid.split(':')
-        if dev_uid[0] == 'vhost':
-            socks.append({
-                'host': '/tmp/sock{}'.format(dev_uid[1]),
-                'guest': '/var/run/usvhost{}'.format(dev_uid[1])})
-        elif dev_uid[0] == 'memif':
+
+        if (dev_uid[0] == 'memif') and (not is_memif_added):
             # Single sock file is enough for memif because it is just used for
             # negotiation between master and slaves processes.
-            socks.append({
-                'host': '/tmp/spp-memif.sock',
-                'guest': '/var/run/spp-memif.sock'})
-            break
-        else:
-            break
-    return socks
+            if is_spp_pri:
+                res.append({
+                    'host': socks['memif']['host'],
+                    'guest': socks['memif']['host']})
+            else:
+                res.append({
+                    'host': socks['memif']['host'],
+                    'guest': socks['memif']['guest']})
+            is_memif_added = True
+
+        elif dev_uid[0] == 'vhost':
+            if is_spp_pri:
+                res.append({
+                    'host': socks['vhost']['host'].format(dev_uid[1]),
+                    'guest': socks['vhost']['host'].format(dev_uid[1])})
+            else:
+                res.append({
+                    'host': socks['vhost']['host'].format(dev_uid[1]),
+                    'guest': socks['vhost']['guest'].format(dev_uid[1])})
+
+    return res
 
 
 def count_ports(port_mask):
@@ -335,7 +390,7 @@ def cores_to_list(core_opt):
 def gen_sppc_file_prefix(app_name):
     """Generate a unique file prefix of DPDK for SPP Container app."""
 
-    return 'sppc-{}-{}'.format(app_name, secrets.token_hex(8))
+    return 'sppc-{:s}-{:s}'.format(app_name, secrets.token_hex(8))
 
 
 def get_dpdk_ver_in_container(rte_sdk, c_image):
-- 
2.17.1


  parent reply	other threads:[~2020-02-25 10:35 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-02-25 10:34 [spp] [PATCH 00/29] Update SPP Container tools Yasufumi Ogawa
2020-02-25 10:34 ` [spp] [PATCH 01/29] tools/sppc: update options for assigning devices Yasufumi Ogawa
2020-02-25 10:34 ` [spp] [PATCH 02/29] tools/sppc: update dev options of l2fwd Yasufumi Ogawa
2020-02-25 10:34 ` [spp] [PATCH 03/29] tools/sppc: add container name option Yasufumi Ogawa
2020-02-25 10:34 ` [spp] [PATCH 04/29] tools/sppc: update l2fwd app for " Yasufumi Ogawa
2020-02-25 10:34 ` [spp] [PATCH 05/29] tools/sppc: update dev options of l3fwd Yasufumi Ogawa
2020-02-25 10:34 ` [spp] [PATCH 06/29] tools/sppc: update dev options of l3fwd-acl Yasufumi Ogawa
2020-02-25 10:34 ` [spp] [PATCH 07/29] tools/sppc: update dev options of testpmd Yasufumi Ogawa
2020-02-25 10:34 ` [spp] [PATCH 08/29] tools/sppc: update dev options of pktgen Yasufumi Ogawa
2020-02-25 10:34 ` [spp] [PATCH 09/29] tools/sppc: update dev options of load-balancer Yasufumi Ogawa
2020-02-25 10:34 ` [spp] [PATCH 10/29] tools/sppc: version checker for container DPDK ver Yasufumi Ogawa
2020-02-25 10:34 ` [spp] [PATCH 11/29] tools/sppc: check DPDK ver in load-balancer Yasufumi Ogawa
2020-02-25 10:34 ` Yasufumi Ogawa [this message]
2020-02-25 10:34 ` [spp] [PATCH 13/29] tools/sppc: define file prefix for SPP Yasufumi Ogawa
2020-02-25 10:34 ` [spp] [PATCH 14/29] tools/sppc: update dev options of spp_primary Yasufumi Ogawa
2020-02-25 10:34 ` [spp] [PATCH 15/29] tools/sppc: setup with docker opts in SPP pri Yasufumi Ogawa
2020-02-25 10:34 ` [spp] [PATCH 16/29] tools/sppc: update calling setup_docker_opts() Yasufumi Ogawa
2020-02-25 10:34 ` [spp] [PATCH 17/29] tools/sppc: update dev options of helloworld Yasufumi Ogawa
2020-02-25 10:34 ` [spp] [PATCH 18/29] tools/sppc: update dev options of suricata Yasufumi Ogawa
2020-02-25 10:34 ` [spp] [PATCH 19/29] tools/sppc: update dev options of spp_nfv Yasufumi Ogawa
2020-02-25 10:34 ` [spp] [PATCH 20/29] tools/sppc: change to gen EAL opts with app name Yasufumi Ogawa
2020-02-25 10:34 ` [spp] [PATCH 21/29] tools/sppc: remove nouse variable Yasufumi Ogawa
2020-02-25 10:34 ` [spp] [PATCH 22/29] bin: remove sock files created by docker Yasufumi Ogawa
2020-02-25 10:34 ` [spp] [PATCH 23/29] tools/sppc: skip checking rule file if dry run Yasufumi Ogawa
2020-02-25 10:34 ` [spp] [PATCH 24/29] docs: revise examples in sppc Yasufumi Ogawa
2020-02-25 10:34 ` [spp] [PATCH 25/29] docs: update versions in " Yasufumi Ogawa
2020-02-25 10:34 ` [spp] [PATCH 26/29] docs: update old example in spp_primary container Yasufumi Ogawa
2020-02-25 10:34 ` [spp] [PATCH 27/29] tools/sppc: python3 support for sppc build tool Yasufumi Ogawa
2020-02-25 10:34 ` [spp] [PATCH 28/29] docs: update app container help msg Yasufumi Ogawa
2020-02-25 10:34 ` [spp] [PATCH 29/29] docs: update howto define app container guide Yasufumi Ogawa

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200225103446.8243-13-yasufum.o@gmail.com \
    --to=yasufum.o@gmail.com \
    --cc=ferruh.yigit@intel.com \
    --cc=spp@dpdk.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

Soft Patch Panel

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://inbox.dpdk.org/spp/0 spp/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 spp spp/ https://inbox.dpdk.org/spp \
		spp@dpdk.org
	public-inbox-index spp

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://inbox.dpdk.org/inbox.dpdk.spp


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git