From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by smtp.lore.kernel.org (Postfix) with ESMTP id 68BBEC53215 for ; Fri, 24 Jul 2026 16:45:58 +0000 (UTC) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 3485640A7D; Fri, 24 Jul 2026 18:45:35 +0200 (CEST) Received: from mail-pg1-f172.google.com (mail-pg1-f172.google.com [209.85.215.172]) by mails.dpdk.org (Postfix) with ESMTP id 3793D40A6C for ; Fri, 24 Jul 2026 18:45:32 +0200 (CEST) Received: by mail-pg1-f172.google.com with SMTP id 41be03b00d2f7-ca88130e09aso492842a12.3 for ; Fri, 24 Jul 2026 09:45:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=networkplumber-org.20251104.gappssmtp.com; s=20251104; t=1784911531; x=1785516331; darn=dpdk.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=eCRaOk4Lk/SHJw/rZok68XGtIpLStpZiRAHz+d4DVW8=; b=Xd9qPQ37aT2KjAm3bfAzbsSUIKbaW0FV1Zh7J05FO5gJoeBvazY4hthlTW4Lxu3lj4 yManICQicxBy6qo+O+XTHuyRTTzoCLTbaQ7KYX0+OpUdiH5HXlxzs19EbNPfNdmmyZvx cSb8/SQ0RHPg6tnaWaGV0LjUExbN+DYXqwI0mVEBIU6rOOm4fc0lC9Jrx/WiX2IM3xEN y7VVkTXk7UMRJQeZl9o++8sMtyW+GstoA/nEI8hm3Q9KeG5NpFaM0qskZNZOTO17Ze5/ mGQdwNKYHIpu+gzfAGcomEB46MvD9/UwSoxrzZd0GbyCKyv3ShbgaanozKeQ7dKVPYj+ PwMg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784911531; x=1785516331; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=eCRaOk4Lk/SHJw/rZok68XGtIpLStpZiRAHz+d4DVW8=; b=b4sVg6MeykJ62FRvdxtXw7BrCiKX5sQMOlm0I12PcAlo2W6342xKqk23a/fDNU+ETo vms2R8Y0TWME7elC4B6R+XDTjhi03BEy3LGg+17Ekf1EeJniu8Uu3UCl0AvGvITe5fUo dA3hcrwYDuA2iKLXtzQ65mH1wNCUXKJFwaCX91SoGWyGTJQ/O4IqlFA+fx5CLaEu9Ins J9xsyIECp+a+fTpXtLlT+5BZbUgZyE6SeNxehfhEbrYkQBsoqxtcrQK0cfei9oi+xdqH jTVMetJ9kE131Z3VrbZ66K/muYvx8BBia64Sj1FG0cKfM5c5Iicrwkr34QQQhkRdmySr diYQ== X-Gm-Message-State: AOJu0Yzj2SwEh4f7AZLSWeVUo/K41VGTWxi4GKqWMBEY2kFwNvBz5lWh JWMfhiTQ7bh/x8UoqE2Ufa7GmBOuMa7xBjq8wcaSqyONMwcuce5MA6+f6szNxAUvnbcoqtrT1aZ e85Ux X-Gm-Gg: AR+sD10EI/OruDw+us51gzA5bf5wp9Up9TfgSVNkBNETQntV+4lb+oX9zoeiongJWlk pCReW9zSS9ZB5luQnwD6+SuvvEBjZvIuqx3eDJ26rRZkjCWSgAuQRZCGhm6AW64GvRa06E+JY2C sC07XA9d3Cd3MAqPSNJE8bvv+vLtjhXbHPmOII8/88uLmP8nRrCCnuv/8L2TQnpdUGd3O0zsMKj wl/9ZcEdE1XGfaI6Vd67UejcCpU13ufnKSCcE4ZdHNbQY12AcRq6WWN+b648LX5rgK4ghul0TQV 6B5/LQxseSlbEttIQg0/lmdYYLW/GEgP2NwA3ACTFB5T2Hh/J14Pa6dqbDTHbHZ32M1L3SHZud5 LgE0aOmbuBH4mAh+XHDxDqyIm6zEeCWjTqkIfBqjl+qQfCoYM4m4HPrApDj6WA+B7pRZcgfHSwB xpeAG2bKEjfTRVBiYetZDANX3FTxQMAbcd+zwWrmAr X-Received: by 2002:a05:6a20:9185:b0:3c4:2fe1:fa29 with SMTP id adf61e73a8af0-3c44b21050fmr8865303637.59.1784911529423; Fri, 24 Jul 2026 09:45:29 -0700 (PDT) Received: from phoenix.lan (204-195-96-226.wavecable.com. [204.195.96.226]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-314bc549cacsm972872eec.16.2026.07.24.09.45.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Jul 2026 09:45:28 -0700 (PDT) From: Stephen Hemminger To: dev@dpdk.org Cc: Stephen Hemminger , Thomas Monjalon , Cristian Dumitrescu Subject: [RFC 3/6] examples/ip_pipeline: remove example Date: Fri, 24 Jul 2026 09:43:59 -0700 Message-ID: <20260724164520.192203-4-stephen@networkplumber.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260724164520.192203-1-stephen@networkplumber.org> References: <20260724164520.192203-1-stephen@networkplumber.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org The ip_pipeline example is built on the legacy pipeline library API (rte_pipeline_*) and the associated port and table action APIs, which were announced for removal in the 24.11 release. The pipeline example covers the SWX pipeline API. Signed-off-by: Stephen Hemminger --- MAINTAINERS | 2 - doc/guides/nics/softnic.rst | 3 +- doc/guides/rel_notes/release_26_11.rst | 4 + doc/guides/sample_app_ug/index.rst | 1 - doc/guides/sample_app_ug/ip_pipeline.rst | 531 -- examples/ip_pipeline/Makefile | 60 - examples/ip_pipeline/action.c | 391 - examples/ip_pipeline/action.h | 78 - examples/ip_pipeline/cli.c | 6791 ----------------- examples/ip_pipeline/cli.h | 18 - examples/ip_pipeline/common.h | 12 - examples/ip_pipeline/conn.c | 330 - examples/ip_pipeline/conn.h | 47 - examples/ip_pipeline/cryptodev.c | 160 - examples/ip_pipeline/cryptodev.h | 46 - examples/ip_pipeline/examples/firewall.cli | 59 - examples/ip_pipeline/examples/flow.cli | 60 - examples/ip_pipeline/examples/flow_crypto.cli | 57 - examples/ip_pipeline/examples/l2fwd.cli | 51 - examples/ip_pipeline/examples/route.cli | 60 - examples/ip_pipeline/examples/route_ecmp.cli | 57 - examples/ip_pipeline/examples/rss.cli | 112 - examples/ip_pipeline/examples/tap.cli | 66 - examples/ip_pipeline/link.c | 270 - examples/ip_pipeline/link.h | 66 - examples/ip_pipeline/main.c | 260 - examples/ip_pipeline/mempool.c | 82 - examples/ip_pipeline/mempool.h | 40 - examples/ip_pipeline/meson.build | 30 - examples/ip_pipeline/parser.c | 506 -- examples/ip_pipeline/parser.h | 56 - examples/ip_pipeline/pipeline.c | 1078 --- examples/ip_pipeline/pipeline.h | 425 -- examples/ip_pipeline/swq.c | 76 - examples/ip_pipeline/swq.h | 37 - examples/ip_pipeline/tap.c | 102 - examples/ip_pipeline/tap.h | 29 - examples/ip_pipeline/thread.c | 3137 -------- examples/ip_pipeline/thread.h | 24 - examples/ip_pipeline/tmgr.c | 248 - examples/ip_pipeline/tmgr.h | 74 - examples/meson.build | 1 - 42 files changed, 5 insertions(+), 15532 deletions(-) delete mode 100644 doc/guides/sample_app_ug/ip_pipeline.rst delete mode 100644 examples/ip_pipeline/Makefile delete mode 100644 examples/ip_pipeline/action.c delete mode 100644 examples/ip_pipeline/action.h delete mode 100644 examples/ip_pipeline/cli.c delete mode 100644 examples/ip_pipeline/cli.h delete mode 100644 examples/ip_pipeline/common.h delete mode 100644 examples/ip_pipeline/conn.c delete mode 100644 examples/ip_pipeline/conn.h delete mode 100644 examples/ip_pipeline/cryptodev.c delete mode 100644 examples/ip_pipeline/cryptodev.h delete mode 100644 examples/ip_pipeline/examples/firewall.cli delete mode 100644 examples/ip_pipeline/examples/flow.cli delete mode 100644 examples/ip_pipeline/examples/flow_crypto.cli delete mode 100644 examples/ip_pipeline/examples/l2fwd.cli delete mode 100644 examples/ip_pipeline/examples/route.cli delete mode 100644 examples/ip_pipeline/examples/route_ecmp.cli delete mode 100644 examples/ip_pipeline/examples/rss.cli delete mode 100644 examples/ip_pipeline/examples/tap.cli delete mode 100644 examples/ip_pipeline/link.c delete mode 100644 examples/ip_pipeline/link.h delete mode 100644 examples/ip_pipeline/main.c delete mode 100644 examples/ip_pipeline/mempool.c delete mode 100644 examples/ip_pipeline/mempool.h delete mode 100644 examples/ip_pipeline/meson.build delete mode 100644 examples/ip_pipeline/parser.c delete mode 100644 examples/ip_pipeline/parser.h delete mode 100644 examples/ip_pipeline/pipeline.c delete mode 100644 examples/ip_pipeline/pipeline.h delete mode 100644 examples/ip_pipeline/swq.c delete mode 100644 examples/ip_pipeline/swq.h delete mode 100644 examples/ip_pipeline/tap.c delete mode 100644 examples/ip_pipeline/tap.h delete mode 100644 examples/ip_pipeline/thread.c delete mode 100644 examples/ip_pipeline/thread.h delete mode 100644 examples/ip_pipeline/tmgr.c delete mode 100644 examples/ip_pipeline/tmgr.h diff --git a/MAINTAINERS b/MAINTAINERS index 4c06f85706..ae84e7f289 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1739,9 +1739,7 @@ F: lib/pipeline/ F: lib/port/ F: lib/table/ F: doc/guides/prog_guide/packet_framework.rst -F: examples/ip_pipeline/ F: examples/pipeline/ -F: doc/guides/sample_app_ug/ip_pipeline.rst Algorithms diff --git a/doc/guides/nics/softnic.rst b/doc/guides/nics/softnic.rst index 603fdb49c4..87f3e5adc0 100644 --- a/doc/guides/nics/softnic.rst +++ b/doc/guides/nics/softnic.rst @@ -10,8 +10,7 @@ is DIY and reconfigurable through ``firmware`` (DPDK Packet Framework script). The Soft NIC leverages the DPDK Packet Framework libraries (librte_port, librte_table and librte_pipeline) to make it modular, flexible and extensible with new functionality. -Please refer to :doc:`/prog_guide/packet_framework` and -:doc:`/sample_app_ug/ip_pipeline` for more details. +Please refer to :doc:`/prog_guide/packet_framework` for more details. The Soft NIC is configured through the standard DPDK ethdev API (ethdev, flow, QoS, security). The internal framework is not externally visible. diff --git a/doc/guides/rel_notes/release_26_11.rst b/doc/guides/rel_notes/release_26_11.rst index 10e4352cac..4cc1cec108 100644 --- a/doc/guides/rel_notes/release_26_11.rst +++ b/doc/guides/rel_notes/release_26_11.rst @@ -71,6 +71,10 @@ Removed Items * Removed the ``dpdk-test-pipeline`` application, which was based on the legacy pipeline library API. +* Removed the ``ip_pipeline`` example application, which was based on + the legacy pipeline library API. + The ``pipeline`` example application covers the SWX pipeline API. + API Changes ----------- diff --git a/doc/guides/sample_app_ug/index.rst b/doc/guides/sample_app_ug/index.rst index c8b50b801c..28c4c9a5b2 100644 --- a/doc/guides/sample_app_ug/index.rst +++ b/doc/guides/sample_app_ug/index.rst @@ -44,7 +44,6 @@ Sample Applications User Guides vhost_blk vhost_crypto vdpa - ip_pipeline pipeline eventdev_pipeline dist_app diff --git a/doc/guides/sample_app_ug/ip_pipeline.rst b/doc/guides/sample_app_ug/ip_pipeline.rst deleted file mode 100644 index 9a5cb517a2..0000000000 --- a/doc/guides/sample_app_ug/ip_pipeline.rst +++ /dev/null @@ -1,531 +0,0 @@ -.. SPDX-License-Identifier: BSD-3-Clause - Copyright(c) 2015-2018 Intel Corporation. - -Internet Protocol (IP) Pipeline Application -=========================================== - -Application overview --------------------- - -The *Internet Protocol (IP) Pipeline* application is intended to be a vehicle for rapid development of packet processing -applications on multi-core CPUs. - -Following OpenFlow and P4 design principles, the application can be used to create functional blocks called pipelines out -of input/output ports, tables and actions in a modular way. Multiple pipelines can be inter-connected through packet queues -to create complete applications (super-pipelines). - -The pipelines are mapped to application threads, with each pipeline executed by a single thread and each thread able to run -one or several pipelines. The possibilities of creating pipelines out of ports, tables and actions, connecting multiple -pipelines together and mapping the pipelines to execution threads are endless, therefore this application can be seen as -a true application generator. - -Pipelines are created and managed through Command Line Interface (CLI): - - * Any standard TCP client (e.g. telnet, netcat, custom script, etc) is typically able to connect to the application, send - commands through the network and wait for the response before pushing the next command. - - * All the application objects are created and managed through CLI commands: - * 'Primitive' objects used to create pipeline ports: memory pools, links (i.e. network interfaces), SW queues, traffic managers, etc. - * Action profiles: used to define the actions to be executed by pipeline input/output ports and tables. - * Pipeline components: input/output ports, tables, pipelines, mapping of pipelines to execution threads. - -Running the application ------------------------ - -The application startup command line is:: - - dpdk-ip_pipeline [EAL_ARGS] -- [-s SCRIPT_FILE] [-h HOST] [-p PORT] - -The application startup arguments are: - -``-s SCRIPT_FILE`` - - * Optional: Yes - - * Default: Not present - - * Argument: Path to the CLI script file to be run at application startup. - No CLI script file will run at startup if this argument is not present. - -``-h HOST`` - - * Optional: Yes - - * Default: ``0.0.0.0`` - - * Argument: IP Address of the host running ip pipeline application to be used by - remote TCP based client (telnet, netcat, etc.) for connection. - -``-p PORT`` - - * Optional: Yes - - * Default: ``8086`` - - * Argument: TCP port number at which the ip pipeline is running. - This port number should be used by remote TCP client (such as telnet, netcat, etc.) to connect to host application. - -Refer to *DPDK Getting Started Guide* for general information on running applications and the Environment Abstraction Layer (EAL) options. - -The following is an example command to run ip pipeline application configured for layer 2 forwarding: - -.. code-block:: console - - $ .//examples/dpdk-ip_pipeline -l 0,1 -- -s examples/route_ecmp.cli - -The application should start successfully and display as follows: - -.. code-block:: console - - EAL: Detected 40 lcore(s) - EAL: Detected 2 NUMA nodes - EAL: Multi-process socket /var/run/.rte_unix - EAL: Probing VFIO support... - EAL: PCI device 0000:02:00.0 on NUMA socket 0 - EAL: probe driver: 8086:10fb net_ixgbe - ... - -To run remote client (e.g. telnet) to communicate with the ip pipeline application: - -.. code-block:: console - - $ telnet 127.0.0.1 8086 - -When running a telnet client as above, command prompt is displayed: - -.. code-block:: console - - Trying 127.0.0.1... - Connected to 127.0.0.1. - Escape character is '^]'. - - Welcome to IP Pipeline! - - pipeline> - -Once application and telnet client start running, messages can be sent from client to application. -At any stage, telnet client can be terminated using the quit command. - - -Application stages ------------------- - -Initialization -~~~~~~~~~~~~~~ - -During this stage, EAL layer is initialised and application specific arguments are parsed. Furthermore, the data structures -(i.e. linked lists) for application objects are initialized. In case of any initialization error, an error message -is displayed and the application is terminated. - -Run-time -~~~~~~~~ - -The main thread is creating and managing all the application objects based on CLI input. - -Each data plane thread runs one or several pipelines previously assigned to it in round-robin order. Each data plane thread -executes two tasks in time-sharing mode: - -#. *Packet processing task*: Process bursts of input packets read from the pipeline input ports. - -#. *Message handling task*: Periodically, the data plane thread pauses the packet processing task and polls for request - messages send by the main thread. Examples: add/remove pipeline to/from current data plane thread, add/delete rules - to/from given table of a specific pipeline owned by the current data plane thread, read statistics, etc. - -Examples --------- - -.. tabularcolumns:: |p{3cm}|p{5cm}|p{4cm}|p{4cm}| - -.. table:: Pipeline examples provided with the application - - +-----------------------+----------------------+----------------+------------------------------------+ - | Name | Table(s) | Actions | Messages | - +=======================+======================+================+====================================+ - | L2fwd | Stub | Forward | 1. Mempool create | - | | | | 2. Link create | - | Note: Implemented | | | 3. Pipeline create | - | using pipeline with | | | 4. Pipeline port in/out | - | a simple pass-through | | | 5. Pipeline table | - | connection between | | | 6. Pipeline port in table | - | input and output | | | 7. Pipeline enable | - | ports. | | | 8. Pipeline table rule add | - +-----------------------+----------------------+----------------+------------------------------------+ - | Flow classification | Exact match | Forward | 1. Mempool create | - | | | | 2. Link create | - | | * Key = byte array | | 3. Pipeline create | - | | (16 bytes) | | 4. Pipeline port in/out | - | | * Offset = 278 | | 5. Pipeline table | - | | * Table size = 64K | | 6. Pipeline port in table | - | | | | 7. Pipeline enable | - | | | | 8. Pipeline table rule add default | - | | | | 9. Pipeline table rule add | - +-----------------------+----------------------+----------------+------------------------------------+ - | Firewall | ACL | Allow/Drop | 1. Mempool create | - | | | | 2. Link create | - | | * Key = n-tuple | | 3. Pipeline create | - | | * Offset = 270 | | 4. Pipeline port in/out | - | | * Table size = 4K | | 5. Pipeline table | - | | | | 6. Pipeline port in table | - | | | | 7. Pipeline enable | - | | | | 8. Pipeline table rule add default | - | | | | 9. Pipeline table rule add | - +-----------------------+----------------------+----------------+------------------------------------+ - | IP routing | LPM (IPv4) | Forward | 1. Mempool Create | - | | | | 2. Link create | - | | * Key = IP dest addr | | 3. Pipeline create | - | | * Offset = 286 | | 4. Pipeline port in/out | - | | * Table size = 4K | | 5. Pipeline table | - | | | | 6. Pipeline port in table | - | | | | 7. Pipeline enable | - | | | | 8. Pipeline table rule add default | - | | | | 9. Pipeline table rule add | - +-----------------------+----------------------+----------------+------------------------------------+ - | Equal-cost multi-path | LPM (IPv4) | Forward, | 1. Mempool Create | - | routing (ECMP) | | load balance, | 2. Link create | - | | * Key = IP dest addr | encap ether | 3. Pipeline create | - | | * Offset = 286 | | 4. Pipeline port in/out | - | | * Table size = 4K | | 5. Pipeline table (LPM) | - | | | | 6. Pipeline table (Array) | - | | | | 7. Pipeline port in table (LPM) | - | | Array | | 8. Pipeline enable | - | | | | 9. Pipeline table rule add default | - | | * Key = Array index | | 10. Pipeline table rule add(LPM) | - | | * Offset = 256 | | 11. Pipeline table rule add(Array) | - | | * Size = 64K | | | - | | | | | - +-----------------------+----------------------+----------------+------------------------------------+ - -Command Line Interface (CLI) ----------------------------- - -Link -~~~~ - - Link configuration :: - - link - dev |port - rxq - txq promiscuous on | off - [rss ... ] - - Note: The PCI device name must be specified in the Domain:Bus:Device.Function format. - - -Mempool -~~~~~~~ - - Mempool create :: - - mempool buffer - pool cache cpu - - -Software queue -~~~~~~~~~~~~~~ - - Create software queue :: - - swq size cpu - - -Traffic manager -~~~~~~~~~~~~~~~ - - Add traffic manager subport profile :: - - tmgr subport profile - - - - - - - Add traffic manager pipe profile :: - - tmgr pipe profile - - - - - - - - - Create traffic manager port :: - - tmgr - rate - spp - pps - fo - mtu - cpu - - Configure traffic manager subport :: - - tmgr - subport - profile - - Configure traffic manager pipe :: - - tmgr - subport - pipe from to - profile - - -Tap -~~~ - - Create tap port :: - - tap - - -Cryptodev -~~~~~~~~~ - - Create cryptodev port :: - - cryptodev - dev - queue - -Action profile -~~~~~~~~~~~~~~ - - Create action profile for pipeline input port :: - - port in action profile - [filter match | mismatch offset mask key port ] - [balance offset mask port ... ] - - Create action profile for the pipeline table :: - - table action profile - ipv4 | ipv6 - offset - fwd - [balance offset mask outoffset ] - [meter srtcm | trtcm - tc - stats none | pkts | bytes | both] - [tm spp pps ] - [encap ether | vlan | qinq | mpls | pppoe] - [nat src | dst - proto udp | tcp] - [ttl drop | fwd - stats none | pkts] - [stats pkts | bytes | both] - [sym_crypto cryptodev - mempool_create mempool_init ] - [time] - - -Pipeline -~~~~~~~~ - -Create pipeline :: - - pipeline - period - offset_port_id - cpu - -Create pipeline input port :: - - pipeline port in - bsz - link rxq - | swq - | tmgr - | tap mempool mtu - | source mempool file bpp - [action ] - [disabled] - -Create pipeline output port :: - - pipeline port out - bsz - link txq - | swq - | tmgr - | tap - | sink [file pkts ] - -Create pipeline table :: - - pipeline table - match - acl - ipv4 | ipv6 - offset - size - | array - offset - size - | hash - ext | lru - key - mask - offset - buckets - size - | lpm - ipv4 | ipv6 - offset - size - | stub - [action ] - -Connect pipeline input port to table :: - - pipeline port in table - -Display statistics for specific pipeline input port, output port -or table :: - - pipeline port in stats read [clear] - pipeline port out stats read [clear] - pipeline table stats read [clear] - -Enable given input port for specific pipeline instance :: - - pipeline port out disable - -Disable given input port for specific pipeline instance :: - - pipeline port out disable - -Add default rule to table for specific pipeline instance :: - - pipeline table rule add - match - default - action - fwd - drop - | port - | meta - | table - -Add rule to table for specific pipeline instance :: - - pipeline table rule add - - match - acl - priority - ipv4 | ipv6 - - | array - | hash - raw - | ipv4_5tuple - | ipv6_5tuple - | ipv4_addr - | ipv6_addr - | qinq - | lpm - ipv4 | ipv6 - - action - fwd - drop - | port - | meta - | table - [balance ... ] - [meter - tc0 meter policer g y r - [tc1 meter policer g y r - tc2 meter policer g y r - tc3 meter policer g y r ]] - [tm subport pipe ] - [encap - ether - | vlan - | qinq - | mpls unicast | multicast - - label0