From: Stephen Hemminger <stephen@networkplumber.org>
To: dev@dpdk.org
Cc: Stephen Hemminger <stephen@networkplumber.org>,
Thomas Monjalon <thomas@monjalon.net>,
Cristian Dumitrescu <cristian.dumitrescu@intel.com>
Subject: [RFC 3/6] examples/ip_pipeline: remove example
Date: Fri, 24 Jul 2026 09:43:59 -0700 [thread overview]
Message-ID: <20260724164520.192203-4-stephen@networkplumber.org> (raw)
In-Reply-To: <20260724164520.192203-1-stephen@networkplumber.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 <stephen@networkplumber.org>
---
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 -
| 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
-
- $ ./<build_dir>/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 <link_name>
- dev <device_name>|port <port_id>
- rxq <n_queues> <queue_size> <mempool_name>
- txq <n_queues> <queue_size> promiscuous on | off
- [rss <qid_0> ... <qid_n>]
-
- Note: The PCI device name must be specified in the Domain:Bus:Device.Function format.
-
-
-Mempool
-~~~~~~~
-
- Mempool create ::
-
- mempool <mempool_name> buffer <buffer_size>
- pool <pool_size> cache <cache_size> cpu <cpu_id>
-
-
-Software queue
-~~~~~~~~~~~~~~
-
- Create software queue ::
-
- swq <swq_name> size <size> cpu <cpu_id>
-
-
-Traffic manager
-~~~~~~~~~~~~~~~
-
- Add traffic manager subport profile ::
-
- tmgr subport profile
- <tb_rate> <tb_size>
- <tc0_rate> <tc1_rate> <tc2_rate> <tc3_rate> <tc4_rate>
- <tc5_rate> <tc6_rate> <tc7_rate> <tc8_rate>
- <tc9_rate> <tc10_rate> <tc11_rate> <tc12_rate>
- <tc_period>
-
- Add traffic manager pipe profile ::
-
- tmgr pipe profile
- <tb_rate> <tb_size>
- <tc0_rate> <tc1_rate> <tc2_rate> <tc3_rate> <tc4_rate>
- <tc5_rate> <tc6_rate> <tc7_rate> <tc8_rate>
- <tc9_rate> <tc10_rate> <tc11_rate> <tc12_rate>
- <tc_period>
- <tc_ov_weight>
- <wrr_weight0..3>
-
- Create traffic manager port ::
-
- tmgr <tmgr_name>
- rate <rate>
- spp <n_subports_per_port>
- pps <n_pipes_per_subport>
- fo <frame_overhead>
- mtu <mtu>
- cpu <cpu_id>
-
- Configure traffic manager subport ::
-
- tmgr <tmgr_name>
- subport <subport_id>
- profile <subport_profile_id>
-
- Configure traffic manager pipe ::
-
- tmgr <tmgr_name>
- subport <subport_id>
- pipe from <pipe_id_first> to <pipe_id_last>
- profile <pipe_profile_id>
-
-
-Tap
-~~~
-
- Create tap port ::
-
- tap <name>
-
-
-Cryptodev
-~~~~~~~~~
-
- Create cryptodev port ::
-
- cryptodev <cryptodev_name>
- dev <DPDK Cryptodev PMD name>
- queue <n_queues> <queue_size>
-
-Action profile
-~~~~~~~~~~~~~~
-
- Create action profile for pipeline input port ::
-
- port in action profile <profile_name>
- [filter match | mismatch offset <key_offset> mask <key_mask> key <key_value> port <port_id>]
- [balance offset <key_offset> mask <key_mask> port <port_id0> ... <port_id15>]
-
- Create action profile for the pipeline table ::
-
- table action profile <profile_name>
- ipv4 | ipv6
- offset <ip_offset>
- fwd
- [balance offset <key_offset> mask <key_mask> outoffset <out_offset>]
- [meter srtcm | trtcm
- 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]
- [nat src | dst
- proto udp | tcp]
- [ttl drop | fwd
- stats none | pkts]
- [stats pkts | bytes | both]
- [sym_crypto cryptodev <cryptodev_name>
- mempool_create <mempool_name> mempool_init <mempool_name>]
- [time]
-
-
-Pipeline
-~~~~~~~~
-
-Create pipeline ::
-
- pipeline <pipeline_name>
- period <timer_period_ms>
- offset_port_id <offset_port_id>
- cpu <cpu_id>
-
-Create pipeline input port ::
-
- pipeline <pipeline_name> port in
- bsz <burst_size>
- link <link_name> rxq <queue_id>
- | swq <swq_name>
- | tmgr <tmgr_name>
- | tap <tap_name> mempool <mempool_name> mtu <mtu>
- | source mempool <mempool_name> file <file_name> bpp <n_bytes_per_pkt>
- [action <port_in_action_profile_name>]
- [disabled]
-
-Create pipeline output port ::
-
- pipeline <pipeline_name> port out
- bsz <burst_size>
- link <link_name> txq <txq_id>
- | swq <swq_name>
- | tmgr <tmgr_name>
- | tap <tap_name>
- | sink [file <file_name> pkts <max_n_pkts>]
-
-Create pipeline table ::
-
- pipeline <pipeline_name> table
- match
- acl
- ipv4 | ipv6
- offset <ip_header_offset>
- size <n_rules>
- | array
- offset <key_offset>
- size <n_keys>
- | hash
- ext | lru
- key <key_size>
- mask <key_mask>
- offset <key_offset>
- buckets <n_buckets>
- size <n_keys>
- | lpm
- ipv4 | ipv6
- offset <ip_header_offset>
- size <n_rules>
- | stub
- [action <table_action_profile_name>]
-
-Connect pipeline input port to table ::
-
- pipeline <pipeline_name> port in <port_id> table <table_id>
-
-Display statistics for specific pipeline input port, output port
-or table ::
-
- pipeline <pipeline_name> port in <port_id> stats read [clear]
- pipeline <pipeline_name> port out <port_id> stats read [clear]
- pipeline <pipeline_name> table <table_id> stats read [clear]
-
-Enable given input port for specific pipeline instance ::
-
- pipeline <pipeline_name> port out <port_id> disable
-
-Disable given input port for specific pipeline instance ::
-
- pipeline <pipeline_name> port out <port_id> disable
-
-Add default rule to table for specific pipeline instance ::
-
- pipeline <pipeline_name> table <table_id> rule add
- match
- default
- action
- fwd
- drop
- | port <port_id>
- | meta
- | table <table_id>
-
-Add rule to table for specific pipeline instance ::
-
- pipeline <pipeline_name> table <table_id> rule add
-
- match
- acl
- priority <priority>
- ipv4 | ipv6 <sa> <sa_depth> <da> <da_depth>
- <sp0> <sp1> <dp0> <dp1> <proto>
- | array <pos>
- | hash
- raw <key>
- | ipv4_5tuple <sa> <da> <sp> <dp> <proto>
- | ipv6_5tuple <sa> <da> <sp> <dp> <proto>
- | ipv4_addr <addr>
- | ipv6_addr <addr>
- | qinq <svlan> <cvlan>
- | lpm
- ipv4 | ipv6 <addr> <depth>
-
- action
- fwd
- drop
- | port <port_id>
- | meta
- | table <table_id>
- [balance <out0> ... <out7>]
- [meter
- tc0 meter <meter_profile_id> policer g <pa> y <pa> r <pa>
- [tc1 meter <meter_profile_id> policer g <pa> y <pa> r <pa>
- tc2 meter <meter_profile_id> policer g <pa> y <pa> r <pa>
- tc3 meter <meter_profile_id> policer g <pa> y <pa> r <pa>]]
- [tm subport <subport_id> pipe <pipe_id>]
- [encap
- ether <da> <sa>
- | vlan <da> <sa> <pcp> <dei> <vid>
- | qinq <da> <sa> <pcp> <dei> <vid> <pcp> <dei> <vid>
- | mpls unicast | multicast
- <da> <sa>
- label0 <label> <tc> <ttl>
- [label1 <label> <tc> <ttl>
- [label2 <label> <tc> <ttl>
- [label3 <label> <tc> <ttl>]]]
- | pppoe <da> <sa> <session_id>]
- [nat ipv4 | ipv6 <addr> <port>]
- [ttl dec | keep]
- [stats]
- [time]
- [sym_crypto
- encrypt | decrypt
- type
- | cipher
- cipher_algo <algo> cipher_key <key> cipher_iv <iv>
- | cipher_auth
- cipher_algo <algo> cipher_key <key> cipher_iv <iv>
- auth_algo <algo> auth_key <key> digest_size <size>
- | aead
- aead_algo <algo> aead_key <key> aead_iv <iv> aead_aad <aad>
- digest_size <size>
- data_offset <data_offset>]
-
- where:
- <pa> ::= g | y | r | drop
-
-Add bulk rules to table for specific pipeline instance ::
-
- pipeline <pipeline_name> table <table_id> rule add bulk <file_name> <n_rules>
-
- Where:
- - file_name = path to file
- - File line format = match <match> action <action>
-
-Delete table rule for specific pipeline instance ::
-
- pipeline <pipeline_name> table <table_id> rule delete
- match <match>
-
-Delete default table rule for specific pipeline instance ::
-
- pipeline <pipeline_name> table <table_id> rule delete
- match
- default
-
-Add meter profile to the table for specific pipeline instance ::
-
- pipeline <pipeline_name> table <table_id> meter profile <meter_profile_id>
- add srtcm cir <cir> cbs <cbs> ebs <ebs>
- | trtcm cir <cir> pir <pir> cbs <cbs> pbs <pbs>
-
-Delete meter profile from the table for specific pipeline instance ::
-
- pipeline <pipeline_name> table <table_id>
- meter profile <meter_profile_id> delete
-
-
-Update the dscp table for meter or traffic manager action for specific
-pipeline instance ::
-
- pipeline <pipeline_name> table <table_id> dscp <file_name>
-
- Where:
- - file_name = path to file
- - exactly 64 lines
- - File line format = <tc_id> <tc_queue_id> <color>, with <color> as: g | y | r
-
-
-Pipeline enable/disable
-~~~~~~~~~~~~~~~~~~~~~~~
-
- Enable given pipeline instance for specific data plane thread ::
-
- thread <thread_id> pipeline <pipeline_name> enable
-
-
- Disable given pipeline instance for specific data plane thread ::
-
- thread <thread_id> pipeline <pipeline_name> disable
diff --git a/examples/ip_pipeline/Makefile b/examples/ip_pipeline/Makefile
deleted file mode 100644
index 438aa6b37f..0000000000
--- a/examples/ip_pipeline/Makefile
+++ /dev/null
@@ -1,60 +0,0 @@
-# SPDX-License-Identifier: BSD-3-Clause
-# Copyright(c) 2010-2018 Intel Corporation
-
-# binary name
-APP = ip_pipeline
-
-# all source are stored in SRCS-y
-SRCS-y := action.c
-SRCS-y += cli.c
-SRCS-y += conn.c
-SRCS-y += link.c
-SRCS-y += main.c
-SRCS-y += mempool.c
-SRCS-y += parser.c
-SRCS-y += pipeline.c
-SRCS-y += swq.c
-SRCS-y += tap.c
-SRCS-y += thread.c
-SRCS-y += tmgr.c
-SRCS-y += cryptodev.c
-
-PKGCONF ?= pkg-config
-
-# Build using pkg-config variables if possible
-ifneq ($(shell $(PKGCONF) --exists libdpdk && echo 0),0)
-$(error "no installation of DPDK found")
-endif
-
-all: shared
-.PHONY: shared static
-shared: build/$(APP)-shared
- ln -sf $(APP)-shared build/$(APP)
-static: build/$(APP)-static
- ln -sf $(APP)-static build/$(APP)
-
-PC_FILE := $(shell $(PKGCONF) --path libdpdk 2>/dev/null)
-CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
-LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
-LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
-
-CFLAGS += -I. -DALLOW_EXPERIMENTAL_API -D_GNU_SOURCE
-
-OBJS := $(patsubst %.c,build/%.o,$(SRCS-y))
-
-build/%.o: %.c Makefile $(PC_FILE) | build
- $(CC) $(CFLAGS) -c $< -o $@
-
-build/$(APP)-shared: $(OBJS)
- $(CC) $(OBJS) -o $@ $(LDFLAGS) $(LDFLAGS_SHARED)
-
-build/$(APP)-static: $(OBJS)
- $(CC) $(OBJS) -o $@ $(LDFLAGS) $(LDFLAGS_STATIC)
-
-build:
- @mkdir -p $@
-
-.PHONY: clean
-clean:
- rm -f build/$(APP)* build/*.o
- test -d build && rmdir -p build || true
diff --git a/examples/ip_pipeline/action.c b/examples/ip_pipeline/action.c
deleted file mode 100644
index d2104aad6e..0000000000
--- a/examples/ip_pipeline/action.c
+++ /dev/null
@@ -1,391 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2018 Intel Corporation
- */
-
-#include <stdint.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <rte_string_fns.h>
-#include <rte_table_hash_func.h>
-
-#include "action.h"
-
-/**
- * Input port
- */
-static struct port_in_action_profile_list port_in_action_profile_list;
-
-int
-port_in_action_profile_init(void)
-{
- TAILQ_INIT(&port_in_action_profile_list);
-
- return 0;
-}
-
-struct port_in_action_profile *
-port_in_action_profile_find(const char *name)
-{
- struct port_in_action_profile *profile;
-
- if (name == NULL)
- return NULL;
-
- TAILQ_FOREACH(profile, &port_in_action_profile_list, node)
- if (strcmp(profile->name, name) == 0)
- return profile;
-
- return NULL;
-}
-
-struct port_in_action_profile *
-port_in_action_profile_create(const char *name,
- struct port_in_action_profile_params *params)
-{
- struct port_in_action_profile *profile;
- struct rte_port_in_action_profile *ap;
- int status;
-
- /* Check input params */
- if ((name == NULL) ||
- port_in_action_profile_find(name) ||
- (params == NULL))
- return NULL;
-
- if ((params->action_mask & (1LLU << RTE_PORT_IN_ACTION_LB)) &&
- (params->lb.f_hash == NULL)) {
- switch (params->lb.key_size) {
- case 8:
- params->lb.f_hash = rte_table_hash_crc_key8;
- break;
-
- case 16:
- params->lb.f_hash = rte_table_hash_crc_key16;
- break;
-
- case 24:
- params->lb.f_hash = rte_table_hash_crc_key24;
- break;
-
- case 32:
- params->lb.f_hash = rte_table_hash_crc_key32;
- break;
-
- case 40:
- params->lb.f_hash = rte_table_hash_crc_key40;
- break;
-
- case 48:
- params->lb.f_hash = rte_table_hash_crc_key48;
- break;
-
- case 56:
- params->lb.f_hash = rte_table_hash_crc_key56;
- break;
-
- case 64:
- params->lb.f_hash = rte_table_hash_crc_key64;
- break;
-
- default:
- return NULL;
- }
-
- params->lb.seed = 0;
- }
- /* Resource */
- ap = rte_port_in_action_profile_create(0);
- if (ap == NULL)
- return NULL;
-
- if (params->action_mask & (1LLU << RTE_PORT_IN_ACTION_FLTR)) {
- status = rte_port_in_action_profile_action_register(ap,
- RTE_PORT_IN_ACTION_FLTR,
- ¶ms->fltr);
-
- if (status) {
- rte_port_in_action_profile_free(ap);
- return NULL;
- }
- }
-
- if (params->action_mask & (1LLU << RTE_PORT_IN_ACTION_LB)) {
- status = rte_port_in_action_profile_action_register(ap,
- RTE_PORT_IN_ACTION_LB,
- ¶ms->lb);
-
- if (status) {
- rte_port_in_action_profile_free(ap);
- return NULL;
- }
- }
-
- status = rte_port_in_action_profile_freeze(ap);
- if (status) {
- rte_port_in_action_profile_free(ap);
- return NULL;
- }
-
- /* Node allocation */
- profile = calloc(1, sizeof(struct port_in_action_profile));
- if (profile == NULL) {
- rte_port_in_action_profile_free(ap);
- return NULL;
- }
-
- /* Node fill in */
- strlcpy(profile->name, name, sizeof(profile->name));
- memcpy(&profile->params, params, sizeof(*params));
- profile->ap = ap;
-
- /* Node add to list */
- TAILQ_INSERT_TAIL(&port_in_action_profile_list, profile, node);
-
- return profile;
-}
-
-/**
- * Table
- */
-static struct table_action_profile_list table_action_profile_list;
-
-int
-table_action_profile_init(void)
-{
- TAILQ_INIT(&table_action_profile_list);
-
- return 0;
-}
-
-struct table_action_profile *
-table_action_profile_find(const char *name)
-{
- struct table_action_profile *profile;
-
- if (name == NULL)
- return NULL;
-
- TAILQ_FOREACH(profile, &table_action_profile_list, node)
- if (strcmp(profile->name, name) == 0)
- return profile;
-
- return NULL;
-}
-
-struct table_action_profile *
-table_action_profile_create(const char *name,
- struct table_action_profile_params *params)
-{
- struct table_action_profile *profile;
- struct rte_table_action_profile *ap;
- int status;
-
- /* Check input params */
- if ((name == NULL) ||
- table_action_profile_find(name) ||
- (params == NULL) ||
- ((params->action_mask & (1LLU << RTE_TABLE_ACTION_FWD)) == 0))
- return NULL;
-
- if ((params->action_mask & (1LLU << RTE_TABLE_ACTION_LB)) &&
- (params->lb.f_hash == NULL)) {
- switch (params->lb.key_size) {
- case 8:
- params->lb.f_hash = rte_table_hash_crc_key8;
- break;
-
- case 16:
- params->lb.f_hash = rte_table_hash_crc_key16;
- break;
-
- case 24:
- params->lb.f_hash = rte_table_hash_crc_key24;
- break;
-
- case 32:
- params->lb.f_hash = rte_table_hash_crc_key32;
- break;
-
- case 40:
- params->lb.f_hash = rte_table_hash_crc_key40;
- break;
-
- case 48:
- params->lb.f_hash = rte_table_hash_crc_key48;
- break;
-
- case 56:
- params->lb.f_hash = rte_table_hash_crc_key56;
- break;
-
- case 64:
- params->lb.f_hash = rte_table_hash_crc_key64;
- break;
-
- default:
- return NULL;
- }
-
- params->lb.seed = 0;
- }
-
- /* Resource */
- ap = rte_table_action_profile_create(¶ms->common);
- if (ap == NULL)
- return NULL;
-
- if (params->action_mask & (1LLU << RTE_TABLE_ACTION_FWD)) {
- status = rte_table_action_profile_action_register(ap,
- RTE_TABLE_ACTION_FWD,
- NULL);
-
- if (status) {
- rte_table_action_profile_free(ap);
- return NULL;
- }
- }
-
- if (params->action_mask & (1LLU << RTE_TABLE_ACTION_LB)) {
- status = rte_table_action_profile_action_register(ap,
- RTE_TABLE_ACTION_LB,
- ¶ms->lb);
-
- if (status) {
- rte_table_action_profile_free(ap);
- return NULL;
- }
- }
-
- if (params->action_mask & (1LLU << RTE_TABLE_ACTION_MTR)) {
- status = rte_table_action_profile_action_register(ap,
- RTE_TABLE_ACTION_MTR,
- ¶ms->mtr);
-
- if (status) {
- rte_table_action_profile_free(ap);
- return NULL;
- }
- }
-
- if (params->action_mask & (1LLU << RTE_TABLE_ACTION_TM)) {
- status = rte_table_action_profile_action_register(ap,
- RTE_TABLE_ACTION_TM,
- ¶ms->tm);
-
- if (status) {
- rte_table_action_profile_free(ap);
- return NULL;
- }
- }
-
- if (params->action_mask & (1LLU << RTE_TABLE_ACTION_ENCAP)) {
- status = rte_table_action_profile_action_register(ap,
- RTE_TABLE_ACTION_ENCAP,
- ¶ms->encap);
-
- if (status) {
- rte_table_action_profile_free(ap);
- return NULL;
- }
- }
-
- if (params->action_mask & (1LLU << RTE_TABLE_ACTION_NAT)) {
- status = rte_table_action_profile_action_register(ap,
- RTE_TABLE_ACTION_NAT,
- ¶ms->nat);
-
- if (status) {
- rte_table_action_profile_free(ap);
- return NULL;
- }
- }
-
- if (params->action_mask & (1LLU << RTE_TABLE_ACTION_TTL)) {
- status = rte_table_action_profile_action_register(ap,
- RTE_TABLE_ACTION_TTL,
- ¶ms->ttl);
-
- if (status) {
- rte_table_action_profile_free(ap);
- return NULL;
- }
- }
-
- if (params->action_mask & (1LLU << RTE_TABLE_ACTION_STATS)) {
- status = rte_table_action_profile_action_register(ap,
- RTE_TABLE_ACTION_STATS,
- ¶ms->stats);
-
- if (status) {
- rte_table_action_profile_free(ap);
- return NULL;
- }
- }
- if (params->action_mask & (1LLU << RTE_TABLE_ACTION_TIME)) {
- status = rte_table_action_profile_action_register(ap,
- RTE_TABLE_ACTION_TIME,
- NULL);
-
- if (status) {
- rte_table_action_profile_free(ap);
- return NULL;
- }
- }
-
- if (params->action_mask & (1LLU << RTE_TABLE_ACTION_SYM_CRYPTO)) {
- status = rte_table_action_profile_action_register(ap,
- RTE_TABLE_ACTION_SYM_CRYPTO,
- ¶ms->sym_crypto);
-
- if (status) {
- rte_table_action_profile_free(ap);
- return NULL;
- }
- }
-
- if (params->action_mask & (1LLU << RTE_TABLE_ACTION_TAG)) {
- status = rte_table_action_profile_action_register(ap,
- RTE_TABLE_ACTION_TAG,
- NULL);
-
- if (status) {
- rte_table_action_profile_free(ap);
- return NULL;
- }
- }
-
- if (params->action_mask & (1LLU << RTE_TABLE_ACTION_DECAP)) {
- status = rte_table_action_profile_action_register(ap,
- RTE_TABLE_ACTION_DECAP,
- NULL);
-
- if (status) {
- rte_table_action_profile_free(ap);
- return NULL;
- }
- }
-
- status = rte_table_action_profile_freeze(ap);
- if (status) {
- rte_table_action_profile_free(ap);
- return NULL;
- }
-
- /* Node allocation */
- profile = calloc(1, sizeof(struct table_action_profile));
- if (profile == NULL) {
- rte_table_action_profile_free(ap);
- return NULL;
- }
-
- /* Node fill in */
- strlcpy(profile->name, name, sizeof(profile->name));
- memcpy(&profile->params, params, sizeof(*params));
- profile->ap = ap;
-
- /* Node add to list */
- TAILQ_INSERT_TAIL(&table_action_profile_list, profile, node);
-
- return profile;
-}
diff --git a/examples/ip_pipeline/action.h b/examples/ip_pipeline/action.h
deleted file mode 100644
index cde17e69a3..0000000000
--- a/examples/ip_pipeline/action.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2018 Intel Corporation
- */
-
-#ifndef _INCLUDE_ACTION_H_
-#define _INCLUDE_ACTION_H_
-
-#include <sys/queue.h>
-
-#include <rte_port_in_action.h>
-#include <rte_table_action.h>
-
-#include "common.h"
-
-/**
- * Input port action
- */
-struct port_in_action_profile_params {
- uint64_t action_mask;
- struct rte_port_in_action_fltr_config fltr;
- struct rte_port_in_action_lb_config lb;
-};
-
-struct port_in_action_profile {
- TAILQ_ENTRY(port_in_action_profile) node;
- char name[NAME_SIZE];
- struct port_in_action_profile_params params;
- struct rte_port_in_action_profile *ap;
-};
-
-TAILQ_HEAD(port_in_action_profile_list, port_in_action_profile);
-
-int
-port_in_action_profile_init(void);
-
-struct port_in_action_profile *
-port_in_action_profile_find(const char *name);
-
-struct port_in_action_profile *
-port_in_action_profile_create(const char *name,
- struct port_in_action_profile_params *params);
-
-/**
- * Table action
- */
-struct table_action_profile_params {
- uint64_t action_mask;
- struct rte_table_action_common_config common;
- struct rte_table_action_lb_config lb;
- struct rte_table_action_mtr_config mtr;
- struct rte_table_action_tm_config tm;
- struct rte_table_action_encap_config encap;
- struct rte_table_action_nat_config nat;
- struct rte_table_action_ttl_config ttl;
- struct rte_table_action_stats_config stats;
- struct rte_table_action_sym_crypto_config sym_crypto;
-};
-
-struct table_action_profile {
- TAILQ_ENTRY(table_action_profile) node;
- char name[NAME_SIZE];
- struct table_action_profile_params params;
- struct rte_table_action_profile *ap;
-};
-
-TAILQ_HEAD(table_action_profile_list, table_action_profile);
-
-int
-table_action_profile_init(void);
-
-struct table_action_profile *
-table_action_profile_find(const char *name);
-
-struct table_action_profile *
-table_action_profile_create(const char *name,
- struct table_action_profile_params *params);
-
-#endif /* _INCLUDE_ACTION_H_ */
diff --git a/examples/ip_pipeline/cli.c b/examples/ip_pipeline/cli.c
deleted file mode 100644
index 935c9b39d5..0000000000
--- a/examples/ip_pipeline/cli.c
+++ /dev/null
@@ -1,6791 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2018 Intel Corporation
- */
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <rte_common.h>
-#include <rte_cycles.h>
-#include <rte_ethdev.h>
-
-#include "cli.h"
-
-#include "cryptodev.h"
-#include "link.h"
-#include "mempool.h"
-#include "parser.h"
-#include "pipeline.h"
-#include "swq.h"
-#include "tap.h"
-#include "thread.h"
-#include "tmgr.h"
-
-#ifndef CMD_MAX_TOKENS
-#define CMD_MAX_TOKENS 256
-#endif
-
-#define MSG_OUT_OF_MEMORY "Not enough memory.\n"
-#define MSG_CMD_UNKNOWN "Unknown command \"%s\".\n"
-#define MSG_CMD_UNIMPLEM "Command \"%s\" not implemented.\n"
-#define MSG_ARG_NOT_ENOUGH "Not enough arguments for command \"%s\".\n"
-#define MSG_ARG_TOO_MANY "Too many arguments for command \"%s\".\n"
-#define MSG_ARG_MISMATCH "Wrong number of arguments for command \"%s\".\n"
-#define MSG_ARG_NOT_FOUND "Argument \"%s\" not found.\n"
-#define MSG_ARG_INVALID "Invalid value for argument \"%s\".\n"
-#define MSG_FILE_ERR "Error in file \"%s\" at line %u.\n"
-#define MSG_FILE_NOT_ENOUGH "Not enough rules in file \"%s\".\n"
-#define MSG_CMD_FAIL "Command \"%s\" failed.\n"
-
-static int
-is_comment(char *in)
-{
- if ((strlen(in) && index("!#%;", in[0])) ||
- (strncmp(in, "//", 2) == 0) ||
- (strncmp(in, "--", 2) == 0))
- return 1;
-
- return 0;
-}
-
-static const char cmd_mempool_help[] =
-"mempool <mempool_name>\n"
-" buffer <buffer_size>\n"
-" pool <pool_size>\n"
-" cache <cache_size>\n"
-" cpu <cpu_id>\n";
-
-static void
-cmd_mempool(char **tokens,
- uint32_t n_tokens,
- char *out,
- size_t out_size)
-{
- struct mempool_params p;
- char *name;
- struct mempool *mempool;
-
- if (n_tokens != 10) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return;
- }
-
- name = tokens[1];
-
- if (strcmp(tokens[2], "buffer") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "buffer");
- return;
- }
-
- if (parser_read_uint32(&p.buffer_size, tokens[3]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "buffer_size");
- return;
- }
-
- if (strcmp(tokens[4], "pool") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "pool");
- return;
- }
-
- if (parser_read_uint32(&p.pool_size, tokens[5]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "pool_size");
- return;
- }
-
- if (strcmp(tokens[6], "cache") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "cache");
- return;
- }
-
- if (parser_read_uint32(&p.cache_size, tokens[7]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "cache_size");
- return;
- }
-
- if (strcmp(tokens[8], "cpu") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "cpu");
- return;
- }
-
- if (parser_read_uint32(&p.cpu_id, tokens[9]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "cpu_id");
- return;
- }
-
- mempool = mempool_create(name, &p);
- if (mempool == NULL) {
- snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
- return;
- }
-}
-
-static const char cmd_link_help[] =
-"link <link_name>\n"
-" dev <device_name> | port <port_id>\n"
-" rxq <n_queues> <queue_size> <mempool_name>\n"
-" txq <n_queues> <queue_size>\n"
-" promiscuous on | off\n"
-" [rss <qid_0> ... <qid_n>]\n";
-
-static void
-cmd_link(char **tokens,
- uint32_t n_tokens,
- char *out,
- size_t out_size)
-{
- struct link_params p;
- struct link_params_rss rss;
- struct link *link;
- char *name;
-
- memset(&p, 0, sizeof(p));
-
- if ((n_tokens < 13) || (n_tokens > 14 + LINK_RXQ_RSS_MAX)) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return;
- }
- name = tokens[1];
-
- if (strcmp(tokens[2], "dev") == 0)
- p.dev_name = tokens[3];
- else if (strcmp(tokens[2], "port") == 0) {
- p.dev_name = NULL;
-
- if (parser_read_uint16(&p.port_id, tokens[3]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "port_id");
- return;
- }
- } else {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "dev or port");
- return;
- }
-
- if (strcmp(tokens[4], "rxq") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "rxq");
- return;
- }
-
- if (parser_read_uint32(&p.rx.n_queues, tokens[5]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "n_queues");
- return;
- }
- if (parser_read_uint32(&p.rx.queue_size, tokens[6]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "queue_size");
- return;
- }
-
- p.rx.mempool_name = tokens[7];
-
- if (strcmp(tokens[8], "txq") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "txq");
- return;
- }
-
- if (parser_read_uint32(&p.tx.n_queues, tokens[9]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "n_queues");
- return;
- }
-
- if (parser_read_uint32(&p.tx.queue_size, tokens[10]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "queue_size");
- return;
- }
-
- if (strcmp(tokens[11], "promiscuous") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "promiscuous");
- return;
- }
-
- if (strcmp(tokens[12], "on") == 0)
- p.promiscuous = 1;
- else if (strcmp(tokens[12], "off") == 0)
- p.promiscuous = 0;
- else {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "on or off");
- return;
- }
-
- /* RSS */
- p.rx.rss = NULL;
- if (n_tokens > 13) {
- uint32_t queue_id, i;
-
- if (strcmp(tokens[13], "rss") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "rss");
- return;
- }
-
- p.rx.rss = &rss;
-
- rss.n_queues = 0;
- for (i = 14; i < n_tokens; i++) {
- if (parser_read_uint32(&queue_id, tokens[i]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID,
- "queue_id");
- return;
- }
-
- rss.queue_id[rss.n_queues] = queue_id;
- rss.n_queues++;
- }
- }
-
- link = link_create(name, &p);
- if (link == NULL) {
- snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
- return;
- }
-}
-
-/* Print the link stats and info */
-static void
-print_link_info(struct link *link, char *out, size_t out_size)
-{
- struct rte_eth_stats stats;
- struct rte_ether_addr mac_addr;
- struct rte_eth_link eth_link;
- uint16_t mtu;
- int ret;
-
- memset(&stats, 0, sizeof(stats));
- rte_eth_stats_get(link->port_id, &stats);
-
- ret = rte_eth_macaddr_get(link->port_id, &mac_addr);
- if (ret != 0) {
- snprintf(out, out_size, "\n%s: MAC address get failed: %s",
- link->name, rte_strerror(-ret));
- return;
- }
-
- ret = rte_eth_link_get(link->port_id, ð_link);
- if (ret < 0) {
- snprintf(out, out_size, "\n%s: link get failed: %s",
- link->name, rte_strerror(-ret));
- return;
- }
-
- rte_eth_dev_get_mtu(link->port_id, &mtu);
-
- snprintf(out, out_size,
- "\n"
- "%s: flags=<%s> mtu %u\n"
- "\tether " RTE_ETHER_ADDR_PRT_FMT " rxqueues %u txqueues %u\n"
- "\tport# %u speed %s\n"
- "\tRX packets %" PRIu64" bytes %" PRIu64"\n"
- "\tRX errors %" PRIu64" missed %" PRIu64" no-mbuf %" PRIu64"\n"
- "\tTX packets %" PRIu64" bytes %" PRIu64"\n"
- "\tTX errors %" PRIu64"\n",
- link->name,
- eth_link.link_status == 0 ? "DOWN" : "UP",
- mtu,
- RTE_ETHER_ADDR_BYTES(&mac_addr),
- link->n_rxq,
- link->n_txq,
- link->port_id,
- rte_eth_link_speed_to_str(eth_link.link_speed),
- stats.ipackets,
- stats.ibytes,
- stats.ierrors,
- stats.imissed,
- stats.rx_nombuf,
- stats.opackets,
- stats.obytes,
- stats.oerrors);
-}
-
-/*
- * link show [<link_name>]
- */
-static void
-cmd_link_show(char **tokens, uint32_t n_tokens, char *out, size_t out_size)
-{
- struct link *link;
- char *link_name;
-
- if (n_tokens != 2 && n_tokens != 3) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return;
- }
-
- if (n_tokens == 2) {
- link = link_next(NULL);
-
- while (link != NULL) {
- out_size = out_size - strlen(out);
- out = &out[strlen(out)];
-
- print_link_info(link, out, out_size);
- link = link_next(link);
- }
- } else {
- out_size = out_size - strlen(out);
- out = &out[strlen(out)];
-
- link_name = tokens[2];
- link = link_find(link_name);
-
- if (link == NULL) {
- snprintf(out, out_size, MSG_ARG_INVALID,
- "Link does not exist");
- return;
- }
- print_link_info(link, out, out_size);
- }
-}
-
-static const char cmd_swq_help[] =
-"swq <swq_name>\n"
-" size <size>\n"
-" cpu <cpu_id>\n";
-
-static void
-cmd_swq(char **tokens,
- uint32_t n_tokens,
- char *out,
- size_t out_size)
-{
- struct swq_params p;
- char *name;
- struct swq *swq;
-
- if (n_tokens != 6) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return;
- }
-
- name = tokens[1];
-
- if (strcmp(tokens[2], "size") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "size");
- return;
- }
-
- if (parser_read_uint32(&p.size, tokens[3]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "size");
- return;
- }
-
- if (strcmp(tokens[4], "cpu") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "cpu");
- return;
- }
-
- if (parser_read_uint32(&p.cpu_id, tokens[5]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "cpu_id");
- return;
- }
-
- swq = swq_create(name, &p);
- if (swq == NULL) {
- snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
- return;
- }
-}
-
-static const char cmd_tmgr_subport_profile_help[] =
-"tmgr subport profile\n"
-" <tb_rate> <tb_size>\n"
-" <tc0_rate> <tc1_rate> <tc2_rate> <tc3_rate> <tc4_rate>"
-" <tc5_rate> <tc6_rate> <tc7_rate> <tc8_rate>"
-" <tc9_rate> <tc10_rate> <tc11_rate> <tc12_rate>\n"
-" <tc_period>\n";
-
-static void
-cmd_tmgr_subport_profile(char **tokens,
- uint32_t n_tokens,
- char *out,
- size_t out_size)
-{
- struct rte_sched_subport_profile_params subport_profile;
- int status, i;
-
- if (n_tokens != 19) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return;
- }
-
- if (parser_read_uint64(&subport_profile.tb_rate, tokens[3]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "tb_rate");
- return;
- }
-
- if (parser_read_uint64(&subport_profile.tb_size, tokens[4]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "tb_size");
- return;
- }
-
- for (i = 0; i < RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE; i++)
- if (parser_read_uint64(&subport_profile.tc_rate[i],
- tokens[5 + i]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "tc_rate");
- return;
- }
-
- if (parser_read_uint64(&subport_profile.tc_period, tokens[18]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "tc_period");
- return;
- }
-
- status = tmgr_subport_profile_add(&subport_profile);
- if (status != 0) {
- snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
- return;
- }
-}
-
-static const char cmd_tmgr_pipe_profile_help[] =
-"tmgr pipe profile\n"
-" <tb_rate> <tb_size>\n"
-" <tc0_rate> <tc1_rate> <tc2_rate> <tc3_rate> <tc4_rate>"
-" <tc5_rate> <tc6_rate> <tc7_rate> <tc8_rate>"
-" <tc9_rate> <tc10_rate> <tc11_rate> <tc12_rate>\n"
-" <tc_period>\n"
-" <tc_ov_weight>\n"
-" <wrr_weight0..3>\n";
-
-static void
-cmd_tmgr_pipe_profile(char **tokens,
- uint32_t n_tokens,
- char *out,
- size_t out_size)
-{
- struct rte_sched_pipe_params p;
- int status, i;
-
- if (n_tokens != 24) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return;
- }
-
- if (parser_read_uint64(&p.tb_rate, tokens[3]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "tb_rate");
- return;
- }
-
- if (parser_read_uint64(&p.tb_size, tokens[4]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "tb_size");
- return;
- }
-
- for (i = 0; i < RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE; i++)
- if (parser_read_uint64(&p.tc_rate[i], tokens[5 + i]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "tc_rate");
- return;
- }
-
- if (parser_read_uint64(&p.tc_period, tokens[18]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "tc_period");
- return;
- }
-
- if (parser_read_uint8(&p.tc_ov_weight, tokens[19]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "tc_ov_weight");
- return;
- }
-
- for (i = 0; i < RTE_SCHED_BE_QUEUES_PER_PIPE; i++)
- if (parser_read_uint8(&p.wrr_weights[i], tokens[20 + i]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "wrr_weights");
- return;
- }
-
- status = tmgr_pipe_profile_add(&p);
- if (status != 0) {
- snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
- return;
- }
-}
-
-static const char cmd_tmgr_help[] =
-"tmgr <tmgr_name>\n"
-" rate <rate>\n"
-" spp <n_subports_per_port>\n"
-" pps <n_pipes_per_subport>\n"
-" fo <frame_overhead>\n"
-" mtu <mtu>\n"
-" cpu <cpu_id>\n";
-
-static void
-cmd_tmgr(char **tokens,
- uint32_t n_tokens,
- char *out,
- size_t out_size)
-{
- struct tmgr_port_params p;
- char *name;
- struct tmgr_port *tmgr_port;
-
- if (n_tokens != 14) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return;
- }
-
- name = tokens[1];
-
- if (strcmp(tokens[2], "rate") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "rate");
- return;
- }
-
- if (parser_read_uint64(&p.rate, tokens[3]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "rate");
- return;
- }
-
- if (strcmp(tokens[4], "spp") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "spp");
- return;
- }
-
- if (parser_read_uint32(&p.n_subports_per_port, tokens[5]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "n_subports_per_port");
- return;
- }
-
- if (strcmp(tokens[6], "pps") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "spp");
- return;
- }
-
- if (parser_read_uint32(&p.n_pipes_per_subport, tokens[7]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "n_pipes_per_subport");
- return;
- }
-
- if (strcmp(tokens[8], "fo") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "fo");
- return;
- }
-
- if (parser_read_uint32(&p.frame_overhead, tokens[9]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "frame_overhead");
- return;
- }
-
- if (strcmp(tokens[10], "mtu") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "mtu");
- return;
- }
-
- if (parser_read_uint32(&p.mtu, tokens[11]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "mtu");
- return;
- }
-
- if (strcmp(tokens[12], "cpu") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "cpu");
- return;
- }
-
- if (parser_read_uint32(&p.cpu_id, tokens[13]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "cpu_id");
- return;
- }
-
- tmgr_port = tmgr_port_create(name, &p);
- if (tmgr_port == NULL) {
- snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
- return;
- }
-}
-
-static const char cmd_tmgr_subport_help[] =
-"tmgr <tmgr_name> subport <subport_id>\n"
-" profile <subport_profile_id>\n";
-
-static void
-cmd_tmgr_subport(char **tokens,
- uint32_t n_tokens,
- char *out,
- size_t out_size)
-{
- uint32_t subport_id, subport_profile_id;
- int status;
- char *name;
-
- if (n_tokens != 6) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return;
- }
-
- name = tokens[1];
-
- if (parser_read_uint32(&subport_id, tokens[3]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "subport_id");
- return;
- }
-
- if (parser_read_uint32(&subport_profile_id, tokens[5]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "subport_profile_id");
- return;
- }
-
- status = tmgr_subport_config(name, subport_id, subport_profile_id);
- if (status) {
- snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
- return;
- }
-}
-
-
-static const char cmd_tmgr_subport_pipe_help[] =
-"tmgr <tmgr_name> subport <subport_id> pipe\n"
-" from <pipe_id_first> to <pipe_id_last>\n"
-" profile <pipe_profile_id>\n";
-
-static void
-cmd_tmgr_subport_pipe(char **tokens,
- uint32_t n_tokens,
- char *out,
- size_t out_size)
-{
- uint32_t subport_id, pipe_id_first, pipe_id_last, pipe_profile_id;
- int status;
- char *name;
-
- if (n_tokens != 11) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return;
- }
-
- name = tokens[1];
-
- if (parser_read_uint32(&subport_id, tokens[3]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "subport_id");
- return;
- }
-
- if (strcmp(tokens[4], "pipe") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "pipe");
- return;
- }
-
- if (strcmp(tokens[5], "from") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "from");
- return;
- }
-
- if (parser_read_uint32(&pipe_id_first, tokens[6]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "pipe_id_first");
- return;
- }
-
- if (strcmp(tokens[7], "to") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "to");
- return;
- }
-
- if (parser_read_uint32(&pipe_id_last, tokens[8]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "pipe_id_last");
- return;
- }
-
- if (strcmp(tokens[9], "profile") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "profile");
- return;
- }
-
- if (parser_read_uint32(&pipe_profile_id, tokens[10]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "pipe_profile_id");
- return;
- }
-
- status = tmgr_pipe_config(name, subport_id, pipe_id_first,
- pipe_id_last, pipe_profile_id);
- if (status) {
- snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
- return;
- }
-}
-
-
-static const char cmd_tap_help[] =
-"tap <tap_name>\n";
-
-static void
-cmd_tap(char **tokens,
- uint32_t n_tokens,
- char *out,
- size_t out_size)
-{
- char *name;
- struct tap *tap;
-
- if (n_tokens != 2) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return;
- }
-
- name = tokens[1];
-
- tap = tap_create(name);
- if (tap == NULL) {
- snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
- return;
- }
-}
-
-
-static const char cmd_cryptodev_help[] =
-"cryptodev <cryptodev_name>\n"
-" dev <device_name> | dev_id <device_id>\n"
-" queue <n_queues> <queue_size>\n"
-" max_sessions <n_sessions>";
-
-static void
-cmd_cryptodev(char **tokens,
- uint32_t n_tokens,
- char *out,
- size_t out_size)
-{
- struct cryptodev_params params;
- char *name;
-
- memset(¶ms, 0, sizeof(params));
- if (n_tokens != 9) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return;
- }
-
- name = tokens[1];
-
- if (strcmp(tokens[2], "dev") == 0)
- params.dev_name = tokens[3];
- else if (strcmp(tokens[2], "dev_id") == 0) {
- if (parser_read_uint32(¶ms.dev_id, tokens[3]) < 0) {
- snprintf(out, out_size, MSG_ARG_INVALID,
- "dev_id");
- return;
- }
- } else {
- snprintf(out, out_size, MSG_ARG_INVALID,
- "cryptodev");
- return;
- }
-
- if (strcmp(tokens[4], "queue")) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND,
- "queue");
- return;
- }
-
- if (parser_read_uint32(¶ms.n_queues, tokens[5]) < 0) {
- snprintf(out, out_size, MSG_ARG_INVALID,
- "q");
- return;
- }
-
- if (parser_read_uint32(¶ms.queue_size, tokens[6]) < 0) {
- snprintf(out, out_size, MSG_ARG_INVALID,
- "queue_size");
- return;
- }
-
- if (strcmp(tokens[7], "max_sessions")) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND,
- "max_sessions");
- return;
- }
-
- if (parser_read_uint32(¶ms.session_pool_size, tokens[8]) < 0) {
- snprintf(out, out_size, MSG_ARG_INVALID,
- "queue_size");
- return;
- }
-
- if (cryptodev_create(name, ¶ms) == NULL) {
- snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
- return;
- }
-}
-
-static const char cmd_port_in_action_profile_help[] =
-"port in action profile <profile_name>\n"
-" [filter match | mismatch offset <key_offset> mask <key_mask> key <key_value> port <port_id>]\n"
-" [balance offset <key_offset> mask <key_mask> port <port_id0> ... <port_id15>]\n";
-
-static void
-cmd_port_in_action_profile(char **tokens,
- uint32_t n_tokens,
- char *out,
- size_t out_size)
-{
- struct port_in_action_profile_params p;
- struct port_in_action_profile *ap;
- char *name;
- uint32_t t0;
-
- memset(&p, 0, sizeof(p));
-
- if (n_tokens < 5) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return;
- }
-
- if (strcmp(tokens[1], "in") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "in");
- return;
- }
-
- if (strcmp(tokens[2], "action") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "action");
- return;
- }
-
- if (strcmp(tokens[3], "profile") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "profile");
- return;
- }
-
- name = tokens[4];
-
- t0 = 5;
-
- if ((t0 < n_tokens) && (strcmp(tokens[t0], "filter") == 0)) {
- uint32_t size;
-
- if (n_tokens < t0 + 10) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, "port in action profile filter");
- return;
- }
-
- if (strcmp(tokens[t0 + 1], "match") == 0)
- p.fltr.filter_on_match = 1;
- else if (strcmp(tokens[t0 + 1], "mismatch") == 0)
- p.fltr.filter_on_match = 0;
- else {
- snprintf(out, out_size, MSG_ARG_INVALID, "match or mismatch");
- return;
- }
-
- if (strcmp(tokens[t0 + 2], "offset") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "offset");
- return;
- }
-
- if (parser_read_uint32(&p.fltr.key_offset, tokens[t0 + 3]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "key_offset");
- return;
- }
-
- if (strcmp(tokens[t0 + 4], "mask") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "mask");
- return;
- }
-
- size = RTE_PORT_IN_ACTION_FLTR_KEY_SIZE;
- if ((parse_hex_string(tokens[t0 + 5], p.fltr.key_mask, &size) != 0) ||
- (size != RTE_PORT_IN_ACTION_FLTR_KEY_SIZE)) {
- snprintf(out, out_size, MSG_ARG_INVALID, "key_mask");
- return;
- }
-
- if (strcmp(tokens[t0 + 6], "key") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "key");
- return;
- }
-
- size = RTE_PORT_IN_ACTION_FLTR_KEY_SIZE;
- if ((parse_hex_string(tokens[t0 + 7], p.fltr.key, &size) != 0) ||
- (size != RTE_PORT_IN_ACTION_FLTR_KEY_SIZE)) {
- snprintf(out, out_size, MSG_ARG_INVALID, "key_value");
- return;
- }
-
- if (strcmp(tokens[t0 + 8], "port") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
- return;
- }
-
- if (parser_read_uint32(&p.fltr.port_id, tokens[t0 + 9]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "port_id");
- return;
- }
-
- p.action_mask |= 1LLU << RTE_PORT_IN_ACTION_FLTR;
- t0 += 10;
- } /* filter */
-
- if ((t0 < n_tokens) && (strcmp(tokens[t0], "balance") == 0)) {
- uint32_t i;
-
- if (n_tokens < t0 + 22) {
- snprintf(out, out_size, MSG_ARG_MISMATCH,
- "port in action profile balance");
- return;
- }
-
- if (strcmp(tokens[t0 + 1], "offset") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "offset");
- return;
- }
-
- if (parser_read_uint32(&p.lb.key_offset, tokens[t0 + 2]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "key_offset");
- return;
- }
-
- if (strcmp(tokens[t0 + 3], "mask") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "mask");
- return;
- }
-
- p.lb.key_size = RTE_PORT_IN_ACTION_LB_KEY_SIZE_MAX;
- if (parse_hex_string(tokens[t0 + 4], p.lb.key_mask, &p.lb.key_size) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "key_mask");
- return;
- }
-
- if (strcmp(tokens[t0 + 5], "port") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
- return;
- }
-
- for (i = 0; i < 16; i++)
- if (parser_read_uint32(&p.lb.port_id[i], tokens[t0 + 6 + i]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "port_id");
- return;
- }
-
- p.action_mask |= 1LLU << RTE_PORT_IN_ACTION_LB;
- t0 += 22;
- } /* balance */
-
- if (t0 < n_tokens) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return;
- }
-
- ap = port_in_action_profile_create(name, &p);
- if (ap == NULL) {
- snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
- return;
- }
-}
-
-
-static const char cmd_table_action_profile_help[] =
-"table action profile <profile_name>\n"
-" ipv4 | ipv6\n"
-" offset <ip_offset>\n"
-" fwd\n"
-" [balance offset <key_offset> mask <key_mask> outoffset <out_offset>]\n"
-" [meter srtcm | trtcm\n"
-" 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 | qinq_pppoe \n"
-" vxlan offset <ether_offset> ipv4 | ipv6 vlan on | off]\n"
-" [nat src | dst\n"
-" proto udp | tcp]\n"
-" [ttl drop | fwd\n"
-" stats none | pkts]\n"
-" [stats pkts | bytes | both]\n"
-" [time]\n"
-" [sym_crypto dev <CRYPTODEV_NAME> offset <op_offset>]\n"
-" [tag]\n"
-" [decap]\n";
-
-static void
-cmd_table_action_profile(char **tokens,
- uint32_t n_tokens,
- char *out,
- size_t out_size)
-{
- struct table_action_profile_params p;
- struct table_action_profile *ap;
- char *name;
- uint32_t t0;
-
- memset(&p, 0, sizeof(p));
-
- if (n_tokens < 8) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return;
- }
-
- if (strcmp(tokens[1], "action") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "action");
- return;
- }
-
- if (strcmp(tokens[2], "profile") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "profile");
- return;
- }
-
- name = tokens[3];
-
- if (strcmp(tokens[4], "ipv4") == 0)
- p.common.ip_version = 1;
- else if (strcmp(tokens[4], "ipv6") == 0)
- p.common.ip_version = 0;
- else {
- snprintf(out, out_size, MSG_ARG_INVALID, "ipv4 or ipv6");
- return;
- }
-
- if (strcmp(tokens[5], "offset") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "offset");
- return;
- }
-
- if (parser_read_uint32(&p.common.ip_offset, tokens[6]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "ip_offset");
- return;
- }
-
- if (strcmp(tokens[7], "fwd") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "fwd");
- return;
- }
-
- p.action_mask |= 1LLU << RTE_TABLE_ACTION_FWD;
-
- t0 = 8;
- if ((t0 < n_tokens) && (strcmp(tokens[t0], "balance") == 0)) {
- if (n_tokens < t0 + 7) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, "table action profile balance");
- return;
- }
-
- if (strcmp(tokens[t0 + 1], "offset") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "offset");
- return;
- }
-
- if (parser_read_uint32(&p.lb.key_offset, tokens[t0 + 2]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "key_offset");
- return;
- }
-
- if (strcmp(tokens[t0 + 3], "mask") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "mask");
- return;
- }
-
- p.lb.key_size = RTE_PORT_IN_ACTION_LB_KEY_SIZE_MAX;
- if (parse_hex_string(tokens[t0 + 4], p.lb.key_mask, &p.lb.key_size) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "key_mask");
- return;
- }
-
- if (strcmp(tokens[t0 + 5], "outoffset") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "outoffset");
- return;
- }
-
- if (parser_read_uint32(&p.lb.out_offset, tokens[t0 + 6]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "out_offset");
- return;
- }
-
- p.action_mask |= 1LLU << RTE_TABLE_ACTION_LB;
- t0 += 7;
- } /* balance */
-
- if ((t0 < n_tokens) && (strcmp(tokens[t0], "meter") == 0)) {
- if (n_tokens < t0 + 6) {
- snprintf(out, out_size, MSG_ARG_MISMATCH,
- "table action profile meter");
- return;
- }
-
- if (strcmp(tokens[t0 + 1], "srtcm") == 0)
- p.mtr.alg = RTE_TABLE_ACTION_METER_SRTCM;
- else if (strcmp(tokens[t0 + 1], "trtcm") == 0)
- p.mtr.alg = RTE_TABLE_ACTION_METER_TRTCM;
- else {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND,
- "srtcm or trtcm");
- return;
- }
-
- if (strcmp(tokens[t0 + 2], "tc") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "tc");
- return;
- }
-
- if (parser_read_uint32(&p.mtr.n_tc, tokens[t0 + 3]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "n_tc");
- return;
- }
-
- if (strcmp(tokens[t0 + 4], "stats") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "stats");
- return;
- }
-
- if (strcmp(tokens[t0 + 5], "none") == 0) {
- p.mtr.n_packets_enabled = 0;
- p.mtr.n_bytes_enabled = 0;
- } else if (strcmp(tokens[t0 + 5], "pkts") == 0) {
- p.mtr.n_packets_enabled = 1;
- p.mtr.n_bytes_enabled = 0;
- } else if (strcmp(tokens[t0 + 5], "bytes") == 0) {
- p.mtr.n_packets_enabled = 0;
- p.mtr.n_bytes_enabled = 1;
- } else if (strcmp(tokens[t0 + 5], "both") == 0) {
- p.mtr.n_packets_enabled = 1;
- p.mtr.n_bytes_enabled = 1;
- } else {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND,
- "none or pkts or bytes or both");
- return;
- }
-
- p.action_mask |= 1LLU << RTE_TABLE_ACTION_MTR;
- t0 += 6;
- } /* meter */
-
- if ((t0 < n_tokens) && (strcmp(tokens[t0], "tm") == 0)) {
- if (n_tokens < t0 + 5) {
- snprintf(out, out_size, MSG_ARG_MISMATCH,
- "table action profile tm");
- return;
- }
-
- if (strcmp(tokens[t0 + 1], "spp") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "spp");
- return;
- }
-
- if (parser_read_uint32(&p.tm.n_subports_per_port,
- tokens[t0 + 2]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID,
- "n_subports_per_port");
- return;
- }
-
- if (strcmp(tokens[t0 + 3], "pps") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "pps");
- return;
- }
-
- if (parser_read_uint32(&p.tm.n_pipes_per_subport,
- tokens[t0 + 4]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID,
- "n_pipes_per_subport");
- return;
- }
-
- p.action_mask |= 1LLU << RTE_TABLE_ACTION_TM;
- t0 += 5;
- } /* tm */
-
- if ((t0 < n_tokens) && (strcmp(tokens[t0], "encap") == 0)) {
- uint32_t n_extra_tokens = 0;
-
- if (n_tokens < t0 + 2) {
- snprintf(out, out_size, MSG_ARG_MISMATCH,
- "action profile encap");
- return;
- }
-
- if (strcmp(tokens[t0 + 1], "ether") == 0)
- p.encap.encap_mask = 1LLU << RTE_TABLE_ACTION_ENCAP_ETHER;
- else if (strcmp(tokens[t0 + 1], "vlan") == 0)
- p.encap.encap_mask = 1LLU << RTE_TABLE_ACTION_ENCAP_VLAN;
- else if (strcmp(tokens[t0 + 1], "qinq") == 0)
- p.encap.encap_mask = 1LLU << RTE_TABLE_ACTION_ENCAP_QINQ;
- else if (strcmp(tokens[t0 + 1], "mpls") == 0)
- p.encap.encap_mask = 1LLU << RTE_TABLE_ACTION_ENCAP_MPLS;
- else if (strcmp(tokens[t0 + 1], "pppoe") == 0)
- p.encap.encap_mask = 1LLU << RTE_TABLE_ACTION_ENCAP_PPPOE;
- else if (strcmp(tokens[t0 + 1], "vxlan") == 0) {
- if (n_tokens < t0 + 2 + 5) {
- snprintf(out, out_size, MSG_ARG_MISMATCH,
- "action profile encap vxlan");
- return;
- }
-
- if (strcmp(tokens[t0 + 2], "offset") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND,
- "vxlan: offset");
- return;
- }
-
- if (parser_read_uint32(&p.encap.vxlan.data_offset,
- tokens[t0 + 2 + 1]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID,
- "vxlan: ether_offset");
- return;
- }
-
- if (strcmp(tokens[t0 + 2 + 2], "ipv4") == 0)
- p.encap.vxlan.ip_version = 1;
- else if (strcmp(tokens[t0 + 2 + 2], "ipv6") == 0)
- p.encap.vxlan.ip_version = 0;
- else {
- snprintf(out, out_size, MSG_ARG_INVALID,
- "vxlan: ipv4 or ipv6");
- return;
- }
-
- if (strcmp(tokens[t0 + 2 + 3], "vlan") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND,
- "vxlan: vlan");
- return;
- }
-
- if (strcmp(tokens[t0 + 2 + 4], "on") == 0)
- p.encap.vxlan.vlan = 1;
- else if (strcmp(tokens[t0 + 2 + 4], "off") == 0)
- p.encap.vxlan.vlan = 0;
- else {
- snprintf(out, out_size, MSG_ARG_INVALID,
- "vxlan: on or off");
- return;
- }
-
- 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 */
-
- if ((t0 < n_tokens) && (strcmp(tokens[t0], "nat") == 0)) {
- if (n_tokens < t0 + 4) {
- snprintf(out, out_size, MSG_ARG_MISMATCH,
- "table action profile nat");
- return;
- }
-
- if (strcmp(tokens[t0 + 1], "src") == 0)
- p.nat.source_nat = 1;
- else if (strcmp(tokens[t0 + 1], "dst") == 0)
- p.nat.source_nat = 0;
- else {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND,
- "src or dst");
- return;
- }
-
- if (strcmp(tokens[t0 + 2], "proto") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "proto");
- return;
- }
-
- if (strcmp(tokens[t0 + 3], "tcp") == 0)
- p.nat.proto = 0x06;
- else if (strcmp(tokens[t0 + 3], "udp") == 0)
- p.nat.proto = 0x11;
- else {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND,
- "tcp or udp");
- return;
- }
-
- p.action_mask |= 1LLU << RTE_TABLE_ACTION_NAT;
- t0 += 4;
- } /* nat */
-
- if ((t0 < n_tokens) && (strcmp(tokens[t0], "ttl") == 0)) {
- if (n_tokens < t0 + 4) {
- snprintf(out, out_size, MSG_ARG_MISMATCH,
- "table action profile ttl");
- return;
- }
-
- if (strcmp(tokens[t0 + 1], "drop") == 0)
- p.ttl.drop = 1;
- else if (strcmp(tokens[t0 + 1], "fwd") == 0)
- p.ttl.drop = 0;
- else {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND,
- "drop or fwd");
- return;
- }
-
- if (strcmp(tokens[t0 + 2], "stats") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "stats");
- return;
- }
-
- if (strcmp(tokens[t0 + 3], "none") == 0)
- p.ttl.n_packets_enabled = 0;
- else if (strcmp(tokens[t0 + 3], "pkts") == 0)
- p.ttl.n_packets_enabled = 1;
- else {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND,
- "none or pkts");
- return;
- }
-
- p.action_mask |= 1LLU << RTE_TABLE_ACTION_TTL;
- t0 += 4;
- } /* ttl */
-
- if ((t0 < n_tokens) && (strcmp(tokens[t0], "stats") == 0)) {
- if (n_tokens < t0 + 2) {
- snprintf(out, out_size, MSG_ARG_MISMATCH,
- "table action profile stats");
- return;
- }
-
- if (strcmp(tokens[t0 + 1], "pkts") == 0) {
- p.stats.n_packets_enabled = 1;
- p.stats.n_bytes_enabled = 0;
- } else if (strcmp(tokens[t0 + 1], "bytes") == 0) {
- p.stats.n_packets_enabled = 0;
- p.stats.n_bytes_enabled = 1;
- } else if (strcmp(tokens[t0 + 1], "both") == 0) {
- p.stats.n_packets_enabled = 1;
- p.stats.n_bytes_enabled = 1;
- } else {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND,
- "pkts or bytes or both");
- return;
- }
-
- p.action_mask |= 1LLU << RTE_TABLE_ACTION_STATS;
- t0 += 2;
- } /* stats */
-
- if ((t0 < n_tokens) && (strcmp(tokens[t0], "time") == 0)) {
- p.action_mask |= 1LLU << RTE_TABLE_ACTION_TIME;
- t0 += 1;
- } /* time */
-
- if ((t0 < n_tokens) && (strcmp(tokens[t0], "sym_crypto") == 0)) {
- struct 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 = cryptodev_find(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 (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) && (strcmp(tokens[t0], "tag") == 0)) {
- p.action_mask |= 1LLU << RTE_TABLE_ACTION_TAG;
- t0 += 1;
- } /* tag */
-
- if ((t0 < n_tokens) && (strcmp(tokens[t0], "decap") == 0)) {
- p.action_mask |= 1LLU << RTE_TABLE_ACTION_DECAP;
- t0 += 1;
- } /* decap */
-
- if (t0 < n_tokens) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return;
- }
-
- ap = table_action_profile_create(name, &p);
- if (ap == NULL) {
- snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
- return;
- }
-}
-
-static const char cmd_pipeline_help[] =
-"pipeline <pipeline_name>\n"
-" period <timer_period_ms>\n"
-" offset_port_id <offset_port_id>\n"
-" cpu <cpu_id>\n";
-
-static void
-cmd_pipeline(char **tokens,
- uint32_t n_tokens,
- char *out,
- size_t out_size)
-{
- struct pipeline_params p;
- char *name;
- struct pipeline *pipeline;
-
- if (n_tokens != 8) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return;
- }
-
- name = tokens[1];
-
- if (strcmp(tokens[2], "period") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "period");
- return;
- }
-
- if (parser_read_uint32(&p.timer_period_ms, tokens[3]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "timer_period_ms");
- return;
- }
-
- if (strcmp(tokens[4], "offset_port_id") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "offset_port_id");
- return;
- }
-
- if (parser_read_uint32(&p.offset_port_id, tokens[5]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "offset_port_id");
- return;
- }
-
- if (strcmp(tokens[6], "cpu") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "cpu");
- return;
- }
-
- if (parser_read_uint32(&p.cpu_id, tokens[7]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "cpu_id");
- return;
- }
-
- pipeline = pipeline_create(name, &p);
- if (pipeline == NULL) {
- snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
- return;
- }
-}
-
-static const char cmd_pipeline_port_in_help[] =
-"pipeline <pipeline_name> port in\n"
-" bsz <burst_size>\n"
-" link <link_name> rxq <queue_id>\n"
-" | swq <swq_name>\n"
-" | tmgr <tmgr_name>\n"
-" | tap <tap_name> mempool <mempool_name> mtu <mtu>\n"
-" | source mempool <mempool_name> file <file_name> bpp <n_bytes_per_pkt>\n"
-" | cryptodev <cryptodev_name> rxq <queue_id>\n"
-" [action <port_in_action_profile_name>]\n"
-" [disabled]\n";
-
-static void
-cmd_pipeline_port_in(char **tokens,
- uint32_t n_tokens,
- char *out,
- size_t out_size)
-{
- struct port_in_params p;
- char *pipeline_name;
- uint32_t t0;
- int enabled, status;
-
- if (n_tokens < 7) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return;
- }
-
- pipeline_name = tokens[1];
-
- if (strcmp(tokens[2], "port") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
- return;
- }
-
- if (strcmp(tokens[3], "in") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "in");
- return;
- }
-
- if (strcmp(tokens[4], "bsz") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "bsz");
- return;
- }
-
- if (parser_read_uint32(&p.burst_size, tokens[5]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "burst_size");
- return;
- }
-
- t0 = 6;
-
- if (strcmp(tokens[t0], "link") == 0) {
- if (n_tokens < t0 + 4) {
- snprintf(out, out_size, MSG_ARG_MISMATCH,
- "pipeline port in link");
- return;
- }
-
- p.type = PORT_IN_RXQ;
-
- p.dev_name = tokens[t0 + 1];
-
- if (strcmp(tokens[t0 + 2], "rxq") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "rxq");
- return;
- }
-
- if (parser_read_uint16(&p.rxq.queue_id, tokens[t0 + 3]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID,
- "queue_id");
- return;
- }
- t0 += 4;
- } else if (strcmp(tokens[t0], "swq") == 0) {
- if (n_tokens < t0 + 2) {
- snprintf(out, out_size, MSG_ARG_MISMATCH,
- "pipeline port in swq");
- return;
- }
-
- p.type = PORT_IN_SWQ;
-
- p.dev_name = tokens[t0 + 1];
-
- t0 += 2;
- } else if (strcmp(tokens[t0], "tmgr") == 0) {
- if (n_tokens < t0 + 2) {
- snprintf(out, out_size, MSG_ARG_MISMATCH,
- "pipeline port in tmgr");
- return;
- }
-
- p.type = PORT_IN_TMGR;
-
- p.dev_name = tokens[t0 + 1];
-
- t0 += 2;
- } else if (strcmp(tokens[t0], "tap") == 0) {
- if (n_tokens < t0 + 6) {
- snprintf(out, out_size, MSG_ARG_MISMATCH,
- "pipeline port in tap");
- return;
- }
-
- p.type = PORT_IN_TAP;
-
- p.dev_name = tokens[t0 + 1];
-
- if (strcmp(tokens[t0 + 2], "mempool") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND,
- "mempool");
- return;
- }
-
- p.tap.mempool_name = tokens[t0 + 3];
-
- if (strcmp(tokens[t0 + 4], "mtu") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND,
- "mtu");
- return;
- }
-
- if (parser_read_uint32(&p.tap.mtu, tokens[t0 + 5]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "mtu");
- return;
- }
-
- t0 += 6;
- } else if (strcmp(tokens[t0], "source") == 0) {
- if (n_tokens < t0 + 6) {
- snprintf(out, out_size, MSG_ARG_MISMATCH,
- "pipeline port in source");
- return;
- }
-
- p.type = PORT_IN_SOURCE;
-
- p.dev_name = NULL;
-
- if (strcmp(tokens[t0 + 1], "mempool") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND,
- "mempool");
- return;
- }
-
- p.source.mempool_name = tokens[t0 + 2];
-
- if (strcmp(tokens[t0 + 3], "file") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND,
- "file");
- return;
- }
-
- p.source.file_name = tokens[t0 + 4];
-
- if (strcmp(tokens[t0 + 5], "bpp") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND,
- "bpp");
- return;
- }
-
- if (parser_read_uint32(&p.source.n_bytes_per_pkt, tokens[t0 + 6]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID,
- "n_bytes_per_pkt");
- return;
- }
-
- t0 += 7;
- } else if (strcmp(tokens[t0], "cryptodev") == 0) {
- if (n_tokens < t0 + 3) {
- snprintf(out, out_size, MSG_ARG_MISMATCH,
- "pipeline port in cryptodev");
- return;
- }
-
- p.type = PORT_IN_CRYPTODEV;
-
- p.dev_name = tokens[t0 + 1];
- if (parser_read_uint16(&p.rxq.queue_id, tokens[t0 + 3]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID,
- "rxq");
- return;
- }
-
- p.cryptodev.arg_callback = NULL;
- p.cryptodev.f_callback = NULL;
-
- t0 += 4;
- } else {
- snprintf(out, out_size, MSG_ARG_INVALID, tokens[0]);
- return;
- }
-
- p.action_profile_name = NULL;
- if ((n_tokens > t0) && (strcmp(tokens[t0], "action") == 0)) {
- if (n_tokens < t0 + 2) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, "action");
- return;
- }
-
- p.action_profile_name = tokens[t0 + 1];
-
- t0 += 2;
- }
-
- enabled = 1;
- if ((n_tokens > t0) &&
- (strcmp(tokens[t0], "disabled") == 0)) {
- enabled = 0;
-
- t0 += 1;
- }
-
- if (n_tokens != t0) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return;
- }
-
- status = pipeline_port_in_create(pipeline_name,
- &p, enabled);
- if (status) {
- snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
- return;
- }
-}
-
-static const char cmd_pipeline_port_out_help[] =
-"pipeline <pipeline_name> port out\n"
-" bsz <burst_size>\n"
-" link <link_name> txq <txq_id>\n"
-" | swq <swq_name>\n"
-" | tmgr <tmgr_name>\n"
-" | tap <tap_name>\n"
-" | sink [file <file_name> pkts <max_n_pkts>]\n"
-" | cryptodev <cryptodev_name> txq <txq_id> offset <crypto_op_offset>\n";
-
-static void
-cmd_pipeline_port_out(char **tokens,
- uint32_t n_tokens,
- char *out,
- size_t out_size)
-{
- struct port_out_params p;
- char *pipeline_name;
- int status;
-
- memset(&p, 0, sizeof(p));
-
- if (n_tokens < 7) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return;
- }
-
- pipeline_name = tokens[1];
-
- if (strcmp(tokens[2], "port") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
- return;
- }
-
- if (strcmp(tokens[3], "out") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "out");
- return;
- }
-
- if (strcmp(tokens[4], "bsz") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "bsz");
- return;
- }
-
- if (parser_read_uint32(&p.burst_size, tokens[5]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "burst_size");
- return;
- }
-
- if (strcmp(tokens[6], "link") == 0) {
- if (n_tokens != 10) {
- snprintf(out, out_size, MSG_ARG_MISMATCH,
- "pipeline port out link");
- return;
- }
-
- p.type = PORT_OUT_TXQ;
-
- p.dev_name = tokens[7];
-
- if (strcmp(tokens[8], "txq") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "txq");
- return;
- }
-
- if (parser_read_uint16(&p.txq.queue_id, tokens[9]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "queue_id");
- return;
- }
- } else if (strcmp(tokens[6], "swq") == 0) {
- if (n_tokens != 8) {
- snprintf(out, out_size, MSG_ARG_MISMATCH,
- "pipeline port out swq");
- return;
- }
-
- p.type = PORT_OUT_SWQ;
-
- p.dev_name = tokens[7];
- } else if (strcmp(tokens[6], "tmgr") == 0) {
- if (n_tokens != 8) {
- snprintf(out, out_size, MSG_ARG_MISMATCH,
- "pipeline port out tmgr");
- return;
- }
-
- p.type = PORT_OUT_TMGR;
-
- p.dev_name = tokens[7];
- } else if (strcmp(tokens[6], "tap") == 0) {
- if (n_tokens != 8) {
- snprintf(out, out_size, MSG_ARG_MISMATCH,
- "pipeline port out tap");
- return;
- }
-
- p.type = PORT_OUT_TAP;
-
- p.dev_name = tokens[7];
- } else if (strcmp(tokens[6], "sink") == 0) {
- if ((n_tokens != 7) && (n_tokens != 11)) {
- snprintf(out, out_size, MSG_ARG_MISMATCH,
- "pipeline port out sink");
- return;
- }
-
- p.type = PORT_OUT_SINK;
-
- p.dev_name = NULL;
-
- if (n_tokens == 7) {
- p.sink.file_name = NULL;
- p.sink.max_n_pkts = 0;
- } else {
- if (strcmp(tokens[7], "file") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND,
- "file");
- return;
- }
-
- p.sink.file_name = tokens[8];
-
- if (strcmp(tokens[9], "pkts") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "pkts");
- return;
- }
-
- if (parser_read_uint32(&p.sink.max_n_pkts, tokens[10]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "max_n_pkts");
- return;
- }
- }
-
- } else if (strcmp(tokens[6], "cryptodev") == 0) {
- if (n_tokens != 12) {
- snprintf(out, out_size, MSG_ARG_MISMATCH,
- "pipeline port out cryptodev");
- return;
- }
-
- p.type = PORT_OUT_CRYPTODEV;
-
- p.dev_name = tokens[7];
-
- if (strcmp(tokens[8], "txq")) {
- snprintf(out, out_size, MSG_ARG_MISMATCH,
- "pipeline port out cryptodev");
- return;
- }
-
- if (parser_read_uint16(&p.cryptodev.queue_id, tokens[9])
- != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "queue_id");
- return;
- }
-
- if (strcmp(tokens[10], "offset")) {
- snprintf(out, out_size, MSG_ARG_MISMATCH,
- "pipeline port out cryptodev");
- return;
- }
-
- if (parser_read_uint32(&p.cryptodev.op_offset, tokens[11])
- != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "queue_id");
- return;
- }
- } else {
- snprintf(out, out_size, MSG_ARG_INVALID, tokens[0]);
- return;
- }
-
- status = pipeline_port_out_create(pipeline_name, &p);
- if (status) {
- snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
- return;
- }
-}
-
-static const char cmd_pipeline_table_help[] =
-"pipeline <pipeline_name> table\n"
-" match\n"
-" acl\n"
-" ipv4 | ipv6\n"
-" offset <ip_header_offset>\n"
-" size <n_rules>\n"
-" | array\n"
-" offset <key_offset>\n"
-" size <n_keys>\n"
-" | hash\n"
-" ext | lru\n"
-" key <key_size>\n"
-" mask <key_mask>\n"
-" offset <key_offset>\n"
-" buckets <n_buckets>\n"
-" size <n_keys>\n"
-" | lpm\n"
-" ipv4 | ipv6\n"
-" offset <ip_header_offset>\n"
-" size <n_rules>\n"
-" | stub\n"
-" [action <table_action_profile_name>]\n";
-
-static void
-cmd_pipeline_table(char **tokens,
- uint32_t n_tokens,
- char *out,
- size_t out_size)
-{
- uint8_t key_mask[TABLE_RULE_MATCH_SIZE_MAX];
- struct table_params p;
- char *pipeline_name;
- uint32_t t0;
- int status;
-
- if (n_tokens < 5) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return;
- }
-
- pipeline_name = tokens[1];
-
- if (strcmp(tokens[2], "table") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "table");
- return;
- }
-
- if (strcmp(tokens[3], "match") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "match");
- return;
- }
-
- t0 = 4;
- if (strcmp(tokens[t0], "acl") == 0) {
- if (n_tokens < t0 + 6) {
- snprintf(out, out_size, MSG_ARG_MISMATCH,
- "pipeline table acl");
- return;
- }
-
- p.match_type = TABLE_ACL;
-
- if (strcmp(tokens[t0 + 1], "ipv4") == 0)
- p.match.acl.ip_version = 1;
- else if (strcmp(tokens[t0 + 1], "ipv6") == 0)
- p.match.acl.ip_version = 0;
- else {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND,
- "ipv4 or ipv6");
- return;
- }
-
- if (strcmp(tokens[t0 + 2], "offset") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "offset");
- return;
- }
-
- if (parser_read_uint32(&p.match.acl.ip_header_offset,
- tokens[t0 + 3]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID,
- "ip_header_offset");
- return;
- }
-
- if (strcmp(tokens[t0 + 4], "size") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "size");
- return;
- }
-
- if (parser_read_uint32(&p.match.acl.n_rules,
- tokens[t0 + 5]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "n_rules");
- return;
- }
-
- t0 += 6;
- } else if (strcmp(tokens[t0], "array") == 0) {
- if (n_tokens < t0 + 5) {
- snprintf(out, out_size, MSG_ARG_MISMATCH,
- "pipeline table array");
- return;
- }
-
- p.match_type = TABLE_ARRAY;
-
- if (strcmp(tokens[t0 + 1], "offset") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "offset");
- return;
- }
-
- if (parser_read_uint32(&p.match.array.key_offset,
- tokens[t0 + 2]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "key_offset");
- return;
- }
-
- if (strcmp(tokens[t0 + 3], "size") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "size");
- return;
- }
-
- if (parser_read_uint32(&p.match.array.n_keys,
- tokens[t0 + 4]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "n_keys");
- return;
- }
-
- t0 += 5;
- } else if (strcmp(tokens[t0], "hash") == 0) {
- uint32_t key_mask_size = TABLE_RULE_MATCH_SIZE_MAX;
-
- if (n_tokens < t0 + 12) {
- snprintf(out, out_size, MSG_ARG_MISMATCH,
- "pipeline table hash");
- return;
- }
-
- p.match_type = TABLE_HASH;
-
- if (strcmp(tokens[t0 + 1], "ext") == 0)
- p.match.hash.extendable_bucket = 1;
- else if (strcmp(tokens[t0 + 1], "lru") == 0)
- p.match.hash.extendable_bucket = 0;
- else {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND,
- "ext or lru");
- return;
- }
-
- if (strcmp(tokens[t0 + 2], "key") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "key");
- return;
- }
-
- if ((parser_read_uint32(&p.match.hash.key_size,
- tokens[t0 + 3]) != 0) ||
- (p.match.hash.key_size == 0) ||
- (p.match.hash.key_size > TABLE_RULE_MATCH_SIZE_MAX)) {
- snprintf(out, out_size, MSG_ARG_INVALID, "key_size");
- return;
- }
-
- if (strcmp(tokens[t0 + 4], "mask") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "mask");
- return;
- }
-
- if ((parse_hex_string(tokens[t0 + 5],
- key_mask, &key_mask_size) != 0) ||
- (key_mask_size != p.match.hash.key_size)) {
- snprintf(out, out_size, MSG_ARG_INVALID, "key_mask");
- return;
- }
- p.match.hash.key_mask = key_mask;
-
- if (strcmp(tokens[t0 + 6], "offset") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "offset");
- return;
- }
-
- if (parser_read_uint32(&p.match.hash.key_offset,
- tokens[t0 + 7]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "key_offset");
- return;
- }
-
- if (strcmp(tokens[t0 + 8], "buckets") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "buckets");
- return;
- }
-
- if (parser_read_uint32(&p.match.hash.n_buckets,
- tokens[t0 + 9]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "n_buckets");
- return;
- }
-
- if (strcmp(tokens[t0 + 10], "size") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "size");
- return;
- }
-
- if (parser_read_uint32(&p.match.hash.n_keys,
- tokens[t0 + 11]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "n_keys");
- return;
- }
-
- t0 += 12;
- } else if (strcmp(tokens[t0], "lpm") == 0) {
- if (n_tokens < t0 + 6) {
- snprintf(out, out_size, MSG_ARG_MISMATCH,
- "pipeline table lpm");
- return;
- }
-
- p.match_type = TABLE_LPM;
-
- if (strcmp(tokens[t0 + 1], "ipv4") == 0)
- p.match.lpm.key_size = 4;
- else if (strcmp(tokens[t0 + 1], "ipv6") == 0)
- p.match.lpm.key_size = 16;
- else {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND,
- "ipv4 or ipv6");
- return;
- }
-
- if (strcmp(tokens[t0 + 2], "offset") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "offset");
- return;
- }
-
- if (parser_read_uint32(&p.match.lpm.key_offset,
- tokens[t0 + 3]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "key_offset");
- return;
- }
-
- if (strcmp(tokens[t0 + 4], "size") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "size");
- return;
- }
-
- if (parser_read_uint32(&p.match.lpm.n_rules,
- tokens[t0 + 5]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "n_rules");
- return;
- }
-
- t0 += 6;
- } else if (strcmp(tokens[t0], "stub") == 0) {
- p.match_type = TABLE_STUB;
-
- t0 += 1;
- } else {
- snprintf(out, out_size, MSG_ARG_INVALID, tokens[0]);
- return;
- }
-
- p.action_profile_name = NULL;
- if ((n_tokens > t0) && (strcmp(tokens[t0], "action") == 0)) {
- if (n_tokens < t0 + 2) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, "action");
- return;
- }
-
- p.action_profile_name = tokens[t0 + 1];
-
- t0 += 2;
- }
-
- if (n_tokens > t0) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return;
- }
-
- status = pipeline_table_create(pipeline_name, &p);
- if (status) {
- snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
- return;
- }
-}
-
-static const char cmd_pipeline_port_in_table_help[] =
-"pipeline <pipeline_name> port in <port_id> table <table_id>\n";
-
-static void
-cmd_pipeline_port_in_table(char **tokens,
- uint32_t n_tokens,
- char *out,
- size_t out_size)
-{
- char *pipeline_name;
- uint32_t port_id, table_id;
- int status;
-
- if (n_tokens != 7) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return;
- }
-
- pipeline_name = tokens[1];
-
- if (strcmp(tokens[2], "port") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
- return;
- }
-
- if (strcmp(tokens[3], "in") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "in");
- return;
- }
-
- if (parser_read_uint32(&port_id, tokens[4]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "port_id");
- return;
- }
-
- if (strcmp(tokens[5], "table") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "table");
- return;
- }
-
- if (parser_read_uint32(&table_id, tokens[6]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
- return;
- }
-
- status = pipeline_port_in_connect_to_table(pipeline_name,
- port_id,
- table_id);
- if (status) {
- snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
- return;
- }
-}
-
-
-static const char cmd_pipeline_port_in_stats_help[] =
-"pipeline <pipeline_name> port in <port_id> stats read [clear]\n";
-
-#define MSG_PIPELINE_PORT_IN_STATS \
- "Pkts in: %" PRIu64 "\n" \
- "Pkts dropped by AH: %" PRIu64 "\n" \
- "Pkts dropped by other: %" PRIu64 "\n"
-
-static void
-cmd_pipeline_port_in_stats(char **tokens,
- uint32_t n_tokens,
- char *out,
- size_t out_size)
-{
- struct rte_pipeline_port_in_stats stats;
- char *pipeline_name;
- uint32_t port_id;
- int clear, status;
-
- if ((n_tokens != 7) && (n_tokens != 8)) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return;
- }
-
- pipeline_name = tokens[1];
-
- if (strcmp(tokens[2], "port") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
- return;
- }
-
- if (strcmp(tokens[3], "in") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "in");
- return;
- }
-
- if (parser_read_uint32(&port_id, tokens[4]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "port_id");
- return;
- }
-
- if (strcmp(tokens[5], "stats") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "stats");
- return;
- }
-
- if (strcmp(tokens[6], "read") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "read");
- return;
- }
-
- clear = 0;
- if (n_tokens == 8) {
- if (strcmp(tokens[7], "clear") != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "clear");
- return;
- }
-
- clear = 1;
- }
-
- status = pipeline_port_in_stats_read(pipeline_name,
- port_id,
- &stats,
- clear);
- if (status) {
- snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
- return;
- }
-
- snprintf(out, out_size, MSG_PIPELINE_PORT_IN_STATS,
- stats.stats.n_pkts_in,
- stats.n_pkts_dropped_by_ah,
- stats.stats.n_pkts_drop);
-}
-
-
-static const char cmd_pipeline_port_in_enable_help[] =
-"pipeline <pipeline_name> port in <port_id> enable\n";
-
-static void
-cmd_pipeline_port_in_enable(char **tokens,
- uint32_t n_tokens,
- char *out,
- size_t out_size)
-{
- char *pipeline_name;
- uint32_t port_id;
- int status;
-
- if (n_tokens != 6) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return;
- }
-
- pipeline_name = tokens[1];
-
- if (strcmp(tokens[2], "port") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
- return;
- }
-
- if (strcmp(tokens[3], "in") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "in");
- return;
- }
-
- if (parser_read_uint32(&port_id, tokens[4]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "port_id");
- return;
- }
-
- if (strcmp(tokens[5], "enable") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "enable");
- return;
- }
-
- status = pipeline_port_in_enable(pipeline_name, port_id);
- if (status) {
- snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
- return;
- }
-}
-
-
-static const char cmd_pipeline_port_in_disable_help[] =
-"pipeline <pipeline_name> port in <port_id> disable\n";
-
-static void
-cmd_pipeline_port_in_disable(char **tokens,
- uint32_t n_tokens,
- char *out,
- size_t out_size)
-{
- char *pipeline_name;
- uint32_t port_id;
- int status;
-
- if (n_tokens != 6) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return;
- }
-
- pipeline_name = tokens[1];
-
- if (strcmp(tokens[2], "port") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
- return;
- }
-
- if (strcmp(tokens[3], "in") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "in");
- return;
- }
-
- if (parser_read_uint32(&port_id, tokens[4]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "port_id");
- return;
- }
-
- if (strcmp(tokens[5], "disable") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "disable");
- return;
- }
-
- status = pipeline_port_in_disable(pipeline_name, port_id);
- if (status) {
- snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
- return;
- }
-}
-
-
-static const char cmd_pipeline_port_out_stats_help[] =
-"pipeline <pipeline_name> port out <port_id> stats read [clear]\n";
-
-#define MSG_PIPELINE_PORT_OUT_STATS \
- "Pkts in: %" PRIu64 "\n" \
- "Pkts dropped by AH: %" PRIu64 "\n" \
- "Pkts dropped by other: %" PRIu64 "\n"
-
-static void
-cmd_pipeline_port_out_stats(char **tokens,
- uint32_t n_tokens,
- char *out,
- size_t out_size)
-{
- struct rte_pipeline_port_out_stats stats;
- char *pipeline_name;
- uint32_t port_id;
- int clear, status;
-
- if ((n_tokens != 7) && (n_tokens != 8)) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return;
- }
-
- pipeline_name = tokens[1];
-
- if (strcmp(tokens[2], "port") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
- return;
- }
-
- if (strcmp(tokens[3], "out") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "out");
- return;
- }
-
- if (parser_read_uint32(&port_id, tokens[4]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "port_id");
- return;
- }
-
- if (strcmp(tokens[5], "stats") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "stats");
- return;
- }
-
- if (strcmp(tokens[6], "read") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "read");
- return;
- }
-
- clear = 0;
- if (n_tokens == 8) {
- if (strcmp(tokens[7], "clear") != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "clear");
- return;
- }
-
- clear = 1;
- }
-
- status = pipeline_port_out_stats_read(pipeline_name,
- port_id,
- &stats,
- clear);
- if (status) {
- snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
- return;
- }
-
- snprintf(out, out_size, MSG_PIPELINE_PORT_OUT_STATS,
- stats.stats.n_pkts_in,
- stats.n_pkts_dropped_by_ah,
- stats.stats.n_pkts_drop);
-}
-
-
-static const char cmd_pipeline_table_stats_help[] =
-"pipeline <pipeline_name> table <table_id> stats read [clear]\n";
-
-#define MSG_PIPELINE_TABLE_STATS \
- "Pkts in: %" PRIu64 "\n" \
- "Pkts in with lookup miss: %" PRIu64 "\n" \
- "Pkts in with lookup hit dropped by AH: %" PRIu64 "\n" \
- "Pkts in with lookup hit dropped by others: %" PRIu64 "\n" \
- "Pkts in with lookup miss dropped by AH: %" PRIu64 "\n" \
- "Pkts in with lookup miss dropped by others: %" PRIu64 "\n"
-
-static void
-cmd_pipeline_table_stats(char **tokens,
- uint32_t n_tokens,
- char *out,
- size_t out_size)
-{
- struct rte_pipeline_table_stats stats;
- char *pipeline_name;
- uint32_t table_id;
- int clear, status;
-
- if ((n_tokens != 6) && (n_tokens != 7)) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return;
- }
-
- pipeline_name = tokens[1];
-
- if (strcmp(tokens[2], "table") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
- return;
- }
-
- if (parser_read_uint32(&table_id, tokens[3]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
- return;
- }
-
- if (strcmp(tokens[4], "stats") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "stats");
- return;
- }
-
- if (strcmp(tokens[5], "read") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "read");
- return;
- }
-
- clear = 0;
- if (n_tokens == 7) {
- if (strcmp(tokens[6], "clear") != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "clear");
- return;
- }
-
- clear = 1;
- }
-
- status = pipeline_table_stats_read(pipeline_name,
- table_id,
- &stats,
- clear);
- if (status) {
- snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
- return;
- }
-
- snprintf(out, out_size, MSG_PIPELINE_TABLE_STATS,
- stats.stats.n_pkts_in,
- stats.stats.n_pkts_lookup_miss,
- stats.n_pkts_dropped_by_lkp_hit_ah,
- stats.n_pkts_dropped_lkp_hit,
- stats.n_pkts_dropped_by_lkp_miss_ah,
- stats.n_pkts_dropped_lkp_miss);
-}
-
-/**
- * <match> ::=
- *
- * match
- * acl
- * priority <priority>
- * ipv4 | ipv6 <sa> <sa_depth> <da> <da_depth>
- * <sp0> <sp1> <dp0> <dp1> <proto>
- * | array <pos>
- * | hash
- * raw <key>
- * | ipv4_5tuple <sa> <da> <sp> <dp> <proto>
- * | ipv6_5tuple <sa> <da> <sp> <dp> <proto>
- * | ipv4_addr <addr>
- * | ipv6_addr <addr>
- * | qinq <svlan> <cvlan>
- * | lpm
- * ipv4 | ipv6 <addr> <depth>
- */
-struct pkt_key_qinq {
- uint16_t ethertype_svlan;
- uint16_t svlan;
- uint16_t ethertype_cvlan;
- uint16_t cvlan;
-};
-
-struct pkt_key_ipv4_5tuple {
- uint8_t time_to_live;
- uint8_t proto;
- uint16_t hdr_checksum;
- uint32_t sa;
- uint32_t da;
- uint16_t sp;
- uint16_t dp;
-};
-
-struct pkt_key_ipv6_5tuple {
- uint16_t payload_length;
- uint8_t proto;
- uint8_t hop_limit;
- struct rte_ipv6_addr sa;
- struct rte_ipv6_addr da;
- uint16_t sp;
- uint16_t dp;
-};
-
-struct pkt_key_ipv4_addr {
- uint32_t addr;
-};
-
-struct pkt_key_ipv6_addr {
- struct rte_ipv6_addr addr;
-};
-
-static uint32_t
-parse_match(char **tokens,
- uint32_t n_tokens,
- char *out,
- size_t out_size,
- struct table_rule_match *m)
-{
- memset(m, 0, sizeof(*m));
-
- if (n_tokens < 2)
- return 0;
-
- if (strcmp(tokens[0], "match") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "match");
- return 0;
- }
-
- if (strcmp(tokens[1], "acl") == 0) {
- if (n_tokens < 14) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return 0;
- }
-
- m->match_type = TABLE_ACL;
-
- if (strcmp(tokens[2], "priority") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "priority");
- return 0;
- }
-
- if (parser_read_uint32(&m->match.acl.priority,
- tokens[3]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "priority");
- return 0;
- }
-
- if (strcmp(tokens[4], "ipv4") == 0) {
- struct in_addr saddr, daddr;
-
- m->match.acl.ip_version = 1;
-
- if (parse_ipv4_addr(tokens[5], &saddr) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "sa");
- return 0;
- }
- m->match.acl.ipv4.sa = rte_be_to_cpu_32(saddr.s_addr);
-
- if (parse_ipv4_addr(tokens[7], &daddr) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "da");
- return 0;
- }
- m->match.acl.ipv4.da = rte_be_to_cpu_32(daddr.s_addr);
- } else if (strcmp(tokens[4], "ipv6") == 0) {
- struct rte_ipv6_addr saddr, daddr;
-
- m->match.acl.ip_version = 0;
-
- if (parse_ipv6_addr(tokens[5], &saddr) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "sa");
- return 0;
- }
- m->match.acl.ipv6.sa = saddr;
-
- if (parse_ipv6_addr(tokens[7], &daddr) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "da");
- return 0;
- }
- m->match.acl.ipv6.da = daddr;
- } else {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND,
- "ipv4 or ipv6");
- return 0;
- }
-
- if (parser_read_uint32(&m->match.acl.sa_depth,
- tokens[6]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "sa_depth");
- return 0;
- }
-
- if (parser_read_uint32(&m->match.acl.da_depth,
- tokens[8]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "da_depth");
- return 0;
- }
-
- if (parser_read_uint16(&m->match.acl.sp0, tokens[9]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "sp0");
- return 0;
- }
-
- if (parser_read_uint16(&m->match.acl.sp1, tokens[10]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "sp1");
- return 0;
- }
-
- if (parser_read_uint16(&m->match.acl.dp0, tokens[11]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "dp0");
- return 0;
- }
-
- if (parser_read_uint16(&m->match.acl.dp1, tokens[12]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "dp1");
- return 0;
- }
-
- if (parser_read_uint8(&m->match.acl.proto, tokens[13]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "proto");
- return 0;
- }
-
- m->match.acl.proto_mask = 0xff;
-
- return 14;
- } /* acl */
-
- if (strcmp(tokens[1], "array") == 0) {
- if (n_tokens < 3) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return 0;
- }
-
- m->match_type = TABLE_ARRAY;
-
- if (parser_read_uint32(&m->match.array.pos, tokens[2]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "pos");
- return 0;
- }
-
- return 3;
- } /* array */
-
- if (strcmp(tokens[1], "hash") == 0) {
- if (n_tokens < 3) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return 0;
- }
-
- m->match_type = TABLE_HASH;
-
- if (strcmp(tokens[2], "raw") == 0) {
- uint32_t key_size = TABLE_RULE_MATCH_SIZE_MAX;
-
- if (n_tokens < 4) {
- snprintf(out, out_size, MSG_ARG_MISMATCH,
- tokens[0]);
- return 0;
- }
-
- if (parse_hex_string(tokens[3],
- m->match.hash.key, &key_size) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "key");
- return 0;
- }
-
- return 4;
- } /* hash raw */
-
- if (strcmp(tokens[2], "ipv4_5tuple") == 0) {
- struct pkt_key_ipv4_5tuple *ipv4 =
- (struct pkt_key_ipv4_5tuple *) m->match.hash.key;
- struct in_addr saddr, daddr;
- uint16_t sp, dp;
- uint8_t proto;
-
- if (n_tokens < 8) {
- snprintf(out, out_size, MSG_ARG_MISMATCH,
- tokens[0]);
- return 0;
- }
-
- if (parse_ipv4_addr(tokens[3], &saddr) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "sa");
- return 0;
- }
-
- if (parse_ipv4_addr(tokens[4], &daddr) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "da");
- return 0;
- }
-
- if (parser_read_uint16(&sp, tokens[5]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "sp");
- return 0;
- }
-
- if (parser_read_uint16(&dp, tokens[6]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "dp");
- return 0;
- }
-
- if (parser_read_uint8(&proto, tokens[7]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID,
- "proto");
- return 0;
- }
-
- ipv4->sa = saddr.s_addr;
- ipv4->da = daddr.s_addr;
- ipv4->sp = rte_cpu_to_be_16(sp);
- ipv4->dp = rte_cpu_to_be_16(dp);
- ipv4->proto = proto;
-
- return 8;
- } /* hash ipv4_5tuple */
-
- if (strcmp(tokens[2], "ipv6_5tuple") == 0) {
- struct pkt_key_ipv6_5tuple *ipv6 =
- (struct pkt_key_ipv6_5tuple *) m->match.hash.key;
- struct rte_ipv6_addr saddr, daddr;
- uint16_t sp, dp;
- uint8_t proto;
-
- if (n_tokens < 8) {
- snprintf(out, out_size, MSG_ARG_MISMATCH,
- tokens[0]);
- return 0;
- }
-
- if (parse_ipv6_addr(tokens[3], &saddr) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "sa");
- return 0;
- }
-
- if (parse_ipv6_addr(tokens[4], &daddr) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "da");
- return 0;
- }
-
- if (parser_read_uint16(&sp, tokens[5]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "sp");
- return 0;
- }
-
- if (parser_read_uint16(&dp, tokens[6]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "dp");
- return 0;
- }
-
- if (parser_read_uint8(&proto, tokens[7]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID,
- "proto");
- return 0;
- }
-
- ipv6->sa = saddr;
- ipv6->da = daddr;
- ipv6->sp = rte_cpu_to_be_16(sp);
- ipv6->dp = rte_cpu_to_be_16(dp);
- ipv6->proto = proto;
-
- return 8;
- } /* hash ipv6_5tuple */
-
- if (strcmp(tokens[2], "ipv4_addr") == 0) {
- struct pkt_key_ipv4_addr *ipv4_addr =
- (struct pkt_key_ipv4_addr *) m->match.hash.key;
- struct in_addr addr;
-
- if (n_tokens < 4) {
- snprintf(out, out_size, MSG_ARG_MISMATCH,
- tokens[0]);
- return 0;
- }
-
- if (parse_ipv4_addr(tokens[3], &addr) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID,
- "addr");
- return 0;
- }
-
- ipv4_addr->addr = addr.s_addr;
-
- return 4;
- } /* hash ipv4_addr */
-
- if (strcmp(tokens[2], "ipv6_addr") == 0) {
- struct pkt_key_ipv6_addr *ipv6_addr =
- (struct pkt_key_ipv6_addr *) m->match.hash.key;
- struct rte_ipv6_addr addr;
-
- if (n_tokens < 4) {
- snprintf(out, out_size, MSG_ARG_MISMATCH,
- tokens[0]);
- return 0;
- }
-
- if (parse_ipv6_addr(tokens[3], &addr) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID,
- "addr");
- return 0;
- }
-
- ipv6_addr->addr = addr;
-
- return 4;
- } /* hash ipv6_5tuple */
-
- if (strcmp(tokens[2], "qinq") == 0) {
- struct pkt_key_qinq *qinq =
- (struct pkt_key_qinq *) m->match.hash.key;
- uint16_t svlan, cvlan;
-
- if (n_tokens < 5) {
- snprintf(out, out_size, MSG_ARG_MISMATCH,
- tokens[0]);
- return 0;
- }
-
- if ((parser_read_uint16(&svlan, tokens[3]) != 0) ||
- (svlan > 0xFFF)) {
- snprintf(out, out_size, MSG_ARG_INVALID,
- "svlan");
- return 0;
- }
-
- if ((parser_read_uint16(&cvlan, tokens[4]) != 0) ||
- (cvlan > 0xFFF)) {
- snprintf(out, out_size, MSG_ARG_INVALID,
- "cvlan");
- return 0;
- }
-
- qinq->svlan = rte_cpu_to_be_16(svlan);
- qinq->cvlan = rte_cpu_to_be_16(cvlan);
-
- return 5;
- } /* hash qinq */
-
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return 0;
- } /* hash */
-
- if (strcmp(tokens[1], "lpm") == 0) {
- if (n_tokens < 5) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return 0;
- }
-
- m->match_type = TABLE_LPM;
-
- if (strcmp(tokens[2], "ipv4") == 0) {
- struct in_addr addr;
-
- m->match.lpm.ip_version = 1;
-
- if (parse_ipv4_addr(tokens[3], &addr) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID,
- "addr");
- return 0;
- }
-
- m->match.lpm.ipv4 = rte_be_to_cpu_32(addr.s_addr);
- } else if (strcmp(tokens[2], "ipv6") == 0) {
- struct rte_ipv6_addr addr;
-
- m->match.lpm.ip_version = 0;
-
- if (parse_ipv6_addr(tokens[3], &addr) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID,
- "addr");
- return 0;
- }
-
- m->match.lpm.ipv6 = addr;
- } else {
- snprintf(out, out_size, MSG_ARG_MISMATCH,
- "ipv4 or ipv6");
- return 0;
- }
-
- if (parser_read_uint8(&m->match.lpm.depth, tokens[4]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "depth");
- return 0;
- }
-
- return 5;
- } /* lpm */
-
- snprintf(out, out_size, MSG_ARG_MISMATCH,
- "acl or array or hash or lpm");
- return 0;
-}
-
-/**
- * table_action ::=
- *
- * action
- * fwd
- * drop
- * | port <port_id>
- * | meta
- * | table <table_id>
- * [balance <out0> ... <out7>]
- * [meter
- * tc0 meter <meter_profile_id> policer g <pa> y <pa> r <pa>
- * [tc1 meter <meter_profile_id> policer g <pa> y <pa> r <pa>
- * tc2 meter <meter_profile_id> policer g <pa> y <pa> r <pa>
- * tc3 meter <meter_profile_id> policer g <pa> y <pa> r <pa>]]
- * [tm subport <subport_id> pipe <pipe_id>]
- * [encap
- * 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>
- * [label1 <label> <tc> <ttl>
- * [label2 <label> <tc> <ttl>
- * [label3 <label> <tc> <ttl>]]]
- * | pppoe <da> <sa> <session_id>
- * | vxlan ether <da> <sa>
- * [vlan <pcp> <dei> <vid>]
- * ipv4 <sa> <da> <dscp> <ttl>
- * | ipv6 <sa> <da> <flow_label> <dscp> <hop_limit>
- * udp <sp> <dp>
- * vxlan <vni>]
- * [nat ipv4 | ipv6 <addr> <port>]
- * [ttl dec | keep]
- * [stats]
- * [time]
- * [sym_crypto
- * encrypt | decrypt
- * type
- * | cipher
- * cipher_algo <algo> cipher_key <key> cipher_iv <iv>
- * | cipher_auth
- * cipher_algo <algo> cipher_key <key> cipher_iv <iv>
- * auth_algo <algo> auth_key <key> digest_size <size>
- * | aead
- * aead_algo <algo> aead_key <key> aead_iv <iv> aead_aad <aad>
- * digest_size <size>
- * data_offset <data_offset>]
- * [tag <tag>]
- * [decap <n>]
- *
- * where:
- * <pa> ::= g | y | r | drop
- */
-static uint32_t
-parse_table_action_fwd(char **tokens,
- uint32_t n_tokens,
- struct table_rule_action *a)
-{
- if ((n_tokens == 0) || (strcmp(tokens[0], "fwd") != 0))
- return 0;
-
- tokens++;
- n_tokens--;
-
- if (n_tokens && (strcmp(tokens[0], "drop") == 0)) {
- a->fwd.action = RTE_PIPELINE_ACTION_DROP;
- a->action_mask |= 1 << RTE_TABLE_ACTION_FWD;
- return 1 + 1;
- }
-
- if (n_tokens && (strcmp(tokens[0], "port") == 0)) {
- uint32_t id;
-
- if ((n_tokens < 2) ||
- parser_read_uint32(&id, tokens[1]))
- return 0;
-
- a->fwd.action = RTE_PIPELINE_ACTION_PORT;
- a->fwd.id = id;
- a->action_mask |= 1 << RTE_TABLE_ACTION_FWD;
- return 1 + 2;
- }
-
- if (n_tokens && (strcmp(tokens[0], "meta") == 0)) {
- a->fwd.action = RTE_PIPELINE_ACTION_PORT_META;
- a->action_mask |= 1 << RTE_TABLE_ACTION_FWD;
- return 1 + 1;
- }
-
- if (n_tokens && (strcmp(tokens[0], "table") == 0)) {
- uint32_t id;
-
- if ((n_tokens < 2) ||
- parser_read_uint32(&id, tokens[1]))
- return 0;
-
- a->fwd.action = RTE_PIPELINE_ACTION_TABLE;
- a->fwd.id = id;
- a->action_mask |= 1 << RTE_TABLE_ACTION_FWD;
- return 1 + 2;
- }
-
- return 0;
-}
-
-static uint32_t
-parse_table_action_balance(char **tokens,
- uint32_t n_tokens,
- struct table_rule_action *a)
-{
- uint32_t i;
-
- if ((n_tokens == 0) || (strcmp(tokens[0], "balance") != 0))
- return 0;
-
- tokens++;
- n_tokens--;
-
- if (n_tokens < RTE_TABLE_ACTION_LB_TABLE_SIZE)
- return 0;
-
- for (i = 0; i < RTE_TABLE_ACTION_LB_TABLE_SIZE; i++)
- if (parser_read_uint32(&a->lb.out[i], tokens[i]) != 0)
- return 0;
-
- a->action_mask |= 1 << RTE_TABLE_ACTION_LB;
- return 1 + RTE_TABLE_ACTION_LB_TABLE_SIZE;
-
-}
-
-static int
-parse_policer_action(char *token, enum rte_table_action_policer *a)
-{
- if (strcmp(token, "g") == 0) {
- *a = RTE_TABLE_ACTION_POLICER_COLOR_GREEN;
- return 0;
- }
-
- if (strcmp(token, "y") == 0) {
- *a = RTE_TABLE_ACTION_POLICER_COLOR_YELLOW;
- return 0;
- }
-
- if (strcmp(token, "r") == 0) {
- *a = RTE_TABLE_ACTION_POLICER_COLOR_RED;
- return 0;
- }
-
- if (strcmp(token, "drop") == 0) {
- *a = RTE_TABLE_ACTION_POLICER_DROP;
- return 0;
- }
-
- return -1;
-}
-
-static uint32_t
-parse_table_action_meter_tc(char **tokens,
- uint32_t n_tokens,
- struct rte_table_action_mtr_tc_params *mtr)
-{
- if ((n_tokens < 9) ||
- strcmp(tokens[0], "meter") ||
- parser_read_uint32(&mtr->meter_profile_id, tokens[1]) ||
- strcmp(tokens[2], "policer") ||
- strcmp(tokens[3], "g") ||
- parse_policer_action(tokens[4], &mtr->policer[RTE_COLOR_GREEN]) ||
- strcmp(tokens[5], "y") ||
- parse_policer_action(tokens[6], &mtr->policer[RTE_COLOR_YELLOW]) ||
- strcmp(tokens[7], "r") ||
- parse_policer_action(tokens[8], &mtr->policer[RTE_COLOR_RED]))
- return 0;
-
- return 9;
-}
-
-static uint32_t
-parse_table_action_meter(char **tokens,
- uint32_t n_tokens,
- struct table_rule_action *a)
-{
- if ((n_tokens == 0) || strcmp(tokens[0], "meter"))
- return 0;
-
- tokens++;
- n_tokens--;
-
- if ((n_tokens < 10) ||
- strcmp(tokens[0], "tc0") ||
- (parse_table_action_meter_tc(tokens + 1,
- n_tokens - 1,
- &a->mtr.mtr[0]) == 0))
- return 0;
-
- tokens += 10;
- n_tokens -= 10;
-
- if ((n_tokens == 0) || strcmp(tokens[0], "tc1")) {
- a->mtr.tc_mask = 1;
- a->action_mask |= 1 << RTE_TABLE_ACTION_MTR;
- return 1 + 10;
- }
-
- if ((n_tokens < 30) ||
- (parse_table_action_meter_tc(tokens + 1,
- n_tokens - 1, &a->mtr.mtr[1]) == 0) ||
- strcmp(tokens[10], "tc2") ||
- (parse_table_action_meter_tc(tokens + 11,
- n_tokens - 11, &a->mtr.mtr[2]) == 0) ||
- strcmp(tokens[20], "tc3") ||
- (parse_table_action_meter_tc(tokens + 21,
- n_tokens - 21, &a->mtr.mtr[3]) == 0))
- return 0;
-
- a->mtr.tc_mask = 0xF;
- a->action_mask |= 1 << RTE_TABLE_ACTION_MTR;
- return 1 + 10 + 3 * 10;
-}
-
-static uint32_t
-parse_table_action_tm(char **tokens,
- uint32_t n_tokens,
- struct table_rule_action *a)
-{
- uint32_t subport_id, pipe_id;
-
- if ((n_tokens < 5) ||
- strcmp(tokens[0], "tm") ||
- strcmp(tokens[1], "subport") ||
- parser_read_uint32(&subport_id, tokens[2]) ||
- strcmp(tokens[3], "pipe") ||
- parser_read_uint32(&pipe_id, tokens[4]))
- return 0;
-
- a->tm.subport_id = subport_id;
- a->tm.pipe_id = pipe_id;
- a->action_mask |= 1 << RTE_TABLE_ACTION_TM;
- return 5;
-}
-
-static uint32_t
-parse_table_action_encap(char **tokens,
- uint32_t n_tokens,
- struct table_rule_action *a)
-{
- if ((n_tokens == 0) || strcmp(tokens[0], "encap"))
- return 0;
-
- tokens++;
- n_tokens--;
-
- /* ether */
- if (n_tokens && (strcmp(tokens[0], "ether") == 0)) {
- if ((n_tokens < 3) ||
- parse_mac_addr(tokens[1], &a->encap.ether.ether.da) ||
- parse_mac_addr(tokens[2], &a->encap.ether.ether.sa))
- return 0;
-
- a->encap.type = RTE_TABLE_ACTION_ENCAP_ETHER;
- a->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;
- return 1 + 3;
- }
-
- /* vlan */
- if (n_tokens && (strcmp(tokens[0], "vlan") == 0)) {
- uint32_t pcp, dei, vid;
-
- if ((n_tokens < 6) ||
- parse_mac_addr(tokens[1], &a->encap.vlan.ether.da) ||
- parse_mac_addr(tokens[2], &a->encap.vlan.ether.sa) ||
- parser_read_uint32(&pcp, tokens[3]) ||
- (pcp > 0x7) ||
- parser_read_uint32(&dei, tokens[4]) ||
- (dei > 0x1) ||
- parser_read_uint32(&vid, tokens[5]) ||
- (vid > 0xFFF))
- return 0;
-
- a->encap.vlan.vlan.pcp = pcp & 0x7;
- a->encap.vlan.vlan.dei = dei & 0x1;
- a->encap.vlan.vlan.vid = vid & 0xFFF;
- a->encap.type = RTE_TABLE_ACTION_ENCAP_VLAN;
- a->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;
- return 1 + 6;
- }
-
- /* qinq */
- if (n_tokens && (strcmp(tokens[0], "qinq") == 0)) {
- uint32_t svlan_pcp, svlan_dei, svlan_vid;
- uint32_t cvlan_pcp, cvlan_dei, cvlan_vid;
-
- if ((n_tokens < 9) ||
- parse_mac_addr(tokens[1], &a->encap.qinq.ether.da) ||
- parse_mac_addr(tokens[2], &a->encap.qinq.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))
- return 0;
-
- a->encap.qinq.svlan.pcp = svlan_pcp & 0x7;
- a->encap.qinq.svlan.dei = svlan_dei & 0x1;
- a->encap.qinq.svlan.vid = svlan_vid & 0xFFF;
- a->encap.qinq.cvlan.pcp = cvlan_pcp & 0x7;
- a->encap.qinq.cvlan.dei = cvlan_dei & 0x1;
- a->encap.qinq.cvlan.vid = cvlan_vid & 0xFFF;
- a->encap.type = RTE_TABLE_ACTION_ENCAP_QINQ;
- a->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;
- 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;
-
- if (n_tokens < 8)
- return 0;
-
- if (strcmp(tokens[1], "unicast") == 0)
- a->encap.mpls.unicast = 1;
- else if (strcmp(tokens[1], "multicast") == 0)
- a->encap.mpls.unicast = 0;
- else
- return 0;
-
- if (parse_mac_addr(tokens[2], &a->encap.mpls.ether.da) ||
- parse_mac_addr(tokens[3], &a->encap.mpls.ether.sa) ||
- strcmp(tokens[4], "label0") ||
- parser_read_uint32(&label, tokens[5]) ||
- (label > 0xFFFFF) ||
- parser_read_uint32(&tc, tokens[6]) ||
- (tc > 0x7) ||
- parser_read_uint32(&ttl, tokens[7]) ||
- (ttl > 0x3F))
- return 0;
-
- a->encap.mpls.mpls[0].label = label;
- a->encap.mpls.mpls[0].tc = tc;
- a->encap.mpls.mpls[0].ttl = ttl;
-
- tokens += 8;
- n_tokens -= 8;
-
- if ((n_tokens == 0) || strcmp(tokens[0], "label1")) {
- a->encap.mpls.mpls_count = 1;
- a->encap.type = RTE_TABLE_ACTION_ENCAP_MPLS;
- a->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;
- return 1 + 8;
- }
-
- if ((n_tokens < 4) ||
- parser_read_uint32(&label, tokens[1]) ||
- (label > 0xFFFFF) ||
- parser_read_uint32(&tc, tokens[2]) ||
- (tc > 0x7) ||
- parser_read_uint32(&ttl, tokens[3]) ||
- (ttl > 0x3F))
- return 0;
-
- a->encap.mpls.mpls[1].label = label;
- a->encap.mpls.mpls[1].tc = tc;
- a->encap.mpls.mpls[1].ttl = ttl;
-
- tokens += 4;
- n_tokens -= 4;
-
- if ((n_tokens == 0) || strcmp(tokens[0], "label2")) {
- a->encap.mpls.mpls_count = 2;
- a->encap.type = RTE_TABLE_ACTION_ENCAP_MPLS;
- a->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;
- return 1 + 8 + 4;
- }
-
- if ((n_tokens < 4) ||
- parser_read_uint32(&label, tokens[1]) ||
- (label > 0xFFFFF) ||
- parser_read_uint32(&tc, tokens[2]) ||
- (tc > 0x7) ||
- parser_read_uint32(&ttl, tokens[3]) ||
- (ttl > 0x3F))
- return 0;
-
- a->encap.mpls.mpls[2].label = label;
- a->encap.mpls.mpls[2].tc = tc;
- a->encap.mpls.mpls[2].ttl = ttl;
-
- tokens += 4;
- n_tokens -= 4;
-
- if ((n_tokens == 0) || strcmp(tokens[0], "label3")) {
- a->encap.mpls.mpls_count = 3;
- a->encap.type = RTE_TABLE_ACTION_ENCAP_MPLS;
- a->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;
- return 1 + 8 + 4 + 4;
- }
-
- if ((n_tokens < 4) ||
- parser_read_uint32(&label, tokens[1]) ||
- (label > 0xFFFFF) ||
- parser_read_uint32(&tc, tokens[2]) ||
- (tc > 0x7) ||
- parser_read_uint32(&ttl, tokens[3]) ||
- (ttl > 0x3F))
- return 0;
-
- a->encap.mpls.mpls[3].label = label;
- a->encap.mpls.mpls[3].tc = tc;
- a->encap.mpls.mpls[3].ttl = ttl;
-
- a->encap.mpls.mpls_count = 4;
- a->encap.type = RTE_TABLE_ACTION_ENCAP_MPLS;
- a->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;
- return 1 + 8 + 4 + 4 + 4;
- }
-
- /* pppoe */
- if (n_tokens && (strcmp(tokens[0], "pppoe") == 0)) {
- if ((n_tokens < 4) ||
- parse_mac_addr(tokens[1], &a->encap.pppoe.ether.da) ||
- parse_mac_addr(tokens[2], &a->encap.pppoe.ether.sa) ||
- parser_read_uint16(&a->encap.pppoe.pppoe.session_id,
- tokens[3]))
- return 0;
-
- a->encap.type = RTE_TABLE_ACTION_ENCAP_PPPOE;
- a->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;
- return 1 + 4;
- }
-
- /* vxlan */
- if (n_tokens && (strcmp(tokens[0], "vxlan") == 0)) {
- uint32_t n = 0;
-
- n_tokens--;
- tokens++;
- n++;
-
- /* ether <da> <sa> */
- if ((n_tokens < 3) ||
- strcmp(tokens[0], "ether") ||
- parse_mac_addr(tokens[1], &a->encap.vxlan.ether.da) ||
- parse_mac_addr(tokens[2], &a->encap.vxlan.ether.sa))
- return 0;
-
- n_tokens -= 3;
- tokens += 3;
- n += 3;
-
- /* [vlan <pcp> <dei> <vid>] */
- if (strcmp(tokens[0], "vlan") == 0) {
- uint32_t pcp, dei, vid;
-
- if ((n_tokens < 4) ||
- parser_read_uint32(&pcp, tokens[1]) ||
- (pcp > 7) ||
- parser_read_uint32(&dei, tokens[2]) ||
- (dei > 1) ||
- parser_read_uint32(&vid, tokens[3]) ||
- (vid > 0xFFF))
- return 0;
-
- a->encap.vxlan.vlan.pcp = pcp;
- a->encap.vxlan.vlan.dei = dei;
- a->encap.vxlan.vlan.vid = vid;
-
- n_tokens -= 4;
- tokens += 4;
- n += 4;
- }
-
- /* ipv4 <sa> <da> <dscp> <ttl>
- | ipv6 <sa> <da> <flow_label> <dscp> <hop_limit> */
- if (strcmp(tokens[0], "ipv4") == 0) {
- struct in_addr sa, da;
- uint8_t dscp, ttl;
-
- if ((n_tokens < 5) ||
- parse_ipv4_addr(tokens[1], &sa) ||
- parse_ipv4_addr(tokens[2], &da) ||
- parser_read_uint8(&dscp, tokens[3]) ||
- (dscp > 64) ||
- parser_read_uint8(&ttl, tokens[4]))
- return 0;
-
- a->encap.vxlan.ipv4.sa = rte_be_to_cpu_32(sa.s_addr);
- a->encap.vxlan.ipv4.da = rte_be_to_cpu_32(da.s_addr);
- a->encap.vxlan.ipv4.dscp = dscp;
- a->encap.vxlan.ipv4.ttl = ttl;
-
- n_tokens -= 5;
- tokens += 5;
- n += 5;
- } else if (strcmp(tokens[0], "ipv6") == 0) {
- struct rte_ipv6_addr sa, da;
- uint32_t flow_label;
- uint8_t dscp, hop_limit;
-
- if ((n_tokens < 6) ||
- parse_ipv6_addr(tokens[1], &sa) ||
- parse_ipv6_addr(tokens[2], &da) ||
- parser_read_uint32(&flow_label, tokens[3]) ||
- parser_read_uint8(&dscp, tokens[4]) ||
- (dscp > 64) ||
- parser_read_uint8(&hop_limit, tokens[5]))
- return 0;
-
- a->encap.vxlan.ipv6.sa = sa;
- a->encap.vxlan.ipv6.da = da;
- a->encap.vxlan.ipv6.flow_label = flow_label;
- a->encap.vxlan.ipv6.dscp = dscp;
- a->encap.vxlan.ipv6.hop_limit = hop_limit;
-
- n_tokens -= 6;
- tokens += 6;
- n += 6;
- } else
- return 0;
-
- /* udp <sp> <dp> */
- if ((n_tokens < 3) ||
- strcmp(tokens[0], "udp") ||
- parser_read_uint16(&a->encap.vxlan.udp.sp, tokens[1]) ||
- parser_read_uint16(&a->encap.vxlan.udp.dp, tokens[2]))
- return 0;
-
- n_tokens -= 3;
- tokens += 3;
- n += 3;
-
- /* vxlan <vni> */
- if ((n_tokens < 2) ||
- strcmp(tokens[0], "vxlan") ||
- parser_read_uint32(&a->encap.vxlan.vxlan.vni, tokens[1]) ||
- (a->encap.vxlan.vxlan.vni > 0xFFFFFF))
- return 0;
-
- n_tokens -= 2;
- tokens += 2;
- n += 2;
-
- a->encap.type = RTE_TABLE_ACTION_ENCAP_VXLAN;
- a->action_mask |= 1 << RTE_TABLE_ACTION_ENCAP;
- return 1 + n;
- }
-
- return 0;
-}
-
-static uint32_t
-parse_table_action_nat(char **tokens,
- uint32_t n_tokens,
- struct table_rule_action *a)
-{
- if ((n_tokens < 4) ||
- strcmp(tokens[0], "nat"))
- return 0;
-
- if (strcmp(tokens[1], "ipv4") == 0) {
- struct in_addr addr;
- uint16_t port;
-
- if (parse_ipv4_addr(tokens[2], &addr) ||
- parser_read_uint16(&port, tokens[3]))
- return 0;
-
- a->nat.ip_version = 1;
- a->nat.addr.ipv4 = rte_be_to_cpu_32(addr.s_addr);
- a->nat.port = port;
- a->action_mask |= 1 << RTE_TABLE_ACTION_NAT;
- return 4;
- }
-
- if (strcmp(tokens[1], "ipv6") == 0) {
- struct rte_ipv6_addr addr;
- uint16_t port;
-
- if (parse_ipv6_addr(tokens[2], &addr) ||
- parser_read_uint16(&port, tokens[3]))
- return 0;
-
- a->nat.ip_version = 0;
- a->nat.addr.ipv6 = addr;
- a->nat.port = port;
- a->action_mask |= 1 << RTE_TABLE_ACTION_NAT;
- return 4;
- }
-
- return 0;
-}
-
-static uint32_t
-parse_table_action_ttl(char **tokens,
- uint32_t n_tokens,
- struct table_rule_action *a)
-{
- if ((n_tokens < 2) ||
- strcmp(tokens[0], "ttl"))
- return 0;
-
- if (strcmp(tokens[1], "dec") == 0)
- a->ttl.decrement = 1;
- else if (strcmp(tokens[1], "keep") == 0)
- a->ttl.decrement = 0;
- else
- return 0;
-
- a->action_mask |= 1 << RTE_TABLE_ACTION_TTL;
- return 2;
-}
-
-static uint32_t
-parse_table_action_stats(char **tokens,
- uint32_t n_tokens,
- struct table_rule_action *a)
-{
- if ((n_tokens < 1) ||
- strcmp(tokens[0], "stats"))
- return 0;
-
- a->stats.n_packets = 0;
- a->stats.n_bytes = 0;
- a->action_mask |= 1 << RTE_TABLE_ACTION_STATS;
- return 1;
-}
-
-static uint32_t
-parse_table_action_time(char **tokens,
- uint32_t n_tokens,
- struct table_rule_action *a)
-{
- if ((n_tokens < 1) ||
- strcmp(tokens[0], "time"))
- return 0;
-
- a->time.time = rte_rdtsc();
- a->action_mask |= 1 << RTE_TABLE_ACTION_TIME;
- return 1;
-}
-
-static void
-parse_free_sym_crypto_param_data(struct rte_table_action_sym_crypto_params *p)
-{
- struct rte_crypto_sym_xform *xform[2] = {NULL};
- uint32_t i;
-
- xform[0] = p->xform;
- if (xform[0])
- xform[1] = xform[0]->next;
-
- for (i = 0; i < 2; i++) {
- if (xform[i] == NULL)
- continue;
-
- switch (xform[i]->type) {
- case RTE_CRYPTO_SYM_XFORM_CIPHER:
- free(p->cipher_auth.cipher_iv.val);
- free(p->cipher_auth.cipher_iv_update.val);
- break;
- case RTE_CRYPTO_SYM_XFORM_AUTH:
- if (p->cipher_auth.auth_iv.val)
- free(p->cipher_auth.cipher_iv.val);
- if (p->cipher_auth.auth_iv_update.val)
- free(p->cipher_auth.cipher_iv_update.val);
- break;
- case RTE_CRYPTO_SYM_XFORM_AEAD:
- free(p->aead.iv.val);
- free(p->aead.aad.val);
- break;
- default:
- continue;
- }
- }
-
-}
-
-static struct rte_crypto_sym_xform *
-parse_table_action_cipher(struct rte_table_action_sym_crypto_params *p,
- uint8_t *key, uint32_t max_key_len, char **tokens,
- uint32_t n_tokens, uint32_t encrypt, uint32_t *used_n_tokens)
-{
- struct rte_crypto_sym_xform *xform_cipher;
- int status;
- size_t len;
-
- if (n_tokens < 7 || strcmp(tokens[1], "cipher_algo") ||
- strcmp(tokens[3], "cipher_key") ||
- strcmp(tokens[5], "cipher_iv"))
- return NULL;
-
- xform_cipher = calloc(1, sizeof(*xform_cipher));
- if (xform_cipher == NULL)
- return NULL;
-
- xform_cipher->type = RTE_CRYPTO_SYM_XFORM_CIPHER;
- xform_cipher->cipher.op = encrypt ? RTE_CRYPTO_CIPHER_OP_ENCRYPT :
- RTE_CRYPTO_CIPHER_OP_DECRYPT;
-
- /* cipher_algo */
- status = rte_cryptodev_get_cipher_algo_enum(
- &xform_cipher->cipher.algo, tokens[2]);
- if (status < 0)
- goto error_exit;
-
- /* cipher_key */
- len = strlen(tokens[4]);
- if (len / 2 > max_key_len) {
- status = -ENOMEM;
- goto error_exit;
- }
-
- status = parse_hex_string(tokens[4], key, (uint32_t *)&len);
- if (status < 0)
- goto error_exit;
-
- xform_cipher->cipher.key.data = key;
- xform_cipher->cipher.key.length = (uint16_t)len;
-
- /* cipher_iv */
- len = strlen(tokens[6]);
-
- p->cipher_auth.cipher_iv.val = calloc(1, len / 2 + 1);
- if (p->cipher_auth.cipher_iv.val == NULL)
- goto error_exit;
-
- status = parse_hex_string(tokens[6],
- p->cipher_auth.cipher_iv.val,
- (uint32_t *)&len);
- if (status < 0)
- goto error_exit;
-
- xform_cipher->cipher.iv.length = (uint16_t)len;
- xform_cipher->cipher.iv.offset = RTE_TABLE_ACTION_SYM_CRYPTO_IV_OFFSET;
- p->cipher_auth.cipher_iv.length = (uint32_t)len;
- *used_n_tokens = 7;
-
- return xform_cipher;
-
-error_exit:
- if (p->cipher_auth.cipher_iv.val) {
- free(p->cipher_auth.cipher_iv.val);
- p->cipher_auth.cipher_iv.val = NULL;
- }
-
- free(xform_cipher);
-
- return NULL;
-}
-
-static struct rte_crypto_sym_xform *
-parse_table_action_cipher_auth(struct rte_table_action_sym_crypto_params *p,
- uint8_t *key, uint32_t max_key_len, char **tokens,
- uint32_t n_tokens, uint32_t encrypt, uint32_t *used_n_tokens)
-{
- struct rte_crypto_sym_xform *xform_cipher;
- struct rte_crypto_sym_xform *xform_auth;
- int status;
- size_t len;
-
- if (n_tokens < 13 ||
- strcmp(tokens[7], "auth_algo") ||
- strcmp(tokens[9], "auth_key") ||
- strcmp(tokens[11], "digest_size"))
- return NULL;
-
- xform_auth = calloc(1, sizeof(*xform_auth));
- if (xform_auth == NULL)
- return NULL;
-
- xform_auth->type = RTE_CRYPTO_SYM_XFORM_AUTH;
- xform_auth->auth.op = encrypt ? RTE_CRYPTO_AUTH_OP_GENERATE :
- RTE_CRYPTO_AUTH_OP_VERIFY;
-
- /* auth_algo */
- status = rte_cryptodev_get_auth_algo_enum(&xform_auth->auth.algo,
- tokens[8]);
- if (status < 0)
- goto error_exit;
-
- /* auth_key */
- len = strlen(tokens[10]);
- if (len / 2 > max_key_len) {
- status = -ENOMEM;
- goto error_exit;
- }
-
- status = parse_hex_string(tokens[10], key, (uint32_t *)&len);
- if (status < 0)
- goto error_exit;
-
- xform_auth->auth.key.data = key;
- xform_auth->auth.key.length = (uint16_t)len;
-
- key += xform_auth->auth.key.length;
- max_key_len -= xform_auth->auth.key.length;
-
- if (strcmp(tokens[11], "digest_size"))
- goto error_exit;
-
- status = parser_read_uint16(&xform_auth->auth.digest_length,
- tokens[12]);
- if (status < 0)
- goto error_exit;
-
- xform_cipher = parse_table_action_cipher(p, key, max_key_len, tokens,
- 7, encrypt, used_n_tokens);
- if (xform_cipher == NULL)
- goto error_exit;
-
- *used_n_tokens += 6;
-
- if (encrypt) {
- xform_cipher->next = xform_auth;
- return xform_cipher;
- } else {
- xform_auth->next = xform_cipher;
- return xform_auth;
- }
-
-error_exit:
- if (p->cipher_auth.auth_iv.val) {
- free(p->cipher_auth.auth_iv.val);
- p->cipher_auth.auth_iv.val = 0;
- }
-
- free(xform_auth);
-
- return NULL;
-}
-
-static struct rte_crypto_sym_xform *
-parse_table_action_aead(struct rte_table_action_sym_crypto_params *p,
- uint8_t *key, uint32_t max_key_len, char **tokens,
- uint32_t n_tokens, uint32_t encrypt, uint32_t *used_n_tokens)
-{
- struct rte_crypto_sym_xform *xform_aead;
- int status;
- size_t len;
-
- if (n_tokens < 11 || strcmp(tokens[1], "aead_algo") ||
- strcmp(tokens[3], "aead_key") ||
- strcmp(tokens[5], "aead_iv") ||
- strcmp(tokens[7], "aead_aad") ||
- strcmp(tokens[9], "digest_size"))
- return NULL;
-
- xform_aead = calloc(1, sizeof(*xform_aead));
- if (xform_aead == NULL)
- return NULL;
-
- xform_aead->type = RTE_CRYPTO_SYM_XFORM_AEAD;
- xform_aead->aead.op = encrypt ? RTE_CRYPTO_AEAD_OP_ENCRYPT :
- RTE_CRYPTO_AEAD_OP_DECRYPT;
-
- /* aead_algo */
- status = rte_cryptodev_get_aead_algo_enum(&xform_aead->aead.algo,
- tokens[2]);
- if (status < 0)
- goto error_exit;
-
- /* aead_key */
- len = strlen(tokens[4]);
- if (len / 2 > max_key_len) {
- status = -ENOMEM;
- goto error_exit;
- }
-
- status = parse_hex_string(tokens[4], key, (uint32_t *)&len);
- if (status < 0)
- goto error_exit;
-
- xform_aead->aead.key.data = key;
- xform_aead->aead.key.length = (uint16_t)len;
-
- /* aead_iv */
- len = strlen(tokens[6]);
- p->aead.iv.val = calloc(1, len / 2 + 1);
- if (p->aead.iv.val == NULL)
- goto error_exit;
-
- status = parse_hex_string(tokens[6], p->aead.iv.val,
- (uint32_t *)&len);
- if (status < 0)
- goto error_exit;
-
- xform_aead->aead.iv.length = (uint16_t)len;
- xform_aead->aead.iv.offset = RTE_TABLE_ACTION_SYM_CRYPTO_IV_OFFSET;
- p->aead.iv.length = (uint32_t)len;
-
- /* aead_aad */
- len = strlen(tokens[8]);
- p->aead.aad.val = calloc(1, len / 2 + 1);
- if (p->aead.aad.val == NULL)
- goto error_exit;
-
- status = parse_hex_string(tokens[8], p->aead.aad.val, (uint32_t *)&len);
- if (status < 0)
- goto error_exit;
-
- xform_aead->aead.aad_length = (uint16_t)len;
- p->aead.aad.length = (uint32_t)len;
-
- /* digest_size */
- status = parser_read_uint16(&xform_aead->aead.digest_length,
- tokens[10]);
- if (status < 0)
- goto error_exit;
-
- *used_n_tokens = 11;
-
- return xform_aead;
-
-error_exit:
- if (p->aead.iv.val) {
- free(p->aead.iv.val);
- p->aead.iv.val = NULL;
- }
- if (p->aead.aad.val) {
- free(p->aead.aad.val);
- p->aead.aad.val = NULL;
- }
-
- free(xform_aead);
-
- return NULL;
-}
-
-
-static uint32_t
-parse_table_action_sym_crypto(char **tokens,
- uint32_t n_tokens,
- struct table_rule_action *a)
-{
- struct rte_table_action_sym_crypto_params *p = &a->sym_crypto;
- struct rte_crypto_sym_xform *xform = NULL;
- uint8_t *key = a->sym_crypto_key;
- uint32_t max_key_len = SYM_CRYPTO_MAX_KEY_SIZE;
- uint32_t used_n_tokens;
- uint32_t encrypt;
- int status;
-
- if ((n_tokens < 12) ||
- strcmp(tokens[0], "sym_crypto") ||
- strcmp(tokens[2], "type"))
- return 0;
-
- memset(p, 0, sizeof(*p));
-
- if (strcmp(tokens[1], "encrypt") == 0)
- encrypt = 1;
- else
- encrypt = 0;
-
- status = parser_read_uint32(&p->data_offset, tokens[n_tokens - 1]);
- if (status < 0)
- return 0;
-
- if (strcmp(tokens[3], "cipher") == 0) {
- tokens += 3;
- n_tokens -= 3;
-
- xform = parse_table_action_cipher(p, key, max_key_len, tokens,
- n_tokens, encrypt, &used_n_tokens);
- } else if (strcmp(tokens[3], "cipher_auth") == 0) {
- tokens += 3;
- n_tokens -= 3;
-
- xform = parse_table_action_cipher_auth(p, key, max_key_len,
- tokens, n_tokens, encrypt, &used_n_tokens);
- } else if (strcmp(tokens[3], "aead") == 0) {
- tokens += 3;
- n_tokens -= 3;
-
- xform = parse_table_action_aead(p, key, max_key_len, tokens,
- n_tokens, encrypt, &used_n_tokens);
- }
-
- if (xform == NULL)
- return 0;
-
- p->xform = xform;
-
- if (strcmp(tokens[used_n_tokens], "data_offset")) {
- parse_free_sym_crypto_param_data(p);
- return 0;
- }
-
- a->action_mask |= 1 << RTE_TABLE_ACTION_SYM_CRYPTO;
-
- return used_n_tokens + 5;
-}
-
-static uint32_t
-parse_table_action_tag(char **tokens,
- uint32_t n_tokens,
- struct table_rule_action *a)
-{
- if ((n_tokens < 2) ||
- strcmp(tokens[0], "tag"))
- return 0;
-
- if (parser_read_uint32(&a->tag.tag, tokens[1]))
- return 0;
-
- a->action_mask |= 1 << RTE_TABLE_ACTION_TAG;
- return 2;
-}
-
-static uint32_t
-parse_table_action_decap(char **tokens,
- uint32_t n_tokens,
- struct table_rule_action *a)
-{
- if ((n_tokens < 2) ||
- strcmp(tokens[0], "decap"))
- return 0;
-
- if (parser_read_uint16(&a->decap.n, tokens[1]))
- return 0;
-
- a->action_mask |= 1 << RTE_TABLE_ACTION_DECAP;
- return 2;
-}
-
-static uint32_t
-parse_table_action(char **tokens,
- uint32_t n_tokens,
- char *out,
- size_t out_size,
- struct table_rule_action *a)
-{
- uint32_t n_tokens0 = n_tokens;
-
- memset(a, 0, sizeof(*a));
-
- if ((n_tokens < 2) ||
- strcmp(tokens[0], "action"))
- return 0;
-
- tokens++;
- n_tokens--;
-
- if (n_tokens && (strcmp(tokens[0], "fwd") == 0)) {
- uint32_t n;
-
- n = parse_table_action_fwd(tokens, n_tokens, a);
- if (n == 0) {
- snprintf(out, out_size, MSG_ARG_INVALID,
- "action fwd");
- return 0;
- }
-
- tokens += n;
- n_tokens -= n;
- }
-
- if (n_tokens && (strcmp(tokens[0], "balance") == 0)) {
- uint32_t n;
-
- n = parse_table_action_balance(tokens, n_tokens, a);
- if (n == 0) {
- snprintf(out, out_size, MSG_ARG_INVALID,
- "action balance");
- return 0;
- }
-
- tokens += n;
- n_tokens -= n;
- }
-
- if (n_tokens && (strcmp(tokens[0], "meter") == 0)) {
- uint32_t n;
-
- n = parse_table_action_meter(tokens, n_tokens, a);
- if (n == 0) {
- snprintf(out, out_size, MSG_ARG_INVALID,
- "action meter");
- return 0;
- }
-
- tokens += n;
- n_tokens -= n;
- }
-
- if (n_tokens && (strcmp(tokens[0], "tm") == 0)) {
- uint32_t n;
-
- n = parse_table_action_tm(tokens, n_tokens, a);
- if (n == 0) {
- snprintf(out, out_size, MSG_ARG_INVALID,
- "action tm");
- return 0;
- }
-
- tokens += n;
- n_tokens -= n;
- }
-
- if (n_tokens && (strcmp(tokens[0], "encap") == 0)) {
- uint32_t n;
-
- n = parse_table_action_encap(tokens, n_tokens, a);
- if (n == 0) {
- snprintf(out, out_size, MSG_ARG_INVALID,
- "action encap");
- return 0;
- }
-
- tokens += n;
- n_tokens -= n;
- }
-
- if (n_tokens && (strcmp(tokens[0], "nat") == 0)) {
- uint32_t n;
-
- n = parse_table_action_nat(tokens, n_tokens, a);
- if (n == 0) {
- snprintf(out, out_size, MSG_ARG_INVALID,
- "action nat");
- return 0;
- }
-
- tokens += n;
- n_tokens -= n;
- }
-
- if (n_tokens && (strcmp(tokens[0], "ttl") == 0)) {
- uint32_t n;
-
- n = parse_table_action_ttl(tokens, n_tokens, a);
- if (n == 0) {
- snprintf(out, out_size, MSG_ARG_INVALID,
- "action ttl");
- return 0;
- }
-
- tokens += n;
- n_tokens -= n;
- }
-
- if (n_tokens && (strcmp(tokens[0], "stats") == 0)) {
- uint32_t n;
-
- n = parse_table_action_stats(tokens, n_tokens, a);
- if (n == 0) {
- snprintf(out, out_size, MSG_ARG_INVALID,
- "action stats");
- return 0;
- }
-
- tokens += n;
- n_tokens -= n;
- }
-
- if (n_tokens && (strcmp(tokens[0], "time") == 0)) {
- uint32_t n;
-
- n = parse_table_action_time(tokens, n_tokens, a);
- if (n == 0) {
- snprintf(out, out_size, MSG_ARG_INVALID,
- "action time");
- return 0;
- }
-
- tokens += n;
- n_tokens -= n;
- }
-
- if (n_tokens && (strcmp(tokens[0], "sym_crypto") == 0)) {
- uint32_t n;
-
- n = parse_table_action_sym_crypto(tokens, n_tokens, a);
- if (n == 0) {
- snprintf(out, out_size, MSG_ARG_INVALID,
- "action sym_crypto");
- }
-
- tokens += n;
- n_tokens -= n;
- }
-
- if (n_tokens && (strcmp(tokens[0], "tag") == 0)) {
- uint32_t n;
-
- n = parse_table_action_tag(tokens, n_tokens, a);
- if (n == 0) {
- snprintf(out, out_size, MSG_ARG_INVALID,
- "action tag");
- return 0;
- }
-
- tokens += n;
- n_tokens -= n;
- }
-
- if (n_tokens && (strcmp(tokens[0], "decap") == 0)) {
- uint32_t n;
-
- n = parse_table_action_decap(tokens, n_tokens, a);
- if (n == 0) {
- snprintf(out, out_size, MSG_ARG_INVALID,
- "action decap");
- return 0;
- }
-
- tokens += n;
- n_tokens -= n;
- }
-
- if (n_tokens0 - n_tokens == 1) {
- snprintf(out, out_size, MSG_ARG_INVALID, "action");
- return 0;
- }
-
- return n_tokens0 - n_tokens;
-}
-
-
-static const char cmd_pipeline_table_rule_add_help[] =
-"pipeline <pipeline_name> table <table_id> rule add\n"
-" match <match>\n"
-" action <table_action>\n";
-
-static void
-cmd_pipeline_table_rule_add(char **tokens,
- uint32_t n_tokens,
- char *out,
- size_t out_size)
-{
- struct table_rule_match m;
- struct table_rule_action a;
- char *pipeline_name;
- uint32_t table_id, t0, n_tokens_parsed;
- int status;
-
- if (n_tokens < 8) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return;
- }
-
- pipeline_name = tokens[1];
-
- if (strcmp(tokens[2], "table") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "table");
- return;
- }
-
- if (parser_read_uint32(&table_id, tokens[3]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
- return;
- }
-
- if (strcmp(tokens[4], "rule") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "rule");
- return;
- }
-
- if (strcmp(tokens[5], "add") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "add");
- return;
- }
-
- t0 = 6;
-
- /* match */
- n_tokens_parsed = parse_match(tokens + t0,
- n_tokens - t0,
- out,
- out_size,
- &m);
- if (n_tokens_parsed == 0)
- return;
- t0 += n_tokens_parsed;
-
- /* action */
- n_tokens_parsed = parse_table_action(tokens + t0,
- n_tokens - t0,
- out,
- out_size,
- &a);
- if (n_tokens_parsed == 0)
- return;
- t0 += n_tokens_parsed;
-
- if (t0 != n_tokens) {
- snprintf(out, out_size, MSG_ARG_INVALID, tokens[0]);
- return;
- }
-
- status = pipeline_table_rule_add(pipeline_name, table_id, &m, &a);
- if (status) {
- snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
- return;
- }
-
- if (a.action_mask & 1 << RTE_TABLE_ACTION_SYM_CRYPTO)
- parse_free_sym_crypto_param_data(&a.sym_crypto);
-}
-
-
-static const char cmd_pipeline_table_rule_add_default_help[] =
-"pipeline <pipeline_name> table <table_id> rule add\n"
-" match\n"
-" default\n"
-" action\n"
-" fwd\n"
-" drop\n"
-" | port <port_id>\n"
-" | meta\n"
-" | table <table_id>\n";
-
-static void
-cmd_pipeline_table_rule_add_default(char **tokens,
- uint32_t n_tokens,
- char *out,
- size_t out_size)
-{
- struct table_rule_action action;
- char *pipeline_name;
- uint32_t table_id;
- int status;
-
- if ((n_tokens != 11) && (n_tokens != 12)) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return;
- }
-
- pipeline_name = tokens[1];
-
- if (strcmp(tokens[2], "table") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "table");
- return;
- }
-
- if (parser_read_uint32(&table_id, tokens[3]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
- return;
- }
-
- if (strcmp(tokens[4], "rule") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "rule");
- return;
- }
-
- if (strcmp(tokens[5], "add") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "add");
- return;
- }
-
- if (strcmp(tokens[6], "match") != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "match");
- return;
- }
-
- if (strcmp(tokens[7], "default") != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "default");
- return;
- }
-
- if (strcmp(tokens[8], "action") != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "action");
- return;
- }
-
- if (strcmp(tokens[9], "fwd") != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "fwd");
- return;
- }
-
- action.action_mask = 1 << RTE_TABLE_ACTION_FWD;
-
- if (strcmp(tokens[10], "drop") == 0) {
- if (n_tokens != 11) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return;
- }
-
- action.fwd.action = RTE_PIPELINE_ACTION_DROP;
- } else if (strcmp(tokens[10], "port") == 0) {
- uint32_t id;
-
- if (n_tokens != 12) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return;
- }
-
- if (parser_read_uint32(&id, tokens[11]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "port_id");
- return;
- }
-
- action.fwd.action = RTE_PIPELINE_ACTION_PORT;
- action.fwd.id = id;
- } else if (strcmp(tokens[10], "meta") == 0) {
- if (n_tokens != 11) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return;
- }
-
- action.fwd.action = RTE_PIPELINE_ACTION_PORT_META;
- } else if (strcmp(tokens[10], "table") == 0) {
- uint32_t id;
-
- if (n_tokens != 12) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return;
- }
-
- if (parser_read_uint32(&id, tokens[11]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
- return;
- }
-
- action.fwd.action = RTE_PIPELINE_ACTION_TABLE;
- action.fwd.id = id;
- } else {
- snprintf(out, out_size, MSG_ARG_INVALID,
- "drop or port or meta or table");
- return;
- }
-
- status = pipeline_table_rule_add_default(pipeline_name,
- table_id,
- &action);
- if (status) {
- snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
- return;
- }
-}
-
-
-static const char cmd_pipeline_table_rule_add_bulk_help[] =
-"pipeline <pipeline_name> table <table_id> rule add bulk <file_name>\n"
-"\n"
-" File <file_name>:\n"
-" - line format: match <match> action <action>\n";
-
-static int
-cli_rule_file_process(const char *file_name,
- size_t line_len_max,
- struct table_rule_list **rule_list,
- uint32_t *n_rules,
- uint32_t *line_number,
- char *out,
- size_t out_size);
-
-static void
-cmd_pipeline_table_rule_add_bulk(char **tokens,
- uint32_t n_tokens,
- char *out,
- size_t out_size)
-{
- struct table_rule_list *list = NULL;
- char *pipeline_name, *file_name;
- uint32_t table_id, n_rules, n_rules_added, n_rules_not_added, line_number;
- int status;
-
- if (n_tokens != 8) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return;
- }
-
- pipeline_name = tokens[1];
-
- if (strcmp(tokens[2], "table") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "table");
- return;
- }
-
- if (parser_read_uint32(&table_id, tokens[3]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
- return;
- }
-
- if (strcmp(tokens[4], "rule") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "rule");
- return;
- }
-
- if (strcmp(tokens[5], "add") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "add");
- return;
- }
-
- if (strcmp(tokens[6], "bulk") != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "bulk");
- return;
- }
-
- file_name = tokens[7];
-
- /* Load rules from file. */
- status = cli_rule_file_process(file_name,
- 1024,
- &list,
- &n_rules,
- &line_number,
- out,
- out_size);
- if (status) {
- snprintf(out, out_size, MSG_FILE_ERR, file_name, line_number);
- return;
- }
-
- /* Rule bulk add */
- status = pipeline_table_rule_add_bulk(pipeline_name,
- table_id,
- list,
- &n_rules_added,
- &n_rules_not_added);
- if (status) {
- snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
- return;
- }
-
- snprintf(out, out_size, "Added %u rules out of %u.\n",
- n_rules_added,
- n_rules);
-}
-
-
-static const char cmd_pipeline_table_rule_delete_help[] =
-"pipeline <pipeline_name> table <table_id> rule delete\n"
-" match <match>\n";
-
-static void
-cmd_pipeline_table_rule_delete(char **tokens,
- uint32_t n_tokens,
- char *out,
- size_t out_size)
-{
- struct table_rule_match m;
- char *pipeline_name;
- uint32_t table_id, n_tokens_parsed, t0;
- int status;
-
- if (n_tokens < 8) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return;
- }
-
- pipeline_name = tokens[1];
-
- if (strcmp(tokens[2], "table") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "table");
- return;
- }
-
- if (parser_read_uint32(&table_id, tokens[3]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
- return;
- }
-
- if (strcmp(tokens[4], "rule") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "rule");
- return;
- }
-
- if (strcmp(tokens[5], "delete") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "delete");
- return;
- }
-
- t0 = 6;
-
- /* match */
- n_tokens_parsed = parse_match(tokens + t0,
- n_tokens - t0,
- out,
- out_size,
- &m);
- if (n_tokens_parsed == 0)
- return;
- t0 += n_tokens_parsed;
-
- if (n_tokens != t0) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return;
- }
-
- status = pipeline_table_rule_delete(pipeline_name,
- table_id,
- &m);
- if (status) {
- snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
- return;
- }
-}
-
-
-static const char cmd_pipeline_table_rule_delete_default_help[] =
-"pipeline <pipeline_name> table <table_id> rule delete\n"
-" match\n"
-" default\n";
-
-static void
-cmd_pipeline_table_rule_delete_default(char **tokens,
- uint32_t n_tokens,
- char *out,
- size_t out_size)
-{
- char *pipeline_name;
- uint32_t table_id;
- int status;
-
- if (n_tokens != 8) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return;
- }
-
- pipeline_name = tokens[1];
-
- if (strcmp(tokens[2], "table") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "table");
- return;
- }
-
- if (parser_read_uint32(&table_id, tokens[3]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
- return;
- }
-
- if (strcmp(tokens[4], "rule") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "rule");
- return;
- }
-
- if (strcmp(tokens[5], "delete") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "delete");
- return;
- }
-
- if (strcmp(tokens[6], "match") != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "match");
- return;
- }
-
- if (strcmp(tokens[7], "default") != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "default");
- return;
- }
-
- status = pipeline_table_rule_delete_default(pipeline_name,
- table_id);
- if (status) {
- snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
- return;
- }
-}
-
-static void
-ether_addr_show(FILE *f, struct rte_ether_addr *addr)
-{
- fprintf(f, RTE_ETHER_ADDR_PRT_FMT, RTE_ETHER_ADDR_BYTES(addr));
-}
-
-static void
-ipv4_addr_show(FILE *f, uint32_t addr)
-{
- fprintf(f, "%u.%u.%u.%u",
- addr >> 24,
- (addr >> 16) & 0xFF,
- (addr >> 8) & 0xFF,
- addr & 0xFF);
-}
-
-static void
-ipv6_addr_show(FILE *f, const struct rte_ipv6_addr *ip)
-{
- fprintf(f, RTE_IPV6_ADDR_FMT ":", RTE_IPV6_ADDR_SPLIT(ip));
-}
-
-static const char *
-policer_action_string(enum rte_table_action_policer action) {
- switch (action) {
- case RTE_TABLE_ACTION_POLICER_COLOR_GREEN: return "G";
- case RTE_TABLE_ACTION_POLICER_COLOR_YELLOW: return "Y";
- case RTE_TABLE_ACTION_POLICER_COLOR_RED: return "R";
- case RTE_TABLE_ACTION_POLICER_DROP: return "D";
- default: return "?";
- }
-}
-
-static int
-table_rule_show(const char *pipeline_name,
- uint32_t table_id,
- const char *file_name)
-{
- struct pipeline *pipeline;
- struct table *table;
- struct table_rule *rule;
- FILE *f = NULL;
- uint32_t i;
-
- /* Check input params. */
- if ((pipeline_name == NULL) ||
- (file_name == NULL))
- return -1;
-
- pipeline = pipeline_find(pipeline_name);
- if (pipeline == NULL || table_id >= pipeline->n_tables)
- return -1;
-
- table = &pipeline->table[table_id];
-
- /* Open file. */
- f = fopen(file_name, "w");
- if (f == NULL)
- return -1;
-
- /* Write table rules to file. */
- TAILQ_FOREACH(rule, &table->rules, node) {
- struct table_rule_match *m = &rule->match;
- struct table_rule_action *a = &rule->action;
-
- fprintf(f, "match ");
- switch (m->match_type) {
- case TABLE_ACL:
- fprintf(f, "acl priority %u ",
- m->match.acl.priority);
-
- fprintf(f, m->match.acl.ip_version ? "ipv4 " : "ipv6 ");
-
- if (m->match.acl.ip_version)
- ipv4_addr_show(f, m->match.acl.ipv4.sa);
- else
- ipv6_addr_show(f, &m->match.acl.ipv6.sa);
-
- fprintf(f, "%u", m->match.acl.sa_depth);
-
- if (m->match.acl.ip_version)
- ipv4_addr_show(f, m->match.acl.ipv4.da);
- else
- ipv6_addr_show(f, &m->match.acl.ipv6.da);
-
- fprintf(f, "%u", m->match.acl.da_depth);
-
- fprintf(f, "%u %u %u %u %u ",
- (uint32_t)m->match.acl.sp0,
- (uint32_t)m->match.acl.sp1,
- (uint32_t)m->match.acl.dp0,
- (uint32_t)m->match.acl.dp1,
- (uint32_t)m->match.acl.proto);
- break;
-
- case TABLE_ARRAY:
- fprintf(f, "array %u ",
- m->match.array.pos);
- break;
-
- case TABLE_HASH:
- fprintf(f, "hash raw ");
- for (i = 0; i < table->params.match.hash.key_size; i++)
- fprintf(f, "%02x", m->match.hash.key[i]);
- fprintf(f, " ");
- break;
-
- case TABLE_LPM:
- fprintf(f, "lpm ");
-
- fprintf(f, m->match.lpm.ip_version ? "ipv4 " : "ipv6 ");
-
- if (m->match.acl.ip_version)
- ipv4_addr_show(f, m->match.lpm.ipv4);
- else
- ipv6_addr_show(f, &m->match.lpm.ipv6);
-
- fprintf(f, "%u ",
- (uint32_t)m->match.lpm.depth);
- break;
-
- default:
- fprintf(f, "unknown ");
- }
-
- fprintf(f, "action ");
- if (a->action_mask & (1LLU << RTE_TABLE_ACTION_FWD)) {
- fprintf(f, "fwd ");
- switch (a->fwd.action) {
- case RTE_PIPELINE_ACTION_DROP:
- fprintf(f, "drop ");
- break;
-
- case RTE_PIPELINE_ACTION_PORT:
- fprintf(f, "port %u ", a->fwd.id);
- break;
-
- case RTE_PIPELINE_ACTION_PORT_META:
- fprintf(f, "meta ");
- break;
-
- case RTE_PIPELINE_ACTION_TABLE:
- default:
- fprintf(f, "table %u ", a->fwd.id);
- }
- }
-
- if (a->action_mask & (1LLU << RTE_TABLE_ACTION_LB)) {
- fprintf(f, "balance ");
- for (i = 0; i < RTE_DIM(a->lb.out); i++)
- fprintf(f, "%u ", a->lb.out[i]);
- }
-
- if (a->action_mask & (1LLU << RTE_TABLE_ACTION_MTR)) {
- fprintf(f, "mtr ");
- for (i = 0; i < RTE_TABLE_ACTION_TC_MAX; i++)
- if (a->mtr.tc_mask & (1 << i)) {
- struct rte_table_action_mtr_tc_params *p =
- &a->mtr.mtr[i];
- enum rte_table_action_policer ga =
- p->policer[RTE_COLOR_GREEN];
- enum rte_table_action_policer ya =
- p->policer[RTE_COLOR_YELLOW];
- enum rte_table_action_policer ra =
- p->policer[RTE_COLOR_RED];
-
- fprintf(f, "tc%u meter %u policer g %s y %s r %s ",
- i,
- a->mtr.mtr[i].meter_profile_id,
- policer_action_string(ga),
- policer_action_string(ya),
- policer_action_string(ra));
- }
- }
-
- if (a->action_mask & (1LLU << RTE_TABLE_ACTION_TM))
- fprintf(f, "tm subport %u pipe %u ",
- a->tm.subport_id,
- a->tm.pipe_id);
-
- if (a->action_mask & (1LLU << RTE_TABLE_ACTION_ENCAP)) {
- fprintf(f, "encap ");
- switch (a->encap.type) {
- case RTE_TABLE_ACTION_ENCAP_ETHER:
- fprintf(f, "ether ");
- ether_addr_show(f, &a->encap.ether.ether.da);
- fprintf(f, " ");
- ether_addr_show(f, &a->encap.ether.ether.sa);
- fprintf(f, " ");
- break;
-
- case RTE_TABLE_ACTION_ENCAP_VLAN:
- fprintf(f, "vlan ");
- ether_addr_show(f, &a->encap.vlan.ether.da);
- fprintf(f, " ");
- ether_addr_show(f, &a->encap.vlan.ether.sa);
- fprintf(f, " pcp %u dei %u vid %u ",
- a->encap.vlan.vlan.pcp,
- a->encap.vlan.vlan.dei,
- a->encap.vlan.vlan.vid);
- break;
-
- case RTE_TABLE_ACTION_ENCAP_QINQ:
- fprintf(f, "qinq ");
- ether_addr_show(f, &a->encap.qinq.ether.da);
- fprintf(f, " ");
- ether_addr_show(f, &a->encap.qinq.ether.sa);
- fprintf(f, " pcp %u dei %u vid %u pcp %u dei %u vid %u ",
- a->encap.qinq.svlan.pcp,
- a->encap.qinq.svlan.dei,
- a->encap.qinq.svlan.vid,
- a->encap.qinq.cvlan.pcp,
- a->encap.qinq.cvlan.dei,
- a->encap.qinq.cvlan.vid);
- break;
-
- case RTE_TABLE_ACTION_ENCAP_MPLS:
- fprintf(f, "mpls %s ", (a->encap.mpls.unicast) ?
- "unicast " : "multicast ");
- ether_addr_show(f, &a->encap.mpls.ether.da);
- fprintf(f, " ");
- ether_addr_show(f, &a->encap.mpls.ether.sa);
- fprintf(f, " ");
- for (i = 0; i < a->encap.mpls.mpls_count; i++) {
- struct rte_table_action_mpls_hdr *l =
- &a->encap.mpls.mpls[i];
-
- fprintf(f, "label%u %u %u %u ",
- i,
- l->label,
- l->tc,
- l->ttl);
- }
- break;
-
- case RTE_TABLE_ACTION_ENCAP_PPPOE:
- fprintf(f, "pppoe ");
- ether_addr_show(f, &a->encap.pppoe.ether.da);
- fprintf(f, " ");
- ether_addr_show(f, &a->encap.pppoe.ether.sa);
- fprintf(f, " %u ", a->encap.pppoe.pppoe.session_id);
- break;
-
- case RTE_TABLE_ACTION_ENCAP_VXLAN:
- fprintf(f, "vxlan ether ");
- ether_addr_show(f, &a->encap.vxlan.ether.da);
- fprintf(f, " ");
- ether_addr_show(f, &a->encap.vxlan.ether.sa);
- if (table->ap->params.encap.vxlan.vlan)
- fprintf(f, " vlan pcp %u dei %u vid %u ",
- a->encap.vxlan.vlan.pcp,
- a->encap.vxlan.vlan.dei,
- a->encap.vxlan.vlan.vid);
- if (table->ap->params.encap.vxlan.ip_version) {
- fprintf(f, " ipv4 ");
- ipv4_addr_show(f, a->encap.vxlan.ipv4.sa);
- fprintf(f, " ");
- ipv4_addr_show(f, a->encap.vxlan.ipv4.da);
- fprintf(f, " %u %u ",
- (uint32_t)a->encap.vxlan.ipv4.dscp,
- (uint32_t)a->encap.vxlan.ipv4.ttl);
- } else {
- fprintf(f, " ipv6 ");
- ipv6_addr_show(f, &a->encap.vxlan.ipv6.sa);
- fprintf(f, " ");
- ipv6_addr_show(f, &a->encap.vxlan.ipv6.da);
- fprintf(f, " %u %u %u ",
- a->encap.vxlan.ipv6.flow_label,
- (uint32_t)a->encap.vxlan.ipv6.dscp,
- (uint32_t)a->encap.vxlan.ipv6.hop_limit);
- fprintf(f, " udp %u %u vxlan %u ",
- a->encap.vxlan.udp.sp,
- a->encap.vxlan.udp.dp,
- a->encap.vxlan.vxlan.vni);
- }
- break;
-
- default:
- fprintf(f, "unknown ");
- }
- }
-
- if (a->action_mask & (1LLU << RTE_TABLE_ACTION_NAT)) {
- fprintf(f, "nat %s ", (a->nat.ip_version) ? "ipv4 " : "ipv6 ");
- if (a->nat.ip_version)
- ipv4_addr_show(f, a->nat.addr.ipv4);
- else
- ipv6_addr_show(f, &a->nat.addr.ipv6);
- fprintf(f, " %u ", (uint32_t)(a->nat.port));
- }
-
- if (a->action_mask & (1LLU << RTE_TABLE_ACTION_TTL))
- fprintf(f, "ttl %s ", (a->ttl.decrement) ? "dec" : "keep");
-
- if (a->action_mask & (1LLU << RTE_TABLE_ACTION_STATS))
- fprintf(f, "stats ");
-
- if (a->action_mask & (1LLU << RTE_TABLE_ACTION_TIME))
- fprintf(f, "time ");
-
- if (a->action_mask & (1LLU << RTE_TABLE_ACTION_SYM_CRYPTO))
- fprintf(f, "sym_crypto ");
-
- if (a->action_mask & (1LLU << RTE_TABLE_ACTION_TAG))
- fprintf(f, "tag %u ", a->tag.tag);
-
- if (a->action_mask & (1LLU << RTE_TABLE_ACTION_DECAP))
- fprintf(f, "decap %u ", a->decap.n);
-
- /* end */
- fprintf(f, "\n");
- }
-
- /* Write table default rule to file. */
- if (table->rule_default) {
- struct table_rule_action *a = &table->rule_default->action;
-
- fprintf(f, "# match default action fwd ");
-
- switch (a->fwd.action) {
- case RTE_PIPELINE_ACTION_DROP:
- fprintf(f, "drop ");
- break;
-
- case RTE_PIPELINE_ACTION_PORT:
- fprintf(f, "port %u ", a->fwd.id);
- break;
-
- case RTE_PIPELINE_ACTION_PORT_META:
- fprintf(f, "meta ");
- break;
-
- case RTE_PIPELINE_ACTION_TABLE:
- default:
- fprintf(f, "table %u ", a->fwd.id);
- }
- } else
- fprintf(f, "# match default action fwd drop ");
-
- fprintf(f, "\n");
-
- /* Close file. */
- fclose(f);
-
- return 0;
-}
-
-static const char cmd_pipeline_table_rule_show_help[] =
-"pipeline <pipeline_name> table <table_id> rule show\n"
-" file <file_name>\n";
-
-static void
-cmd_pipeline_table_rule_show(char **tokens,
- uint32_t n_tokens,
- char *out,
- size_t out_size)
-{
- char *file_name = NULL, *pipeline_name;
- uint32_t table_id;
- int status;
-
- if (n_tokens != 8) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return;
- }
-
- pipeline_name = tokens[1];
-
- if (strcmp(tokens[2], "table") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "table");
- return;
- }
-
- if (parser_read_uint32(&table_id, tokens[3]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
- return;
- }
-
- if (strcmp(tokens[4], "rule") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "rule");
- return;
- }
-
- if (strcmp(tokens[5], "show") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "show");
- return;
- }
-
- if (strcmp(tokens[6], "file") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "file");
- return;
- }
-
- file_name = tokens[7];
-
- status = table_rule_show(pipeline_name, table_id, file_name);
- if (status) {
- snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
- return;
- }
-}
-
-static const char cmd_pipeline_table_rule_stats_read_help[] =
-"pipeline <pipeline_name> table <table_id> rule read stats [clear]\n"
-" match <match>\n";
-
-static void
-cmd_pipeline_table_rule_stats_read(char **tokens,
- uint32_t n_tokens,
- char *out,
- size_t out_size)
-{
- struct table_rule_match m;
- struct rte_table_action_stats_counters stats;
- char *pipeline_name;
- uint32_t table_id, n_tokens_parsed;
- int clear = 0, status;
-
- if (n_tokens < 7) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return;
- }
-
- pipeline_name = tokens[1];
-
- if (strcmp(tokens[2], "table") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "table");
- return;
- }
-
- if (parser_read_uint32(&table_id, tokens[3]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
- return;
- }
-
- if (strcmp(tokens[4], "rule") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "rule");
- return;
- }
-
- if (strcmp(tokens[5], "read") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "read");
- return;
- }
-
- if (strcmp(tokens[6], "stats") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "stats");
- return;
- }
-
- n_tokens -= 7;
- tokens += 7;
-
- /* clear */
- if (n_tokens && (strcmp(tokens[0], "clear") == 0)) {
- clear = 1;
-
- n_tokens--;
- tokens++;
- }
-
- /* match */
- if ((n_tokens == 0) || strcmp(tokens[0], "match")) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "match");
- return;
- }
-
- n_tokens_parsed = parse_match(tokens,
- n_tokens,
- out,
- out_size,
- &m);
- if (n_tokens_parsed == 0)
- return;
- n_tokens -= n_tokens_parsed;
- tokens += n_tokens_parsed;
-
- /* end */
- if (n_tokens) {
- snprintf(out, out_size, MSG_ARG_INVALID, tokens[0]);
- return;
- }
-
- /* Read table rule stats. */
- status = pipeline_table_rule_stats_read(pipeline_name,
- table_id,
- &m,
- &stats,
- clear);
- if (status) {
- snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
- return;
- }
-
- /* Print stats. */
- if (stats.n_packets_valid && stats.n_bytes_valid)
- snprintf(out, out_size, "Packets: %" PRIu64 "; Bytes: %" PRIu64 "\n",
- stats.n_packets,
- stats.n_bytes);
-
- if (stats.n_packets_valid && !stats.n_bytes_valid)
- snprintf(out, out_size, "Packets: %" PRIu64 "; Bytes: N/A\n",
- stats.n_packets);
-
- if (!stats.n_packets_valid && stats.n_bytes_valid)
- snprintf(out, out_size, "Packets: N/A; Bytes: %" PRIu64 "\n",
- stats.n_bytes);
-
- if (!stats.n_packets_valid && !stats.n_bytes_valid)
- snprintf(out, out_size, "Packets: N/A ; Bytes: N/A\n");
-}
-
-static const char cmd_pipeline_table_meter_profile_add_help[] =
-"pipeline <pipeline_name> table <table_id> meter profile <meter_profile_id>\n"
-" add srtcm cir <cir> cbs <cbs> ebs <ebs>\n"
-" | trtcm cir <cir> pir <pir> cbs <cbs> pbs <pbs>\n";
-
-static void
-cmd_pipeline_table_meter_profile_add(char **tokens,
- uint32_t n_tokens,
- char *out,
- size_t out_size)
-{
- struct rte_table_action_meter_profile p;
- char *pipeline_name;
- uint32_t table_id, meter_profile_id;
- int status;
-
- if (n_tokens < 9) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return;
- }
-
- pipeline_name = tokens[1];
-
- if (strcmp(tokens[2], "table") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
- return;
- }
-
- if (parser_read_uint32(&table_id, tokens[3]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
- return;
- }
-
- if (strcmp(tokens[4], "meter") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "meter");
- return;
- }
-
- if (strcmp(tokens[5], "profile") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "profile");
- return;
- }
-
- if (parser_read_uint32(&meter_profile_id, tokens[6]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "meter_profile_id");
- return;
- }
-
- if (strcmp(tokens[7], "add") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "add");
- return;
- }
-
- if (strcmp(tokens[8], "srtcm") == 0) {
- if (n_tokens != 15) {
- snprintf(out, out_size, MSG_ARG_MISMATCH,
- tokens[0]);
- return;
- }
-
- p.alg = RTE_TABLE_ACTION_METER_SRTCM;
-
- if (strcmp(tokens[9], "cir") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "cir");
- return;
- }
-
- if (parser_read_uint64(&p.srtcm.cir, tokens[10]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "cir");
- return;
- }
-
- if (strcmp(tokens[11], "cbs") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "cbs");
- return;
- }
-
- if (parser_read_uint64(&p.srtcm.cbs, tokens[12]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "cbs");
- return;
- }
-
- if (strcmp(tokens[13], "ebs") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "ebs");
- return;
- }
-
- if (parser_read_uint64(&p.srtcm.ebs, tokens[14]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "ebs");
- return;
- }
- } else if (strcmp(tokens[8], "trtcm") == 0) {
- if (n_tokens != 17) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return;
- }
-
- p.alg = RTE_TABLE_ACTION_METER_TRTCM;
-
- if (strcmp(tokens[9], "cir") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "cir");
- return;
- }
-
- if (parser_read_uint64(&p.trtcm.cir, tokens[10]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "cir");
- return;
- }
-
- if (strcmp(tokens[11], "pir") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "pir");
- return;
- }
-
- if (parser_read_uint64(&p.trtcm.pir, tokens[12]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "pir");
- return;
- }
- if (strcmp(tokens[13], "cbs") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "cbs");
- return;
- }
-
- if (parser_read_uint64(&p.trtcm.cbs, tokens[14]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "cbs");
- return;
- }
-
- if (strcmp(tokens[15], "pbs") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "pbs");
- return;
- }
-
- if (parser_read_uint64(&p.trtcm.pbs, tokens[16]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "pbs");
- return;
- }
- } else {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return;
- }
-
- status = pipeline_table_mtr_profile_add(pipeline_name,
- table_id,
- meter_profile_id,
- &p);
- if (status) {
- snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
- return;
- }
-}
-
-
-static const char cmd_pipeline_table_meter_profile_delete_help[] =
-"pipeline <pipeline_name> table <table_id>\n"
-" meter profile <meter_profile_id> delete\n";
-
-static void
-cmd_pipeline_table_meter_profile_delete(char **tokens,
- uint32_t n_tokens,
- char *out,
- size_t out_size)
-{
- char *pipeline_name;
- uint32_t table_id, meter_profile_id;
- int status;
-
- if (n_tokens != 8) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return;
- }
-
- pipeline_name = tokens[1];
-
- if (strcmp(tokens[2], "table") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
- return;
- }
-
- if (parser_read_uint32(&table_id, tokens[3]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
- return;
- }
-
- if (strcmp(tokens[4], "meter") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "meter");
- return;
- }
-
- if (strcmp(tokens[5], "profile") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "profile");
- return;
- }
-
- if (parser_read_uint32(&meter_profile_id, tokens[6]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "meter_profile_id");
- return;
- }
-
- if (strcmp(tokens[7], "delete") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "delete");
- return;
- }
-
- status = pipeline_table_mtr_profile_delete(pipeline_name,
- table_id,
- meter_profile_id);
- if (status) {
- snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
- return;
- }
-}
-
-
-static const char cmd_pipeline_table_rule_meter_read_help[] =
-"pipeline <pipeline_name> table <table_id> rule read meter [clear]\n"
-" match <match>\n";
-
-static void
-cmd_pipeline_table_rule_meter_read(char **tokens,
- uint32_t n_tokens,
- char *out,
- size_t out_size)
-{
- struct table_rule_match m;
- struct rte_table_action_mtr_counters stats;
- char *pipeline_name;
- uint32_t table_id, n_tokens_parsed;
- int clear = 0, status;
-
- if (n_tokens < 7) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return;
- }
-
- pipeline_name = tokens[1];
-
- if (strcmp(tokens[2], "table") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "table");
- return;
- }
-
- if (parser_read_uint32(&table_id, tokens[3]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
- return;
- }
-
- if (strcmp(tokens[4], "rule") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "rule");
- return;
- }
-
- if (strcmp(tokens[5], "read") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "read");
- return;
- }
-
- if (strcmp(tokens[6], "meter") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "meter");
- return;
- }
-
- n_tokens -= 7;
- tokens += 7;
-
- /* clear */
- if (n_tokens && (strcmp(tokens[0], "clear") == 0)) {
- clear = 1;
-
- n_tokens--;
- tokens++;
- }
-
- /* match */
- if ((n_tokens == 0) || strcmp(tokens[0], "match")) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "match");
- return;
- }
-
- n_tokens_parsed = parse_match(tokens,
- n_tokens,
- out,
- out_size,
- &m);
- if (n_tokens_parsed == 0)
- return;
- n_tokens -= n_tokens_parsed;
- tokens += n_tokens_parsed;
-
- /* end */
- if (n_tokens) {
- snprintf(out, out_size, MSG_ARG_INVALID, tokens[0]);
- return;
- }
-
- /* Read table rule meter stats. */
- status = pipeline_table_rule_mtr_read(pipeline_name,
- table_id,
- &m,
- &stats,
- clear);
- if (status) {
- snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
- return;
- }
-
- /* Print stats. */
-}
-
-
-static const char cmd_pipeline_table_dscp_help[] =
-"pipeline <pipeline_name> table <table_id> dscp <file_name>\n"
-"\n"
-" File <file_name>:\n"
-" - exactly 64 lines\n"
-" - line format: <tc_id> <tc_queue_id> <color>, with <color> as: g | y | r\n";
-
-static int
-load_dscp_table(struct rte_table_action_dscp_table *dscp_table,
- const char *file_name,
- uint32_t *line_number)
-{
- FILE *f = NULL;
- uint32_t dscp, l;
-
- /* Check input arguments */
- if ((dscp_table == NULL) ||
- (file_name == NULL) ||
- (line_number == NULL)) {
- if (line_number)
- *line_number = 0;
- return -EINVAL;
- }
-
- /* Open input file */
- f = fopen(file_name, "r");
- if (f == NULL) {
- *line_number = 0;
- return -EINVAL;
- }
-
- /* Read file */
- for (dscp = 0, l = 1; ; l++) {
- char line[64];
- char *tokens[3];
- enum rte_color color;
- uint32_t tc_id, tc_queue_id, n_tokens = RTE_DIM(tokens);
-
- if (fgets(line, sizeof(line), f) == NULL)
- break;
-
- if (is_comment(line))
- continue;
-
- if (parse_tokenize_string(line, tokens, &n_tokens)) {
- *line_number = l;
- fclose(f);
- return -EINVAL;
- }
-
- if (n_tokens == 0)
- continue;
-
- if ((dscp >= RTE_DIM(dscp_table->entry)) ||
- (n_tokens != RTE_DIM(tokens)) ||
- parser_read_uint32(&tc_id, tokens[0]) ||
- (tc_id >= RTE_TABLE_ACTION_TC_MAX) ||
- parser_read_uint32(&tc_queue_id, tokens[1]) ||
- (tc_queue_id >= RTE_TABLE_ACTION_TC_QUEUE_MAX) ||
- (strlen(tokens[2]) != 1)) {
- *line_number = l;
- fclose(f);
- return -EINVAL;
- }
-
- switch (tokens[2][0]) {
- case 'g':
- case 'G':
- color = RTE_COLOR_GREEN;
- break;
-
- case 'y':
- case 'Y':
- color = RTE_COLOR_YELLOW;
- break;
-
- case 'r':
- case 'R':
- color = RTE_COLOR_RED;
- break;
-
- default:
- *line_number = l;
- fclose(f);
- return -EINVAL;
- }
-
- dscp_table->entry[dscp].tc_id = tc_id;
- dscp_table->entry[dscp].tc_queue_id = tc_queue_id;
- dscp_table->entry[dscp].color = color;
- dscp++;
- }
-
- /* Close file */
- fclose(f);
- return 0;
-}
-
-static void
-cmd_pipeline_table_dscp(char **tokens,
- uint32_t n_tokens,
- char *out,
- size_t out_size)
-{
- struct rte_table_action_dscp_table dscp_table;
- char *pipeline_name, *file_name;
- uint32_t table_id, line_number;
- int status;
-
- if (n_tokens != 6) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return;
- }
-
- pipeline_name = tokens[1];
-
- if (strcmp(tokens[2], "table") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "port");
- return;
- }
-
- if (parser_read_uint32(&table_id, tokens[3]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
- return;
- }
-
- if (strcmp(tokens[4], "dscp") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "dscp");
- return;
- }
-
- file_name = tokens[5];
-
- status = load_dscp_table(&dscp_table, file_name, &line_number);
- if (status) {
- snprintf(out, out_size, MSG_FILE_ERR, file_name, line_number);
- return;
- }
-
- status = pipeline_table_dscp_table_update(pipeline_name,
- table_id,
- UINT64_MAX,
- &dscp_table);
- if (status) {
- snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
- return;
- }
-}
-
-
-static const char cmd_pipeline_table_rule_ttl_read_help[] =
-"pipeline <pipeline_name> table <table_id> rule read ttl [clear]\n"
-" match <match>\n";
-
-static void
-cmd_pipeline_table_rule_ttl_read(char **tokens,
- uint32_t n_tokens,
- char *out,
- size_t out_size)
-{
- struct table_rule_match m;
- struct rte_table_action_ttl_counters stats;
- char *pipeline_name;
- uint32_t table_id, n_tokens_parsed;
- int clear = 0, status;
-
- if (n_tokens < 7) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return;
- }
-
- pipeline_name = tokens[1];
-
- if (strcmp(tokens[2], "table") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "table");
- return;
- }
-
- if (parser_read_uint32(&table_id, tokens[3]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
- return;
- }
-
- if (strcmp(tokens[4], "rule") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "rule");
- return;
- }
-
- if (strcmp(tokens[5], "read") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "read");
- return;
- }
-
- if (strcmp(tokens[6], "ttl") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "ttl");
- return;
- }
-
- n_tokens -= 7;
- tokens += 7;
-
- /* clear */
- if (n_tokens && (strcmp(tokens[0], "clear") == 0)) {
- clear = 1;
-
- n_tokens--;
- tokens++;
- }
-
- /* match */
- if ((n_tokens == 0) || strcmp(tokens[0], "match")) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "match");
- return;
- }
-
- n_tokens_parsed = parse_match(tokens,
- n_tokens,
- out,
- out_size,
- &m);
- if (n_tokens_parsed == 0)
- return;
- n_tokens -= n_tokens_parsed;
- tokens += n_tokens_parsed;
-
- /* end */
- if (n_tokens) {
- snprintf(out, out_size, MSG_ARG_INVALID, tokens[0]);
- return;
- }
-
- /* Read table rule TTL stats. */
- status = pipeline_table_rule_ttl_read(pipeline_name,
- table_id,
- &m,
- &stats,
- clear);
- if (status) {
- snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
- return;
- }
-
- /* Print stats. */
- snprintf(out, out_size, "Packets: %" PRIu64 "\n",
- stats.n_packets);
-}
-
-static const char cmd_pipeline_table_rule_time_read_help[] =
-"pipeline <pipeline_name> table <table_id> rule read time\n"
-" match <match>\n";
-
-static void
-cmd_pipeline_table_rule_time_read(char **tokens,
- uint32_t n_tokens,
- char *out,
- size_t out_size)
-{
- struct table_rule_match m;
- char *pipeline_name;
- uint64_t timestamp;
- uint32_t table_id, n_tokens_parsed;
- int status;
-
- if (n_tokens < 7) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return;
- }
-
- pipeline_name = tokens[1];
-
- if (strcmp(tokens[2], "table") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "table");
- return;
- }
-
- if (parser_read_uint32(&table_id, tokens[3]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
- return;
- }
-
- if (strcmp(tokens[4], "rule") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "rule");
- return;
- }
-
- if (strcmp(tokens[5], "read") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "read");
- return;
- }
-
- if (strcmp(tokens[6], "time") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "time");
- return;
- }
-
- n_tokens -= 7;
- tokens += 7;
-
- /* match */
- if ((n_tokens == 0) || strcmp(tokens[0], "match")) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "match");
- return;
- }
-
- n_tokens_parsed = parse_match(tokens,
- n_tokens,
- out,
- out_size,
- &m);
- if (n_tokens_parsed == 0)
- return;
- n_tokens -= n_tokens_parsed;
- tokens += n_tokens_parsed;
-
- /* end */
- if (n_tokens) {
- snprintf(out, out_size, MSG_ARG_INVALID, tokens[0]);
- return;
- }
-
- /* Read table rule timestamp. */
- status = pipeline_table_rule_time_read(pipeline_name,
- table_id,
- &m,
- ×tamp);
- if (status) {
- snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
- return;
- }
-
- /* Print stats. */
- snprintf(out, out_size, "Packets: %" PRIu64 "\n", timestamp);
-}
-
-static const char cmd_thread_pipeline_enable_help[] =
-"thread <thread_id> pipeline <pipeline_name> enable\n";
-
-static void
-cmd_thread_pipeline_enable(char **tokens,
- uint32_t n_tokens,
- char *out,
- size_t out_size)
-{
- char *pipeline_name;
- uint32_t thread_id;
- int status;
-
- if (n_tokens != 5) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return;
- }
-
- if (parser_read_uint32(&thread_id, tokens[1]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "thread_id");
- return;
- }
-
- if (strcmp(tokens[2], "pipeline") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "pipeline");
- return;
- }
-
- pipeline_name = tokens[3];
-
- if (strcmp(tokens[4], "enable") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "enable");
- return;
- }
-
- status = thread_pipeline_enable(thread_id, pipeline_name);
- if (status) {
- snprintf(out, out_size, MSG_CMD_FAIL, "thread pipeline enable");
- return;
- }
-}
-
-
-static const char cmd_thread_pipeline_disable_help[] =
-"thread <thread_id> pipeline <pipeline_name> disable\n";
-
-static void
-cmd_thread_pipeline_disable(char **tokens,
- uint32_t n_tokens,
- char *out,
- size_t out_size)
-{
- char *pipeline_name;
- uint32_t thread_id;
- int status;
-
- if (n_tokens != 5) {
- snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
- return;
- }
-
- if (parser_read_uint32(&thread_id, tokens[1]) != 0) {
- snprintf(out, out_size, MSG_ARG_INVALID, "thread_id");
- return;
- }
-
- if (strcmp(tokens[2], "pipeline") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "pipeline");
- return;
- }
-
- pipeline_name = tokens[3];
-
- if (strcmp(tokens[4], "disable") != 0) {
- snprintf(out, out_size, MSG_ARG_NOT_FOUND, "disable");
- return;
- }
-
- status = thread_pipeline_disable(thread_id, pipeline_name);
- if (status) {
- snprintf(out, out_size, MSG_CMD_FAIL,
- "thread pipeline disable");
- return;
- }
-}
-
-static void
-cmd_help(char **tokens, uint32_t n_tokens, char *out, size_t out_size)
-{
- tokens++;
- n_tokens--;
-
- if (n_tokens == 0) {
- snprintf(out, out_size,
- "Type 'help <command>' for details on each command.\n\n"
- "List of commands:\n"
- "\tmempool\n"
- "\tlink\n"
- "\tswq\n"
- "\ttmgr subport profile\n"
- "\ttmgr pipe profile\n"
- "\ttmgr\n"
- "\ttmgr subport\n"
- "\ttmgr subport pipe\n"
- "\ttap\n"
- "\tport in action profile\n"
- "\ttable action profile\n"
- "\tpipeline\n"
- "\tpipeline port in\n"
- "\tpipeline port out\n"
- "\tpipeline table\n"
- "\tpipeline port in table\n"
- "\tpipeline port in stats\n"
- "\tpipeline port in enable\n"
- "\tpipeline port in disable\n"
- "\tpipeline port out stats\n"
- "\tpipeline table stats\n"
- "\tpipeline table rule add\n"
- "\tpipeline table rule add default\n"
- "\tpipeline table rule add bulk\n"
- "\tpipeline table rule delete\n"
- "\tpipeline table rule delete default\n"
- "\tpipeline table rule show\n"
- "\tpipeline table rule stats read\n"
- "\tpipeline table meter profile add\n"
- "\tpipeline table meter profile delete\n"
- "\tpipeline table rule meter read\n"
- "\tpipeline table dscp\n"
- "\tpipeline table rule ttl read\n"
- "\tpipeline table rule time read\n"
- "\tthread pipeline enable\n"
- "\tthread pipeline disable\n\n");
- return;
- }
-
- if (strcmp(tokens[0], "mempool") == 0) {
- snprintf(out, out_size, "\n%s\n", cmd_mempool_help);
- return;
- }
-
- if (strcmp(tokens[0], "link") == 0) {
- snprintf(out, out_size, "\n%s\n", cmd_link_help);
- return;
- }
-
- if (strcmp(tokens[0], "swq") == 0) {
- snprintf(out, out_size, "\n%s\n", cmd_swq_help);
- return;
- }
-
- if (strcmp(tokens[0], "tmgr") == 0) {
- if (n_tokens == 1) {
- snprintf(out, out_size, "\n%s\n", cmd_tmgr_help);
- return;
- }
-
- if ((n_tokens == 2) &&
- (strcmp(tokens[1], "subport")) == 0) {
- snprintf(out, out_size, "\n%s\n", cmd_tmgr_subport_help);
- return;
- }
-
- if ((n_tokens == 3) &&
- (strcmp(tokens[1], "subport") == 0) &&
- (strcmp(tokens[2], "profile") == 0)) {
- snprintf(out, out_size, "\n%s\n",
- cmd_tmgr_subport_profile_help);
- return;
- }
-
- if ((n_tokens == 3) &&
- (strcmp(tokens[1], "subport") == 0) &&
- (strcmp(tokens[2], "pipe") == 0)) {
- snprintf(out, out_size, "\n%s\n", cmd_tmgr_subport_pipe_help);
- return;
- }
-
- if ((n_tokens == 3) &&
- (strcmp(tokens[1], "pipe") == 0) &&
- (strcmp(tokens[2], "profile") == 0)) {
- snprintf(out, out_size, "\n%s\n", cmd_tmgr_pipe_profile_help);
- return;
- }
- }
-
- if (strcmp(tokens[0], "tap") == 0) {
- snprintf(out, out_size, "\n%s\n", cmd_tap_help);
- return;
- }
-
- if (strcmp(tokens[0], "cryptodev") == 0) {
- snprintf(out, out_size, "\n%s\n", cmd_cryptodev_help);
- return;
- }
-
- if ((n_tokens == 4) &&
- (strcmp(tokens[0], "port") == 0) &&
- (strcmp(tokens[1], "in") == 0) &&
- (strcmp(tokens[2], "action") == 0) &&
- (strcmp(tokens[3], "profile") == 0)) {
- snprintf(out, out_size, "\n%s\n", cmd_port_in_action_profile_help);
- return;
- }
-
- if ((n_tokens == 3) &&
- (strcmp(tokens[0], "table") == 0) &&
- (strcmp(tokens[1], "action") == 0) &&
- (strcmp(tokens[2], "profile") == 0)) {
- snprintf(out, out_size, "\n%s\n", cmd_table_action_profile_help);
- return;
- }
-
- if ((strcmp(tokens[0], "pipeline") == 0) && (n_tokens == 1)) {
- snprintf(out, out_size, "\n%s\n", cmd_pipeline_help);
- return;
- }
-
- if ((strcmp(tokens[0], "pipeline") == 0) &&
- (strcmp(tokens[1], "port") == 0)) {
- if ((n_tokens == 3) && (strcmp(tokens[2], "in")) == 0) {
- snprintf(out, out_size, "\n%s\n", cmd_pipeline_port_in_help);
- return;
- }
-
- if ((n_tokens == 3) && (strcmp(tokens[2], "out")) == 0) {
- snprintf(out, out_size, "\n%s\n", cmd_pipeline_port_out_help);
- return;
- }
-
- if ((n_tokens == 4) &&
- (strcmp(tokens[2], "in") == 0) &&
- (strcmp(tokens[3], "table") == 0)) {
- snprintf(out, out_size, "\n%s\n",
- cmd_pipeline_port_in_table_help);
- return;
- }
-
- if ((n_tokens == 4) &&
- (strcmp(tokens[2], "in") == 0) &&
- (strcmp(tokens[3], "stats") == 0)) {
- snprintf(out, out_size, "\n%s\n",
- cmd_pipeline_port_in_stats_help);
- return;
- }
-
- if ((n_tokens == 4) &&
- (strcmp(tokens[2], "in") == 0) &&
- (strcmp(tokens[3], "enable") == 0)) {
- snprintf(out, out_size, "\n%s\n",
- cmd_pipeline_port_in_enable_help);
- return;
- }
-
- if ((n_tokens == 4) &&
- (strcmp(tokens[2], "in") == 0) &&
- (strcmp(tokens[3], "disable") == 0)) {
- snprintf(out, out_size, "\n%s\n",
- cmd_pipeline_port_in_disable_help);
- return;
- }
-
- if ((n_tokens == 4) &&
- (strcmp(tokens[2], "out") == 0) &&
- (strcmp(tokens[3], "stats") == 0)) {
- snprintf(out, out_size, "\n%s\n",
- cmd_pipeline_port_out_stats_help);
- return;
- }
- }
-
- if ((strcmp(tokens[0], "pipeline") == 0) &&
- (strcmp(tokens[1], "table") == 0)) {
- if (n_tokens == 2) {
- snprintf(out, out_size, "\n%s\n", cmd_pipeline_table_help);
- return;
- }
-
- if ((n_tokens == 3) && strcmp(tokens[2], "stats") == 0) {
- snprintf(out, out_size, "\n%s\n",
- cmd_pipeline_table_stats_help);
- return;
- }
-
- if ((n_tokens == 3) && strcmp(tokens[2], "dscp") == 0) {
- snprintf(out, out_size, "\n%s\n",
- cmd_pipeline_table_dscp_help);
- return;
- }
-
- if ((n_tokens == 4) &&
- (strcmp(tokens[2], "rule") == 0) &&
- (strcmp(tokens[3], "add") == 0)) {
- snprintf(out, out_size, "\n%s\n",
- cmd_pipeline_table_rule_add_help);
- return;
- }
-
- if ((n_tokens == 5) &&
- (strcmp(tokens[2], "rule") == 0) &&
- (strcmp(tokens[3], "add") == 0) &&
- (strcmp(tokens[4], "default") == 0)) {
- snprintf(out, out_size, "\n%s\n",
- cmd_pipeline_table_rule_add_default_help);
- return;
- }
-
- if ((n_tokens == 5) &&
- (strcmp(tokens[2], "rule") == 0) &&
- (strcmp(tokens[3], "add") == 0) &&
- (strcmp(tokens[4], "bulk") == 0)) {
- snprintf(out, out_size, "\n%s\n",
- cmd_pipeline_table_rule_add_bulk_help);
- return;
- }
-
- if ((n_tokens == 4) &&
- (strcmp(tokens[2], "rule") == 0) &&
- (strcmp(tokens[3], "delete") == 0)) {
- snprintf(out, out_size, "\n%s\n",
- cmd_pipeline_table_rule_delete_help);
- return;
- }
-
- if ((n_tokens == 5) &&
- (strcmp(tokens[2], "rule") == 0) &&
- (strcmp(tokens[3], "delete") == 0) &&
- (strcmp(tokens[4], "default") == 0)) {
- snprintf(out, out_size, "\n%s\n",
- cmd_pipeline_table_rule_delete_default_help);
- return;
- }
-
- if ((n_tokens == 4) &&
- (strcmp(tokens[2], "rule") == 0) &&
- (strcmp(tokens[3], "show") == 0)) {
- snprintf(out, out_size, "\n%s\n",
- cmd_pipeline_table_rule_show_help);
- return;
- }
-
- if ((n_tokens == 5) &&
- (strcmp(tokens[2], "rule") == 0) &&
- (strcmp(tokens[3], "stats") == 0) &&
- (strcmp(tokens[4], "read") == 0)) {
- snprintf(out, out_size, "\n%s\n",
- cmd_pipeline_table_rule_stats_read_help);
- return;
- }
-
- if ((n_tokens == 5) &&
- (strcmp(tokens[2], "meter") == 0) &&
- (strcmp(tokens[3], "profile") == 0) &&
- (strcmp(tokens[4], "add") == 0)) {
- snprintf(out, out_size, "\n%s\n",
- cmd_pipeline_table_meter_profile_add_help);
- return;
- }
-
- if ((n_tokens == 5) &&
- (strcmp(tokens[2], "meter") == 0) &&
- (strcmp(tokens[3], "profile") == 0) &&
- (strcmp(tokens[4], "delete") == 0)) {
- snprintf(out, out_size, "\n%s\n",
- cmd_pipeline_table_meter_profile_delete_help);
- return;
- }
-
- if ((n_tokens == 5) &&
- (strcmp(tokens[2], "rule") == 0) &&
- (strcmp(tokens[3], "meter") == 0) &&
- (strcmp(tokens[4], "read") == 0)) {
- snprintf(out, out_size, "\n%s\n",
- cmd_pipeline_table_rule_meter_read_help);
- return;
- }
-
- if ((n_tokens == 5) &&
- (strcmp(tokens[2], "rule") == 0) &&
- (strcmp(tokens[3], "ttl") == 0) &&
- (strcmp(tokens[4], "read") == 0)) {
- snprintf(out, out_size, "\n%s\n",
- cmd_pipeline_table_rule_ttl_read_help);
- return;
- }
-
- if ((n_tokens == 5) &&
- (strcmp(tokens[2], "rule") == 0) &&
- (strcmp(tokens[3], "time") == 0) &&
- (strcmp(tokens[4], "read") == 0)) {
- snprintf(out, out_size, "\n%s\n",
- cmd_pipeline_table_rule_time_read_help);
- return;
- }
- }
-
- if ((n_tokens == 3) &&
- (strcmp(tokens[0], "thread") == 0) &&
- (strcmp(tokens[1], "pipeline") == 0)) {
- if (strcmp(tokens[2], "enable") == 0) {
- snprintf(out, out_size, "\n%s\n",
- cmd_thread_pipeline_enable_help);
- return;
- }
-
- if (strcmp(tokens[2], "disable") == 0) {
- snprintf(out, out_size, "\n%s\n",
- cmd_thread_pipeline_disable_help);
- return;
- }
- }
-
- snprintf(out, out_size, "Invalid command\n");
-}
-
-void
-cli_process(char *in, char *out, size_t out_size)
-{
- char *tokens[CMD_MAX_TOKENS];
- uint32_t n_tokens = RTE_DIM(tokens);
- int status;
-
- if (is_comment(in))
- return;
-
- status = parse_tokenize_string(in, tokens, &n_tokens);
- if (status) {
- snprintf(out, out_size, MSG_ARG_TOO_MANY, "");
- return;
- }
-
- if (n_tokens == 0)
- return;
-
- if (strcmp(tokens[0], "help") == 0) {
- cmd_help(tokens, n_tokens, out, out_size);
- return;
- }
-
- if (strcmp(tokens[0], "mempool") == 0) {
- cmd_mempool(tokens, n_tokens, out, out_size);
- return;
- }
-
- if (strcmp(tokens[0], "link") == 0) {
- if (strcmp(tokens[1], "show") == 0) {
- cmd_link_show(tokens, n_tokens, out, out_size);
- return;
- }
-
- cmd_link(tokens, n_tokens, out, out_size);
- return;
- }
-
- if (strcmp(tokens[0], "swq") == 0) {
- cmd_swq(tokens, n_tokens, out, out_size);
- return;
- }
-
- if (strcmp(tokens[0], "tmgr") == 0) {
- if ((n_tokens >= 3) &&
- (strcmp(tokens[1], "subport") == 0) &&
- (strcmp(tokens[2], "profile") == 0)) {
- cmd_tmgr_subport_profile(tokens, n_tokens,
- out, out_size);
- return;
- }
-
- if ((n_tokens >= 3) &&
- (strcmp(tokens[1], "pipe") == 0) &&
- (strcmp(tokens[2], "profile") == 0)) {
- cmd_tmgr_pipe_profile(tokens, n_tokens, out, out_size);
- return;
- }
-
- if ((n_tokens >= 5) &&
- (strcmp(tokens[2], "subport") == 0) &&
- (strcmp(tokens[4], "profile") == 0)) {
- cmd_tmgr_subport(tokens, n_tokens, out, out_size);
- return;
- }
-
- if ((n_tokens >= 5) &&
- (strcmp(tokens[2], "subport") == 0) &&
- (strcmp(tokens[4], "pipe") == 0)) {
- cmd_tmgr_subport_pipe(tokens, n_tokens, out, out_size);
- return;
- }
-
- cmd_tmgr(tokens, n_tokens, out, out_size);
- return;
- }
-
- if (strcmp(tokens[0], "tap") == 0) {
- cmd_tap(tokens, n_tokens, out, out_size);
- return;
- }
-
- if (strcmp(tokens[0], "cryptodev") == 0) {
- cmd_cryptodev(tokens, n_tokens, out, out_size);
- return;
- }
-
- if (strcmp(tokens[0], "port") == 0) {
- cmd_port_in_action_profile(tokens, n_tokens, out, out_size);
- return;
- }
-
- if (strcmp(tokens[0], "table") == 0) {
- cmd_table_action_profile(tokens, n_tokens, out, out_size);
- return;
- }
-
- if (strcmp(tokens[0], "pipeline") == 0) {
- if ((n_tokens >= 3) &&
- (strcmp(tokens[2], "period") == 0)) {
- cmd_pipeline(tokens, n_tokens, out, out_size);
- return;
- }
-
- if ((n_tokens >= 5) &&
- (strcmp(tokens[2], "port") == 0) &&
- (strcmp(tokens[3], "in") == 0) &&
- (strcmp(tokens[4], "bsz") == 0)) {
- cmd_pipeline_port_in(tokens, n_tokens, out, out_size);
- return;
- }
-
- if ((n_tokens >= 5) &&
- (strcmp(tokens[2], "port") == 0) &&
- (strcmp(tokens[3], "out") == 0) &&
- (strcmp(tokens[4], "bsz") == 0)) {
- cmd_pipeline_port_out(tokens, n_tokens, out, out_size);
- return;
- }
-
- if ((n_tokens >= 4) &&
- (strcmp(tokens[2], "table") == 0) &&
- (strcmp(tokens[3], "match") == 0)) {
- cmd_pipeline_table(tokens, n_tokens, out, out_size);
- return;
- }
-
- if ((n_tokens >= 6) &&
- (strcmp(tokens[2], "port") == 0) &&
- (strcmp(tokens[3], "in") == 0) &&
- (strcmp(tokens[5], "table") == 0)) {
- cmd_pipeline_port_in_table(tokens, n_tokens,
- out, out_size);
- return;
- }
-
- if ((n_tokens >= 6) &&
- (strcmp(tokens[2], "port") == 0) &&
- (strcmp(tokens[3], "in") == 0) &&
- (strcmp(tokens[5], "stats") == 0)) {
- cmd_pipeline_port_in_stats(tokens, n_tokens,
- out, out_size);
- return;
- }
-
- if ((n_tokens >= 6) &&
- (strcmp(tokens[2], "port") == 0) &&
- (strcmp(tokens[3], "in") == 0) &&
- (strcmp(tokens[5], "enable") == 0)) {
- cmd_pipeline_port_in_enable(tokens, n_tokens,
- out, out_size);
- return;
- }
-
- if ((n_tokens >= 6) &&
- (strcmp(tokens[2], "port") == 0) &&
- (strcmp(tokens[3], "in") == 0) &&
- (strcmp(tokens[5], "disable") == 0)) {
- cmd_pipeline_port_in_disable(tokens, n_tokens,
- out, out_size);
- return;
- }
-
- if ((n_tokens >= 6) &&
- (strcmp(tokens[2], "port") == 0) &&
- (strcmp(tokens[3], "out") == 0) &&
- (strcmp(tokens[5], "stats") == 0)) {
- cmd_pipeline_port_out_stats(tokens, n_tokens,
- out, out_size);
- return;
- }
-
- if ((n_tokens >= 5) &&
- (strcmp(tokens[2], "table") == 0) &&
- (strcmp(tokens[4], "stats") == 0)) {
- cmd_pipeline_table_stats(tokens, n_tokens,
- out, out_size);
- return;
- }
-
- if ((n_tokens >= 7) &&
- (strcmp(tokens[2], "table") == 0) &&
- (strcmp(tokens[4], "rule") == 0) &&
- (strcmp(tokens[5], "add") == 0) &&
- (strcmp(tokens[6], "match") == 0)) {
- if ((n_tokens >= 8) &&
- (strcmp(tokens[7], "default") == 0)) {
- cmd_pipeline_table_rule_add_default(tokens,
- n_tokens, out, out_size);
- return;
- }
-
- cmd_pipeline_table_rule_add(tokens, n_tokens,
- out, out_size);
- return;
- }
-
- if ((n_tokens >= 7) &&
- (strcmp(tokens[2], "table") == 0) &&
- (strcmp(tokens[4], "rule") == 0) &&
- (strcmp(tokens[5], "add") == 0) &&
- (strcmp(tokens[6], "bulk") == 0)) {
- cmd_pipeline_table_rule_add_bulk(tokens,
- n_tokens, out, out_size);
- return;
- }
-
- if ((n_tokens >= 7) &&
- (strcmp(tokens[2], "table") == 0) &&
- (strcmp(tokens[4], "rule") == 0) &&
- (strcmp(tokens[5], "delete") == 0) &&
- (strcmp(tokens[6], "match") == 0)) {
- if ((n_tokens >= 8) &&
- (strcmp(tokens[7], "default") == 0)) {
- cmd_pipeline_table_rule_delete_default(tokens,
- n_tokens, out, out_size);
- return;
- }
-
- cmd_pipeline_table_rule_delete(tokens, n_tokens,
- out, out_size);
- return;
- }
-
- if ((n_tokens >= 6) &&
- (strcmp(tokens[2], "table") == 0) &&
- (strcmp(tokens[4], "rule") == 0) &&
- (strcmp(tokens[5], "show") == 0)) {
- cmd_pipeline_table_rule_show(tokens, n_tokens,
- out, out_size);
- return;
- }
-
- if ((n_tokens >= 7) &&
- (strcmp(tokens[2], "table") == 0) &&
- (strcmp(tokens[4], "rule") == 0) &&
- (strcmp(tokens[5], "read") == 0) &&
- (strcmp(tokens[6], "stats") == 0)) {
- cmd_pipeline_table_rule_stats_read(tokens, n_tokens,
- out, out_size);
- return;
- }
-
- if ((n_tokens >= 8) &&
- (strcmp(tokens[2], "table") == 0) &&
- (strcmp(tokens[4], "meter") == 0) &&
- (strcmp(tokens[5], "profile") == 0) &&
- (strcmp(tokens[7], "add") == 0)) {
- cmd_pipeline_table_meter_profile_add(tokens, n_tokens,
- out, out_size);
- return;
- }
-
- if ((n_tokens >= 8) &&
- (strcmp(tokens[2], "table") == 0) &&
- (strcmp(tokens[4], "meter") == 0) &&
- (strcmp(tokens[5], "profile") == 0) &&
- (strcmp(tokens[7], "delete") == 0)) {
- cmd_pipeline_table_meter_profile_delete(tokens,
- n_tokens, out, out_size);
- return;
- }
-
- if ((n_tokens >= 7) &&
- (strcmp(tokens[2], "table") == 0) &&
- (strcmp(tokens[4], "rule") == 0) &&
- (strcmp(tokens[5], "read") == 0) &&
- (strcmp(tokens[6], "meter") == 0)) {
- cmd_pipeline_table_rule_meter_read(tokens, n_tokens,
- out, out_size);
- return;
- }
-
- if ((n_tokens >= 5) &&
- (strcmp(tokens[2], "table") == 0) &&
- (strcmp(tokens[4], "dscp") == 0)) {
- cmd_pipeline_table_dscp(tokens, n_tokens,
- out, out_size);
- return;
- }
-
- if ((n_tokens >= 7) &&
- (strcmp(tokens[2], "table") == 0) &&
- (strcmp(tokens[4], "rule") == 0) &&
- (strcmp(tokens[5], "read") == 0) &&
- (strcmp(tokens[6], "ttl") == 0)) {
- cmd_pipeline_table_rule_ttl_read(tokens, n_tokens,
- out, out_size);
- return;
- }
-
- if ((n_tokens >= 7) &&
- (strcmp(tokens[2], "table") == 0) &&
- (strcmp(tokens[4], "rule") == 0) &&
- (strcmp(tokens[5], "read") == 0) &&
- (strcmp(tokens[6], "time") == 0)) {
- cmd_pipeline_table_rule_time_read(tokens, n_tokens,
- out, out_size);
- return;
- }
- }
-
- if (strcmp(tokens[0], "thread") == 0) {
- if ((n_tokens >= 5) &&
- (strcmp(tokens[4], "enable") == 0)) {
- cmd_thread_pipeline_enable(tokens, n_tokens,
- out, out_size);
- return;
- }
-
- if ((n_tokens >= 5) &&
- (strcmp(tokens[4], "disable") == 0)) {
- cmd_thread_pipeline_disable(tokens, n_tokens,
- out, out_size);
- return;
- }
- }
-
- snprintf(out, out_size, MSG_CMD_UNKNOWN, tokens[0]);
-}
-
-int
-cli_script_process(const char *file_name,
- size_t msg_in_len_max,
- size_t msg_out_len_max)
-{
- char *msg_in = NULL, *msg_out = NULL;
- FILE *f = NULL;
-
- /* Check input arguments */
- if ((file_name == NULL) ||
- (strlen(file_name) == 0) ||
- (msg_in_len_max == 0) ||
- (msg_out_len_max == 0))
- return -EINVAL;
-
- msg_in = malloc(msg_in_len_max + 1);
- msg_out = malloc(msg_out_len_max + 1);
- if ((msg_in == NULL) ||
- (msg_out == NULL)) {
- free(msg_out);
- free(msg_in);
- return -ENOMEM;
- }
-
- /* Open input file */
- f = fopen(file_name, "r");
- if (f == NULL) {
- free(msg_out);
- free(msg_in);
- return -EIO;
- }
-
- /* Read file */
- for ( ; ; ) {
- if (fgets(msg_in, msg_in_len_max + 1, f) == NULL)
- break;
-
- printf("%s", msg_in);
- msg_out[0] = 0;
-
- cli_process(msg_in,
- msg_out,
- msg_out_len_max);
-
- if (strlen(msg_out))
- printf("%s", msg_out);
- }
-
- /* Close file */
- fclose(f);
- free(msg_out);
- free(msg_in);
- return 0;
-}
-
-static int
-cli_rule_file_process(const char *file_name,
- size_t line_len_max,
- struct table_rule_list **rule_list,
- uint32_t *n_rules,
- uint32_t *line_number,
- char *out,
- size_t out_size)
-{
- struct table_rule_list *list = NULL;
- char *line = NULL;
- FILE *f = NULL;
- uint32_t rule_id = 0, line_id = 0;
- int status = 0;
-
- /* Check input arguments */
- if ((file_name == NULL) ||
- (strlen(file_name) == 0) ||
- (line_len_max == 0) ||
- (rule_list == NULL) ||
- (n_rules == NULL) ||
- (line_number == NULL) ||
- (out == NULL)) {
- status = -EINVAL;
- goto cli_rule_file_process_free;
- }
-
- /* Memory allocation */
- list = malloc(sizeof(struct table_rule_list));
- if (list == NULL) {
- status = -ENOMEM;
- goto cli_rule_file_process_free;
- }
-
- TAILQ_INIT(list);
-
- line = malloc(line_len_max + 1);
- if (line == NULL) {
- status = -ENOMEM;
- goto cli_rule_file_process_free;
- }
-
- /* Open file */
- f = fopen(file_name, "r");
- if (f == NULL) {
- status = -EIO;
- goto cli_rule_file_process_free;
- }
-
- /* Read file */
- for (line_id = 1, rule_id = 0; ; line_id++) {
- char *tokens[CMD_MAX_TOKENS];
- struct table_rule *rule = NULL;
- uint32_t n_tokens, n_tokens_parsed, t0;
-
- /* Read next line from file. */
- if (fgets(line, line_len_max + 1, f) == NULL)
- break;
-
- /* Comment. */
- if (is_comment(line))
- continue;
-
- /* Parse line. */
- n_tokens = RTE_DIM(tokens);
- status = parse_tokenize_string(line, tokens, &n_tokens);
- if (status) {
- status = -EINVAL;
- goto cli_rule_file_process_free;
- }
-
- /* Empty line. */
- if (n_tokens == 0)
- continue;
- t0 = 0;
-
- /* Rule alloc and insert. */
- rule = calloc(1, sizeof(struct table_rule));
- if (rule == NULL) {
- status = -ENOMEM;
- goto cli_rule_file_process_free;
- }
-
- TAILQ_INSERT_TAIL(list, rule, node);
-
- /* Rule match. */
- n_tokens_parsed = parse_match(tokens + t0,
- n_tokens - t0,
- out,
- out_size,
- &rule->match);
- if (n_tokens_parsed == 0) {
- status = -EINVAL;
- goto cli_rule_file_process_free;
- }
- t0 += n_tokens_parsed;
-
- /* Rule action. */
- n_tokens_parsed = parse_table_action(tokens + t0,
- n_tokens - t0,
- out,
- out_size,
- &rule->action);
- if (n_tokens_parsed == 0) {
- status = -EINVAL;
- goto cli_rule_file_process_free;
- }
- t0 += n_tokens_parsed;
-
- /* Line completed. */
- if (t0 < n_tokens) {
- status = -EINVAL;
- goto cli_rule_file_process_free;
- }
-
- /* Increment rule count */
- rule_id++;
- }
-
- /* Close file */
- fclose(f);
-
- /* Memory free */
- free(line);
-
- *rule_list = list;
- *n_rules = rule_id;
- *line_number = line_id;
- return 0;
-
-cli_rule_file_process_free:
- if (rule_list != NULL)
- *rule_list = NULL;
-
- if (n_rules != NULL)
- *n_rules = rule_id;
-
- if (line_number != NULL)
- *line_number = line_id;
-
- 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);
- free(line);
- free(list);
-
- return status;
-}
diff --git a/examples/ip_pipeline/cli.h b/examples/ip_pipeline/cli.h
deleted file mode 100644
index 992e4c3a4a..0000000000
--- a/examples/ip_pipeline/cli.h
+++ /dev/null
@@ -1,18 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2018 Intel Corporation
- */
-
-#ifndef __INCLUDE_CLI_H__
-#define __INCLUDE_CLI_H__
-
-#include <stddef.h>
-
-void
-cli_process(char *in, char *out, size_t out_size);
-
-int
-cli_script_process(const char *file_name,
- size_t msg_in_len_max,
- size_t msg_out_len_max);
-
-#endif
diff --git a/examples/ip_pipeline/common.h b/examples/ip_pipeline/common.h
deleted file mode 100644
index 0886dfbe95..0000000000
--- a/examples/ip_pipeline/common.h
+++ /dev/null
@@ -1,12 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2018 Intel Corporation
- */
-
-#ifndef _INCLUDE_COMMON_H_
-#define _INCLUDE_COMMON_H_
-
-#ifndef NAME_SIZE
-#define NAME_SIZE 64
-#endif
-
-#endif /* _INCLUDE_COMMON_H_ */
diff --git a/examples/ip_pipeline/conn.c b/examples/ip_pipeline/conn.c
deleted file mode 100644
index b2406b7af1..0000000000
--- a/examples/ip_pipeline/conn.c
+++ /dev/null
@@ -1,330 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2018 Intel Corporation
- */
-
-#include <string.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <sys/types.h>
-
-#include <sys/socket.h>
-
-#include <sys/epoll.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <errno.h>
-
-#include <rte_string_fns.h>
-
-#include "conn.h"
-
-#define MSG_CMD_TOO_LONG "Command too long."
-
-struct conn {
- char *welcome;
- char *prompt;
- char *buf;
- char *msg_in;
- char *msg_out;
- size_t buf_size;
- size_t msg_in_len_max;
- size_t msg_out_len_max;
- size_t msg_in_len;
- int fd_server;
- int fd_client_group;
- conn_msg_handle_t msg_handle;
-};
-
-struct conn *
-conn_init(struct conn_params *p)
-{
- struct sockaddr_in server_address;
- struct conn *conn;
- int fd_server, fd_client_group, status;
-
- memset(&server_address, 0, sizeof(server_address));
-
- /* Check input arguments */
- if ((p == NULL) ||
- (p->welcome == NULL) ||
- (p->prompt == NULL) ||
- (p->addr == NULL) ||
- (p->buf_size == 0) ||
- (p->msg_in_len_max == 0) ||
- (p->msg_out_len_max == 0) ||
- (p->msg_handle == NULL))
- return NULL;
-
- status = inet_aton(p->addr, &server_address.sin_addr);
- if (status == 0)
- return NULL;
-
- /* Memory allocation */
- conn = calloc(1, sizeof(struct conn));
- if (conn == NULL)
- return NULL;
-
- conn->welcome = calloc(1, CONN_WELCOME_LEN_MAX + 1);
- conn->prompt = calloc(1, CONN_PROMPT_LEN_MAX + 1);
- conn->buf = calloc(1, p->buf_size);
- conn->msg_in = calloc(1, p->msg_in_len_max + 1);
- conn->msg_out = calloc(1, p->msg_out_len_max + 1);
-
- if ((conn->welcome == NULL) ||
- (conn->prompt == NULL) ||
- (conn->buf == NULL) ||
- (conn->msg_in == NULL) ||
- (conn->msg_out == NULL)) {
- conn_free(conn);
- return NULL;
- }
-
- /* Server socket */
- server_address.sin_family = AF_INET;
- server_address.sin_port = htons(p->port);
-
- fd_server = socket(AF_INET,
- SOCK_STREAM | SOCK_NONBLOCK,
- 0);
- if (fd_server == -1) {
- conn_free(conn);
- return NULL;
- }
-
- status = bind(fd_server,
- (struct sockaddr *) &server_address,
- sizeof(server_address));
- if (status == -1) {
- conn_free(conn);
- close(fd_server);
- return NULL;
- }
-
- status = listen(fd_server, 16);
- if (status == -1) {
- conn_free(conn);
- close(fd_server);
- return NULL;
- }
-
- /* Client group */
- fd_client_group = epoll_create(1);
- if (fd_client_group == -1) {
- conn_free(conn);
- close(fd_server);
- return NULL;
- }
-
- /* Fill in */
- strlcpy(conn->welcome, p->welcome, CONN_WELCOME_LEN_MAX + 1);
- strlcpy(conn->prompt, p->prompt, CONN_PROMPT_LEN_MAX + 1);
- conn->buf_size = p->buf_size;
- conn->msg_in_len_max = p->msg_in_len_max;
- conn->msg_out_len_max = p->msg_out_len_max;
- conn->msg_in_len = 0;
- conn->fd_server = fd_server;
- conn->fd_client_group = fd_client_group;
- conn->msg_handle = p->msg_handle;
-
- return conn;
-}
-
-void
-conn_free(struct conn *conn)
-{
- if (conn == NULL)
- return;
-
- if (conn->fd_client_group)
- close(conn->fd_client_group);
-
- if (conn->fd_server)
- close(conn->fd_server);
-
- free(conn->msg_out);
- free(conn->msg_in);
- free(conn->prompt);
- free(conn->welcome);
- free(conn);
-}
-
-int
-conn_poll_for_conn(struct conn *conn)
-{
- struct sockaddr_in client_address;
- struct epoll_event event;
- socklen_t client_address_length;
- int fd_client, status;
-
- /* Check input arguments */
- if (conn == NULL)
- return -1;
-
- /* Server socket */
- client_address_length = sizeof(client_address);
- fd_client = accept4(conn->fd_server,
- (struct sockaddr *) &client_address,
- &client_address_length,
- SOCK_NONBLOCK);
- if (fd_client == -1) {
- if ((errno == EAGAIN) || (errno == EWOULDBLOCK))
- return 0;
-
- return -1;
- }
-
- /* Client group */
- event.events = EPOLLIN | EPOLLRDHUP | EPOLLHUP;
- event.data.fd = fd_client;
-
- status = epoll_ctl(conn->fd_client_group,
- EPOLL_CTL_ADD,
- fd_client,
- &event);
- if (status == -1) {
- close(fd_client);
- return -1;
- }
-
- /* Client */
- status = write(fd_client,
- conn->welcome,
- strlen(conn->welcome));
- if (status == -1) {
- close(fd_client);
- return -1;
- }
-
- status = write(fd_client,
- conn->prompt,
- strlen(conn->prompt));
- if (status == -1) {
- close(fd_client);
- return -1;
- }
-
- return 0;
-}
-
-static int
-data_event_handle(struct conn *conn,
- int fd_client)
-{
- ssize_t len, i, status;
-
- /* Read input message */
-
- len = read(fd_client,
- conn->buf,
- conn->buf_size);
- if (len == -1) {
- if ((errno == EAGAIN) || (errno == EWOULDBLOCK))
- return 0;
-
- return -1;
- }
- if (len == 0)
- return 0;
-
- /* Handle input messages */
- for (i = 0; i < len; i++) {
- if (conn->buf[i] == '\n') {
- size_t n;
-
- conn->msg_in[conn->msg_in_len] = 0;
- conn->msg_out[0] = 0;
-
- conn->msg_handle(conn->msg_in,
- conn->msg_out,
- conn->msg_out_len_max);
-
- n = strlen(conn->msg_out);
- if (n) {
- status = write(fd_client,
- conn->msg_out,
- n);
- if (status == -1)
- return status;
- }
-
- conn->msg_in_len = 0;
- } else if (conn->msg_in_len < conn->msg_in_len_max) {
- conn->msg_in[conn->msg_in_len] = conn->buf[i];
- conn->msg_in_len++;
- } else {
- status = write(fd_client,
- MSG_CMD_TOO_LONG,
- strlen(MSG_CMD_TOO_LONG));
- if (status == -1)
- return status;
-
- conn->msg_in_len = 0;
- }
- }
-
- /* Write prompt */
- status = write(fd_client,
- conn->prompt,
- strlen(conn->prompt));
- if (status == -1)
- return status;
-
- return 0;
-}
-
-static int
-control_event_handle(struct conn *conn,
- int fd_client)
-{
- int status;
-
- status = epoll_ctl(conn->fd_client_group,
- EPOLL_CTL_DEL,
- fd_client,
- NULL);
- if (status == -1)
- return -1;
-
- status = close(fd_client);
- if (status == -1)
- return -1;
-
- return 0;
-}
-
-int
-conn_poll_for_msg(struct conn *conn)
-{
- struct epoll_event event;
- int fd_client, status, status_data = 0, status_control = 0;
-
- /* Check input arguments */
- if (conn == NULL)
- return -1;
-
- /* Client group */
- status = epoll_wait(conn->fd_client_group,
- &event,
- 1,
- 0);
- if (status == -1)
- return -1;
- if (status == 0)
- return 0;
-
- fd_client = event.data.fd;
-
- /* Data available */
- if (event.events & EPOLLIN)
- status_data = data_event_handle(conn, fd_client);
-
- /* Control events */
- if (event.events & (EPOLLRDHUP | EPOLLERR | EPOLLHUP))
- status_control = control_event_handle(conn, fd_client);
-
- if (status_data || status_control)
- return -1;
-
- return 0;
-}
diff --git a/examples/ip_pipeline/conn.h b/examples/ip_pipeline/conn.h
deleted file mode 100644
index 46f9f95e9c..0000000000
--- a/examples/ip_pipeline/conn.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2018 Intel Corporation
- */
-
-#ifndef __INCLUDE_CONN_H__
-#define __INCLUDE_CONN_H__
-
-#include <stdint.h>
-
-struct conn;
-
-#ifndef CONN_WELCOME_LEN_MAX
-#define CONN_WELCOME_LEN_MAX 1024
-#endif
-
-#ifndef CONN_PROMPT_LEN_MAX
-#define CONN_PROMPT_LEN_MAX 16
-#endif
-
-typedef void (*conn_msg_handle_t)(char *msg_in,
- char *msg_out,
- size_t msg_out_len_max);
-
-struct conn_params {
- const char *welcome;
- const char *prompt;
- const char *addr;
- uint16_t port;
- size_t buf_size;
- size_t msg_in_len_max;
- size_t msg_out_len_max;
- conn_msg_handle_t msg_handle;
-};
-
-struct conn *
-conn_init(struct conn_params *p);
-
-void
-conn_free(struct conn *conn);
-
-int
-conn_poll_for_conn(struct conn *conn);
-
-int
-conn_poll_for_msg(struct conn *conn);
-
-#endif
diff --git a/examples/ip_pipeline/cryptodev.c b/examples/ip_pipeline/cryptodev.c
deleted file mode 100644
index cd0f9c3d4e..0000000000
--- a/examples/ip_pipeline/cryptodev.c
+++ /dev/null
@@ -1,160 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2018 Intel Corporation
- */
-
-#include <stdlib.h>
-#include <stdio.h>
-
-#include <rte_cryptodev.h>
-#include <rte_string_fns.h>
-
-#include "cryptodev.h"
-
-#define PIPELINE_CRYPTO_SESSION_CACHE_SIZE 128
-
-static struct cryptodev_list cryptodev_list;
-
-int
-cryptodev_init(void)
-{
- TAILQ_INIT(&cryptodev_list);
-
- return 0;
-}
-
-struct cryptodev *
-cryptodev_find(const char *name)
-{
- struct cryptodev *cryptodev;
-
- if (name == NULL)
- return NULL;
-
- TAILQ_FOREACH(cryptodev, &cryptodev_list, node)
- if (strcmp(cryptodev->name, name) == 0)
- return cryptodev;
-
- return NULL;
-}
-
-struct cryptodev *
-cryptodev_next(struct cryptodev *cryptodev)
-{
- return (cryptodev == NULL) ?
- TAILQ_FIRST(&cryptodev_list) :
- TAILQ_NEXT(cryptodev, node);
-}
-
-struct cryptodev *
-cryptodev_create(const char *name, struct cryptodev_params *params)
-{
- struct rte_cryptodev_info dev_info;
- struct rte_cryptodev_config dev_conf;
- struct rte_cryptodev_qp_conf queue_conf;
- struct cryptodev *cryptodev;
- uint32_t dev_id, i;
- uint32_t socket_id;
- uint32_t cache_size;
- char mp_name[NAME_SIZE];
- int status;
-
- /* Check input params */
- if ((name == NULL) ||
- cryptodev_find(name) ||
- (params->n_queues == 0) ||
- (params->queue_size == 0) ||
- (params->session_pool_size == 0))
- return NULL;
-
- if (params->dev_name) {
- status = rte_cryptodev_get_dev_id(params->dev_name);
- if (status == -1)
- return NULL;
-
- dev_id = (uint32_t)status;
- } else {
- if (rte_cryptodev_is_valid_dev(params->dev_id) == 0)
- return NULL;
-
- dev_id = params->dev_id;
- }
-
- cache_size = (params->session_pool_size / 2 <
- PIPELINE_CRYPTO_SESSION_CACHE_SIZE) ?
- (params->session_pool_size / 2) :
- PIPELINE_CRYPTO_SESSION_CACHE_SIZE;
-
- socket_id = rte_cryptodev_socket_id(dev_id);
- rte_cryptodev_info_get(dev_id, &dev_info);
-
- if (dev_info.max_nb_queue_pairs < params->n_queues)
- return NULL;
-
- dev_conf.socket_id = socket_id;
- dev_conf.nb_queue_pairs = params->n_queues;
- dev_conf.ff_disable = 0;
-
- status = rte_cryptodev_configure(dev_id, &dev_conf);
- if (status < 0)
- return NULL;
-
- queue_conf.nb_descriptors = params->queue_size;
- for (i = 0; i < params->n_queues; i++) {
- status = rte_cryptodev_queue_pair_setup(dev_id, i,
- &queue_conf, socket_id);
- if (status < 0)
- return NULL;
- }
-
- if (rte_cryptodev_start(dev_id) < 0)
- return NULL;
-
- cryptodev = calloc(1, sizeof(struct cryptodev));
- if (cryptodev == NULL) {
- rte_cryptodev_stop(dev_id);
- return NULL;
- }
-
- strlcpy(cryptodev->name, name, sizeof(cryptodev->name));
- cryptodev->dev_id = dev_id;
- cryptodev->n_queues = params->n_queues;
-
- snprintf(mp_name, NAME_SIZE, "%s_mp%u", name, dev_id);
- cryptodev->mp_create = rte_cryptodev_sym_session_pool_create(
- mp_name,
- params->session_pool_size,
- 0,
- cache_size,
- 0,
- socket_id);
- if (!cryptodev->mp_create)
- goto error_exit;
-
- snprintf(mp_name, NAME_SIZE, "%s_mp_priv%u", name, dev_id);
- cryptodev->mp_init = rte_mempool_create(
- NULL,
- params->session_pool_size,
- rte_cryptodev_sym_get_private_session_size(dev_id),
- cache_size,
- 0,
- NULL,
- NULL,
- NULL,
- NULL,
- socket_id,
- 0);
- if (!cryptodev->mp_init)
- goto error_exit;
-
- TAILQ_INSERT_TAIL(&cryptodev_list, cryptodev, node);
-
- return cryptodev;
-
-error_exit:
- rte_mempool_free(cryptodev->mp_create);
- rte_mempool_free(cryptodev->mp_init);
-
- free(cryptodev);
-
- return NULL;
-}
diff --git a/examples/ip_pipeline/cryptodev.h b/examples/ip_pipeline/cryptodev.h
deleted file mode 100644
index d00434379e..0000000000
--- a/examples/ip_pipeline/cryptodev.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2018 Intel Corporation
- */
-
-#ifndef _INCLUDE_SYM_C_H_
-#define _INCLUDE_SYM_C_H_
-
-#include <stdint.h>
-#include <sys/queue.h>
-
-#include <rte_cryptodev.h>
-
-#include "common.h"
-
-struct cryptodev {
- TAILQ_ENTRY(cryptodev) node;
- char name[NAME_SIZE];
- uint16_t dev_id;
- uint32_t n_queues;
- struct rte_mempool *mp_create;
- struct rte_mempool *mp_init;
-};
-
-TAILQ_HEAD(cryptodev_list, cryptodev);
-
-int
-cryptodev_init(void);
-
-struct cryptodev *
-cryptodev_find(const char *name);
-
-struct cryptodev *
-cryptodev_next(struct cryptodev *cryptodev);
-
-struct cryptodev_params {
- const char *dev_name;
- uint32_t dev_id; /**< Valid only when *dev_name* is NULL. */
- uint32_t n_queues;
- uint32_t queue_size;
- uint32_t session_pool_size;
-};
-
-struct cryptodev *
-cryptodev_create(const char *name, struct cryptodev_params *params);
-
-#endif
diff --git a/examples/ip_pipeline/examples/firewall.cli b/examples/ip_pipeline/examples/firewall.cli
deleted file mode 100644
index 269256c161..0000000000
--- a/examples/ip_pipeline/examples/firewall.cli
+++ /dev/null
@@ -1,59 +0,0 @@
-; SPDX-License-Identifier: BSD-3-Clause
-; Copyright(c) 2010-2018 Intel Corporation
-
-; _______________
-; LINK0 RXQ0 --->| |---> LINK0 TXQ0
-; | |
-; LINK1 RXQ0 --->| |---> LINK1 TXQ0
-; | Firewall |
-; LINK2 RXQ0 --->| |---> LINK2 TXQ0
-; | |
-; LINK3 RXQ0 --->| |---> LINK3 TXQ0
-; |_______________|
-; |
-; -+-
-;
-; Input packet: Ethernet/IPv4
-;
-; Packet buffer layout:
-; # Field Name Offset (Bytes) Size (Bytes)
-; 0 Mbuf 0 128
-; 1 Headroom 128 128
-; 2 Ethernet header 256 14
-; 3 IPv4 header 270 20
-
-mempool MEMPOOL0 buffer 2304 pool 32K cache 256 cpu 0
-
-link LINK0 dev 0000:02:00.0 rxq 1 128 MEMPOOL0 txq 1 512 promiscuous on
-link LINK1 dev 0000:02:00.1 rxq 1 128 MEMPOOL0 txq 1 512 promiscuous on
-link LINK2 dev 0000:06:00.0 rxq 1 128 MEMPOOL0 txq 1 512 promiscuous on
-link LINK3 dev 0000:06:00.1 rxq 1 128 MEMPOOL0 txq 1 512 promiscuous on
-
-table action profile AP0 ipv4 offset 270 fwd
-
-pipeline PIPELINE0 period 10 offset_port_id 0 cpu 0
-
-pipeline PIPELINE0 port in bsz 32 link LINK0 rxq 0
-pipeline PIPELINE0 port in bsz 32 link LINK1 rxq 0
-pipeline PIPELINE0 port in bsz 32 link LINK2 rxq 0
-pipeline PIPELINE0 port in bsz 32 link LINK3 rxq 0
-
-pipeline PIPELINE0 port out bsz 32 link LINK0 txq 0
-pipeline PIPELINE0 port out bsz 32 link LINK1 txq 0
-pipeline PIPELINE0 port out bsz 32 link LINK2 txq 0
-pipeline PIPELINE0 port out bsz 32 link LINK3 txq 0
-
-pipeline PIPELINE0 table match acl ipv4 offset 270 size 4K action AP0
-
-pipeline PIPELINE0 port in 0 table 0
-pipeline PIPELINE0 port in 1 table 0
-pipeline PIPELINE0 port in 2 table 0
-pipeline PIPELINE0 port in 3 table 0
-
-thread 1 pipeline PIPELINE0 enable
-
-pipeline PIPELINE0 table 0 rule add match default action fwd drop
-pipeline PIPELINE0 table 0 rule add match acl priority 0 ipv4 0.0.0.0 0 100.0.0.0 10 0 65535 0 65535 6 action fwd port 0
-pipeline PIPELINE0 table 0 rule add match acl priority 0 ipv4 0.0.0.0 0 100.64.0.0 10 0 65535 0 65535 6 action fwd port 1
-pipeline PIPELINE0 table 0 rule add match acl priority 0 ipv4 0.0.0.0 0 100.128.0.0 10 0 65535 0 65535 6 action fwd port 2
-pipeline PIPELINE0 table 0 rule add match acl priority 0 ipv4 0.0.0.0 0 100.192.0.0 10 0 65535 0 65535 6 action fwd port 3
diff --git a/examples/ip_pipeline/examples/flow.cli b/examples/ip_pipeline/examples/flow.cli
deleted file mode 100644
index 426ff90255..0000000000
--- a/examples/ip_pipeline/examples/flow.cli
+++ /dev/null
@@ -1,60 +0,0 @@
-; SPDX-License-Identifier: BSD-3-Clause
-; Copyright(c) 2010-2018 Intel Corporation
-
-; ________________
-; LINK0 RXQ0 --->| |---> LINK0 TXQ0
-; | |
-; LINK1 RXQ0 --->| |---> LINK1 TXQ0
-; | Flow |
-; LINK2 RXQ0 --->| Classification |---> LINK2 TXQ0
-; | |
-; LINK3 RXQ0 --->| |---> LINK3 TXQ0
-; |________________|
-; |
-; +-----------> SINK0 (flow lookup miss)
-;
-; Input packet: Ethernet/IPv4
-;
-; Packet buffer layout:
-; # Field Name Offset (Bytes) Size (Bytes)
-; 0 Mbuf 0 128
-; 1 Headroom 128 128
-; 2 Ethernet header 256 14
-; 3 IPv4 header 270 20
-
-mempool MEMPOOL0 buffer 2304 pool 32K cache 256 cpu 0
-
-link LINK0 dev 0000:02:00.0 rxq 1 128 MEMPOOL0 txq 1 512 promiscuous on
-link LINK1 dev 0000:02:00.1 rxq 1 128 MEMPOOL0 txq 1 512 promiscuous on
-link LINK2 dev 0000:06:00.0 rxq 1 128 MEMPOOL0 txq 1 512 promiscuous on
-link LINK3 dev 0000:06:00.1 rxq 1 128 MEMPOOL0 txq 1 512 promiscuous on
-
-table action profile AP0 ipv4 offset 270 fwd
-
-pipeline PIPELINE0 period 10 offset_port_id 0 cpu 0
-
-pipeline PIPELINE0 port in bsz 32 link LINK0 rxq 0
-pipeline PIPELINE0 port in bsz 32 link LINK1 rxq 0
-pipeline PIPELINE0 port in bsz 32 link LINK2 rxq 0
-pipeline PIPELINE0 port in bsz 32 link LINK3 rxq 0
-
-pipeline PIPELINE0 port out bsz 32 link LINK0 txq 0
-pipeline PIPELINE0 port out bsz 32 link LINK1 txq 0
-pipeline PIPELINE0 port out bsz 32 link LINK2 txq 0
-pipeline PIPELINE0 port out bsz 32 link LINK3 txq 0
-pipeline PIPELINE0 port out bsz 32 sink
-
-pipeline PIPELINE0 table match hash ext key 16 mask 00FF0000FFFFFFFFFFFFFFFFFFFFFFFF offset 278 buckets 16K size 65K action AP0
-
-pipeline PIPELINE0 port in 0 table 0
-pipeline PIPELINE0 port in 1 table 0
-pipeline PIPELINE0 port in 2 table 0
-pipeline PIPELINE0 port in 3 table 0
-
-thread 1 pipeline PIPELINE0 enable
-
-pipeline PIPELINE0 table 0 rule add match default action fwd port 4
-pipeline PIPELINE0 table 0 rule add match hash ipv4_5tuple 100.0.0.10 200.0.0.10 100 200 6 action fwd port 0
-pipeline PIPELINE0 table 0 rule add match hash ipv4_5tuple 100.0.0.11 200.0.0.11 101 201 6 action fwd port 1
-pipeline PIPELINE0 table 0 rule add match hash ipv4_5tuple 100.0.0.12 200.0.0.12 102 202 6 action fwd port 2
-pipeline PIPELINE0 table 0 rule add match hash ipv4_5tuple 100.0.0.13 200.0.0.13 103 203 6 action fwd port 3
diff --git a/examples/ip_pipeline/examples/flow_crypto.cli b/examples/ip_pipeline/examples/flow_crypto.cli
deleted file mode 100644
index 849f9d5fec..0000000000
--- a/examples/ip_pipeline/examples/flow_crypto.cli
+++ /dev/null
@@ -1,57 +0,0 @@
-; SPDX-License-Identifier: BSD-3-Clause
-; Copyright(c) 2018 Intel Corporation
-
-; ________________
-; LINK0 RXQ0 --->| |---> CRYPTO0 TXQ0
-; | Flow |
-; CRYPTO0 RXQ0-->| Classification |---> LINK0 TXQ0
-; |________________|
-; |
-; +-----------> SINK0 (flow lookup miss)
-;
-; Input packet: Ethernet/IPv4
-;
-; Packet buffer layout:
-; # Field Name Offset (Bytes) Size (Bytes)
-; 0 Mbuf 0 128
-; 1 Headroom 128 128
-; 2 Ethernet header 256 14
-; 3 IPv4 header 280 20
-; 4 Packet 256 1536
-; 5 Crypto Operation 1792 160
-
-mempool MEMPOOL0 buffer 2304 pool 32K cache 256 cpu 1
-
-link LINK0 dev 81:00.0 rxq 1 128 MEMPOOL0 txq 1 512 promiscuous on
-
-#Cryptodev
-cryptodev CRYPTO0 dev crypto_aesni_gcm0 queue 1 1024 max_sessions 512
-
-table action profile AP0 ipv4 offset 270 fwd sym_crypto dev CRYPTO0 offset 1792
-table action profile AP1 ipv4 offset 270 fwd
-
-pipeline PIPELINE0 period 10 offset_port_id 0 cpu 1
-
-pipeline PIPELINE0 port in bsz 32 link LINK0 rxq 0
-pipeline PIPELINE0 port in bsz 32 cryptodev CRYPTO0 rxq 0
-
-pipeline PIPELINE0 port out bsz 32 cryptodev CRYPTO0 txq 0 offset 1792
-pipeline PIPELINE0 port out bsz 32 link LINK0 txq 0
-pipeline PIPELINE0 port out bsz 32 sink
-
-pipeline PIPELINE0 table match hash ext key 8 mask FFFFFFFF00000000 offset 282 buckets 1K size 4K action AP0
-pipeline PIPELINE0 table match stub action AP1
-
-pipeline PIPELINE0 port in 0 table 0
-pipeline PIPELINE0 port in 1 table 1
-
-thread 2 pipeline PIPELINE0 enable
-
-pipeline PIPELINE0 table 0 rule add match default action fwd port 2
-
-#AES-GCM encrypt
-pipeline PIPELINE0 table 0 rule add match hash ipv4_addr 100.0.0.10 action fwd port 0 sym_crypto encrypt type aead aead_algo aes-gcm aead_key 000102030405060708090a0b0c0d0e0f aead_iv 000102030405060708090a0b aead_aad 000102030405060708090a0b0c0d0e0f digest_size 8 data_offset 290
-#AES-GCM decrypt
-#pipeline PIPELINE0 table 0 rule add match hash ipv4_addr 100.0.0.10 action fwd port 0 sym_crypto decrypt type aead aead_algo aes-gcm aead_key 000102030405060708090a0b0c0d0e0f aead_iv 000102030405060708090a0b aead_aad 000102030405060708090a0b0c0d0e0f digest_size 8 data_offset 290
-
-pipeline PIPELINE0 table 1 rule add match default action fwd port 1
diff --git a/examples/ip_pipeline/examples/l2fwd.cli b/examples/ip_pipeline/examples/l2fwd.cli
deleted file mode 100644
index 35e77cc968..0000000000
--- a/examples/ip_pipeline/examples/l2fwd.cli
+++ /dev/null
@@ -1,51 +0,0 @@
-; SPDX-License-Identifier: BSD-3-Clause
-; Copyright(c) 2010-2018 Intel Corporation
-
-; The pipeline below implements a simple pass-through connection between the
-; input ports to the output ports, as in this diagram:
-; ________________
-; LINK0 RXQ0 --->|................|---> LINK1 TXQ0
-; | |
-; LINK1 RXQ0 --->|................|---> LINK0 TXQ0
-; | PIPELINE0 |
-; LINK2 RXQ0 --->|................|---> LINK3 TXQ0
-; | |
-; LINK3 RXQ0 --->|................|---> LINK2 TXQ0
-; |________________|
-;
-
-mempool MEMPOOL0 buffer 2304 pool 32K cache 256 cpu 0
-
-link LINK0 dev 0000:02:00.0 rxq 1 128 MEMPOOL0 txq 1 512 promiscuous on
-link LINK1 dev 0000:02:00.1 rxq 1 128 MEMPOOL0 txq 1 512 promiscuous on
-link LINK2 dev 0000:06:00.0 rxq 1 128 MEMPOOL0 txq 1 512 promiscuous on
-link LINK3 dev 0000:06:00.1 rxq 1 128 MEMPOOL0 txq 1 512 promiscuous on
-
-pipeline PIPELINE0 period 10 offset_port_id 0 cpu 0
-
-pipeline PIPELINE0 port in bsz 32 link LINK0 rxq 0
-pipeline PIPELINE0 port in bsz 32 link LINK1 rxq 0
-pipeline PIPELINE0 port in bsz 32 link LINK2 rxq 0
-pipeline PIPELINE0 port in bsz 32 link LINK3 rxq 0
-
-pipeline PIPELINE0 port out bsz 32 link LINK0 txq 0
-pipeline PIPELINE0 port out bsz 32 link LINK1 txq 0
-pipeline PIPELINE0 port out bsz 32 link LINK2 txq 0
-pipeline PIPELINE0 port out bsz 32 link LINK3 txq 0
-
-pipeline PIPELINE0 table match stub
-pipeline PIPELINE0 table match stub
-pipeline PIPELINE0 table match stub
-pipeline PIPELINE0 table match stub
-
-pipeline PIPELINE0 port in 0 table 0
-pipeline PIPELINE0 port in 1 table 1
-pipeline PIPELINE0 port in 2 table 2
-pipeline PIPELINE0 port in 3 table 3
-
-thread 1 pipeline PIPELINE0 enable
-
-pipeline PIPELINE0 table 0 rule add match default action fwd port 1
-pipeline PIPELINE0 table 1 rule add match default action fwd port 0
-pipeline PIPELINE0 table 2 rule add match default action fwd port 3
-pipeline PIPELINE0 table 3 rule add match default action fwd port 2
diff --git a/examples/ip_pipeline/examples/route.cli b/examples/ip_pipeline/examples/route.cli
deleted file mode 100644
index 579b36a659..0000000000
--- a/examples/ip_pipeline/examples/route.cli
+++ /dev/null
@@ -1,60 +0,0 @@
-; SPDX-License-Identifier: BSD-3-Clause
-; Copyright(c) 2010-2018 Intel Corporation
-
-; _______________
-; LINK0 RXQ0 --->| |---> LINK0 TXQ0
-; | |
-; LINK1 RXQ0 --->| |---> LINK1 TXQ0
-; | Routing |
-; LINK2 RXQ0 --->| |---> LINK2 TXQ0
-; | |
-; LINK3 RXQ0 --->| |---> LINK3 TXQ0
-; |_______________|
-; |
-; +-----------> SINK0 (route miss)
-;
-; Input packet: Ethernet/IPv4
-;
-; Packet buffer layout:
-; # Field Name Offset (Bytes) Size (Bytes)
-; 0 Mbuf 0 128
-; 1 Headroom 128 128
-; 2 Ethernet header 256 14
-; 3 IPv4 header 270 20
-
-mempool MEMPOOL0 buffer 2304 pool 32K cache 256 cpu 0
-
-link LINK0 dev 0000:02:00.0 rxq 1 128 MEMPOOL0 txq 1 512 promiscuous on
-link LINK1 dev 0000:02:00.1 rxq 1 128 MEMPOOL0 txq 1 512 promiscuous on
-link LINK2 dev 0000:06:00.0 rxq 1 128 MEMPOOL0 txq 1 512 promiscuous on
-link LINK3 dev 0000:06:00.1 rxq 1 128 MEMPOOL0 txq 1 512 promiscuous on
-
-table action profile AP0 ipv4 offset 270 fwd encap ether
-
-pipeline PIPELINE0 period 10 offset_port_id 0 cpu 0
-
-pipeline PIPELINE0 port in bsz 32 link LINK0 rxq 0
-pipeline PIPELINE0 port in bsz 32 link LINK1 rxq 0
-pipeline PIPELINE0 port in bsz 32 link LINK2 rxq 0
-pipeline PIPELINE0 port in bsz 32 link LINK3 rxq 0
-
-pipeline PIPELINE0 port out bsz 32 link LINK0 txq 0
-pipeline PIPELINE0 port out bsz 32 link LINK1 txq 0
-pipeline PIPELINE0 port out bsz 32 link LINK2 txq 0
-pipeline PIPELINE0 port out bsz 32 link LINK3 txq 0
-pipeline PIPELINE0 port out bsz 32 sink
-
-pipeline PIPELINE0 table match lpm ipv4 offset 286 size 4K action AP0
-
-pipeline PIPELINE0 port in 0 table 0
-pipeline PIPELINE0 port in 1 table 0
-pipeline PIPELINE0 port in 2 table 0
-pipeline PIPELINE0 port in 3 table 0
-
-thread 1 pipeline PIPELINE0 enable
-
-pipeline PIPELINE0 table 0 rule add match default action fwd port 4
-pipeline PIPELINE0 table 0 rule add match lpm ipv4 100.0.0.0 10 action fwd port 0 encap ether a0:a1:a2:a3:a4:a5 00:01:02:03:04:05
-pipeline PIPELINE0 table 0 rule add match lpm ipv4 100.64.0.0 10 action fwd port 1 encap ether b0:b1:b2:b3:b4:b5 10:11:12:13:14:15
-pipeline PIPELINE0 table 0 rule add match lpm ipv4 100.128.0.0 10 action fwd port 2 encap ether c0:c1:c2:c3:c4:c5 20:21:22:23:24:25
-pipeline PIPELINE0 table 0 rule add match lpm ipv4 100.192.0.0 10 action fwd port 3 encap ether d0:d1:d2:d3:d4:d5 30:31:32:33:34:35
diff --git a/examples/ip_pipeline/examples/route_ecmp.cli b/examples/ip_pipeline/examples/route_ecmp.cli
deleted file mode 100644
index 06434a2560..0000000000
--- a/examples/ip_pipeline/examples/route_ecmp.cli
+++ /dev/null
@@ -1,57 +0,0 @@
-; SPDX-License-Identifier: BSD-3-Clause
-; Copyright(c) 2010-2018 Intel Corporation
-
-; Equal Cost Multi-Path (ECMP) Routing
-;
-; Input packet: Ethernet/IPv4
-;
-; Packet buffer layout:
-; # Field Name Offset (Bytes) Size (Bytes)
-; 0 Mbuf 0 128
-; 1 Headroom 128 128
-; 2 Ethernet header 256 14
-; 3 IPv4 header 270 20
-
-mempool MEMPOOL0 buffer 2304 pool 32K cache 256 cpu 0
-
-link LINK0 dev 0000:02:00.0 rxq 1 128 MEMPOOL0 txq 1 512 promiscuous on
-link LINK1 dev 0000:02:00.1 rxq 1 128 MEMPOOL0 txq 1 512 promiscuous on
-link LINK2 dev 0000:06:00.0 rxq 1 128 MEMPOOL0 txq 1 512 promiscuous on
-link LINK3 dev 0000:06:00.1 rxq 1 128 MEMPOOL0 txq 1 512 promiscuous on
-
-table action profile APRT ipv4 offset 270 fwd balance offset 278 mask 00FF0000FFFFFFFFFFFFFFFFFFFFFFFF outoffset 256
-table action profile APNH ipv4 offset 270 fwd encap ether
-
-pipeline PIPELINE0 period 10 offset_port_id 0 cpu 0
-
-pipeline PIPELINE0 port in bsz 32 link LINK0 rxq 0
-pipeline PIPELINE0 port in bsz 32 link LINK1 rxq 0
-pipeline PIPELINE0 port in bsz 32 link LINK2 rxq 0
-pipeline PIPELINE0 port in bsz 32 link LINK3 rxq 0
-
-pipeline PIPELINE0 port out bsz 32 link LINK0 txq 0
-pipeline PIPELINE0 port out bsz 32 link LINK1 txq 0
-pipeline PIPELINE0 port out bsz 32 link LINK2 txq 0
-pipeline PIPELINE0 port out bsz 32 link LINK3 txq 0
-pipeline PIPELINE0 port out bsz 32 sink
-
-pipeline PIPELINE0 table match lpm ipv4 offset 286 size 4K action APRT
-pipeline PIPELINE0 table match array offset 256 size 64K action APNH
-
-pipeline PIPELINE0 port in 0 table 0
-pipeline PIPELINE0 port in 1 table 0
-pipeline PIPELINE0 port in 2 table 0
-pipeline PIPELINE0 port in 3 table 0
-
-thread 1 pipeline PIPELINE0 enable
-
-pipeline PIPELINE0 table 0 rule add match default action fwd port 4
-pipeline PIPELINE0 table 0 rule add match lpm ipv4 100.0.0.0 10 action fwd table 1 balance 0 0 0 0 1 1 2 2
-pipeline PIPELINE0 table 0 rule add match lpm ipv4 100.64.0.0 10 action fwd table 1 balance 1 1 1 1 2 2 3 3
-pipeline PIPELINE0 table 0 rule add match lpm ipv4 100.128.0.0 10 action fwd table 1 balance 2 2 2 2 3 3 0 0
-pipeline PIPELINE0 table 0 rule add match lpm ipv4 100.192.0.0 10 action fwd table 1 balance 3 3 3 3 0 0 1 1
-
-pipeline PIPELINE0 table 1 rule add match array 0 action fwd port 0 encap ether a0:a1:a2:a3:a4:a5 00:01:02:03:04:05
-pipeline PIPELINE0 table 1 rule add match array 1 action fwd port 1 encap ether b0:b1:b2:b3:b4:b5 10:11:12:13:14:15
-pipeline PIPELINE0 table 1 rule add match array 2 action fwd port 2 encap ether c0:c1:c2:c3:c4:c5 20:21:22:23:24:25
-pipeline PIPELINE0 table 1 rule add match array 3 action fwd port 3 encap ether d0:d1:d2:d3:d4:d5 30:31:32:33:34:35
diff --git a/examples/ip_pipeline/examples/rss.cli b/examples/ip_pipeline/examples/rss.cli
deleted file mode 100644
index 29c0a91392..0000000000
--- a/examples/ip_pipeline/examples/rss.cli
+++ /dev/null
@@ -1,112 +0,0 @@
-; SPDX-License-Identifier: BSD-3-Clause
-; Copyright(c) 2010-2018 Intel Corporation
-
-; This setup demonstrates the usage of NIC Receive Side Scaling (RSS) feature.
-; Each NIC splits the input traffic into 4 RX queues, with each of its RX queues
-; being handled by a different pipeline:
-;
-; +-----------+ +----------+
-; +--------------------------->| | | |
-; | +------------------->| PIPELINE0 +--->| LINK 0 |--->
-; | | +------------->| (CORE A) | | TX |
-; | | | +------->| | | |
-; | | | | +-----------+ +----------+
-; +----------+ | | | |
-; | |-------+ | | |
-;--->| LINK 0 |-----------+ | | |
-; | RX |---------+ | | | |
-; | |-------+ | | | | |
-; +----------+ | | | | | | +-----------+ +----------+
-; | | +---|-----|-----|------->| | | |
-; +----------+ | | | +---|-----|------->| PIPELINE1 +--->| LINK 1 |--->
-; | |-------|-|-----+ | | +---|------->| (CORE B) | | TX |
-;--->| LINK 1 |-------|-|-------+ | | | +----->| | | |
-; | RX |-------|-|-------+ | | | | +-----------+ +----------+
-; | |-------|-|-----+ | | | | |
-; +----------+ | | | | | | | |
-; | | | | | | | |
-; +----------+ | | | | | | | |
-; | |-------|-|-----|-|---+ | | |
-;--->| LINK 2 |-------|-|-----|-|-----+ | | +-----------+ +----------+
-; | RX |-----+ | +-----|-|---------|-|----->| | | |
-; | |---+ | | | +---------|-|----->| PIPELINE2 +--->| LINK 2 |--->
-; +----------+ | +-|-------|-----------|-|----->| (CORE C) | | TX |
-; | | | | | +--->| | | |
-; +----------+ | | | | | | +-----------+ +----------+
-; | |---|---|-------|-----------+ | |
-;--->| LINK 3 |---|---|-------|-------------+ |
-; | RX |---|---|-------|---------------+
-; | |---|---|-------|-----------+
-; +----------+ | | | |
-; | | | | +-----------+ +----------+
-; | +-------|-----------|------->| | | |
-; | +-----------|------->| PIPELINE3 +--->| LINK 3 |--->
-; +-----------------------|------->| (CORE D) | | TX |
-; +------->| | | |
-; +-----------+ +----------+
-;
-;
-
-mempool MEMPOOL0 buffer 2304 pool 32K cache 256 cpu 0
-
-link LINK0 dev 0000:02:00.0 rxq 4 128 MEMPOOL0 txq 1 512 promiscuous on rss 0 1 2 3
-link LINK1 dev 0000:02:00.1 rxq 4 128 MEMPOOL0 txq 1 512 promiscuous on rss 0 1 2 3
-link LINK2 dev 0000:06:00.0 rxq 4 128 MEMPOOL0 txq 1 512 promiscuous on rss 0 1 2 3
-link LINK3 dev 0000:06:00.1 rxq 4 128 MEMPOOL0 txq 1 512 promiscuous on rss 0 1 2 3
-
-pipeline PIPELINE0 period 10 offset_port_id 0 cpu 0
-pipeline PIPELINE0 port in bsz 32 link LINK0 rxq 0
-pipeline PIPELINE0 port in bsz 32 link LINK1 rxq 0
-pipeline PIPELINE0 port in bsz 32 link LINK2 rxq 0
-pipeline PIPELINE0 port in bsz 32 link LINK3 rxq 0
-pipeline PIPELINE0 port out bsz 32 link LINK0 txq 0
-pipeline PIPELINE0 table match stub
-pipeline PIPELINE0 port in 0 table 0
-pipeline PIPELINE0 port in 1 table 0
-pipeline PIPELINE0 port in 2 table 0
-pipeline PIPELINE0 port in 3 table 0
-pipeline PIPELINE0 table 0 rule add match default action fwd port 0
-
-pipeline PIPELINE1 period 10 offset_port_id 0 cpu 0
-pipeline PIPELINE1 port in bsz 32 link LINK0 rxq 1
-pipeline PIPELINE1 port in bsz 32 link LINK1 rxq 1
-pipeline PIPELINE1 port in bsz 32 link LINK2 rxq 1
-pipeline PIPELINE1 port in bsz 32 link LINK3 rxq 1
-pipeline PIPELINE1 port out bsz 32 link LINK1 txq 0
-pipeline PIPELINE1 table match stub
-pipeline PIPELINE1 port in 0 table 0
-pipeline PIPELINE1 port in 1 table 0
-pipeline PIPELINE1 port in 2 table 0
-pipeline PIPELINE1 port in 3 table 0
-pipeline PIPELINE1 table 0 rule add match default action fwd port 0
-
-pipeline PIPELINE2 period 10 offset_port_id 0 cpu 0
-pipeline PIPELINE2 port in bsz 32 link LINK0 rxq 2
-pipeline PIPELINE2 port in bsz 32 link LINK1 rxq 2
-pipeline PIPELINE2 port in bsz 32 link LINK2 rxq 2
-pipeline PIPELINE2 port in bsz 32 link LINK3 rxq 2
-pipeline PIPELINE2 port out bsz 32 link LINK2 txq 0
-pipeline PIPELINE2 table match stub
-pipeline PIPELINE2 port in 0 table 0
-pipeline PIPELINE2 port in 1 table 0
-pipeline PIPELINE2 port in 2 table 0
-pipeline PIPELINE2 port in 3 table 0
-pipeline PIPELINE2 table 0 rule add match default action fwd port 0
-
-pipeline PIPELINE3 period 10 offset_port_id 0 cpu 0
-pipeline PIPELINE3 port in bsz 32 link LINK0 rxq 3
-pipeline PIPELINE3 port in bsz 32 link LINK1 rxq 3
-pipeline PIPELINE3 port in bsz 32 link LINK2 rxq 3
-pipeline PIPELINE3 port in bsz 32 link LINK3 rxq 3
-pipeline PIPELINE3 port out bsz 32 link LINK3 txq 0
-pipeline PIPELINE3 table match stub
-pipeline PIPELINE3 port in 0 table 0
-pipeline PIPELINE3 port in 1 table 0
-pipeline PIPELINE3 port in 2 table 0
-pipeline PIPELINE3 port in 3 table 0
-pipeline PIPELINE3 table 0 rule add match default action fwd port 0
-
-thread 1 pipeline PIPELINE0 enable
-thread 2 pipeline PIPELINE1 enable
-thread 3 pipeline PIPELINE2 enable
-thread 4 pipeline PIPELINE3 enable
diff --git a/examples/ip_pipeline/examples/tap.cli b/examples/ip_pipeline/examples/tap.cli
deleted file mode 100644
index 600cea2643..0000000000
--- a/examples/ip_pipeline/examples/tap.cli
+++ /dev/null
@@ -1,66 +0,0 @@
-; SPDX-License-Identifier: BSD-3-Clause
-; Copyright(c) 2010-2018 Intel Corporation
-
-; _______________ ______________________
-; | | TAP0 | |
-; LINK0 RXQ0 --->|...............|------->|--+ |
-; | | TAP1 | | br0 |
-; LINK1 TXQ0 <---|...............|<-------|<-+ |
-; | | | Linux Kernel |
-; | PIPELINE0 | | Network Stack |
-; | | TAP1 | |
-; LINK1 RXQ0 --->|...............|------->|--+ |
-; | | TAP0 | | br0 |
-; LINK0 TXQ0 <---|...............|<-------|<-+ |
-; |_______________| |______________________|
-;
-; Configure Linux kernel bridge between TAP0 and TAP1 interfaces:
-; [Linux]$ brctl addbr br0
-; [Linux]$ brctl addif br0 TAP0
-; [Linux]$ brctl addif br0 TAP1
-; [Linux]$ ifconfig TAP0 up
-; [Linux]$ ifconfig TAP1 up
-; [Linux]$ ifconfig br0 up
-;
-; Monitor packet forwarding performed by Linux kernel between TAP0 and TAP1:
-; [Linux]$ tcpdump -i TAP0
-; [Linux]$ tcpdump -i TAP1
-
-mempool MEMPOOL0 buffer 2304 pool 32K cache 256 cpu 0
-
-link LINK0 dev 0000:02:00.0 rxq 1 128 MEMPOOL0 txq 1 512 promiscuous on
-link LINK1 dev 0000:02:00.1 rxq 1 128 MEMPOOL0 txq 1 512 promiscuous on
-
-tap TAP0
-tap TAP1
-
-table action profile AP0 ipv4 offset 270 fwd
-
-pipeline PIPELINE0 period 10 offset_port_id 0 cpu 0
-
-pipeline PIPELINE0 port in bsz 32 link LINK0 rxq 0
-pipeline PIPELINE0 port in bsz 32 tap TAP1 mempool MEMPOOL0 mtu 1500
-pipeline PIPELINE0 port in bsz 32 link LINK1 rxq 0
-pipeline PIPELINE0 port in bsz 32 tap TAP0 mempool MEMPOOL0 mtu 1500
-
-pipeline PIPELINE0 port out bsz 32 tap TAP0
-pipeline PIPELINE0 port out bsz 32 link LINK1 txq 0
-pipeline PIPELINE0 port out bsz 32 tap TAP1
-pipeline PIPELINE0 port out bsz 32 link LINK0 txq 0
-
-pipeline PIPELINE0 table match stub action AP0
-pipeline PIPELINE0 table match stub action AP0
-pipeline PIPELINE0 table match stub action AP0
-pipeline PIPELINE0 table match stub action AP0
-
-pipeline PIPELINE0 port in 0 table 0
-pipeline PIPELINE0 port in 1 table 1
-pipeline PIPELINE0 port in 2 table 2
-pipeline PIPELINE0 port in 3 table 3
-
-thread 1 pipeline PIPELINE0 enable
-
-pipeline PIPELINE0 table 0 rule add match default action fwd port 0
-pipeline PIPELINE0 table 1 rule add match default action fwd port 1
-pipeline PIPELINE0 table 2 rule add match default action fwd port 2
-pipeline PIPELINE0 table 3 rule add match default action fwd port 3
diff --git a/examples/ip_pipeline/link.c b/examples/ip_pipeline/link.c
deleted file mode 100644
index 4d69ebebfb..0000000000
--- a/examples/ip_pipeline/link.c
+++ /dev/null
@@ -1,270 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2018 Intel Corporation
- */
-
-#include <stdlib.h>
-#include <string.h>
-
-#include <rte_ethdev.h>
-#include <rte_string_fns.h>
-
-#include "link.h"
-#include "mempool.h"
-
-static struct link_list link_list;
-
-int
-link_init(void)
-{
- TAILQ_INIT(&link_list);
-
- return 0;
-}
-
-struct link *
-link_find(const char *name)
-{
- struct link *link;
-
- if (name == NULL)
- return NULL;
-
- TAILQ_FOREACH(link, &link_list, node)
- if (strcmp(link->name, name) == 0)
- return link;
-
- return NULL;
-}
-
-struct link *
-link_next(struct link *link)
-{
- return (link == NULL) ? TAILQ_FIRST(&link_list) : TAILQ_NEXT(link, node);
-}
-
-static struct rte_eth_conf port_conf_default = {
- .link_speeds = 0,
- .rxmode = {
- .mq_mode = RTE_ETH_MQ_RX_NONE,
- .mtu = 9000 - (RTE_ETHER_HDR_LEN + RTE_ETHER_CRC_LEN), /* Jumbo frame MTU */
- },
- .rx_adv_conf = {
- .rss_conf = {
- .rss_key = NULL,
- .rss_key_len = 40,
- .rss_hf = 0,
- },
- },
- .txmode = {
- .mq_mode = RTE_ETH_MQ_TX_NONE,
- },
- .lpbk_mode = 0,
-};
-
-#define RETA_CONF_SIZE (RTE_ETH_RSS_RETA_SIZE_512 / RTE_ETH_RETA_GROUP_SIZE)
-
-static int
-rss_setup(uint16_t port_id,
- uint16_t reta_size,
- struct link_params_rss *rss)
-{
- struct rte_eth_rss_reta_entry64 reta_conf[RETA_CONF_SIZE];
- uint32_t i;
- int status;
-
- /* RETA setting */
- memset(reta_conf, 0, sizeof(reta_conf));
-
- for (i = 0; i < reta_size; i++)
- reta_conf[i / RTE_ETH_RETA_GROUP_SIZE].mask = UINT64_MAX;
-
- for (i = 0; i < reta_size; i++) {
- uint32_t reta_id = i / RTE_ETH_RETA_GROUP_SIZE;
- uint32_t reta_pos = i % RTE_ETH_RETA_GROUP_SIZE;
- uint32_t rss_qs_pos = i % rss->n_queues;
-
- reta_conf[reta_id].reta[reta_pos] =
- (uint16_t) rss->queue_id[rss_qs_pos];
- }
-
- /* RETA update */
- status = rte_eth_dev_rss_reta_update(port_id,
- reta_conf,
- reta_size);
-
- return status;
-}
-
-struct link *
-link_create(const char *name, struct link_params *params)
-{
- struct rte_eth_dev_info port_info;
- struct rte_eth_conf port_conf;
- struct link *link;
- struct link_params_rss *rss;
- struct mempool *mempool;
- uint32_t cpu_id, i;
- int status;
- uint16_t port_id;
-
- /* Check input params */
- if ((name == NULL) ||
- link_find(name) ||
- (params == NULL) ||
- (params->rx.n_queues == 0) ||
- (params->rx.queue_size == 0) ||
- (params->tx.n_queues == 0) ||
- (params->tx.queue_size == 0))
- return NULL;
-
- port_id = params->port_id;
- if (params->dev_name) {
- status = rte_eth_dev_get_port_by_name(params->dev_name,
- &port_id);
-
- if (status)
- return NULL;
- } else
- if (!rte_eth_dev_is_valid_port(port_id))
- return NULL;
-
- if (rte_eth_dev_info_get(port_id, &port_info) != 0)
- return NULL;
-
- mempool = mempool_find(params->rx.mempool_name);
- if (mempool == NULL)
- return NULL;
-
- rss = params->rx.rss;
- if (rss) {
- if ((port_info.reta_size == 0) ||
- (port_info.reta_size > RTE_ETH_RSS_RETA_SIZE_512))
- return NULL;
-
- if ((rss->n_queues == 0) ||
- (rss->n_queues >= LINK_RXQ_RSS_MAX))
- return NULL;
-
- for (i = 0; i < rss->n_queues; i++)
- if (rss->queue_id[i] >= port_info.max_rx_queues)
- return NULL;
- }
-
- /**
- * Resource create
- */
- /* Port */
- memcpy(&port_conf, &port_conf_default, sizeof(port_conf));
- if (rss) {
- port_conf.rxmode.mq_mode = RTE_ETH_MQ_RX_RSS;
- port_conf.rx_adv_conf.rss_conf.rss_hf =
- (RTE_ETH_RSS_IP | RTE_ETH_RSS_TCP | RTE_ETH_RSS_UDP) &
- port_info.flow_type_rss_offloads;
- }
-
- cpu_id = (uint32_t) rte_eth_dev_socket_id(port_id);
- if (cpu_id == (uint32_t) SOCKET_ID_ANY)
- cpu_id = 0;
-
- status = rte_eth_dev_configure(
- port_id,
- params->rx.n_queues,
- params->tx.n_queues,
- &port_conf);
-
- if (status < 0)
- return NULL;
-
- if (params->promiscuous) {
- status = rte_eth_promiscuous_enable(port_id);
- if (status != 0)
- return NULL;
- }
-
- /* Port RX */
- for (i = 0; i < params->rx.n_queues; i++) {
- status = rte_eth_rx_queue_setup(
- port_id,
- i,
- params->rx.queue_size,
- cpu_id,
- NULL,
- mempool->m);
-
- if (status < 0)
- return NULL;
- }
-
- /* Port TX */
- for (i = 0; i < params->tx.n_queues; i++) {
- status = rte_eth_tx_queue_setup(
- port_id,
- i,
- params->tx.queue_size,
- cpu_id,
- NULL);
-
- if (status < 0)
- return NULL;
- }
-
- /* Port start */
- status = rte_eth_dev_start(port_id);
- if (status < 0)
- return NULL;
-
- if (rss) {
- status = rss_setup(port_id, port_info.reta_size, rss);
-
- if (status) {
- rte_eth_dev_stop(port_id);
- return NULL;
- }
- }
-
- /* Port link up */
- status = rte_eth_dev_set_link_up(port_id);
- if ((status < 0) && (status != -ENOTSUP)) {
- rte_eth_dev_stop(port_id);
- return NULL;
- }
-
- /* Node allocation */
- link = calloc(1, sizeof(struct link));
- if (link == NULL) {
- rte_eth_dev_stop(port_id);
- return NULL;
- }
-
- /* Node fill in */
- strlcpy(link->name, name, sizeof(link->name));
- link->port_id = port_id;
- link->n_rxq = params->rx.n_queues;
- link->n_txq = params->tx.n_queues;
-
- /* Node add to list */
- TAILQ_INSERT_TAIL(&link_list, link, node);
-
- return link;
-}
-
-int
-link_is_up(const char *name)
-{
- struct rte_eth_link link_params;
- struct link *link;
-
- /* Check input params */
- if (name == NULL)
- return 0;
-
- link = link_find(name);
- if (link == NULL)
- return 0;
-
- /* Resource */
- if (rte_eth_link_get(link->port_id, &link_params) < 0)
- return 0;
-
- return (link_params.link_status == RTE_ETH_LINK_DOWN) ? 0 : 1;
-}
diff --git a/examples/ip_pipeline/link.h b/examples/ip_pipeline/link.h
deleted file mode 100644
index 34ff1149e0..0000000000
--- a/examples/ip_pipeline/link.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2018 Intel Corporation
- */
-
-#ifndef _INCLUDE_LINK_H_
-#define _INCLUDE_LINK_H_
-
-#include <stdint.h>
-#include <sys/queue.h>
-
-#include "common.h"
-
-#ifndef LINK_RXQ_RSS_MAX
-#define LINK_RXQ_RSS_MAX 16
-#endif
-
-struct link {
- TAILQ_ENTRY(link) node;
- char name[NAME_SIZE];
- uint16_t port_id;
- uint32_t n_rxq;
- uint32_t n_txq;
-};
-
-TAILQ_HEAD(link_list, link);
-
-int
-link_init(void);
-
-struct link *
-link_find(const char *name);
-
-struct link *
-link_next(struct link *link);
-
-struct link_params_rss {
- uint32_t queue_id[LINK_RXQ_RSS_MAX];
- uint32_t n_queues;
-};
-
-struct link_params {
- const char *dev_name;
- uint16_t port_id; /**< Valid only when *dev_name* is NULL. */
-
- struct {
- uint32_t n_queues;
- uint32_t queue_size;
- const char *mempool_name;
- struct link_params_rss *rss;
- } rx;
-
- struct {
- uint32_t n_queues;
- uint32_t queue_size;
- } tx;
-
- int promiscuous;
-};
-
-struct link *
-link_create(const char *name, struct link_params *params);
-
-int
-link_is_up(const char *name);
-
-#endif /* _INCLUDE_LINK_H_ */
diff --git a/examples/ip_pipeline/main.c b/examples/ip_pipeline/main.c
deleted file mode 100644
index 663f538f02..0000000000
--- a/examples/ip_pipeline/main.c
+++ /dev/null
@@ -1,260 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2018 Intel Corporation
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <getopt.h>
-
-#include <rte_launch.h>
-#include <rte_eal.h>
-
-#include "cli.h"
-#include "conn.h"
-#include "cryptodev.h"
-#include "link.h"
-#include "mempool.h"
-#include "pipeline.h"
-#include "swq.h"
-#include "tap.h"
-#include "thread.h"
-#include "tmgr.h"
-
-static const char usage[] =
- "%s EAL_ARGS -- [-h HOST] [-p PORT] [-s SCRIPT]\n";
-
-static const char welcome[] =
- "\n"
- "Welcome to IP Pipeline!\n"
- "\n";
-
-static const char prompt[] = "pipeline> ";
-
-static struct app_params {
- struct conn_params conn;
- char *script_name;
-} app = {
- .conn = {
- .welcome = welcome,
- .prompt = prompt,
- .addr = "0.0.0.0",
- .port = 8086,
- .buf_size = 1024 * 1024,
- .msg_in_len_max = 1024,
- .msg_out_len_max = 1024 * 1024,
- .msg_handle = cli_process,
- },
- .script_name = NULL,
-};
-
-static int
-parse_args(int argc, char **argv)
-{
- char *app_name = argv[0];
- struct option lgopts[] = {
- { NULL, 0, 0, 0 }
- };
- int opt, option_index;
- int h_present, p_present, s_present, n_args, i;
-
- /* Skip EAL input args */
- n_args = argc;
- for (i = 0; i < n_args; i++)
- if (strcmp(argv[i], "--") == 0) {
- argc -= i;
- argv += i;
- break;
- }
-
- if (i == n_args)
- return 0;
-
- /* Parse args */
- h_present = 0;
- p_present = 0;
- s_present = 0;
-
- while ((opt = getopt_long(argc, argv, "h:p:s:", lgopts, &option_index))
- != EOF)
- switch (opt) {
- case 'h':
- if (h_present) {
- printf("Error: Multiple -h arguments\n");
- return -1;
- }
- h_present = 1;
-
- if (!strlen(optarg)) {
- printf("Error: Argument for -h not provided\n");
- return -1;
- }
-
- app.conn.addr = strdup(optarg);
- if (app.conn.addr == NULL) {
- printf("Error: Not enough memory\n");
- return -1;
- }
- break;
-
- case 'p':
- if (p_present) {
- printf("Error: Multiple -p arguments\n");
- return -1;
- }
- p_present = 1;
-
- if (!strlen(optarg)) {
- printf("Error: Argument for -p not provided\n");
- return -1;
- }
-
- app.conn.port = (uint16_t) atoi(optarg);
- break;
-
- case 's':
- if (s_present) {
- printf("Error: Multiple -s arguments\n");
- return -1;
- }
- s_present = 1;
-
- if (!strlen(optarg)) {
- printf("Error: Argument for -s not provided\n");
- return -1;
- }
-
- app.script_name = strdup(optarg);
- if (app.script_name == NULL) {
- printf("Error: Not enough memory\n");
- return -1;
- }
- break;
-
- default:
- printf(usage, app_name);
- return -1;
- }
-
- optind = 1; /* reset getopt lib */
-
- return 0;
-}
-
-int
-main(int argc, char **argv)
-{
- struct conn *conn;
- int status;
-
- /* Parse application arguments */
- status = parse_args(argc, argv);
- if (status < 0)
- return status;
-
- /* EAL */
- status = rte_eal_init(argc, argv);
- if (status < 0) {
- printf("Error: EAL initialization failed (%d)\n", status);
- return status;
- };
-
- /* Connectivity */
- conn = conn_init(&app.conn);
- if (conn == NULL) {
- printf("Error: Connectivity initialization failed (%d)\n",
- status);
- return status;
- };
-
- /* Mempool */
- status = mempool_init();
- if (status) {
- printf("Error: Mempool initialization failed (%d)\n", status);
- return status;
- }
-
- /* Link */
- status = link_init();
- if (status) {
- printf("Error: Link initialization failed (%d)\n", status);
- return status;
- }
-
- /* SWQ */
- status = swq_init();
- if (status) {
- printf("Error: SWQ initialization failed (%d)\n", status);
- return status;
- }
-
- /* Traffic Manager */
- status = tmgr_init();
- if (status) {
- printf("Error: TMGR initialization failed (%d)\n", status);
- return status;
- }
-
- /* TAP */
- status = tap_init();
- if (status) {
- printf("Error: TAP initialization failed (%d)\n", status);
- return status;
- }
-
- /* Sym Crypto */
- status = cryptodev_init();
- if (status) {
- printf("Error: Cryptodev initialization failed (%d)\n",
- status);
- return status;
- }
-
- /* Action */
- status = port_in_action_profile_init();
- if (status) {
- printf("Error: Input port action profile initialization failed (%d)\n", status);
- return status;
- }
-
- status = table_action_profile_init();
- if (status) {
- printf("Error: Action profile initialization failed (%d)\n",
- status);
- return status;
- }
-
- /* Pipeline */
- status = pipeline_init();
- if (status) {
- printf("Error: Pipeline initialization failed (%d)\n", status);
- return status;
- }
-
- /* Thread */
- status = thread_init();
- if (status) {
- printf("Error: Thread initialization failed (%d)\n", status);
- return status;
- }
-
- rte_eal_mp_remote_launch(
- thread_main,
- NULL,
- SKIP_MAIN);
-
- /* Script */
- if (app.script_name)
- cli_script_process(app.script_name,
- app.conn.msg_in_len_max,
- app.conn.msg_out_len_max);
-
- /* Dispatch loop */
- for ( ; ; ) {
- conn_poll_for_conn(conn);
-
- conn_poll_for_msg(conn);
- }
-}
diff --git a/examples/ip_pipeline/mempool.c b/examples/ip_pipeline/mempool.c
deleted file mode 100644
index f5d2a7d108..0000000000
--- a/examples/ip_pipeline/mempool.c
+++ /dev/null
@@ -1,82 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2018 Intel Corporation
- */
-
-#include <stdlib.h>
-#include <string.h>
-
-#include <rte_mbuf.h>
-#include <rte_string_fns.h>
-
-#include "mempool.h"
-
-#define BUFFER_SIZE_MIN (sizeof(struct rte_mbuf) + RTE_PKTMBUF_HEADROOM)
-
-static struct mempool_list mempool_list;
-
-int
-mempool_init(void)
-{
- TAILQ_INIT(&mempool_list);
-
- return 0;
-}
-
-struct mempool *
-mempool_find(const char *name)
-{
- struct mempool *mempool;
-
- if (name == NULL)
- return NULL;
-
- TAILQ_FOREACH(mempool, &mempool_list, node)
- if (strcmp(mempool->name, name) == 0)
- return mempool;
-
- return NULL;
-}
-
-struct mempool *
-mempool_create(const char *name, struct mempool_params *params)
-{
- struct mempool *mempool;
- struct rte_mempool *m;
-
- /* Check input params */
- if ((name == NULL) ||
- mempool_find(name) ||
- (params == NULL) ||
- (params->buffer_size < BUFFER_SIZE_MIN) ||
- (params->pool_size == 0))
- return NULL;
-
- /* Resource create */
- m = rte_pktmbuf_pool_create(
- name,
- params->pool_size,
- params->cache_size,
- 0,
- params->buffer_size - sizeof(struct rte_mbuf),
- params->cpu_id);
-
- if (m == NULL)
- return NULL;
-
- /* Node allocation */
- mempool = calloc(1, sizeof(struct mempool));
- if (mempool == NULL) {
- rte_mempool_free(m);
- return NULL;
- }
-
- /* Node fill in */
- strlcpy(mempool->name, name, sizeof(mempool->name));
- mempool->m = m;
- mempool->buffer_size = params->buffer_size;
-
- /* Node add to list */
- TAILQ_INSERT_TAIL(&mempool_list, mempool, node);
-
- return mempool;
-}
diff --git a/examples/ip_pipeline/mempool.h b/examples/ip_pipeline/mempool.h
deleted file mode 100644
index bd46a11ca0..0000000000
--- a/examples/ip_pipeline/mempool.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2018 Intel Corporation
- */
-
-#ifndef _INCLUDE_MEMPOOL_H_
-#define _INCLUDE_MEMPOOL_H_
-
-#include <stdint.h>
-#include <sys/queue.h>
-
-#include <rte_mempool.h>
-
-#include "common.h"
-
-struct mempool {
- TAILQ_ENTRY(mempool) node;
- char name[NAME_SIZE];
- struct rte_mempool *m;
- uint32_t buffer_size;
-};
-
-TAILQ_HEAD(mempool_list, mempool);
-
-int
-mempool_init(void);
-
-struct mempool *
-mempool_find(const char *name);
-
-struct mempool_params {
- uint32_t buffer_size;
- uint32_t pool_size;
- uint32_t cache_size;
- uint32_t cpu_id;
-};
-
-struct mempool *
-mempool_create(const char *name, struct mempool_params *params);
-
-#endif /* _INCLUDE_MEMPOOL_H_ */
diff --git a/examples/ip_pipeline/meson.build b/examples/ip_pipeline/meson.build
deleted file mode 100644
index 68049157e4..0000000000
--- a/examples/ip_pipeline/meson.build
+++ /dev/null
@@ -1,30 +0,0 @@
-# SPDX-License-Identifier: BSD-3-Clause
-# Copyright(c) 2017-2018 Intel Corporation
-
-# meson file, for building this example as part of a main DPDK build.
-#
-# To build this example as a standalone application with an already-installed
-# DPDK instance, use 'make'
-
-build = cc.has_header('sys/epoll.h')
-if not build
- subdir_done()
-endif
-
-deps += ['pipeline', 'bus_pci']
-allow_experimental_apis = true
-sources = files(
- 'action.c',
- 'cli.c',
- 'conn.c',
- 'cryptodev.c',
- 'link.c',
- 'main.c',
- 'mempool.c',
- 'parser.c',
- 'pipeline.c',
- 'swq.c',
- 'tap.c',
- 'thread.c',
- 'tmgr.c',
-)
diff --git a/examples/ip_pipeline/parser.c b/examples/ip_pipeline/parser.c
deleted file mode 100644
index 8baa70e1f4..0000000000
--- a/examples/ip_pipeline/parser.c
+++ /dev/null
@@ -1,506 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2016 Intel Corporation.
- * Copyright (c) 2009, Olivier MATZ <zer0@droids-corp.org>
- * All rights reserved.
- */
-
-#include <stdint.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <ctype.h>
-#include <getopt.h>
-#include <errno.h>
-#include <stdarg.h>
-#include <string.h>
-#include <libgen.h>
-#include <unistd.h>
-#include <sys/wait.h>
-#include <arpa/inet.h>
-#include <sys/socket.h>
-
-#include <rte_errno.h>
-#include <rte_string_fns.h>
-
-#include "parser.h"
-
-static uint32_t
-get_hex_val(char c)
-{
- switch (c) {
- case '0': case '1': case '2': case '3': case '4': case '5':
- case '6': case '7': case '8': case '9':
- return c - '0';
- case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
- return c - 'A' + 10;
- case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
- return c - 'a' + 10;
- default:
- return 0;
- }
-}
-
-int
-parser_read_arg_bool(const char *p)
-{
- p = rte_str_skip_leading_spaces(p);
- int result = -EINVAL;
-
- if (((p[0] == 'y') && (p[1] == 'e') && (p[2] == 's')) ||
- ((p[0] == 'Y') && (p[1] == 'E') && (p[2] == 'S'))) {
- p += 3;
- result = 1;
- }
-
- if (((p[0] == 'o') && (p[1] == 'n')) ||
- ((p[0] == 'O') && (p[1] == 'N'))) {
- p += 2;
- result = 1;
- }
-
- if (((p[0] == 'n') && (p[1] == 'o')) ||
- ((p[0] == 'N') && (p[1] == 'O'))) {
- p += 2;
- result = 0;
- }
-
- if (((p[0] == 'o') && (p[1] == 'f') && (p[2] == 'f')) ||
- ((p[0] == 'O') && (p[1] == 'F') && (p[2] == 'F'))) {
- p += 3;
- result = 0;
- }
-
- p = rte_str_skip_leading_spaces(p);
-
- if (p[0] != '\0')
- return -EINVAL;
-
- return result;
-}
-
-int
-parser_read_uint64(uint64_t *value, const char *p)
-{
- char *next;
- uint64_t val;
-
- p = rte_str_skip_leading_spaces(p);
- if (!isdigit(*p))
- return -EINVAL;
-
- val = strtoul(p, &next, 10);
- if (p == next)
- return -EINVAL;
-
- p = next;
- switch (*p) {
- case 'T':
- val *= 1024ULL;
- /* fall through */
- case 'G':
- val *= 1024ULL;
- /* fall through */
- case 'M':
- val *= 1024ULL;
- /* fall through */
- case 'k':
- case 'K':
- val *= 1024ULL;
- p++;
- break;
- }
-
- p = rte_str_skip_leading_spaces(p);
- if (*p != '\0')
- return -EINVAL;
-
- *value = val;
- return 0;
-}
-
-int
-parser_read_uint64_hex(uint64_t *value, const char *p)
-{
- char *next;
- uint64_t val;
-
- p = rte_str_skip_leading_spaces(p);
-
- val = strtoul(p, &next, 16);
- if (p == next)
- return -EINVAL;
-
- p = rte_str_skip_leading_spaces(next);
- if (*p != '\0')
- return -EINVAL;
-
- *value = val;
- return 0;
-}
-
-int
-parser_read_uint32(uint32_t *value, const char *p)
-{
- uint64_t val = 0;
- int ret = parser_read_uint64(&val, p);
-
- if (ret < 0)
- return ret;
-
- if (val > UINT32_MAX)
- return -ERANGE;
-
- *value = val;
- return 0;
-}
-
-int
-parser_read_uint32_hex(uint32_t *value, const char *p)
-{
- uint64_t val = 0;
- int ret = parser_read_uint64_hex(&val, p);
-
- if (ret < 0)
- return ret;
-
- if (val > UINT32_MAX)
- return -ERANGE;
-
- *value = val;
- return 0;
-}
-
-int
-parser_read_uint16(uint16_t *value, const char *p)
-{
- uint64_t val = 0;
- int ret = parser_read_uint64(&val, p);
-
- if (ret < 0)
- return ret;
-
- if (val > UINT16_MAX)
- return -ERANGE;
-
- *value = val;
- return 0;
-}
-
-int
-parser_read_uint16_hex(uint16_t *value, const char *p)
-{
- uint64_t val = 0;
- int ret = parser_read_uint64_hex(&val, p);
-
- if (ret < 0)
- return ret;
-
- if (val > UINT16_MAX)
- return -ERANGE;
-
- *value = val;
- return 0;
-}
-
-int
-parser_read_uint8(uint8_t *value, const char *p)
-{
- uint64_t val = 0;
- int ret = parser_read_uint64(&val, p);
-
- if (ret < 0)
- return ret;
-
- if (val > UINT8_MAX)
- return -ERANGE;
-
- *value = val;
- return 0;
-}
-
-int
-parser_read_uint8_hex(uint8_t *value, const char *p)
-{
- uint64_t val = 0;
- int ret = parser_read_uint64_hex(&val, p);
-
- if (ret < 0)
- return ret;
-
- if (val > UINT8_MAX)
- return -ERANGE;
-
- *value = val;
- return 0;
-}
-
-int
-parse_tokenize_string(char *string, char *tokens[], uint32_t *n_tokens)
-{
- uint32_t i;
-
- if ((string == NULL) ||
- (tokens == NULL) ||
- (*n_tokens < 1))
- return -EINVAL;
-
- for (i = 0; i < *n_tokens; i++) {
- tokens[i] = strtok_r(string, PARSE_DELIMITER, &string);
- if (tokens[i] == NULL)
- break;
- }
-
- if ((i == *n_tokens) &&
- (NULL != strtok_r(string, PARSE_DELIMITER, &string)))
- return -E2BIG;
-
- *n_tokens = i;
- return 0;
-}
-
-int
-parse_hex_string(char *src, uint8_t *dst, uint32_t *size)
-{
- char *c;
- uint32_t len, i;
-
- /* Check input parameters */
- if ((src == NULL) ||
- (dst == NULL) ||
- (size == NULL) ||
- (*size == 0))
- return -1;
-
- len = strlen(src);
- if (((len & 3) != 0) ||
- (len > (*size) * 2))
- return -1;
- *size = len / 2;
-
- for (c = src; *c != 0; c++) {
- if ((((*c) >= '0') && ((*c) <= '9')) ||
- (((*c) >= 'A') && ((*c) <= 'F')) ||
- (((*c) >= 'a') && ((*c) <= 'f')))
- continue;
-
- return -1;
- }
-
- /* Convert chars to bytes */
- for (i = 0; i < *size; i++)
- dst[i] = get_hex_val(src[2 * i]) * 16 +
- get_hex_val(src[2 * i + 1]);
-
- return 0;
-}
-
-int
-parse_mpls_labels(char *string, uint32_t *labels, uint32_t *n_labels)
-{
- uint32_t n_max_labels = *n_labels, count = 0;
-
- /* Check for void list of labels */
- if (strcmp(string, "<void>") == 0) {
- *n_labels = 0;
- return 0;
- }
-
- /* At least one label should be present */
- for ( ; (*string != '\0'); ) {
- char *next;
- int value;
-
- if (count >= n_max_labels)
- return -1;
-
- if (count > 0) {
- if (string[0] != ':')
- return -1;
-
- string++;
- }
-
- value = strtol(string, &next, 10);
- if (next == string)
- return -1;
- string = next;
-
- labels[count++] = (uint32_t) value;
- }
-
- *n_labels = count;
- return 0;
-}
-
-static struct rte_ether_addr *
-my_ether_aton(const char *a)
-{
- int i;
- char *end;
- unsigned long o[RTE_ETHER_ADDR_LEN];
- static struct rte_ether_addr ether_addr;
-
- i = 0;
- do {
- errno = 0;
- o[i] = strtoul(a, &end, 16);
- if (errno != 0 || end == a || (end[0] != ':' && end[0] != 0))
- return NULL;
- a = end + 1;
- } while (++i != RTE_DIM(o) && end[0] != 0);
-
- /* Junk at the end of line */
- if (end[0] != 0)
- return NULL;
-
- /* Support the format XX:XX:XX:XX:XX:XX */
- if (i == RTE_ETHER_ADDR_LEN) {
- while (i-- != 0) {
- if (o[i] > UINT8_MAX)
- return NULL;
- ether_addr.addr_bytes[i] = (uint8_t)o[i];
- }
- /* Support the format XXXX:XXXX:XXXX */
- } else if (i == RTE_ETHER_ADDR_LEN / 2) {
- while (i-- != 0) {
- if (o[i] > UINT16_MAX)
- return NULL;
- ether_addr.addr_bytes[i * 2] = (uint8_t)(o[i] >> 8);
- ether_addr.addr_bytes[i * 2 + 1] = (uint8_t)(o[i] & 0xff);
- }
- /* unknown format */
- } else
- return NULL;
-
- return (struct rte_ether_addr *)ðer_addr;
-}
-
-int
-parse_ipv4_addr(const char *token, struct in_addr *ipv4)
-{
- if (strlen(token) >= INET_ADDRSTRLEN)
- return -EINVAL;
-
- if (inet_pton(AF_INET, token, ipv4) != 1)
- return -EINVAL;
-
- return 0;
-}
-
-int
-parse_ipv6_addr(const char *token, struct rte_ipv6_addr *ipv6)
-{
- if (strlen(token) >= INET6_ADDRSTRLEN)
- return -EINVAL;
-
- if (inet_pton(AF_INET6, token, ipv6) != 1)
- return -EINVAL;
-
- return 0;
-}
-
-int
-parse_mac_addr(const char *token, struct rte_ether_addr *addr)
-{
- struct rte_ether_addr *tmp;
-
- tmp = my_ether_aton(token);
- if (tmp == NULL)
- return -1;
-
- *addr = *tmp;
- return 0;
-}
-
-int
-parse_cpu_core(const char *entry,
- struct cpu_core_params *p)
-{
- size_t num_len;
- char num[8];
-
- uint32_t s = 0, c = 0, h = 0, val;
- uint8_t s_parsed = 0, c_parsed = 0, h_parsed = 0;
- const char *next = rte_str_skip_leading_spaces(entry);
- char type;
-
- if (p == NULL)
- return -EINVAL;
-
- /* Expect <CORE> or [sX][cY][h]. At least one parameter is required. */
- while (*next != '\0') {
- /* If everything parsed nothing should left */
- if (s_parsed && c_parsed && h_parsed)
- return -EINVAL;
-
- type = *next;
- switch (type) {
- case 's':
- case 'S':
- if (s_parsed || c_parsed || h_parsed)
- return -EINVAL;
- s_parsed = 1;
- next++;
- break;
- case 'c':
- case 'C':
- if (c_parsed || h_parsed)
- return -EINVAL;
- c_parsed = 1;
- next++;
- break;
- case 'h':
- case 'H':
- if (h_parsed)
- return -EINVAL;
- h_parsed = 1;
- next++;
- break;
- default:
- /* If it start from digit it must be only core id. */
- if (!isdigit(*next) || s_parsed || c_parsed || h_parsed)
- return -EINVAL;
-
- type = 'C';
- }
-
- for (num_len = 0; *next != '\0'; next++, num_len++) {
- if (num_len == RTE_DIM(num))
- return -EINVAL;
-
- if (!isdigit(*next))
- break;
-
- num[num_len] = *next;
- }
-
- if (num_len == 0 && type != 'h' && type != 'H')
- return -EINVAL;
-
- if (num_len != 0 && (type == 'h' || type == 'H'))
- return -EINVAL;
-
- num[num_len] = '\0';
- val = strtol(num, NULL, 10);
-
- h = 0;
- switch (type) {
- case 's':
- case 'S':
- s = val;
- break;
- case 'c':
- case 'C':
- c = val;
- break;
- case 'h':
- case 'H':
- h = 1;
- break;
- }
- }
-
- p->socket_id = s;
- p->core_id = c;
- p->thread_id = h;
- return 0;
-}
diff --git a/examples/ip_pipeline/parser.h b/examples/ip_pipeline/parser.h
deleted file mode 100644
index c8f0187d71..0000000000
--- a/examples/ip_pipeline/parser.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2016 Intel Corporation
- */
-
-#ifndef __INCLUDE_PARSER_H__
-#define __INCLUDE_PARSER_H__
-
-#include <ctype.h>
-#include <stdint.h>
-
-#include <rte_ip.h>
-#include <rte_ether.h>
-
-#define PARSE_DELIMITER " \f\n\r\t\v"
-
-static inline size_t
-skip_digits(const char *src)
-{
- size_t i;
-
- for (i = 0; isdigit(src[i]); i++)
- ;
-
- return i;
-}
-
-int parser_read_arg_bool(const char *p);
-
-int parser_read_uint64(uint64_t *value, const char *p);
-int parser_read_uint32(uint32_t *value, const char *p);
-int parser_read_uint16(uint16_t *value, const char *p);
-int parser_read_uint8(uint8_t *value, const char *p);
-
-int parser_read_uint64_hex(uint64_t *value, const char *p);
-int parser_read_uint32_hex(uint32_t *value, const char *p);
-int parser_read_uint16_hex(uint16_t *value, const char *p);
-int parser_read_uint8_hex(uint8_t *value, const char *p);
-
-int parse_hex_string(char *src, uint8_t *dst, uint32_t *size);
-
-int parse_ipv4_addr(const char *token, struct in_addr *ipv4);
-int parse_ipv6_addr(const char *token, struct rte_ipv6_addr *ipv6);
-int parse_mac_addr(const char *token, struct rte_ether_addr *addr);
-int parse_mpls_labels(char *string, uint32_t *labels, uint32_t *n_labels);
-
-struct cpu_core_params {
- uint32_t socket_id;
- uint32_t core_id;
- uint32_t thread_id;
-};
-
-int parse_cpu_core(const char *entry, struct cpu_core_params *p);
-
-int parse_tokenize_string(char *string, char *tokens[], uint32_t *n_tokens);
-
-#endif
diff --git a/examples/ip_pipeline/pipeline.c b/examples/ip_pipeline/pipeline.c
deleted file mode 100644
index 792aab0059..0000000000
--- a/examples/ip_pipeline/pipeline.c
+++ /dev/null
@@ -1,1078 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2018 Intel Corporation
- */
-
-#include <stdlib.h>
-#include <string.h>
-
-#include <rte_common.h>
-#include <rte_ip.h>
-#include <rte_tcp.h>
-
-#include <rte_string_fns.h>
-#include <rte_port_ethdev.h>
-#include <rte_port_ring.h>
-#include <rte_port_source_sink.h>
-#include <rte_port_fd.h>
-#include <rte_port_sched.h>
-#include <rte_port_sym_crypto.h>
-
-#include <rte_table_acl.h>
-#include <rte_table_array.h>
-#include <rte_table_hash.h>
-#include <rte_table_hash_func.h>
-#include <rte_table_lpm.h>
-#include <rte_table_lpm_ipv6.h>
-#include <rte_table_stub.h>
-
-#include "link.h"
-#include "mempool.h"
-#include "pipeline.h"
-#include "tap.h"
-#include "tmgr.h"
-#include "swq.h"
-#include "cryptodev.h"
-
-#ifndef PIPELINE_MSGQ_SIZE
-#define PIPELINE_MSGQ_SIZE 64
-#endif
-
-#ifndef TABLE_LPM_NUMBER_TBL8
-#define TABLE_LPM_NUMBER_TBL8 256
-#endif
-
-static struct pipeline_list pipeline_list;
-
-int
-pipeline_init(void)
-{
- TAILQ_INIT(&pipeline_list);
-
- return 0;
-}
-
-struct pipeline *
-pipeline_find(const char *name)
-{
- struct pipeline *pipeline;
-
- if (name == NULL)
- return NULL;
-
- TAILQ_FOREACH(pipeline, &pipeline_list, node)
- if (strcmp(name, pipeline->name) == 0)
- return pipeline;
-
- return NULL;
-}
-
-struct pipeline *
-pipeline_create(const char *name, struct pipeline_params *params)
-{
- char msgq_name[NAME_MAX];
- struct rte_pipeline_params pp;
- struct pipeline *pipeline;
- struct rte_pipeline *p;
- struct rte_ring *msgq_req;
- struct rte_ring *msgq_rsp;
-
- /* Check input params */
- if ((name == NULL) ||
- pipeline_find(name) ||
- (params == NULL) ||
- (params->timer_period_ms == 0))
- return NULL;
-
- /* Resource create */
- snprintf(msgq_name, sizeof(msgq_name), "%s-MSGQ-REQ", name);
-
- msgq_req = rte_ring_create(msgq_name,
- PIPELINE_MSGQ_SIZE,
- params->cpu_id,
- RING_F_SP_ENQ | RING_F_SC_DEQ);
- if (msgq_req == NULL)
- return NULL;
-
- snprintf(msgq_name, sizeof(msgq_name), "%s-MSGQ-RSP", name);
-
- msgq_rsp = rte_ring_create(msgq_name,
- PIPELINE_MSGQ_SIZE,
- params->cpu_id,
- RING_F_SP_ENQ | RING_F_SC_DEQ);
- if (msgq_rsp == NULL) {
- rte_ring_free(msgq_req);
- return NULL;
- }
-
- pp.name = name;
- pp.socket_id = (int) params->cpu_id;
- pp.offset_port_id = params->offset_port_id;
-
- p = rte_pipeline_create(&pp);
- if (p == NULL) {
- rte_ring_free(msgq_rsp);
- rte_ring_free(msgq_req);
- return NULL;
- }
-
- /* Node allocation */
- pipeline = calloc(1, sizeof(struct pipeline));
- if (pipeline == NULL) {
- rte_pipeline_free(p);
- rte_ring_free(msgq_rsp);
- rte_ring_free(msgq_req);
- return NULL;
- }
-
- /* Node fill in */
- strlcpy(pipeline->name, name, sizeof(pipeline->name));
- pipeline->p = p;
- pipeline->n_ports_in = 0;
- pipeline->n_ports_out = 0;
- pipeline->n_tables = 0;
- pipeline->msgq_req = msgq_req;
- pipeline->msgq_rsp = msgq_rsp;
- pipeline->timer_period_ms = params->timer_period_ms;
- pipeline->enabled = 0;
- pipeline->cpu_id = params->cpu_id;
-
- /* Node add to list */
- TAILQ_INSERT_TAIL(&pipeline_list, pipeline, node);
-
- return pipeline;
-}
-
-int
-pipeline_port_in_create(const char *pipeline_name,
- struct port_in_params *params,
- int enabled)
-{
- struct rte_pipeline_port_in_params p;
-
- union {
- struct rte_port_ethdev_reader_params ethdev;
- struct rte_port_ring_reader_params ring;
- struct rte_port_sched_reader_params sched;
- struct rte_port_fd_reader_params fd;
- struct rte_port_source_params source;
- struct rte_port_sym_crypto_reader_params sym_crypto;
- } pp;
-
- struct pipeline *pipeline;
- struct port_in *port_in;
- struct port_in_action_profile *ap;
- struct rte_port_in_action *action;
- uint32_t port_id;
- int status;
-
- memset(&p, 0, sizeof(p));
- memset(&pp, 0, sizeof(pp));
-
- /* Check input params */
- if ((pipeline_name == NULL) ||
- (params == NULL) ||
- (params->burst_size == 0) ||
- (params->burst_size > RTE_PORT_IN_BURST_SIZE_MAX))
- return -1;
-
- pipeline = pipeline_find(pipeline_name);
- if (pipeline == NULL)
- return -1;
-
- ap = NULL;
- if (params->action_profile_name) {
- ap = port_in_action_profile_find(params->action_profile_name);
- if (ap == NULL)
- return -1;
- }
-
- switch (params->type) {
- case PORT_IN_RXQ:
- {
- struct link *link;
-
- link = link_find(params->dev_name);
- if (link == NULL)
- return -1;
-
- if (params->rxq.queue_id >= link->n_rxq)
- return -1;
-
- pp.ethdev.port_id = link->port_id;
- pp.ethdev.queue_id = params->rxq.queue_id;
-
- p.ops = &rte_port_ethdev_reader_ops;
- p.arg_create = &pp.ethdev;
- break;
- }
-
- case PORT_IN_SWQ:
- {
- struct swq *swq;
-
- swq = swq_find(params->dev_name);
- if (swq == NULL)
- return -1;
-
- pp.ring.ring = swq->r;
-
- p.ops = &rte_port_ring_reader_ops;
- p.arg_create = &pp.ring;
- break;
- }
-
- case PORT_IN_TMGR:
- {
- struct tmgr_port *tmgr_port;
-
- tmgr_port = tmgr_port_find(params->dev_name);
- if (tmgr_port == NULL)
- return -1;
-
- pp.sched.sched = tmgr_port->s;
-
- p.ops = &rte_port_sched_reader_ops;
- p.arg_create = &pp.sched;
- break;
- }
-
- case PORT_IN_TAP:
- {
- struct tap *tap;
- struct mempool *mempool;
-
- tap = tap_find(params->dev_name);
- mempool = mempool_find(params->tap.mempool_name);
- if ((tap == NULL) || (mempool == NULL))
- return -1;
-
- pp.fd.fd = tap->fd;
- pp.fd.mempool = mempool->m;
- pp.fd.mtu = params->tap.mtu;
-
- p.ops = &rte_port_fd_reader_ops;
- p.arg_create = &pp.fd;
- break;
- }
-
-
- case PORT_IN_SOURCE:
- {
- struct mempool *mempool;
-
- mempool = mempool_find(params->source.mempool_name);
- if (mempool == NULL)
- return -1;
-
- pp.source.mempool = mempool->m;
- pp.source.file_name = params->source.file_name;
- pp.source.n_bytes_per_pkt = params->source.n_bytes_per_pkt;
-
- p.ops = &rte_port_source_ops;
- p.arg_create = &pp.source;
- break;
- }
-
- case PORT_IN_CRYPTODEV:
- {
- struct cryptodev *cryptodev;
-
- cryptodev = cryptodev_find(params->dev_name);
- if (cryptodev == NULL)
- return -1;
-
- if (params->rxq.queue_id > cryptodev->n_queues - 1)
- return -1;
-
- pp.sym_crypto.cryptodev_id = cryptodev->dev_id;
- pp.sym_crypto.queue_id = params->cryptodev.queue_id;
- pp.sym_crypto.f_callback = params->cryptodev.f_callback;
- pp.sym_crypto.arg_callback = params->cryptodev.arg_callback;
- p.ops = &rte_port_sym_crypto_reader_ops;
- p.arg_create = &pp.sym_crypto;
-
- break;
- }
-
- default:
- return -1;
- }
-
- p.burst_size = params->burst_size;
-
- /* Resource create */
- action = NULL;
- p.f_action = NULL;
- p.arg_ah = NULL;
-
- if (ap) {
- action = rte_port_in_action_create(ap->ap,
- pipeline->cpu_id);
- if (action == NULL)
- return -1;
-
- status = rte_port_in_action_params_get(
- action,
- &p);
- if (status) {
- rte_port_in_action_free(action);
- return -1;
- }
- }
-
- status = rte_pipeline_port_in_create(pipeline->p,
- &p,
- &port_id);
- if (status) {
- rte_port_in_action_free(action);
- return -1;
- }
-
- if (enabled)
- rte_pipeline_port_in_enable(pipeline->p, port_id);
-
- /* Pipeline */
- port_in = &pipeline->port_in[pipeline->n_ports_in];
- memcpy(&port_in->params, params, sizeof(*params));
- port_in->ap = ap;
- port_in->a = action;
- pipeline->n_ports_in++;
-
- return 0;
-}
-
-int
-pipeline_port_in_connect_to_table(const char *pipeline_name,
- uint32_t port_id,
- uint32_t table_id)
-{
- struct pipeline *pipeline;
- int status;
-
- /* Check input params */
- if (pipeline_name == NULL)
- return -1;
-
- pipeline = pipeline_find(pipeline_name);
- if ((pipeline == NULL) ||
- (port_id >= pipeline->n_ports_in) ||
- (table_id >= pipeline->n_tables))
- return -1;
-
- /* Resource */
- status = rte_pipeline_port_in_connect_to_table(pipeline->p,
- port_id,
- table_id);
-
- return status;
-
-}
-
-int
-pipeline_port_out_create(const char *pipeline_name,
- struct port_out_params *params)
-{
- struct rte_pipeline_port_out_params p;
-
- union {
- struct rte_port_ethdev_writer_params ethdev;
- struct rte_port_ring_writer_params ring;
- struct rte_port_sched_writer_params sched;
- struct rte_port_fd_writer_params fd;
- struct rte_port_sink_params sink;
- struct rte_port_sym_crypto_writer_params sym_crypto;
- } pp;
-
- union {
- struct rte_port_ethdev_writer_nodrop_params ethdev;
- struct rte_port_ring_writer_nodrop_params ring;
- struct rte_port_fd_writer_nodrop_params fd;
- struct rte_port_sym_crypto_writer_nodrop_params sym_crypto;
- } pp_nodrop;
-
- struct pipeline *pipeline;
- uint32_t port_id;
- int status;
-
- memset(&p, 0, sizeof(p));
- memset(&pp, 0, sizeof(pp));
- memset(&pp_nodrop, 0, sizeof(pp_nodrop));
-
- /* Check input params */
- if ((pipeline_name == NULL) ||
- (params == NULL) ||
- (params->burst_size == 0) ||
- (params->burst_size > RTE_PORT_IN_BURST_SIZE_MAX))
- return -1;
-
- pipeline = pipeline_find(pipeline_name);
- if (pipeline == NULL)
- return -1;
-
- switch (params->type) {
- case PORT_OUT_TXQ:
- {
- struct link *link;
-
- link = link_find(params->dev_name);
- if (link == NULL)
- return -1;
-
- if (params->txq.queue_id >= link->n_txq)
- return -1;
-
- pp.ethdev.port_id = link->port_id;
- pp.ethdev.queue_id = params->txq.queue_id;
- pp.ethdev.tx_burst_sz = params->burst_size;
-
- pp_nodrop.ethdev.port_id = link->port_id;
- pp_nodrop.ethdev.queue_id = params->txq.queue_id;
- pp_nodrop.ethdev.tx_burst_sz = params->burst_size;
- pp_nodrop.ethdev.n_retries = params->n_retries;
-
- if (params->retry == 0) {
- p.ops = &rte_port_ethdev_writer_ops;
- p.arg_create = &pp.ethdev;
- } else {
- p.ops = &rte_port_ethdev_writer_nodrop_ops;
- p.arg_create = &pp_nodrop.ethdev;
- }
- break;
- }
-
- case PORT_OUT_SWQ:
- {
- struct swq *swq;
-
- swq = swq_find(params->dev_name);
- if (swq == NULL)
- return -1;
-
- pp.ring.ring = swq->r;
- pp.ring.tx_burst_sz = params->burst_size;
-
- pp_nodrop.ring.ring = swq->r;
- pp_nodrop.ring.tx_burst_sz = params->burst_size;
- pp_nodrop.ring.n_retries = params->n_retries;
-
- if (params->retry == 0) {
- p.ops = &rte_port_ring_writer_ops;
- p.arg_create = &pp.ring;
- } else {
- p.ops = &rte_port_ring_writer_nodrop_ops;
- p.arg_create = &pp_nodrop.ring;
- }
- break;
- }
-
- case PORT_OUT_TMGR:
- {
- struct tmgr_port *tmgr_port;
-
- tmgr_port = tmgr_port_find(params->dev_name);
- if (tmgr_port == NULL)
- return -1;
-
- pp.sched.sched = tmgr_port->s;
- pp.sched.tx_burst_sz = params->burst_size;
-
- p.ops = &rte_port_sched_writer_ops;
- p.arg_create = &pp.sched;
- break;
- }
-
- case PORT_OUT_TAP:
- {
- struct tap *tap;
-
- tap = tap_find(params->dev_name);
- if (tap == NULL)
- return -1;
-
- pp.fd.fd = tap->fd;
- pp.fd.tx_burst_sz = params->burst_size;
-
- pp_nodrop.fd.fd = tap->fd;
- pp_nodrop.fd.tx_burst_sz = params->burst_size;
- pp_nodrop.fd.n_retries = params->n_retries;
-
- if (params->retry == 0) {
- p.ops = &rte_port_fd_writer_ops;
- p.arg_create = &pp.fd;
- } else {
- p.ops = &rte_port_fd_writer_nodrop_ops;
- p.arg_create = &pp_nodrop.fd;
- }
- break;
- }
-
-
- case PORT_OUT_SINK:
- {
- pp.sink.file_name = params->sink.file_name;
- pp.sink.max_n_pkts = params->sink.max_n_pkts;
-
- p.ops = &rte_port_sink_ops;
- p.arg_create = &pp.sink;
- break;
- }
-
- case PORT_OUT_CRYPTODEV:
- {
- struct cryptodev *cryptodev;
-
- cryptodev = cryptodev_find(params->dev_name);
- if (cryptodev == NULL)
- return -1;
-
- if (params->cryptodev.queue_id >= cryptodev->n_queues)
- return -1;
-
- pp.sym_crypto.cryptodev_id = cryptodev->dev_id;
- pp.sym_crypto.queue_id = params->cryptodev.queue_id;
- pp.sym_crypto.tx_burst_sz = params->burst_size;
- pp.sym_crypto.crypto_op_offset = params->cryptodev.op_offset;
-
- pp_nodrop.sym_crypto.cryptodev_id = cryptodev->dev_id;
- pp_nodrop.sym_crypto.queue_id = params->cryptodev.queue_id;
- pp_nodrop.sym_crypto.tx_burst_sz = params->burst_size;
- pp_nodrop.sym_crypto.n_retries = params->retry;
- pp_nodrop.sym_crypto.crypto_op_offset =
- params->cryptodev.op_offset;
-
- if (params->retry == 0) {
- p.ops = &rte_port_sym_crypto_writer_ops;
- p.arg_create = &pp.sym_crypto;
- } else {
- p.ops = &rte_port_sym_crypto_writer_nodrop_ops;
- p.arg_create = &pp_nodrop.sym_crypto;
- }
-
- break;
- }
-
- default:
- return -1;
- }
-
- p.f_action = NULL;
- p.arg_ah = NULL;
-
- /* Resource create */
- status = rte_pipeline_port_out_create(pipeline->p,
- &p,
- &port_id);
-
- if (status)
- return -1;
-
- /* Pipeline */
- pipeline->n_ports_out++;
-
- return 0;
-}
-
-static const struct rte_acl_field_def table_acl_field_format_ipv4[] = {
- /* Protocol */
- [0] = {
- .type = RTE_ACL_FIELD_TYPE_BITMASK,
- .size = sizeof(uint8_t),
- .field_index = 0,
- .input_index = 0,
- .offset = offsetof(struct rte_ipv4_hdr, next_proto_id),
- },
-
- /* Source IP address (IPv4) */
- [1] = {
- .type = RTE_ACL_FIELD_TYPE_MASK,
- .size = sizeof(uint32_t),
- .field_index = 1,
- .input_index = 1,
- .offset = offsetof(struct rte_ipv4_hdr, src_addr),
- },
-
- /* Destination IP address (IPv4) */
- [2] = {
- .type = RTE_ACL_FIELD_TYPE_MASK,
- .size = sizeof(uint32_t),
- .field_index = 2,
- .input_index = 2,
- .offset = offsetof(struct rte_ipv4_hdr, dst_addr),
- },
-
- /* Source Port */
- [3] = {
- .type = RTE_ACL_FIELD_TYPE_RANGE,
- .size = sizeof(uint16_t),
- .field_index = 3,
- .input_index = 3,
- .offset = sizeof(struct rte_ipv4_hdr) +
- offsetof(struct rte_tcp_hdr, src_port),
- },
-
- /* Destination Port */
- [4] = {
- .type = RTE_ACL_FIELD_TYPE_RANGE,
- .size = sizeof(uint16_t),
- .field_index = 4,
- .input_index = 3,
- .offset = sizeof(struct rte_ipv4_hdr) +
- offsetof(struct rte_tcp_hdr, dst_port),
- },
-};
-
-static const struct rte_acl_field_def table_acl_field_format_ipv6[] = {
- /* Protocol */
- [0] = {
- .type = RTE_ACL_FIELD_TYPE_BITMASK,
- .size = sizeof(uint8_t),
- .field_index = 0,
- .input_index = 0,
- .offset = offsetof(struct rte_ipv6_hdr, proto),
- },
-
- /* Source IP address (IPv6) */
- [1] = {
- .type = RTE_ACL_FIELD_TYPE_MASK,
- .size = sizeof(uint32_t),
- .field_index = 1,
- .input_index = 1,
- .offset = offsetof(struct rte_ipv6_hdr, src_addr.a[0]),
- },
-
- [2] = {
- .type = RTE_ACL_FIELD_TYPE_MASK,
- .size = sizeof(uint32_t),
- .field_index = 2,
- .input_index = 2,
- .offset = offsetof(struct rte_ipv6_hdr, src_addr.a[4]),
- },
-
- [3] = {
- .type = RTE_ACL_FIELD_TYPE_MASK,
- .size = sizeof(uint32_t),
- .field_index = 3,
- .input_index = 3,
- .offset = offsetof(struct rte_ipv6_hdr, src_addr.a[8]),
- },
-
- [4] = {
- .type = RTE_ACL_FIELD_TYPE_MASK,
- .size = sizeof(uint32_t),
- .field_index = 4,
- .input_index = 4,
- .offset = offsetof(struct rte_ipv6_hdr, src_addr.a[12]),
- },
-
- /* Destination IP address (IPv6) */
- [5] = {
- .type = RTE_ACL_FIELD_TYPE_MASK,
- .size = sizeof(uint32_t),
- .field_index = 5,
- .input_index = 5,
- .offset = offsetof(struct rte_ipv6_hdr, dst_addr.a[0]),
- },
-
- [6] = {
- .type = RTE_ACL_FIELD_TYPE_MASK,
- .size = sizeof(uint32_t),
- .field_index = 6,
- .input_index = 6,
- .offset = offsetof(struct rte_ipv6_hdr, dst_addr.a[4]),
- },
-
- [7] = {
- .type = RTE_ACL_FIELD_TYPE_MASK,
- .size = sizeof(uint32_t),
- .field_index = 7,
- .input_index = 7,
- .offset = offsetof(struct rte_ipv6_hdr, dst_addr.a[8]),
- },
-
- [8] = {
- .type = RTE_ACL_FIELD_TYPE_MASK,
- .size = sizeof(uint32_t),
- .field_index = 8,
- .input_index = 8,
- .offset = offsetof(struct rte_ipv6_hdr, dst_addr.a[12]),
- },
-
- /* Source Port */
- [9] = {
- .type = RTE_ACL_FIELD_TYPE_RANGE,
- .size = sizeof(uint16_t),
- .field_index = 9,
- .input_index = 9,
- .offset = sizeof(struct rte_ipv6_hdr) +
- offsetof(struct rte_tcp_hdr, src_port),
- },
-
- /* Destination Port */
- [10] = {
- .type = RTE_ACL_FIELD_TYPE_RANGE,
- .size = sizeof(uint16_t),
- .field_index = 10,
- .input_index = 9,
- .offset = sizeof(struct rte_ipv6_hdr) +
- offsetof(struct rte_tcp_hdr, dst_port),
- },
-};
-
-int
-pipeline_table_create(const char *pipeline_name,
- struct table_params *params)
-{
- char name[NAME_MAX];
- struct rte_pipeline_table_params p;
-
- union {
- struct rte_table_acl_params acl;
- struct rte_table_array_params array;
- struct rte_table_hash_params hash;
- struct rte_table_lpm_params lpm;
- struct rte_table_lpm_ipv6_params lpm_ipv6;
- } pp;
-
- struct pipeline *pipeline;
- struct table *table;
- struct table_action_profile *ap;
- struct rte_table_action *action;
- uint32_t table_id;
- int status;
-
- memset(&p, 0, sizeof(p));
- memset(&pp, 0, sizeof(pp));
-
- /* Check input params */
- if ((pipeline_name == NULL) ||
- (params == NULL))
- return -1;
-
- pipeline = pipeline_find(pipeline_name);
- if ((pipeline == NULL) ||
- (pipeline->n_tables >= RTE_PIPELINE_TABLE_MAX))
- return -1;
-
- ap = NULL;
- if (params->action_profile_name) {
- ap = table_action_profile_find(params->action_profile_name);
- if (ap == NULL)
- return -1;
- }
-
- snprintf(name, NAME_MAX, "%s_table%u",
- pipeline_name, pipeline->n_tables);
-
- switch (params->match_type) {
- case TABLE_ACL:
- {
- uint32_t ip_header_offset = params->match.acl.ip_header_offset -
- (sizeof(struct rte_mbuf) + RTE_PKTMBUF_HEADROOM);
- uint32_t i;
-
- if (params->match.acl.n_rules == 0)
- return -1;
-
- pp.acl.name = name;
- pp.acl.n_rules = params->match.acl.n_rules;
- if (params->match.acl.ip_version) {
- memcpy(&pp.acl.field_format,
- &table_acl_field_format_ipv4,
- sizeof(table_acl_field_format_ipv4));
- pp.acl.n_rule_fields =
- RTE_DIM(table_acl_field_format_ipv4);
- } else {
- memcpy(&pp.acl.field_format,
- &table_acl_field_format_ipv6,
- sizeof(table_acl_field_format_ipv6));
- pp.acl.n_rule_fields =
- RTE_DIM(table_acl_field_format_ipv6);
- }
-
- for (i = 0; i < pp.acl.n_rule_fields; i++)
- pp.acl.field_format[i].offset += ip_header_offset;
-
- p.ops = &rte_table_acl_ops;
- p.arg_create = &pp.acl;
- break;
- }
-
- case TABLE_ARRAY:
- {
- if (params->match.array.n_keys == 0)
- return -1;
-
- pp.array.n_entries = params->match.array.n_keys;
- pp.array.offset = params->match.array.key_offset;
-
- p.ops = &rte_table_array_ops;
- p.arg_create = &pp.array;
- break;
- }
-
- case TABLE_HASH:
- {
- struct rte_table_ops *ops;
- rte_table_hash_op_hash f_hash;
-
- if (params->match.hash.n_keys == 0)
- return -1;
-
- switch (params->match.hash.key_size) {
- case 8:
- f_hash = rte_table_hash_crc_key8;
- break;
- case 16:
- f_hash = rte_table_hash_crc_key16;
- break;
- case 24:
- f_hash = rte_table_hash_crc_key24;
- break;
- case 32:
- f_hash = rte_table_hash_crc_key32;
- break;
- case 40:
- f_hash = rte_table_hash_crc_key40;
- break;
- case 48:
- f_hash = rte_table_hash_crc_key48;
- break;
- case 56:
- f_hash = rte_table_hash_crc_key56;
- break;
- case 64:
- f_hash = rte_table_hash_crc_key64;
- break;
- default:
- return -1;
- }
-
- pp.hash.name = name;
- pp.hash.key_size = params->match.hash.key_size;
- pp.hash.key_offset = params->match.hash.key_offset;
- pp.hash.key_mask = params->match.hash.key_mask;
- pp.hash.n_keys = params->match.hash.n_keys;
- pp.hash.n_buckets = params->match.hash.n_buckets;
- pp.hash.f_hash = f_hash;
- pp.hash.seed = 0;
-
- if (params->match.hash.extendable_bucket)
- switch (params->match.hash.key_size) {
- case 8:
- ops = &rte_table_hash_key8_ext_ops;
- break;
- case 16:
- ops = &rte_table_hash_key16_ext_ops;
- break;
- default:
- ops = &rte_table_hash_ext_ops;
- }
- else
- switch (params->match.hash.key_size) {
- case 8:
- ops = &rte_table_hash_key8_lru_ops;
- break;
- case 16:
- ops = &rte_table_hash_key16_lru_ops;
- break;
- default:
- ops = &rte_table_hash_lru_ops;
- }
-
- p.ops = ops;
- p.arg_create = &pp.hash;
- break;
- }
-
- case TABLE_LPM:
- {
- if (params->match.lpm.n_rules == 0)
- return -1;
-
- switch (params->match.lpm.key_size) {
- case 4:
- {
- pp.lpm.name = name;
- pp.lpm.n_rules = params->match.lpm.n_rules;
- pp.lpm.number_tbl8s = TABLE_LPM_NUMBER_TBL8;
- pp.lpm.flags = 0;
- pp.lpm.entry_unique_size = p.action_data_size +
- sizeof(struct rte_pipeline_table_entry);
- pp.lpm.offset = params->match.lpm.key_offset;
-
- p.ops = &rte_table_lpm_ops;
- p.arg_create = &pp.lpm;
- break;
- }
-
- case 16:
- {
- pp.lpm_ipv6.name = name;
- pp.lpm_ipv6.n_rules = params->match.lpm.n_rules;
- pp.lpm_ipv6.number_tbl8s = TABLE_LPM_NUMBER_TBL8;
- pp.lpm_ipv6.entry_unique_size = p.action_data_size +
- sizeof(struct rte_pipeline_table_entry);
- pp.lpm_ipv6.offset = params->match.lpm.key_offset;
-
- p.ops = &rte_table_lpm_ipv6_ops;
- p.arg_create = &pp.lpm_ipv6;
- break;
- }
-
- default:
- return -1;
- }
-
- break;
- }
-
- case TABLE_STUB:
- {
- p.ops = &rte_table_stub_ops;
- p.arg_create = NULL;
- break;
- }
-
- default:
- return -1;
- }
-
- /* Resource create */
- action = NULL;
- p.f_action_hit = NULL;
- p.f_action_miss = NULL;
- p.arg_ah = NULL;
-
- if (ap) {
- action = rte_table_action_create(ap->ap,
- pipeline->cpu_id);
- if (action == NULL)
- return -1;
-
- status = rte_table_action_table_params_get(
- action,
- &p);
- if (status ||
- ((p.action_data_size +
- sizeof(struct rte_pipeline_table_entry)) >
- TABLE_RULE_ACTION_SIZE_MAX)) {
- rte_table_action_free(action);
- return -1;
- }
- }
-
- if (params->match_type == TABLE_LPM) {
- if (params->match.lpm.key_size == 4)
- pp.lpm.entry_unique_size = p.action_data_size +
- sizeof(struct rte_pipeline_table_entry);
-
- if (params->match.lpm.key_size == 16)
- pp.lpm_ipv6.entry_unique_size = p.action_data_size +
- sizeof(struct rte_pipeline_table_entry);
- }
-
- status = rte_pipeline_table_create(pipeline->p,
- &p,
- &table_id);
- if (status) {
- rte_table_action_free(action);
- return -1;
- }
-
- /* Pipeline */
- table = &pipeline->table[pipeline->n_tables];
- memcpy(&table->params, params, sizeof(*params));
- table->ap = ap;
- table->a = action;
- TAILQ_INIT(&table->rules);
- table->rule_default = NULL;
-
- pipeline->n_tables++;
-
- return 0;
-}
-
-struct table_rule *
-table_rule_find(struct table *table,
- struct table_rule_match *match)
-{
- struct table_rule *rule;
-
- TAILQ_FOREACH(rule, &table->rules, node)
- if (memcmp(&rule->match, match, sizeof(*match)) == 0)
- return rule;
-
- return NULL;
-}
-
-void
-table_rule_add(struct table *table,
- struct table_rule *new_rule)
-{
- struct table_rule *existing_rule;
-
- existing_rule = table_rule_find(table, &new_rule->match);
- if (existing_rule == NULL)
- TAILQ_INSERT_TAIL(&table->rules, new_rule, node);
- else {
- TAILQ_INSERT_AFTER(&table->rules, existing_rule, new_rule, node);
- TAILQ_REMOVE(&table->rules, existing_rule, node);
- free(existing_rule);
- }
-}
-
-void
-table_rule_add_bulk(struct table *table,
- struct table_rule_list *list,
- uint32_t n_rules)
-{
- uint32_t i;
-
- for (i = 0; i < n_rules; i++) {
- struct table_rule *existing_rule, *new_rule;
-
- new_rule = TAILQ_FIRST(list);
- if (new_rule == NULL)
- break;
-
- TAILQ_REMOVE(list, new_rule, node);
-
- existing_rule = table_rule_find(table, &new_rule->match);
- if (existing_rule == NULL)
- TAILQ_INSERT_TAIL(&table->rules, new_rule, node);
- else {
- TAILQ_INSERT_AFTER(&table->rules, existing_rule, new_rule, node);
- TAILQ_REMOVE(&table->rules, existing_rule, node);
- free(existing_rule);
- }
- }
-}
-
-void
-table_rule_delete(struct table *table,
- struct table_rule_match *match)
-{
- struct table_rule *rule;
-
- rule = table_rule_find(table, match);
- if (rule == NULL)
- return;
-
- TAILQ_REMOVE(&table->rules, rule, node);
- free(rule);
-}
-
-void
-table_rule_default_add(struct table *table,
- struct table_rule *rule)
-{
- free(table->rule_default);
- table->rule_default = rule;
-}
-
-void
-table_rule_default_delete(struct table *table)
-{
- free(table->rule_default);
- table->rule_default = NULL;
-}
diff --git a/examples/ip_pipeline/pipeline.h b/examples/ip_pipeline/pipeline.h
deleted file mode 100644
index 89696480fc..0000000000
--- a/examples/ip_pipeline/pipeline.h
+++ /dev/null
@@ -1,425 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2018 Intel Corporation
- */
-
-#ifndef _INCLUDE_PIPELINE_H_
-#define _INCLUDE_PIPELINE_H_
-
-#include <stdint.h>
-#include <sys/queue.h>
-
-#include <rte_pipeline.h>
-#include <rte_table_action.h>
-
-#include "common.h"
-#include "action.h"
-
-struct pipeline_params {
- uint32_t timer_period_ms;
- uint32_t offset_port_id;
- uint32_t cpu_id;
-};
-
-enum port_in_type {
- PORT_IN_RXQ,
- PORT_IN_SWQ,
- PORT_IN_TMGR,
- PORT_IN_TAP,
- PORT_IN_SOURCE,
- PORT_IN_CRYPTODEV,
-};
-
-struct port_in_params {
- /* Read */
- enum port_in_type type;
- const char *dev_name;
- union {
- struct {
- uint16_t queue_id;
- } rxq;
-
- struct {
- const char *mempool_name;
- uint32_t mtu;
- } tap;
-
- struct {
- const char *mempool_name;
- const char *file_name;
- uint32_t n_bytes_per_pkt;
- } source;
-
- struct {
- uint16_t queue_id;
- void *f_callback;
- void *arg_callback;
- } cryptodev;
- };
- uint32_t burst_size;
-
- /* Action */
- const char *action_profile_name;
-};
-
-enum port_out_type {
- PORT_OUT_TXQ,
- PORT_OUT_SWQ,
- PORT_OUT_TMGR,
- PORT_OUT_TAP,
- PORT_OUT_SINK,
- PORT_OUT_CRYPTODEV,
-};
-
-struct port_out_params {
- enum port_out_type type;
- const char *dev_name;
- union {
- struct {
- uint16_t queue_id;
- } txq;
-
- struct {
- const char *file_name;
- uint32_t max_n_pkts;
- } sink;
-
- struct {
- uint16_t queue_id;
- uint32_t op_offset;
- } cryptodev;
- };
- uint32_t burst_size;
- int retry;
- uint32_t n_retries;
-};
-
-enum table_type {
- TABLE_ACL,
- TABLE_ARRAY,
- TABLE_HASH,
- TABLE_LPM,
- TABLE_STUB,
-};
-
-struct table_acl_params {
- uint32_t n_rules;
- uint32_t ip_header_offset;
- int ip_version;
-};
-
-struct table_array_params {
- uint32_t n_keys;
- uint32_t key_offset;
-};
-
-struct table_hash_params {
- uint32_t n_keys;
- uint32_t key_offset;
- uint32_t key_size;
- uint8_t *key_mask;
- uint32_t n_buckets;
- int extendable_bucket;
-};
-
-struct table_lpm_params {
- uint32_t n_rules;
- uint32_t key_offset;
- uint32_t key_size;
-};
-
-struct table_params {
- /* Match */
- enum table_type match_type;
- union {
- struct table_acl_params acl;
- struct table_array_params array;
- struct table_hash_params hash;
- struct table_lpm_params lpm;
- } match;
-
- /* Action */
- const char *action_profile_name;
-};
-
-struct table_rule;
-
-TAILQ_HEAD(table_rule_list, table_rule);
-
-struct port_in {
- struct port_in_params params;
- struct port_in_action_profile *ap;
- struct rte_port_in_action *a;
-};
-
-struct table {
- struct table_params params;
- struct table_action_profile *ap;
- struct rte_table_action *a;
- struct table_rule_list rules;
- struct table_rule *rule_default;
-};
-
-struct pipeline {
- TAILQ_ENTRY(pipeline) node;
- char name[NAME_SIZE];
-
- struct rte_pipeline *p;
- struct port_in port_in[RTE_PIPELINE_PORT_IN_MAX];
- struct table table[RTE_PIPELINE_TABLE_MAX];
- uint32_t n_ports_in;
- uint32_t n_ports_out;
- uint32_t n_tables;
-
- struct rte_ring *msgq_req;
- struct rte_ring *msgq_rsp;
- uint32_t timer_period_ms;
-
- int enabled;
- uint32_t thread_id;
- uint32_t cpu_id;
-};
-
-TAILQ_HEAD(pipeline_list, pipeline);
-
-int
-pipeline_init(void);
-
-struct pipeline *
-pipeline_find(const char *name);
-
-struct pipeline *
-pipeline_create(const char *name, struct pipeline_params *params);
-
-int
-pipeline_port_in_create(const char *pipeline_name,
- struct port_in_params *params,
- int enabled);
-
-int
-pipeline_port_in_connect_to_table(const char *pipeline_name,
- uint32_t port_id,
- uint32_t table_id);
-
-int
-pipeline_port_out_create(const char *pipeline_name,
- struct port_out_params *params);
-
-int
-pipeline_table_create(const char *pipeline_name,
- struct table_params *params);
-
-struct table_rule_match_acl {
- int ip_version;
-
- union {
- struct {
- uint32_t sa;
- uint32_t da;
- } ipv4;
-
- struct {
- struct rte_ipv6_addr sa;
- struct rte_ipv6_addr da;
- } ipv6;
- };
-
- uint32_t sa_depth;
- uint32_t da_depth;
- uint16_t sp0;
- uint16_t sp1;
- uint16_t dp0;
- uint16_t dp1;
- uint8_t proto;
- uint8_t proto_mask;
- uint32_t priority;
-};
-
-struct table_rule_match_array {
- uint32_t pos;
-};
-
-#ifndef TABLE_RULE_MATCH_SIZE_MAX
-#define TABLE_RULE_MATCH_SIZE_MAX 256
-#endif
-
-#ifndef TABLE_RULE_ACTION_SIZE_MAX
-#define TABLE_RULE_ACTION_SIZE_MAX 2048
-#endif
-
-struct table_rule_match_hash {
- uint8_t key[TABLE_RULE_MATCH_SIZE_MAX];
-};
-
-struct table_rule_match_lpm {
- int ip_version;
-
- union {
- uint32_t ipv4;
- struct rte_ipv6_addr ipv6;
- };
-
- uint8_t depth;
-};
-
-struct table_rule_match {
- enum table_type match_type;
-
- union {
- struct table_rule_match_acl acl;
- struct table_rule_match_array array;
- struct table_rule_match_hash hash;
- struct table_rule_match_lpm lpm;
- } match;
-};
-
-#ifndef SYM_CRYPTO_MAX_KEY_SIZE
-#define SYM_CRYPTO_MAX_KEY_SIZE (256)
-#endif
-
-struct table_rule_action {
- uint64_t action_mask;
- struct rte_table_action_fwd_params fwd;
- struct rte_table_action_lb_params lb;
- struct rte_table_action_mtr_params mtr;
- struct rte_table_action_tm_params tm;
- struct rte_table_action_encap_params encap;
- struct rte_table_action_nat_params nat;
- struct rte_table_action_ttl_params ttl;
- struct rte_table_action_stats_params stats;
- struct rte_table_action_time_params time;
- struct rte_table_action_sym_crypto_params sym_crypto;
- uint8_t sym_crypto_key[SYM_CRYPTO_MAX_KEY_SIZE];
- struct rte_table_action_tag_params tag;
- struct rte_table_action_decap_params decap;
-
-};
-
-struct table_rule {
- TAILQ_ENTRY(table_rule) node;
- struct table_rule_match match;
- struct table_rule_action action;
- void *data;
-};
-
-int
-pipeline_port_in_stats_read(const char *pipeline_name,
- uint32_t port_id,
- struct rte_pipeline_port_in_stats *stats,
- int clear);
-
-int
-pipeline_port_in_enable(const char *pipeline_name,
- uint32_t port_id);
-
-int
-pipeline_port_in_disable(const char *pipeline_name,
- uint32_t port_id);
-
-int
-pipeline_port_out_stats_read(const char *pipeline_name,
- uint32_t port_id,
- struct rte_pipeline_port_out_stats *stats,
- int clear);
-
-int
-pipeline_table_stats_read(const char *pipeline_name,
- uint32_t table_id,
- struct rte_pipeline_table_stats *stats,
- int clear);
-
-int
-pipeline_table_rule_add(const char *pipeline_name,
- uint32_t table_id,
- struct table_rule_match *match,
- struct table_rule_action *action);
-
-int
-pipeline_table_rule_add_bulk(const char *pipeline_name,
- uint32_t table_id,
- struct table_rule_list *list,
- uint32_t *n_rules_added,
- uint32_t *n_rules_not_added);
-
-int
-pipeline_table_rule_add_default(const char *pipeline_name,
- uint32_t table_id,
- struct table_rule_action *action);
-
-int
-pipeline_table_rule_delete(const char *pipeline_name,
- uint32_t table_id,
- struct table_rule_match *match);
-
-int
-pipeline_table_rule_delete_default(const char *pipeline_name,
- uint32_t table_id);
-
-int
-pipeline_table_rule_stats_read(const char *pipeline_name,
- uint32_t table_id,
- struct table_rule_match *match,
- struct rte_table_action_stats_counters *stats,
- int clear);
-
-int
-pipeline_table_mtr_profile_add(const char *pipeline_name,
- uint32_t table_id,
- uint32_t meter_profile_id,
- struct rte_table_action_meter_profile *profile);
-
-int
-pipeline_table_mtr_profile_delete(const char *pipeline_name,
- uint32_t table_id,
- uint32_t meter_profile_id);
-
-int
-pipeline_table_rule_mtr_read(const char *pipeline_name,
- uint32_t table_id,
- struct table_rule_match *match,
- struct rte_table_action_mtr_counters *stats,
- int clear);
-
-int
-pipeline_table_dscp_table_update(const char *pipeline_name,
- uint32_t table_id,
- uint64_t dscp_mask,
- struct rte_table_action_dscp_table *dscp_table);
-
-int
-pipeline_table_rule_ttl_read(const char *pipeline_name,
- uint32_t table_id,
- struct table_rule_match *match,
- struct rte_table_action_ttl_counters *stats,
- int clear);
-
-int
-pipeline_table_rule_time_read(const char *pipeline_name,
- uint32_t table_id,
- struct table_rule_match *match,
- uint64_t *timestamp);
-
-struct table_rule *
-table_rule_find(struct table *table,
- struct table_rule_match *match);
-
-void
-table_rule_add(struct table *table,
- struct table_rule *rule);
-
-void
-table_rule_add_bulk(struct table *table,
- struct table_rule_list *list,
- uint32_t n_rules);
-
-void
-table_rule_delete(struct table *table,
- struct table_rule_match *match);
-
-void
-table_rule_default_add(struct table *table,
- struct table_rule *rule);
-
-void
-table_rule_default_delete(struct table *table);
-
-#endif /* _INCLUDE_PIPELINE_H_ */
diff --git a/examples/ip_pipeline/swq.c b/examples/ip_pipeline/swq.c
deleted file mode 100644
index 7e54a1dbfe..0000000000
--- a/examples/ip_pipeline/swq.c
+++ /dev/null
@@ -1,76 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2018 Intel Corporation
- */
-
-#include <stdlib.h>
-#include <string.h>
-
-#include <rte_string_fns.h>
-
-#include "swq.h"
-
-static struct swq_list swq_list;
-
-int
-swq_init(void)
-{
- TAILQ_INIT(&swq_list);
-
- return 0;
-}
-
-struct swq *
-swq_find(const char *name)
-{
- struct swq *swq;
-
- if (name == NULL)
- return NULL;
-
- TAILQ_FOREACH(swq, &swq_list, node)
- if (strcmp(swq->name, name) == 0)
- return swq;
-
- return NULL;
-}
-
-struct swq *
-swq_create(const char *name, struct swq_params *params)
-{
- struct swq *swq;
- struct rte_ring *r;
- unsigned int flags = RING_F_SP_ENQ | RING_F_SC_DEQ;
-
- /* Check input params */
- if ((name == NULL) ||
- swq_find(name) ||
- (params == NULL) ||
- (params->size == 0))
- return NULL;
-
- /* Resource create */
- r = rte_ring_create(
- name,
- params->size,
- params->cpu_id,
- flags);
-
- if (r == NULL)
- return NULL;
-
- /* Node allocation */
- swq = calloc(1, sizeof(struct swq));
- if (swq == NULL) {
- rte_ring_free(r);
- return NULL;
- }
-
- /* Node fill in */
- strlcpy(swq->name, name, sizeof(swq->name));
- swq->r = r;
-
- /* Node add to list */
- TAILQ_INSERT_TAIL(&swq_list, swq, node);
-
- return swq;
-}
diff --git a/examples/ip_pipeline/swq.h b/examples/ip_pipeline/swq.h
deleted file mode 100644
index c8440ee3cd..0000000000
--- a/examples/ip_pipeline/swq.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2018 Intel Corporation
- */
-
-#ifndef _INCLUDE_SWQ_H_
-#define _INCLUDE_SWQ_H_
-
-#include <stdint.h>
-#include <sys/queue.h>
-
-#include <rte_ring.h>
-
-#include "common.h"
-
-struct swq {
- TAILQ_ENTRY(swq) node;
- char name[NAME_SIZE];
- struct rte_ring *r;
-};
-
-TAILQ_HEAD(swq_list, swq);
-
-int
-swq_init(void);
-
-struct swq *
-swq_find(const char *name);
-
-struct swq_params {
- uint32_t size;
- uint32_t cpu_id;
-};
-
-struct swq *
-swq_create(const char *name, struct swq_params *params);
-
-#endif /* _INCLUDE_SWQ_H_ */
diff --git a/examples/ip_pipeline/tap.c b/examples/ip_pipeline/tap.c
deleted file mode 100644
index adae640c1e..0000000000
--- a/examples/ip_pipeline/tap.c
+++ /dev/null
@@ -1,102 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2018 Intel Corporation
- */
-
-#include <netinet/in.h>
-#ifdef RTE_EXEC_ENV_LINUX
-#include <linux/if.h>
-#include <linux/if_tun.h>
-#endif
-#include <sys/ioctl.h>
-
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include <rte_string_fns.h>
-
-#include "tap.h"
-
-#define TAP_DEV "/dev/net/tun"
-
-static struct tap_list tap_list;
-
-int
-tap_init(void)
-{
- TAILQ_INIT(&tap_list);
-
- return 0;
-}
-
-struct tap *
-tap_find(const char *name)
-{
- struct tap *tap;
-
- if (name == NULL)
- return NULL;
-
- TAILQ_FOREACH(tap, &tap_list, node)
- if (strcmp(tap->name, name) == 0)
- return tap;
-
- return NULL;
-}
-
-#ifndef RTE_EXEC_ENV_LINUX
-
-struct tap *
-tap_create(const char *name __rte_unused)
-{
- return NULL;
-}
-
-#else
-
-struct tap *
-tap_create(const char *name)
-{
- struct tap *tap;
- struct ifreq ifr;
- int fd, status;
-
- /* Check input params */
- if ((name == NULL) ||
- tap_find(name))
- return NULL;
-
- /* Resource create */
- fd = open(TAP_DEV, O_RDWR | O_NONBLOCK);
- if (fd < 0)
- return NULL;
-
- memset(&ifr, 0, sizeof(ifr));
- ifr.ifr_flags = IFF_TAP | IFF_NO_PI; /* No packet information */
- strlcpy(ifr.ifr_name, name, IFNAMSIZ);
-
- status = ioctl(fd, TUNSETIFF, (void *) &ifr);
- if (status < 0) {
- close(fd);
- return NULL;
- }
-
- /* Node allocation */
- tap = calloc(1, sizeof(struct tap));
- if (tap == NULL) {
- close(fd);
- return NULL;
- }
- /* Node fill in */
- strlcpy(tap->name, name, sizeof(tap->name));
- tap->fd = fd;
-
- /* Node add to list */
- TAILQ_INSERT_TAIL(&tap_list, tap, node);
-
- return tap;
-}
-
-#endif
diff --git a/examples/ip_pipeline/tap.h b/examples/ip_pipeline/tap.h
deleted file mode 100644
index 0dce72fe3c..0000000000
--- a/examples/ip_pipeline/tap.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2018 Intel Corporation
- */
-
-#ifndef _INCLUDE_TAP_H_
-#define _INCLUDE_TAP_H_
-
-#include <sys/queue.h>
-
-#include "common.h"
-
-struct tap {
- TAILQ_ENTRY(tap) node;
- char name[NAME_SIZE];
- int fd;
-};
-
-TAILQ_HEAD(tap_list, tap);
-
-int
-tap_init(void);
-
-struct tap *
-tap_find(const char *name);
-
-struct tap *
-tap_create(const char *name);
-
-#endif /* _INCLUDE_TAP_H_ */
diff --git a/examples/ip_pipeline/thread.c b/examples/ip_pipeline/thread.c
deleted file mode 100644
index 0a44bddd90..0000000000
--- a/examples/ip_pipeline/thread.c
+++ /dev/null
@@ -1,3137 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2018 Intel Corporation
- */
-
-#include <stdlib.h>
-
-#include <rte_common.h>
-#include <rte_cycles.h>
-#include <rte_lcore.h>
-#include <rte_ring.h>
-
-#include <rte_table_acl.h>
-#include <rte_table_array.h>
-#include <rte_table_hash.h>
-#include <rte_table_lpm.h>
-#include <rte_table_lpm_ipv6.h>
-
-#include "common.h"
-#include "thread.h"
-#include "pipeline.h"
-
-#ifndef THREAD_PIPELINES_MAX
-#define THREAD_PIPELINES_MAX 256
-#endif
-
-#ifndef THREAD_MSGQ_SIZE
-#define THREAD_MSGQ_SIZE 64
-#endif
-
-#ifndef THREAD_TIMER_PERIOD_MS
-#define THREAD_TIMER_PERIOD_MS 100
-#endif
-
-/**
- * Main thread: data plane thread context
- */
-struct thread {
- struct rte_ring *msgq_req;
- struct rte_ring *msgq_rsp;
-
- uint32_t enabled;
-};
-
-static struct thread thread[RTE_MAX_LCORE];
-
-/**
- * Data plane threads: context
- */
-struct table_data {
- struct rte_table_action *a;
-};
-
-struct pipeline_data {
- struct rte_pipeline *p;
- struct table_data table_data[RTE_PIPELINE_TABLE_MAX];
- uint32_t n_tables;
-
- struct rte_ring *msgq_req;
- struct rte_ring *msgq_rsp;
- uint64_t timer_period; /* Measured in CPU cycles. */
- uint64_t time_next;
-
- uint8_t buffer[TABLE_RULE_ACTION_SIZE_MAX];
-};
-
-struct __rte_cache_aligned thread_data {
- struct rte_pipeline *p[THREAD_PIPELINES_MAX];
- uint32_t n_pipelines;
-
- struct pipeline_data pipeline_data[THREAD_PIPELINES_MAX];
- struct rte_ring *msgq_req;
- struct rte_ring *msgq_rsp;
- uint64_t timer_period; /* Measured in CPU cycles. */
- uint64_t time_next;
- uint64_t time_next_min;
-};
-
-static struct thread_data thread_data[RTE_MAX_LCORE];
-
-/**
- * Main thread: data plane thread init
- */
-static void
-thread_free(void)
-{
- uint32_t i;
-
- for (i = 0; i < RTE_MAX_LCORE; i++) {
- struct thread *t = &thread[i];
-
- if (!rte_lcore_is_enabled(i))
- continue;
-
- /* MSGQs */
- rte_ring_free(t->msgq_req);
-
- rte_ring_free(t->msgq_rsp);
- }
-}
-
-int
-thread_init(void)
-{
- uint32_t i;
-
- RTE_LCORE_FOREACH_WORKER(i) {
- char name[NAME_MAX];
- struct rte_ring *msgq_req, *msgq_rsp;
- struct thread *t = &thread[i];
- struct thread_data *t_data = &thread_data[i];
- uint32_t cpu_id = rte_lcore_to_socket_id(i);
-
- /* MSGQs */
- snprintf(name, sizeof(name), "THREAD-%04x-MSGQ-REQ", i);
-
- msgq_req = rte_ring_create(name,
- THREAD_MSGQ_SIZE,
- cpu_id,
- RING_F_SP_ENQ | RING_F_SC_DEQ);
-
- if (msgq_req == NULL) {
- thread_free();
- return -1;
- }
-
- snprintf(name, sizeof(name), "THREAD-%04x-MSGQ-RSP", i);
-
- msgq_rsp = rte_ring_create(name,
- THREAD_MSGQ_SIZE,
- cpu_id,
- RING_F_SP_ENQ | RING_F_SC_DEQ);
-
- if (msgq_rsp == NULL) {
- thread_free();
- return -1;
- }
-
- /* Main thread records */
- t->msgq_req = msgq_req;
- t->msgq_rsp = msgq_rsp;
- t->enabled = 1;
-
- /* Data plane thread records */
- t_data->n_pipelines = 0;
- t_data->msgq_req = msgq_req;
- t_data->msgq_rsp = msgq_rsp;
- t_data->timer_period =
- (rte_get_tsc_hz() * THREAD_TIMER_PERIOD_MS) / 1000;
- t_data->time_next = rte_get_tsc_cycles() + t_data->timer_period;
- t_data->time_next_min = t_data->time_next;
- }
-
- return 0;
-}
-
-static inline int
-thread_is_running(uint32_t thread_id)
-{
- enum rte_lcore_state_t thread_state;
-
- thread_state = rte_eal_get_lcore_state(thread_id);
- return (thread_state == RUNNING) ? 1 : 0;
-}
-
-/**
- * Pipeline is running when:
- * (A) Pipeline is mapped to a data plane thread AND
- * (B) Its data plane thread is in RUNNING state.
- */
-static inline int
-pipeline_is_running(struct pipeline *p)
-{
- if (p->enabled == 0)
- return 0;
-
- return thread_is_running(p->thread_id);
-}
-
-/**
- * Main thread & data plane threads: message passing
- */
-enum thread_req_type {
- THREAD_REQ_PIPELINE_ENABLE = 0,
- THREAD_REQ_PIPELINE_DISABLE,
- THREAD_REQ_MAX
-};
-
-struct thread_msg_req {
- enum thread_req_type type;
-
- union {
- struct {
- struct rte_pipeline *p;
- struct {
- struct rte_table_action *a;
- } table[RTE_PIPELINE_TABLE_MAX];
- struct rte_ring *msgq_req;
- struct rte_ring *msgq_rsp;
- uint32_t timer_period_ms;
- uint32_t n_tables;
- } pipeline_enable;
-
- struct {
- struct rte_pipeline *p;
- } pipeline_disable;
- };
-};
-
-struct thread_msg_rsp {
- int status;
-};
-
-/**
- * Main thread
- */
-static struct thread_msg_req *
-thread_msg_alloc(void)
-{
- size_t size = RTE_MAX(sizeof(struct thread_msg_req),
- sizeof(struct thread_msg_rsp));
-
- return calloc(1, size);
-}
-
-static void
-thread_msg_free(struct thread_msg_rsp *rsp)
-{
- free(rsp);
-}
-
-static struct thread_msg_rsp *
-thread_msg_send_recv(uint32_t thread_id,
- struct thread_msg_req *req)
-{
- struct thread *t = &thread[thread_id];
- struct rte_ring *msgq_req = t->msgq_req;
- struct rte_ring *msgq_rsp = t->msgq_rsp;
- struct thread_msg_rsp *rsp;
- int status;
-
- /* send */
- do {
- status = rte_ring_sp_enqueue(msgq_req, req);
- } while (status == -ENOBUFS);
-
- /* recv */
- do {
- status = rte_ring_sc_dequeue(msgq_rsp, (void **) &rsp);
- } while (status != 0);
-
- return rsp;
-}
-
-int
-thread_pipeline_enable(uint32_t thread_id,
- const char *pipeline_name)
-{
- struct pipeline *p = pipeline_find(pipeline_name);
- struct thread *t;
- struct thread_msg_req *req;
- struct thread_msg_rsp *rsp;
- uint32_t i;
- int status;
-
- /* Check input params */
- if ((thread_id >= RTE_MAX_LCORE) ||
- (p == NULL) ||
- (p->n_ports_in == 0) ||
- (p->n_ports_out == 0) ||
- (p->n_tables == 0))
- return -1;
-
- t = &thread[thread_id];
- if ((t->enabled == 0) ||
- p->enabled)
- return -1;
-
- if (!thread_is_running(thread_id)) {
- struct thread_data *td = &thread_data[thread_id];
- struct pipeline_data *tdp = &td->pipeline_data[td->n_pipelines];
-
- if (td->n_pipelines >= THREAD_PIPELINES_MAX)
- return -1;
-
- /* Data plane thread */
- td->p[td->n_pipelines] = p->p;
-
- tdp->p = p->p;
- for (i = 0; i < p->n_tables; i++)
- tdp->table_data[i].a = p->table[i].a;
-
- tdp->n_tables = p->n_tables;
-
- tdp->msgq_req = p->msgq_req;
- tdp->msgq_rsp = p->msgq_rsp;
- tdp->timer_period = (rte_get_tsc_hz() * p->timer_period_ms) / 1000;
- tdp->time_next = rte_get_tsc_cycles() + tdp->timer_period;
-
- td->n_pipelines++;
-
- /* Pipeline */
- p->thread_id = thread_id;
- p->enabled = 1;
-
- return 0;
- }
-
- /* Allocate request */
- req = thread_msg_alloc();
- if (req == NULL)
- return -1;
-
- /* Write request */
- req->type = THREAD_REQ_PIPELINE_ENABLE;
- req->pipeline_enable.p = p->p;
- for (i = 0; i < p->n_tables; i++)
- req->pipeline_enable.table[i].a =
- p->table[i].a;
- req->pipeline_enable.msgq_req = p->msgq_req;
- req->pipeline_enable.msgq_rsp = p->msgq_rsp;
- req->pipeline_enable.timer_period_ms = p->timer_period_ms;
- req->pipeline_enable.n_tables = p->n_tables;
-
- /* Send request and wait for response */
- rsp = thread_msg_send_recv(thread_id, req);
-
- /* Read response */
- status = rsp->status;
-
- /* Free response */
- thread_msg_free(rsp);
-
- /* Request completion */
- if (status)
- return status;
-
- p->thread_id = thread_id;
- p->enabled = 1;
-
- return 0;
-}
-
-int
-thread_pipeline_disable(uint32_t thread_id,
- const char *pipeline_name)
-{
- struct pipeline *p = pipeline_find(pipeline_name);
- struct thread *t;
- struct thread_msg_req *req;
- struct thread_msg_rsp *rsp;
- int status;
-
- /* Check input params */
- if ((thread_id >= RTE_MAX_LCORE) ||
- (p == NULL))
- return -1;
-
- t = &thread[thread_id];
- if (t->enabled == 0)
- return -1;
-
- if (p->enabled == 0)
- return 0;
-
- if (p->thread_id != thread_id)
- return -1;
-
- if (!thread_is_running(thread_id)) {
- struct thread_data *td = &thread_data[thread_id];
- uint32_t i;
-
- for (i = 0; i < td->n_pipelines; i++) {
- struct pipeline_data *tdp = &td->pipeline_data[i];
-
- if (tdp->p != p->p)
- continue;
-
- /* Data plane thread */
- if (i < td->n_pipelines - 1) {
- struct rte_pipeline *pipeline_last =
- td->p[td->n_pipelines - 1];
- struct pipeline_data *tdp_last =
- &td->pipeline_data[td->n_pipelines - 1];
-
- td->p[i] = pipeline_last;
- memcpy(tdp, tdp_last, sizeof(*tdp));
- }
-
- td->n_pipelines--;
-
- /* Pipeline */
- p->enabled = 0;
-
- break;
- }
-
- return 0;
- }
-
- /* Allocate request */
- req = thread_msg_alloc();
- if (req == NULL)
- return -1;
-
- /* Write request */
- req->type = THREAD_REQ_PIPELINE_DISABLE;
- req->pipeline_disable.p = p->p;
-
- /* Send request and wait for response */
- rsp = thread_msg_send_recv(thread_id, req);
-
- /* Read response */
- status = rsp->status;
-
- /* Free response */
- thread_msg_free(rsp);
-
- /* Request completion */
- if (status)
- return status;
-
- p->enabled = 0;
-
- return 0;
-}
-
-/**
- * Data plane threads: message handling
- */
-static inline struct thread_msg_req *
-thread_msg_recv(struct rte_ring *msgq_req)
-{
- struct thread_msg_req *req = NULL;
-
- int status = rte_ring_sc_dequeue(msgq_req, (void **) &req);
-
- if (status != 0)
- return NULL;
-
- return req;
-}
-
-static inline void
-thread_msg_send(struct rte_ring *msgq_rsp,
- struct thread_msg_rsp *rsp)
-{
- int status;
-
- do {
- status = rte_ring_sp_enqueue(msgq_rsp, rsp);
- } while (status == -ENOBUFS);
-}
-
-static struct thread_msg_rsp *
-thread_msg_handle_pipeline_enable(struct thread_data *t,
- struct thread_msg_req *req)
-{
- struct thread_msg_rsp *rsp = (struct thread_msg_rsp *) req;
- struct pipeline_data *p = &t->pipeline_data[t->n_pipelines];
- uint32_t i;
-
- /* Request */
- if (t->n_pipelines >= THREAD_PIPELINES_MAX) {
- rsp->status = -1;
- return rsp;
- }
-
- t->p[t->n_pipelines] = req->pipeline_enable.p;
-
- p->p = req->pipeline_enable.p;
- for (i = 0; i < req->pipeline_enable.n_tables; i++)
- p->table_data[i].a =
- req->pipeline_enable.table[i].a;
-
- p->n_tables = req->pipeline_enable.n_tables;
-
- p->msgq_req = req->pipeline_enable.msgq_req;
- p->msgq_rsp = req->pipeline_enable.msgq_rsp;
- p->timer_period =
- (rte_get_tsc_hz() * req->pipeline_enable.timer_period_ms) / 1000;
- p->time_next = rte_get_tsc_cycles() + p->timer_period;
-
- t->n_pipelines++;
-
- /* Response */
- rsp->status = 0;
- return rsp;
-}
-
-static struct thread_msg_rsp *
-thread_msg_handle_pipeline_disable(struct thread_data *t,
- struct thread_msg_req *req)
-{
- struct thread_msg_rsp *rsp = (struct thread_msg_rsp *) req;
- uint32_t n_pipelines = t->n_pipelines;
- struct rte_pipeline *pipeline = req->pipeline_disable.p;
- uint32_t i;
-
- /* find pipeline */
- for (i = 0; i < n_pipelines; i++) {
- struct pipeline_data *p = &t->pipeline_data[i];
-
- if (p->p != pipeline)
- continue;
-
- if (i < n_pipelines - 1) {
- struct rte_pipeline *pipeline_last =
- t->p[n_pipelines - 1];
- struct pipeline_data *p_last =
- &t->pipeline_data[n_pipelines - 1];
-
- t->p[i] = pipeline_last;
- memcpy(p, p_last, sizeof(*p));
- }
-
- t->n_pipelines--;
-
- rsp->status = 0;
- return rsp;
- }
-
- /* should not get here */
- rsp->status = 0;
- return rsp;
-}
-
-static void
-thread_msg_handle(struct thread_data *t)
-{
- for ( ; ; ) {
- struct thread_msg_req *req;
- struct thread_msg_rsp *rsp;
-
- req = thread_msg_recv(t->msgq_req);
- if (req == NULL)
- break;
-
- switch (req->type) {
- case THREAD_REQ_PIPELINE_ENABLE:
- rsp = thread_msg_handle_pipeline_enable(t, req);
- break;
-
- case THREAD_REQ_PIPELINE_DISABLE:
- rsp = thread_msg_handle_pipeline_disable(t, req);
- break;
-
- default:
- rsp = (struct thread_msg_rsp *) req;
- rsp->status = -1;
- }
-
- thread_msg_send(t->msgq_rsp, rsp);
- }
-}
-
-/**
- * Main thread & data plane threads: message passing
- */
-enum pipeline_req_type {
- /* Port IN */
- PIPELINE_REQ_PORT_IN_STATS_READ,
- PIPELINE_REQ_PORT_IN_ENABLE,
- PIPELINE_REQ_PORT_IN_DISABLE,
-
- /* Port OUT */
- PIPELINE_REQ_PORT_OUT_STATS_READ,
-
- /* Table */
- PIPELINE_REQ_TABLE_STATS_READ,
- PIPELINE_REQ_TABLE_RULE_ADD,
- PIPELINE_REQ_TABLE_RULE_ADD_DEFAULT,
- PIPELINE_REQ_TABLE_RULE_ADD_BULK,
- PIPELINE_REQ_TABLE_RULE_DELETE,
- PIPELINE_REQ_TABLE_RULE_DELETE_DEFAULT,
- PIPELINE_REQ_TABLE_RULE_STATS_READ,
- PIPELINE_REQ_TABLE_MTR_PROFILE_ADD,
- PIPELINE_REQ_TABLE_MTR_PROFILE_DELETE,
- PIPELINE_REQ_TABLE_RULE_MTR_READ,
- PIPELINE_REQ_TABLE_DSCP_TABLE_UPDATE,
- PIPELINE_REQ_TABLE_RULE_TTL_READ,
- PIPELINE_REQ_TABLE_RULE_TIME_READ,
- PIPELINE_REQ_MAX
-};
-
-struct pipeline_msg_req_port_in_stats_read {
- int clear;
-};
-
-struct pipeline_msg_req_port_out_stats_read {
- int clear;
-};
-
-struct pipeline_msg_req_table_stats_read {
- int clear;
-};
-
-struct pipeline_msg_req_table_rule_add {
- struct table_rule_match match;
- struct table_rule_action action;
-};
-
-struct pipeline_msg_req_table_rule_add_default {
- struct table_rule_action action;
-};
-
-struct pipeline_msg_req_table_rule_add_bulk {
- struct table_rule_list *list;
- int bulk;
-};
-
-struct pipeline_msg_req_table_rule_delete {
- struct table_rule_match match;
-};
-
-struct pipeline_msg_req_table_rule_stats_read {
- void *data;
- int clear;
-};
-
-struct pipeline_msg_req_table_mtr_profile_add {
- uint32_t meter_profile_id;
- struct rte_table_action_meter_profile profile;
-};
-
-struct pipeline_msg_req_table_mtr_profile_delete {
- uint32_t meter_profile_id;
-};
-
-struct pipeline_msg_req_table_rule_mtr_read {
- void *data;
- uint32_t tc_mask;
- int clear;
-};
-
-struct pipeline_msg_req_table_dscp_table_update {
- uint64_t dscp_mask;
- struct rte_table_action_dscp_table dscp_table;
-};
-
-struct pipeline_msg_req_table_rule_ttl_read {
- void *data;
- int clear;
-};
-
-struct pipeline_msg_req_table_rule_time_read {
- void *data;
-};
-
-struct pipeline_msg_req {
- enum pipeline_req_type type;
- uint32_t id; /* Port IN, port OUT or table ID */
-
- union {
- struct pipeline_msg_req_port_in_stats_read port_in_stats_read;
- struct pipeline_msg_req_port_out_stats_read port_out_stats_read;
- struct pipeline_msg_req_table_stats_read table_stats_read;
- struct pipeline_msg_req_table_rule_add table_rule_add;
- struct pipeline_msg_req_table_rule_add_default table_rule_add_default;
- struct pipeline_msg_req_table_rule_add_bulk table_rule_add_bulk;
- struct pipeline_msg_req_table_rule_delete table_rule_delete;
- struct pipeline_msg_req_table_rule_stats_read table_rule_stats_read;
- struct pipeline_msg_req_table_mtr_profile_add table_mtr_profile_add;
- struct pipeline_msg_req_table_mtr_profile_delete table_mtr_profile_delete;
- struct pipeline_msg_req_table_rule_mtr_read table_rule_mtr_read;
- struct pipeline_msg_req_table_dscp_table_update table_dscp_table_update;
- struct pipeline_msg_req_table_rule_ttl_read table_rule_ttl_read;
- struct pipeline_msg_req_table_rule_time_read table_rule_time_read;
- };
-};
-
-struct pipeline_msg_rsp_port_in_stats_read {
- struct rte_pipeline_port_in_stats stats;
-};
-
-struct pipeline_msg_rsp_port_out_stats_read {
- struct rte_pipeline_port_out_stats stats;
-};
-
-struct pipeline_msg_rsp_table_stats_read {
- struct rte_pipeline_table_stats stats;
-};
-
-struct pipeline_msg_rsp_table_rule_add {
- void *data;
-};
-
-struct pipeline_msg_rsp_table_rule_add_default {
- void *data;
-};
-
-struct pipeline_msg_rsp_table_rule_add_bulk {
- uint32_t n_rules;
-};
-
-struct pipeline_msg_rsp_table_rule_stats_read {
- struct rte_table_action_stats_counters stats;
-};
-
-struct pipeline_msg_rsp_table_rule_mtr_read {
- struct rte_table_action_mtr_counters stats;
-};
-
-struct pipeline_msg_rsp_table_rule_ttl_read {
- struct rte_table_action_ttl_counters stats;
-};
-
-struct pipeline_msg_rsp_table_rule_time_read {
- uint64_t timestamp;
-};
-
-struct pipeline_msg_rsp {
- int status;
-
- union {
- struct pipeline_msg_rsp_port_in_stats_read port_in_stats_read;
- struct pipeline_msg_rsp_port_out_stats_read port_out_stats_read;
- struct pipeline_msg_rsp_table_stats_read table_stats_read;
- struct pipeline_msg_rsp_table_rule_add table_rule_add;
- struct pipeline_msg_rsp_table_rule_add_default table_rule_add_default;
- struct pipeline_msg_rsp_table_rule_add_bulk table_rule_add_bulk;
- struct pipeline_msg_rsp_table_rule_stats_read table_rule_stats_read;
- struct pipeline_msg_rsp_table_rule_mtr_read table_rule_mtr_read;
- struct pipeline_msg_rsp_table_rule_ttl_read table_rule_ttl_read;
- struct pipeline_msg_rsp_table_rule_time_read table_rule_time_read;
- };
-};
-
-/**
- * Main thread
- */
-static struct pipeline_msg_req *
-pipeline_msg_alloc(void)
-{
- size_t size = RTE_MAX(sizeof(struct pipeline_msg_req),
- sizeof(struct pipeline_msg_rsp));
-
- return calloc(1, size);
-}
-
-static void
-pipeline_msg_free(struct pipeline_msg_rsp *rsp)
-{
- free(rsp);
-}
-
-static struct pipeline_msg_rsp *
-pipeline_msg_send_recv(struct pipeline *p,
- struct pipeline_msg_req *req)
-{
- struct rte_ring *msgq_req = p->msgq_req;
- struct rte_ring *msgq_rsp = p->msgq_rsp;
- struct pipeline_msg_rsp *rsp;
- int status;
-
- /* send */
- do {
- status = rte_ring_sp_enqueue(msgq_req, req);
- } while (status == -ENOBUFS);
-
- /* recv */
- do {
- status = rte_ring_sc_dequeue(msgq_rsp, (void **) &rsp);
- } while (status != 0);
-
- return rsp;
-}
-
-int
-pipeline_port_in_stats_read(const char *pipeline_name,
- uint32_t port_id,
- struct rte_pipeline_port_in_stats *stats,
- int clear)
-{
- struct pipeline *p;
- struct pipeline_msg_req *req;
- struct pipeline_msg_rsp *rsp;
- int status;
-
- /* Check input params */
- if ((pipeline_name == NULL) ||
- (stats == NULL))
- return -1;
-
- p = pipeline_find(pipeline_name);
- if ((p == NULL) ||
- (port_id >= p->n_ports_in))
- return -1;
-
- if (!pipeline_is_running(p)) {
- status = rte_pipeline_port_in_stats_read(p->p,
- port_id,
- stats,
- clear);
-
- return status;
- }
-
- /* Allocate request */
- req = pipeline_msg_alloc();
- if (req == NULL)
- return -1;
-
- /* Write request */
- req->type = PIPELINE_REQ_PORT_IN_STATS_READ;
- req->id = port_id;
- req->port_in_stats_read.clear = clear;
-
- /* Send request and wait for response */
- rsp = pipeline_msg_send_recv(p, req);
-
- /* Read response */
- status = rsp->status;
- if (status == 0)
- memcpy(stats, &rsp->port_in_stats_read.stats, sizeof(*stats));
-
- /* Free response */
- pipeline_msg_free(rsp);
-
- return status;
-}
-
-int
-pipeline_port_in_enable(const char *pipeline_name,
- uint32_t port_id)
-{
- struct pipeline *p;
- struct pipeline_msg_req *req;
- struct pipeline_msg_rsp *rsp;
- int status;
-
- /* Check input params */
- if (pipeline_name == NULL)
- return -1;
-
- p = pipeline_find(pipeline_name);
- if ((p == NULL) ||
- (port_id >= p->n_ports_in))
- return -1;
-
- if (!pipeline_is_running(p)) {
- status = rte_pipeline_port_in_enable(p->p, port_id);
- return status;
- }
-
- /* Allocate request */
- req = pipeline_msg_alloc();
- if (req == NULL)
- return -1;
-
- /* Write request */
- req->type = PIPELINE_REQ_PORT_IN_ENABLE;
- req->id = port_id;
-
- /* Send request and wait for response */
- rsp = pipeline_msg_send_recv(p, req);
-
- /* Read response */
- status = rsp->status;
-
- /* Free response */
- pipeline_msg_free(rsp);
-
- return status;
-}
-
-int
-pipeline_port_in_disable(const char *pipeline_name,
- uint32_t port_id)
-{
- struct pipeline *p;
- struct pipeline_msg_req *req;
- struct pipeline_msg_rsp *rsp;
- int status;
-
- /* Check input params */
- if (pipeline_name == NULL)
- return -1;
-
- p = pipeline_find(pipeline_name);
- if ((p == NULL) ||
- (port_id >= p->n_ports_in))
- return -1;
-
- if (!pipeline_is_running(p)) {
- status = rte_pipeline_port_in_disable(p->p, port_id);
- return status;
- }
-
- /* Allocate request */
- req = pipeline_msg_alloc();
- if (req == NULL)
- return -1;
-
- /* Write request */
- req->type = PIPELINE_REQ_PORT_IN_DISABLE;
- req->id = port_id;
-
- /* Send request and wait for response */
- rsp = pipeline_msg_send_recv(p, req);
-
- /* Read response */
- status = rsp->status;
-
- /* Free response */
- pipeline_msg_free(rsp);
-
- return status;
-}
-
-int
-pipeline_port_out_stats_read(const char *pipeline_name,
- uint32_t port_id,
- struct rte_pipeline_port_out_stats *stats,
- int clear)
-{
- struct pipeline *p;
- struct pipeline_msg_req *req;
- struct pipeline_msg_rsp *rsp;
- int status;
-
- /* Check input params */
- if ((pipeline_name == NULL) ||
- (stats == NULL))
- return -1;
-
- p = pipeline_find(pipeline_name);
- if ((p == NULL) ||
- (port_id >= p->n_ports_out))
- return -1;
-
- if (!pipeline_is_running(p)) {
- status = rte_pipeline_port_out_stats_read(p->p,
- port_id,
- stats,
- clear);
-
- return status;
- }
-
- /* Allocate request */
- req = pipeline_msg_alloc();
- if (req == NULL)
- return -1;
-
- /* Write request */
- req->type = PIPELINE_REQ_PORT_OUT_STATS_READ;
- req->id = port_id;
- req->port_out_stats_read.clear = clear;
-
- /* Send request and wait for response */
- rsp = pipeline_msg_send_recv(p, req);
-
- /* Read response */
- status = rsp->status;
- if (status == 0)
- memcpy(stats, &rsp->port_out_stats_read.stats, sizeof(*stats));
-
- /* Free response */
- pipeline_msg_free(rsp);
-
- return status;
-}
-
-int
-pipeline_table_stats_read(const char *pipeline_name,
- uint32_t table_id,
- struct rte_pipeline_table_stats *stats,
- int clear)
-{
- struct pipeline *p;
- struct pipeline_msg_req *req;
- struct pipeline_msg_rsp *rsp;
- int status;
-
- /* Check input params */
- if ((pipeline_name == NULL) ||
- (stats == NULL))
- return -1;
-
- p = pipeline_find(pipeline_name);
- if ((p == NULL) ||
- (table_id >= p->n_tables))
- return -1;
-
- if (!pipeline_is_running(p)) {
- status = rte_pipeline_table_stats_read(p->p,
- table_id,
- stats,
- clear);
-
- return status;
- }
-
- /* Allocate request */
- req = pipeline_msg_alloc();
- if (req == NULL)
- return -1;
-
- /* Write request */
- req->type = PIPELINE_REQ_TABLE_STATS_READ;
- req->id = table_id;
- req->table_stats_read.clear = clear;
-
- /* Send request and wait for response */
- rsp = pipeline_msg_send_recv(p, req);
-
- /* Read response */
- status = rsp->status;
- if (status == 0)
- memcpy(stats, &rsp->table_stats_read.stats, sizeof(*stats));
-
- /* Free response */
- pipeline_msg_free(rsp);
-
- return status;
-}
-
-static int
-match_check(struct table_rule_match *match,
- struct pipeline *p,
- uint32_t table_id)
-{
- struct table *table;
-
- if ((match == NULL) ||
- (p == NULL) ||
- (table_id >= p->n_tables))
- return -1;
-
- table = &p->table[table_id];
- if (match->match_type != table->params.match_type)
- return -1;
-
- switch (match->match_type) {
- case TABLE_ACL:
- {
- struct table_acl_params *t = &table->params.match.acl;
- struct table_rule_match_acl *r = &match->match.acl;
-
- if ((r->ip_version && (t->ip_version == 0)) ||
- ((r->ip_version == 0) && t->ip_version))
- return -1;
-
- if (r->ip_version) {
- if ((r->sa_depth > 32) ||
- (r->da_depth > 32))
- return -1;
- } else {
- if ((r->sa_depth > 128) ||
- (r->da_depth > 128))
- return -1;
- }
- return 0;
- }
-
- case TABLE_ARRAY:
- return 0;
-
- case TABLE_HASH:
- return 0;
-
- case TABLE_LPM:
- {
- struct table_lpm_params *t = &table->params.match.lpm;
- struct table_rule_match_lpm *r = &match->match.lpm;
-
- if ((r->ip_version && (t->key_size != 4)) ||
- ((r->ip_version == 0) && (t->key_size != 16)))
- return -1;
-
- if (r->ip_version) {
- if (r->depth > 32)
- return -1;
- } else {
- if (r->depth > 128)
- return -1;
- }
- return 0;
- }
-
- case TABLE_STUB:
- return -1;
-
- default:
- return -1;
- }
-}
-
-static int
-action_check(struct table_rule_action *action,
- struct pipeline *p,
- uint32_t table_id)
-{
- struct table_action_profile *ap;
-
- if ((action == NULL) ||
- (p == NULL) ||
- (table_id >= p->n_tables))
- return -1;
-
- ap = p->table[table_id].ap;
- if (action->action_mask != ap->params.action_mask)
- return -1;
-
- if (action->action_mask & (1LLU << RTE_TABLE_ACTION_FWD)) {
- if ((action->fwd.action == RTE_PIPELINE_ACTION_PORT) &&
- (action->fwd.id >= p->n_ports_out))
- return -1;
-
- if ((action->fwd.action == RTE_PIPELINE_ACTION_TABLE) &&
- (action->fwd.id >= p->n_tables))
- return -1;
- }
-
- if (action->action_mask & (1LLU << RTE_TABLE_ACTION_MTR)) {
- uint32_t tc_mask0 = (1 << ap->params.mtr.n_tc) - 1;
- uint32_t tc_mask1 = action->mtr.tc_mask;
-
- if (tc_mask1 != tc_mask0)
- return -1;
- }
-
- if (action->action_mask & (1LLU << RTE_TABLE_ACTION_TM)) {
- uint32_t n_subports_per_port =
- ap->params.tm.n_subports_per_port;
- uint32_t n_pipes_per_subport =
- ap->params.tm.n_pipes_per_subport;
- uint32_t subport_id = action->tm.subport_id;
- uint32_t pipe_id = action->tm.pipe_id;
-
- if ((subport_id >= n_subports_per_port) ||
- (pipe_id >= n_pipes_per_subport))
- return -1;
- }
-
- if (action->action_mask & (1LLU << RTE_TABLE_ACTION_ENCAP)) {
- uint64_t encap_mask = ap->params.encap.encap_mask;
- enum rte_table_action_encap_type type = action->encap.type;
-
- if ((encap_mask & (1LLU << type)) == 0)
- return -1;
- }
-
- if (action->action_mask & (1LLU << RTE_TABLE_ACTION_NAT)) {
- int ip_version0 = ap->params.common.ip_version;
- int ip_version1 = action->nat.ip_version;
-
- if ((ip_version1 && (ip_version0 == 0)) ||
- ((ip_version1 == 0) && ip_version0))
- return -1;
- }
-
- return 0;
-}
-
-static int
-action_default_check(struct table_rule_action *action,
- struct pipeline *p,
- uint32_t table_id)
-{
- if ((action == NULL) ||
- (action->action_mask != (1LLU << RTE_TABLE_ACTION_FWD)) ||
- (p == NULL) ||
- (table_id >= p->n_tables))
- return -1;
-
- if (action->action_mask & (1LLU << RTE_TABLE_ACTION_FWD)) {
- if ((action->fwd.action == RTE_PIPELINE_ACTION_PORT) &&
- (action->fwd.id >= p->n_ports_out))
- return -1;
-
- if ((action->fwd.action == RTE_PIPELINE_ACTION_TABLE) &&
- (action->fwd.id >= p->n_tables))
- return -1;
- }
-
- return 0;
-}
-
-union table_rule_match_low_level {
- struct rte_table_acl_rule_add_params acl_add;
- struct rte_table_acl_rule_delete_params acl_delete;
- struct rte_table_array_key array;
- uint8_t hash[TABLE_RULE_MATCH_SIZE_MAX];
- struct rte_table_lpm_key lpm_ipv4;
- struct rte_table_lpm_ipv6_key lpm_ipv6;
-};
-
-static int
-match_convert(struct table_rule_match *mh,
- union table_rule_match_low_level *ml,
- int add);
-
-static int
-action_convert(struct rte_table_action *a,
- struct table_rule_action *action,
- struct rte_pipeline_table_entry *data);
-
-struct table_ll {
- struct rte_pipeline *p;
- int table_id;
- struct rte_table_action *a;
- int bulk_supported;
-};
-
-static int
-table_rule_add_bulk_ll(struct table_ll *table,
- struct table_rule_list *list,
- uint32_t *n_rules)
-{
- union table_rule_match_low_level *match_ll = NULL;
- uint8_t *action_ll = NULL;
- void **match_ll_ptr = NULL;
- struct rte_pipeline_table_entry **action_ll_ptr = NULL;
- struct rte_pipeline_table_entry **entries_ptr = NULL;
- int *found = NULL;
- struct table_rule *rule;
- uint32_t n, i;
- int status = 0;
-
- n = 0;
- TAILQ_FOREACH(rule, list, node)
- n++;
-
- /* Memory allocation */
- match_ll = calloc(n, sizeof(union table_rule_match_low_level));
- action_ll = calloc(n, TABLE_RULE_ACTION_SIZE_MAX);
-
- match_ll_ptr = calloc(n, sizeof(void *));
- action_ll_ptr = calloc(n, sizeof(struct rte_pipeline_table_entry *));
-
- entries_ptr = calloc(n, sizeof(struct rte_pipeline_table_entry *));
- found = calloc(n, sizeof(int));
-
- if (match_ll == NULL ||
- action_ll == NULL ||
- match_ll_ptr == NULL ||
- action_ll_ptr == NULL ||
- entries_ptr == NULL ||
- found == NULL) {
- status = -ENOMEM;
- goto table_rule_add_bulk_ll_free;
- }
-
- /* Init */
- for (i = 0; i < n; i++) {
- match_ll_ptr[i] = (void *)&match_ll[i];
- action_ll_ptr[i] = (struct rte_pipeline_table_entry *)
- &action_ll[i * TABLE_RULE_ACTION_SIZE_MAX];
- }
-
- /* Rule (match, action) conversion */
- i = 0;
- TAILQ_FOREACH(rule, list, node) {
- status = match_convert(&rule->match, match_ll_ptr[i], 1);
- if (status)
- goto table_rule_add_bulk_ll_free;
-
- status = action_convert(table->a, &rule->action, action_ll_ptr[i]);
- if (status)
- goto table_rule_add_bulk_ll_free;
-
- i++;
- }
-
- /* Add rule (match, action) to table */
- if (table->bulk_supported) {
- status = rte_pipeline_table_entry_add_bulk(table->p,
- table->table_id,
- match_ll_ptr,
- action_ll_ptr,
- n,
- found,
- entries_ptr);
- if (status)
- goto table_rule_add_bulk_ll_free;
- } else
- for (i = 0; i < n; i++) {
- status = rte_pipeline_table_entry_add(table->p,
- table->table_id,
- match_ll_ptr[i],
- action_ll_ptr[i],
- &found[i],
- &entries_ptr[i]);
- if (status) {
- if (i == 0)
- goto table_rule_add_bulk_ll_free;
-
- /* No roll-back. */
- status = 0;
- n = i;
- break;
- }
- }
-
- /* Write back to the rule list. */
- i = 0;
- TAILQ_FOREACH(rule, list, node) {
- if (i >= n)
- break;
-
- rule->data = entries_ptr[i];
-
- i++;
- }
-
- *n_rules = n;
-
- /* Free */
-table_rule_add_bulk_ll_free:
- free(found);
- free(entries_ptr);
- free(action_ll_ptr);
- free(match_ll_ptr);
- free(action_ll);
- free(match_ll);
-
- return status;
-}
-
-int
-pipeline_table_rule_add(const char *pipeline_name,
- uint32_t table_id,
- struct table_rule_match *match,
- struct table_rule_action *action)
-{
- struct pipeline *p;
- struct table *table;
- struct pipeline_msg_req *req;
- struct pipeline_msg_rsp *rsp;
- struct table_rule *rule;
- int status;
-
- /* Check input params */
- if ((pipeline_name == NULL) ||
- (match == NULL) ||
- (action == NULL))
- return -1;
-
- p = pipeline_find(pipeline_name);
- if ((p == NULL) ||
- (table_id >= p->n_tables) ||
- match_check(match, p, table_id) ||
- action_check(action, p, table_id))
- return -1;
-
- table = &p->table[table_id];
-
- rule = calloc(1, sizeof(struct table_rule));
- if (rule == NULL)
- return -1;
-
- memcpy(&rule->match, match, sizeof(*match));
- memcpy(&rule->action, action, sizeof(*action));
-
- if (!pipeline_is_running(p)) {
- union table_rule_match_low_level match_ll;
- struct rte_pipeline_table_entry *data_in, *data_out;
- int key_found;
- uint8_t *buffer;
-
- buffer = calloc(TABLE_RULE_ACTION_SIZE_MAX, sizeof(uint8_t));
- if (buffer == NULL) {
- free(rule);
- return -1;
- }
-
- /* Table match-action rule conversion */
- data_in = (struct rte_pipeline_table_entry *)buffer;
-
- status = match_convert(match, &match_ll, 1);
- if (status) {
- free(buffer);
- free(rule);
- return -1;
- }
-
- status = action_convert(table->a, action, data_in);
- if (status) {
- free(buffer);
- free(rule);
- return -1;
- }
-
- /* Add rule (match, action) to table */
- status = rte_pipeline_table_entry_add(p->p,
- table_id,
- &match_ll,
- data_in,
- &key_found,
- &data_out);
- if (status) {
- free(buffer);
- free(rule);
- return -1;
- }
-
- /* Write Response */
- rule->data = data_out;
- table_rule_add(table, rule);
-
- free(buffer);
- return 0;
- }
-
- /* Allocate request */
- req = pipeline_msg_alloc();
- if (req == NULL) {
- free(rule);
- return -1;
- }
-
- /* Write request */
- req->type = PIPELINE_REQ_TABLE_RULE_ADD;
- req->id = table_id;
- memcpy(&req->table_rule_add.match, match, sizeof(*match));
- memcpy(&req->table_rule_add.action, action, sizeof(*action));
-
- /* Send request and wait for response */
- rsp = pipeline_msg_send_recv(p, req);
-
- /* Read response */
- status = rsp->status;
- if (status == 0) {
- rule->data = rsp->table_rule_add.data;
- table_rule_add(table, rule);
- } else
- free(rule);
-
- /* Free response */
- pipeline_msg_free(rsp);
-
- return status;
-}
-
-int
-pipeline_table_rule_add_default(const char *pipeline_name,
- uint32_t table_id,
- struct table_rule_action *action)
-{
- struct pipeline *p;
- struct table *table;
- struct pipeline_msg_req *req;
- struct pipeline_msg_rsp *rsp;
- struct table_rule *rule;
- int status;
-
- /* Check input params */
- if ((pipeline_name == NULL) ||
- (action == NULL))
- return -1;
-
- p = pipeline_find(pipeline_name);
- if ((p == NULL) ||
- (table_id >= p->n_tables) ||
- action_default_check(action, p, table_id))
- return -1;
-
- table = &p->table[table_id];
-
- rule = calloc(1, sizeof(struct table_rule));
- if (rule == NULL)
- return -1;
-
- memcpy(&rule->action, action, sizeof(*action));
-
- if (!pipeline_is_running(p)) {
- struct rte_pipeline_table_entry *data_in, *data_out;
- uint8_t *buffer;
-
- buffer = calloc(TABLE_RULE_ACTION_SIZE_MAX, sizeof(uint8_t));
- if (buffer == NULL) {
- free(rule);
- return -1;
- }
-
- /* Apply actions */
- data_in = (struct rte_pipeline_table_entry *)buffer;
-
- data_in->action = action->fwd.action;
- if (action->fwd.action == RTE_PIPELINE_ACTION_PORT)
- data_in->port_id = action->fwd.id;
- if (action->fwd.action == RTE_PIPELINE_ACTION_TABLE)
- data_in->table_id = action->fwd.id;
-
- /* Add default rule to table */
- status = rte_pipeline_table_default_entry_add(p->p,
- table_id,
- data_in,
- &data_out);
- if (status) {
- free(buffer);
- free(rule);
- return -1;
- }
-
- /* Write Response */
- rule->data = data_out;
- table_rule_default_add(table, rule);
-
- free(buffer);
- return 0;
- }
-
- /* Allocate request */
- req = pipeline_msg_alloc();
- if (req == NULL) {
- free(rule);
- return -1;
- }
-
- /* Write request */
- req->type = PIPELINE_REQ_TABLE_RULE_ADD_DEFAULT;
- req->id = table_id;
- memcpy(&req->table_rule_add_default.action, action, sizeof(*action));
-
- /* Send request and wait for response */
- rsp = pipeline_msg_send_recv(p, req);
-
- /* Read response */
- status = rsp->status;
- if (status == 0) {
- rule->data = rsp->table_rule_add_default.data;
- table_rule_default_add(table, rule);
- } else
- free(rule);
-
- /* Free response */
- pipeline_msg_free(rsp);
-
- return status;
-}
-
-static uint32_t
-table_rule_list_free(struct table_rule_list *list)
-{
- uint32_t n = 0;
-
- if (!list)
- return 0;
-
- for ( ; ; ) {
- struct table_rule *rule;
-
- rule = TAILQ_FIRST(list);
- if (rule == NULL)
- break;
-
- TAILQ_REMOVE(list, rule, node);
- free(rule);
- n++;
- }
-
- free(list);
- return n;
-}
-
-int
-pipeline_table_rule_add_bulk(const char *pipeline_name,
- uint32_t table_id,
- struct table_rule_list *list,
- uint32_t *n_rules_added,
- uint32_t *n_rules_not_added)
-{
- struct pipeline *p;
- struct table *table;
- struct pipeline_msg_req *req;
- struct pipeline_msg_rsp *rsp;
- struct table_rule *rule;
- int status = 0;
-
- /* Check input params */
- if ((pipeline_name == NULL) ||
- (list == NULL) ||
- TAILQ_EMPTY(list) ||
- (n_rules_added == NULL) ||
- (n_rules_not_added == NULL)) {
- table_rule_list_free(list);
- return -EINVAL;
- }
-
- p = pipeline_find(pipeline_name);
- if ((p == NULL) ||
- (table_id >= p->n_tables)) {
- table_rule_list_free(list);
- return -EINVAL;
- }
-
- table = &p->table[table_id];
-
- TAILQ_FOREACH(rule, list, node)
- if (match_check(&rule->match, p, table_id) ||
- action_check(&rule->action, p, table_id)) {
- table_rule_list_free(list);
- return -EINVAL;
- }
-
- if (!pipeline_is_running(p)) {
- struct table_ll table_ll = {
- .p = p->p,
- .table_id = table_id,
- .a = table->a,
- .bulk_supported = table->params.match_type == TABLE_ACL,
- };
-
- status = table_rule_add_bulk_ll(&table_ll, list, n_rules_added);
- if (status) {
- table_rule_list_free(list);
- return status;
- }
-
- table_rule_add_bulk(table, list, *n_rules_added);
- *n_rules_not_added = table_rule_list_free(list);
- return 0;
- }
-
- /* Allocate request */
- req = pipeline_msg_alloc();
- if (req == NULL) {
- table_rule_list_free(list);
- return -ENOMEM;
- }
-
- /* Write request */
- req->type = PIPELINE_REQ_TABLE_RULE_ADD_BULK;
- req->id = table_id;
- req->table_rule_add_bulk.list = list;
- req->table_rule_add_bulk.bulk = table->params.match_type == TABLE_ACL;
-
- /* Send request and wait for response */
- rsp = pipeline_msg_send_recv(p, req);
-
- /* Read response */
- status = rsp->status;
- if (status == 0) {
- *n_rules_added = rsp->table_rule_add_bulk.n_rules;
-
- table_rule_add_bulk(table, list, *n_rules_added);
- *n_rules_not_added = table_rule_list_free(list);
- } else
- table_rule_list_free(list);
-
-
- /* Free response */
- pipeline_msg_free(rsp);
-
- return status;
-}
-
-int
-pipeline_table_rule_delete(const char *pipeline_name,
- uint32_t table_id,
- struct table_rule_match *match)
-{
- struct pipeline *p;
- struct table *table;
- struct pipeline_msg_req *req;
- struct pipeline_msg_rsp *rsp;
- int status;
-
- /* Check input params */
- if ((pipeline_name == NULL) ||
- (match == NULL))
- return -1;
-
- p = pipeline_find(pipeline_name);
- if ((p == NULL) ||
- (table_id >= p->n_tables) ||
- match_check(match, p, table_id))
- return -1;
-
- table = &p->table[table_id];
-
- if (!pipeline_is_running(p)) {
- union table_rule_match_low_level match_ll;
- int key_found;
-
- status = match_convert(match, &match_ll, 0);
- if (status)
- return -1;
-
- status = rte_pipeline_table_entry_delete(p->p,
- table_id,
- &match_ll,
- &key_found,
- NULL);
-
- if (status == 0)
- table_rule_delete(table, match);
-
- return status;
- }
-
- /* Allocate request */
- req = pipeline_msg_alloc();
- if (req == NULL)
- return -1;
-
- /* Write request */
- req->type = PIPELINE_REQ_TABLE_RULE_DELETE;
- req->id = table_id;
- memcpy(&req->table_rule_delete.match, match, sizeof(*match));
-
- /* Send request and wait for response */
- rsp = pipeline_msg_send_recv(p, req);
-
- /* Read response */
- status = rsp->status;
- if (status == 0)
- table_rule_delete(table, match);
-
- /* Free response */
- pipeline_msg_free(rsp);
-
- return status;
-}
-
-int
-pipeline_table_rule_delete_default(const char *pipeline_name,
- uint32_t table_id)
-{
- struct pipeline *p;
- struct table *table;
- struct pipeline_msg_req *req;
- struct pipeline_msg_rsp *rsp;
- int status;
-
- /* Check input params */
- if (pipeline_name == NULL)
- return -1;
-
- p = pipeline_find(pipeline_name);
- if ((p == NULL) ||
- (table_id >= p->n_tables))
- return -1;
-
- table = &p->table[table_id];
-
- if (!pipeline_is_running(p)) {
- status = rte_pipeline_table_default_entry_delete(p->p,
- table_id,
- NULL);
-
- if (status == 0)
- table_rule_default_delete(table);
-
- return status;
- }
-
- /* Allocate request */
- req = pipeline_msg_alloc();
- if (req == NULL)
- return -1;
-
- /* Write request */
- req->type = PIPELINE_REQ_TABLE_RULE_DELETE_DEFAULT;
- req->id = table_id;
-
- /* Send request and wait for response */
- rsp = pipeline_msg_send_recv(p, req);
-
- /* Read response */
- status = rsp->status;
- if (status == 0)
- table_rule_default_delete(table);
-
- /* Free response */
- pipeline_msg_free(rsp);
-
- return status;
-}
-
-int
-pipeline_table_rule_stats_read(const char *pipeline_name,
- uint32_t table_id,
- struct table_rule_match *match,
- struct rte_table_action_stats_counters *stats,
- int clear)
-{
- struct pipeline *p;
- struct table *table;
- struct pipeline_msg_req *req;
- struct pipeline_msg_rsp *rsp;
- struct table_rule *rule;
- int status;
-
- /* Check input params */
- if ((pipeline_name == NULL) ||
- (match == NULL) ||
- (stats == NULL))
- return -1;
-
- p = pipeline_find(pipeline_name);
- if ((p == NULL) ||
- (table_id >= p->n_tables) ||
- match_check(match, p, table_id))
- return -1;
-
- table = &p->table[table_id];
- rule = table_rule_find(table, match);
- if (rule == NULL)
- return -1;
-
- if (!pipeline_is_running(p)) {
- status = rte_table_action_stats_read(table->a,
- rule->data,
- stats,
- clear);
-
- return status;
- }
-
- /* Allocate request */
- req = pipeline_msg_alloc();
- if (req == NULL)
- return -1;
-
- /* Write request */
- req->type = PIPELINE_REQ_TABLE_RULE_STATS_READ;
- req->id = table_id;
- req->table_rule_stats_read.data = rule->data;
- req->table_rule_stats_read.clear = clear;
-
- /* Send request and wait for response */
- rsp = pipeline_msg_send_recv(p, req);
-
- /* Read response */
- status = rsp->status;
- if (status == 0)
- memcpy(stats, &rsp->table_rule_stats_read.stats, sizeof(*stats));
-
- /* Free response */
- pipeline_msg_free(rsp);
-
- return status;
-}
-
-int
-pipeline_table_mtr_profile_add(const char *pipeline_name,
- uint32_t table_id,
- uint32_t meter_profile_id,
- struct rte_table_action_meter_profile *profile)
-{
- struct pipeline *p;
- struct pipeline_msg_req *req;
- struct pipeline_msg_rsp *rsp;
- int status;
-
- /* Check input params */
- if ((pipeline_name == NULL) ||
- (profile == NULL))
- return -1;
-
- p = pipeline_find(pipeline_name);
- if ((p == NULL) ||
- (table_id >= p->n_tables))
- return -1;
-
- if (!pipeline_is_running(p)) {
- struct rte_table_action *a = p->table[table_id].a;
-
- status = rte_table_action_meter_profile_add(a,
- meter_profile_id,
- profile);
-
- return status;
- }
-
- /* Allocate request */
- req = pipeline_msg_alloc();
- if (req == NULL)
- return -1;
-
- /* Write request */
- req->type = PIPELINE_REQ_TABLE_MTR_PROFILE_ADD;
- req->id = table_id;
- req->table_mtr_profile_add.meter_profile_id = meter_profile_id;
- memcpy(&req->table_mtr_profile_add.profile, profile, sizeof(*profile));
-
- /* Send request and wait for response */
- rsp = pipeline_msg_send_recv(p, req);
-
- /* Read response */
- status = rsp->status;
-
- /* Free response */
- pipeline_msg_free(rsp);
-
- return status;
-}
-
-int
-pipeline_table_mtr_profile_delete(const char *pipeline_name,
- uint32_t table_id,
- uint32_t meter_profile_id)
-{
- struct pipeline *p;
- struct pipeline_msg_req *req;
- struct pipeline_msg_rsp *rsp;
- int status;
-
- /* Check input params */
- if (pipeline_name == NULL)
- return -1;
-
- p = pipeline_find(pipeline_name);
- if ((p == NULL) ||
- (table_id >= p->n_tables))
- return -1;
-
- if (!pipeline_is_running(p)) {
- struct rte_table_action *a = p->table[table_id].a;
-
- status = rte_table_action_meter_profile_delete(a,
- meter_profile_id);
-
- return status;
- }
-
- /* Allocate request */
- req = pipeline_msg_alloc();
- if (req == NULL)
- return -1;
-
- /* Write request */
- req->type = PIPELINE_REQ_TABLE_MTR_PROFILE_DELETE;
- req->id = table_id;
- req->table_mtr_profile_delete.meter_profile_id = meter_profile_id;
-
- /* Send request and wait for response */
- rsp = pipeline_msg_send_recv(p, req);
-
- /* Read response */
- status = rsp->status;
-
- /* Free response */
- pipeline_msg_free(rsp);
-
- return status;
-}
-
-int
-pipeline_table_rule_mtr_read(const char *pipeline_name,
- uint32_t table_id,
- struct table_rule_match *match,
- struct rte_table_action_mtr_counters *stats,
- int clear)
-{
- struct pipeline *p;
- struct table *table;
- struct pipeline_msg_req *req;
- struct pipeline_msg_rsp *rsp;
- struct table_rule *rule;
- uint32_t tc_mask;
- int status;
-
- /* Check input params */
- if ((pipeline_name == NULL) ||
- (match == NULL) ||
- (stats == NULL))
- return -1;
-
- p = pipeline_find(pipeline_name);
- if ((p == NULL) ||
- (table_id >= p->n_tables) ||
- match_check(match, p, table_id))
- return -1;
-
- table = &p->table[table_id];
- tc_mask = (1 << table->ap->params.mtr.n_tc) - 1;
-
- rule = table_rule_find(table, match);
- if (rule == NULL)
- return -1;
-
- if (!pipeline_is_running(p)) {
- status = rte_table_action_meter_read(table->a,
- rule->data,
- tc_mask,
- stats,
- clear);
-
- return status;
- }
-
- /* Allocate request */
- req = pipeline_msg_alloc();
- if (req == NULL)
- return -1;
-
- /* Write request */
- req->type = PIPELINE_REQ_TABLE_RULE_MTR_READ;
- req->id = table_id;
- req->table_rule_mtr_read.data = rule->data;
- req->table_rule_mtr_read.tc_mask = tc_mask;
- req->table_rule_mtr_read.clear = clear;
-
- /* Send request and wait for response */
- rsp = pipeline_msg_send_recv(p, req);
-
- /* Read response */
- status = rsp->status;
- if (status == 0)
- memcpy(stats, &rsp->table_rule_mtr_read.stats, sizeof(*stats));
-
- /* Free response */
- pipeline_msg_free(rsp);
-
- return status;
-}
-
-int
-pipeline_table_dscp_table_update(const char *pipeline_name,
- uint32_t table_id,
- uint64_t dscp_mask,
- struct rte_table_action_dscp_table *dscp_table)
-{
- struct pipeline *p;
- struct pipeline_msg_req *req;
- struct pipeline_msg_rsp *rsp;
- int status;
-
- /* Check input params */
- if ((pipeline_name == NULL) ||
- (dscp_table == NULL))
- return -1;
-
- p = pipeline_find(pipeline_name);
- if ((p == NULL) ||
- (table_id >= p->n_tables))
- return -1;
-
- if (!pipeline_is_running(p)) {
- struct rte_table_action *a = p->table[table_id].a;
-
- status = rte_table_action_dscp_table_update(a,
- dscp_mask,
- dscp_table);
-
- return status;
- }
-
- /* Allocate request */
- req = pipeline_msg_alloc();
- if (req == NULL)
- return -1;
-
- /* Write request */
- req->type = PIPELINE_REQ_TABLE_DSCP_TABLE_UPDATE;
- req->id = table_id;
- req->table_dscp_table_update.dscp_mask = dscp_mask;
- memcpy(&req->table_dscp_table_update.dscp_table,
- dscp_table, sizeof(*dscp_table));
-
- /* Send request and wait for response */
- rsp = pipeline_msg_send_recv(p, req);
-
- /* Read response */
- status = rsp->status;
-
- /* Free response */
- pipeline_msg_free(rsp);
-
- return status;
-}
-
-int
-pipeline_table_rule_ttl_read(const char *pipeline_name,
- uint32_t table_id,
- struct table_rule_match *match,
- struct rte_table_action_ttl_counters *stats,
- int clear)
-{
- struct pipeline *p;
- struct table *table;
- struct pipeline_msg_req *req;
- struct pipeline_msg_rsp *rsp;
- struct table_rule *rule;
- int status;
-
- /* Check input params */
- if ((pipeline_name == NULL) ||
- (match == NULL) ||
- (stats == NULL))
- return -1;
-
- p = pipeline_find(pipeline_name);
- if ((p == NULL) ||
- (table_id >= p->n_tables) ||
- match_check(match, p, table_id))
- return -1;
-
- table = &p->table[table_id];
- if (!table->ap->params.ttl.n_packets_enabled)
- return -1;
-
- rule = table_rule_find(table, match);
- if (rule == NULL)
- return -1;
-
- if (!pipeline_is_running(p)) {
- status = rte_table_action_ttl_read(table->a,
- rule->data,
- stats,
- clear);
-
- return status;
- }
-
- /* Allocate request */
- req = pipeline_msg_alloc();
- if (req == NULL)
- return -1;
-
- /* Write request */
- req->type = PIPELINE_REQ_TABLE_RULE_TTL_READ;
- req->id = table_id;
- req->table_rule_ttl_read.data = rule->data;
- req->table_rule_ttl_read.clear = clear;
-
- /* Send request and wait for response */
- rsp = pipeline_msg_send_recv(p, req);
-
- /* Read response */
- status = rsp->status;
- if (status == 0)
- memcpy(stats, &rsp->table_rule_ttl_read.stats, sizeof(*stats));
-
- /* Free response */
- pipeline_msg_free(rsp);
-
- return status;
-}
-
-int
-pipeline_table_rule_time_read(const char *pipeline_name,
- uint32_t table_id,
- struct table_rule_match *match,
- uint64_t *timestamp)
-{
- struct pipeline *p;
- struct table *table;
- struct pipeline_msg_req *req;
- struct pipeline_msg_rsp *rsp;
- struct table_rule *rule;
- int status;
-
- /* Check input params */
- if ((pipeline_name == NULL) ||
- (match == NULL) ||
- (timestamp == NULL))
- return -1;
-
- p = pipeline_find(pipeline_name);
- if ((p == NULL) ||
- (table_id >= p->n_tables) ||
- match_check(match, p, table_id))
- return -1;
-
- table = &p->table[table_id];
-
- rule = table_rule_find(table, match);
- if (rule == NULL)
- return -1;
-
- if (!pipeline_is_running(p)) {
- status = rte_table_action_time_read(table->a,
- rule->data,
- timestamp);
-
- return status;
- }
-
- /* Allocate request */
- req = pipeline_msg_alloc();
- if (req == NULL)
- return -1;
-
- /* Write request */
- req->type = PIPELINE_REQ_TABLE_RULE_TIME_READ;
- req->id = table_id;
- req->table_rule_time_read.data = rule->data;
-
- /* Send request and wait for response */
- rsp = pipeline_msg_send_recv(p, req);
-
- /* Read response */
- status = rsp->status;
- if (status == 0)
- *timestamp = rsp->table_rule_time_read.timestamp;
-
- /* Free response */
- pipeline_msg_free(rsp);
-
- return status;
-}
-
-/**
- * Data plane threads: message handling
- */
-static inline struct pipeline_msg_req *
-pipeline_msg_recv(struct rte_ring *msgq_req)
-{
- struct pipeline_msg_req *req;
-
- int status = rte_ring_sc_dequeue(msgq_req, (void **) &req);
-
- if (status != 0)
- return NULL;
-
- return req;
-}
-
-static inline void
-pipeline_msg_send(struct rte_ring *msgq_rsp,
- struct pipeline_msg_rsp *rsp)
-{
- int status;
-
- do {
- status = rte_ring_sp_enqueue(msgq_rsp, rsp);
- } while (status == -ENOBUFS);
-}
-
-static struct pipeline_msg_rsp *
-pipeline_msg_handle_port_in_stats_read(struct pipeline_data *p,
- struct pipeline_msg_req *req)
-{
- struct pipeline_msg_rsp *rsp = (struct pipeline_msg_rsp *) req;
- uint32_t port_id = req->id;
- int clear = req->port_in_stats_read.clear;
-
- rsp->status = rte_pipeline_port_in_stats_read(p->p,
- port_id,
- &rsp->port_in_stats_read.stats,
- clear);
-
- return rsp;
-}
-
-static struct pipeline_msg_rsp *
-pipeline_msg_handle_port_in_enable(struct pipeline_data *p,
- struct pipeline_msg_req *req)
-{
- struct pipeline_msg_rsp *rsp = (struct pipeline_msg_rsp *) req;
- uint32_t port_id = req->id;
-
- rsp->status = rte_pipeline_port_in_enable(p->p,
- port_id);
-
- return rsp;
-}
-
-static struct pipeline_msg_rsp *
-pipeline_msg_handle_port_in_disable(struct pipeline_data *p,
- struct pipeline_msg_req *req)
-{
- struct pipeline_msg_rsp *rsp = (struct pipeline_msg_rsp *) req;
- uint32_t port_id = req->id;
-
- rsp->status = rte_pipeline_port_in_disable(p->p,
- port_id);
-
- return rsp;
-}
-
-static struct pipeline_msg_rsp *
-pipeline_msg_handle_port_out_stats_read(struct pipeline_data *p,
- struct pipeline_msg_req *req)
-{
- struct pipeline_msg_rsp *rsp = (struct pipeline_msg_rsp *) req;
- uint32_t port_id = req->id;
- int clear = req->port_out_stats_read.clear;
-
- rsp->status = rte_pipeline_port_out_stats_read(p->p,
- port_id,
- &rsp->port_out_stats_read.stats,
- clear);
-
- return rsp;
-}
-
-static struct pipeline_msg_rsp *
-pipeline_msg_handle_table_stats_read(struct pipeline_data *p,
- struct pipeline_msg_req *req)
-{
- struct pipeline_msg_rsp *rsp = (struct pipeline_msg_rsp *) req;
- uint32_t port_id = req->id;
- int clear = req->table_stats_read.clear;
-
- rsp->status = rte_pipeline_table_stats_read(p->p,
- port_id,
- &rsp->table_stats_read.stats,
- clear);
-
- return rsp;
-}
-
-static int
-match_convert_ipv6_depth(uint32_t depth, uint32_t *depth32)
-{
- if (depth > 128)
- return -1;
-
- switch (depth / 32) {
- case 0:
- depth32[0] = depth;
- depth32[1] = 0;
- depth32[2] = 0;
- depth32[3] = 0;
- return 0;
-
- case 1:
- depth32[0] = 32;
- depth32[1] = depth - 32;
- depth32[2] = 0;
- depth32[3] = 0;
- return 0;
-
- case 2:
- depth32[0] = 32;
- depth32[1] = 32;
- depth32[2] = depth - 64;
- depth32[3] = 0;
- return 0;
-
- case 3:
- depth32[0] = 32;
- depth32[1] = 32;
- depth32[2] = 32;
- depth32[3] = depth - 96;
- return 0;
-
- case 4:
- depth32[0] = 32;
- depth32[1] = 32;
- depth32[2] = 32;
- depth32[3] = 32;
- return 0;
-
- default:
- return -1;
- }
-}
-
-static int
-match_convert(struct table_rule_match *mh,
- union table_rule_match_low_level *ml,
- int add)
-{
- memset(ml, 0, sizeof(*ml));
-
- switch (mh->match_type) {
- case TABLE_ACL:
- if (mh->match.acl.ip_version)
- if (add) {
- ml->acl_add.field_value[0].value.u8 =
- mh->match.acl.proto;
- ml->acl_add.field_value[0].mask_range.u8 =
- mh->match.acl.proto_mask;
-
- ml->acl_add.field_value[1].value.u32 =
- mh->match.acl.ipv4.sa;
- ml->acl_add.field_value[1].mask_range.u32 =
- mh->match.acl.sa_depth;
-
- ml->acl_add.field_value[2].value.u32 =
- mh->match.acl.ipv4.da;
- ml->acl_add.field_value[2].mask_range.u32 =
- mh->match.acl.da_depth;
-
- ml->acl_add.field_value[3].value.u16 =
- mh->match.acl.sp0;
- ml->acl_add.field_value[3].mask_range.u16 =
- mh->match.acl.sp1;
-
- ml->acl_add.field_value[4].value.u16 =
- mh->match.acl.dp0;
- ml->acl_add.field_value[4].mask_range.u16 =
- mh->match.acl.dp1;
-
- ml->acl_add.priority =
- (int32_t) mh->match.acl.priority;
- } else {
- ml->acl_delete.field_value[0].value.u8 =
- mh->match.acl.proto;
- ml->acl_delete.field_value[0].mask_range.u8 =
- mh->match.acl.proto_mask;
-
- ml->acl_delete.field_value[1].value.u32 =
- mh->match.acl.ipv4.sa;
- ml->acl_delete.field_value[1].mask_range.u32 =
- mh->match.acl.sa_depth;
-
- ml->acl_delete.field_value[2].value.u32 =
- mh->match.acl.ipv4.da;
- ml->acl_delete.field_value[2].mask_range.u32 =
- mh->match.acl.da_depth;
-
- ml->acl_delete.field_value[3].value.u16 =
- mh->match.acl.sp0;
- ml->acl_delete.field_value[3].mask_range.u16 =
- mh->match.acl.sp1;
-
- ml->acl_delete.field_value[4].value.u16 =
- mh->match.acl.dp0;
- ml->acl_delete.field_value[4].mask_range.u16 =
- mh->match.acl.dp1;
- }
- else
- if (add) {
- uint32_t *sa32 = (uint32_t *)&mh->match.acl.ipv6.sa;
- uint32_t *da32 = (uint32_t *)&mh->match.acl.ipv6.da;
- uint32_t sa32_depth[4], da32_depth[4];
- int status;
-
- status = match_convert_ipv6_depth(
- mh->match.acl.sa_depth,
- sa32_depth);
- if (status)
- return status;
-
- status = match_convert_ipv6_depth(
- mh->match.acl.da_depth,
- da32_depth);
- if (status)
- return status;
-
- ml->acl_add.field_value[0].value.u8 =
- mh->match.acl.proto;
- ml->acl_add.field_value[0].mask_range.u8 =
- mh->match.acl.proto_mask;
-
- ml->acl_add.field_value[1].value.u32 =
- rte_be_to_cpu_32(sa32[0]);
- ml->acl_add.field_value[1].mask_range.u32 =
- sa32_depth[0];
- ml->acl_add.field_value[2].value.u32 =
- rte_be_to_cpu_32(sa32[1]);
- ml->acl_add.field_value[2].mask_range.u32 =
- sa32_depth[1];
- ml->acl_add.field_value[3].value.u32 =
- rte_be_to_cpu_32(sa32[2]);
- ml->acl_add.field_value[3].mask_range.u32 =
- sa32_depth[2];
- ml->acl_add.field_value[4].value.u32 =
- rte_be_to_cpu_32(sa32[3]);
- ml->acl_add.field_value[4].mask_range.u32 =
- sa32_depth[3];
-
- ml->acl_add.field_value[5].value.u32 =
- rte_be_to_cpu_32(da32[0]);
- ml->acl_add.field_value[5].mask_range.u32 =
- da32_depth[0];
- ml->acl_add.field_value[6].value.u32 =
- rte_be_to_cpu_32(da32[1]);
- ml->acl_add.field_value[6].mask_range.u32 =
- da32_depth[1];
- ml->acl_add.field_value[7].value.u32 =
- rte_be_to_cpu_32(da32[2]);
- ml->acl_add.field_value[7].mask_range.u32 =
- da32_depth[2];
- ml->acl_add.field_value[8].value.u32 =
- rte_be_to_cpu_32(da32[3]);
- ml->acl_add.field_value[8].mask_range.u32 =
- da32_depth[3];
-
- ml->acl_add.field_value[9].value.u16 =
- mh->match.acl.sp0;
- ml->acl_add.field_value[9].mask_range.u16 =
- mh->match.acl.sp1;
-
- ml->acl_add.field_value[10].value.u16 =
- mh->match.acl.dp0;
- ml->acl_add.field_value[10].mask_range.u16 =
- mh->match.acl.dp1;
-
- ml->acl_add.priority =
- (int32_t) mh->match.acl.priority;
- } else {
- uint32_t *sa32 = (uint32_t *)&mh->match.acl.ipv6.sa;
- uint32_t *da32 = (uint32_t *)&mh->match.acl.ipv6.da;
- uint32_t sa32_depth[4], da32_depth[4];
- int status;
-
- status = match_convert_ipv6_depth(
- mh->match.acl.sa_depth,
- sa32_depth);
- if (status)
- return status;
-
- status = match_convert_ipv6_depth(
- mh->match.acl.da_depth,
- da32_depth);
- if (status)
- return status;
-
- ml->acl_delete.field_value[0].value.u8 =
- mh->match.acl.proto;
- ml->acl_delete.field_value[0].mask_range.u8 =
- mh->match.acl.proto_mask;
-
- ml->acl_delete.field_value[1].value.u32 =
- rte_be_to_cpu_32(sa32[0]);
- ml->acl_delete.field_value[1].mask_range.u32 =
- sa32_depth[0];
- ml->acl_delete.field_value[2].value.u32 =
- rte_be_to_cpu_32(sa32[1]);
- ml->acl_delete.field_value[2].mask_range.u32 =
- sa32_depth[1];
- ml->acl_delete.field_value[3].value.u32 =
- rte_be_to_cpu_32(sa32[2]);
- ml->acl_delete.field_value[3].mask_range.u32 =
- sa32_depth[2];
- ml->acl_delete.field_value[4].value.u32 =
- rte_be_to_cpu_32(sa32[3]);
- ml->acl_delete.field_value[4].mask_range.u32 =
- sa32_depth[3];
-
- ml->acl_delete.field_value[5].value.u32 =
- rte_be_to_cpu_32(da32[0]);
- ml->acl_delete.field_value[5].mask_range.u32 =
- da32_depth[0];
- ml->acl_delete.field_value[6].value.u32 =
- rte_be_to_cpu_32(da32[1]);
- ml->acl_delete.field_value[6].mask_range.u32 =
- da32_depth[1];
- ml->acl_delete.field_value[7].value.u32 =
- rte_be_to_cpu_32(da32[2]);
- ml->acl_delete.field_value[7].mask_range.u32 =
- da32_depth[2];
- ml->acl_delete.field_value[8].value.u32 =
- rte_be_to_cpu_32(da32[3]);
- ml->acl_delete.field_value[8].mask_range.u32 =
- da32_depth[3];
-
- ml->acl_delete.field_value[9].value.u16 =
- mh->match.acl.sp0;
- ml->acl_delete.field_value[9].mask_range.u16 =
- mh->match.acl.sp1;
-
- ml->acl_delete.field_value[10].value.u16 =
- mh->match.acl.dp0;
- ml->acl_delete.field_value[10].mask_range.u16 =
- mh->match.acl.dp1;
- }
- return 0;
-
- case TABLE_ARRAY:
- ml->array.pos = mh->match.array.pos;
- return 0;
-
- case TABLE_HASH:
- memcpy(ml->hash, mh->match.hash.key, sizeof(ml->hash));
- return 0;
-
- case TABLE_LPM:
- if (mh->match.lpm.ip_version) {
- ml->lpm_ipv4.ip = mh->match.lpm.ipv4;
- ml->lpm_ipv4.depth = mh->match.lpm.depth;
- } else {
- ml->lpm_ipv6.ip = mh->match.lpm.ipv6;
- ml->lpm_ipv6.depth = mh->match.lpm.depth;
- }
-
- return 0;
-
- default:
- return -1;
- }
-}
-
-static int
-action_convert(struct rte_table_action *a,
- struct table_rule_action *action,
- struct rte_pipeline_table_entry *data)
-{
- int status;
-
- /* Apply actions */
- if (action->action_mask & (1LLU << RTE_TABLE_ACTION_FWD)) {
- status = rte_table_action_apply(a,
- data,
- RTE_TABLE_ACTION_FWD,
- &action->fwd);
-
- if (status)
- return status;
- }
-
- if (action->action_mask & (1LLU << RTE_TABLE_ACTION_LB)) {
- status = rte_table_action_apply(a,
- data,
- RTE_TABLE_ACTION_LB,
- &action->lb);
-
- if (status)
- return status;
- }
-
- if (action->action_mask & (1LLU << RTE_TABLE_ACTION_MTR)) {
- status = rte_table_action_apply(a,
- data,
- RTE_TABLE_ACTION_MTR,
- &action->mtr);
-
- if (status)
- return status;
- }
-
- if (action->action_mask & (1LLU << RTE_TABLE_ACTION_TM)) {
- status = rte_table_action_apply(a,
- data,
- RTE_TABLE_ACTION_TM,
- &action->tm);
-
- if (status)
- return status;
- }
-
- if (action->action_mask & (1LLU << RTE_TABLE_ACTION_ENCAP)) {
- status = rte_table_action_apply(a,
- data,
- RTE_TABLE_ACTION_ENCAP,
- &action->encap);
-
- if (status)
- return status;
- }
-
- if (action->action_mask & (1LLU << RTE_TABLE_ACTION_NAT)) {
- status = rte_table_action_apply(a,
- data,
- RTE_TABLE_ACTION_NAT,
- &action->nat);
-
- if (status)
- return status;
- }
-
- if (action->action_mask & (1LLU << RTE_TABLE_ACTION_TTL)) {
- status = rte_table_action_apply(a,
- data,
- RTE_TABLE_ACTION_TTL,
- &action->ttl);
-
- if (status)
- return status;
- }
-
- if (action->action_mask & (1LLU << RTE_TABLE_ACTION_STATS)) {
- status = rte_table_action_apply(a,
- data,
- RTE_TABLE_ACTION_STATS,
- &action->stats);
-
- if (status)
- return status;
- }
-
- if (action->action_mask & (1LLU << RTE_TABLE_ACTION_TIME)) {
- status = rte_table_action_apply(a,
- data,
- RTE_TABLE_ACTION_TIME,
- &action->time);
-
- if (status)
- return status;
- }
-
- if (action->action_mask & (1LLU << RTE_TABLE_ACTION_SYM_CRYPTO)) {
- status = rte_table_action_apply(a,
- data,
- RTE_TABLE_ACTION_SYM_CRYPTO,
- &action->sym_crypto);
-
- if (status)
- return status;
- }
-
- if (action->action_mask & (1LLU << RTE_TABLE_ACTION_TAG)) {
- status = rte_table_action_apply(a,
- data,
- RTE_TABLE_ACTION_TAG,
- &action->tag);
-
- if (status)
- return status;
- }
-
- if (action->action_mask & (1LLU << RTE_TABLE_ACTION_DECAP)) {
- status = rte_table_action_apply(a,
- data,
- RTE_TABLE_ACTION_DECAP,
- &action->decap);
-
- if (status)
- return status;
- }
-
- return 0;
-}
-
-static struct pipeline_msg_rsp *
-pipeline_msg_handle_table_rule_add(struct pipeline_data *p,
- struct pipeline_msg_req *req)
-{
- union table_rule_match_low_level match_ll;
- struct pipeline_msg_rsp *rsp = (struct pipeline_msg_rsp *) req;
- struct table_rule_match *match = &req->table_rule_add.match;
- struct table_rule_action *action = &req->table_rule_add.action;
- struct rte_pipeline_table_entry *data_in, *data_out;
- uint32_t table_id = req->id;
- int key_found, status;
- struct rte_table_action *a = p->table_data[table_id].a;
-
- /* Apply actions */
- memset(p->buffer, 0, sizeof(p->buffer));
- data_in = (struct rte_pipeline_table_entry *) p->buffer;
-
- status = match_convert(match, &match_ll, 1);
- if (status) {
- rsp->status = -1;
- return rsp;
- }
-
- status = action_convert(a, action, data_in);
- if (status) {
- rsp->status = -1;
- return rsp;
- }
-
- status = rte_pipeline_table_entry_add(p->p,
- table_id,
- &match_ll,
- data_in,
- &key_found,
- &data_out);
- if (status) {
- rsp->status = -1;
- return rsp;
- }
-
- /* Write response */
- rsp->status = 0;
- rsp->table_rule_add.data = data_out;
-
- return rsp;
-}
-
-static struct pipeline_msg_rsp *
-pipeline_msg_handle_table_rule_add_default(struct pipeline_data *p,
- struct pipeline_msg_req *req)
-{
- struct pipeline_msg_rsp *rsp = (struct pipeline_msg_rsp *) req;
- struct table_rule_action *action = &req->table_rule_add_default.action;
- struct rte_pipeline_table_entry *data_in, *data_out;
- uint32_t table_id = req->id;
- int status;
-
- /* Apply actions */
- memset(p->buffer, 0, sizeof(p->buffer));
- data_in = (struct rte_pipeline_table_entry *) p->buffer;
-
- data_in->action = action->fwd.action;
- if (action->fwd.action == RTE_PIPELINE_ACTION_PORT)
- data_in->port_id = action->fwd.id;
- if (action->fwd.action == RTE_PIPELINE_ACTION_TABLE)
- data_in->table_id = action->fwd.id;
-
- /* Add default rule to table */
- status = rte_pipeline_table_default_entry_add(p->p,
- table_id,
- data_in,
- &data_out);
- if (status) {
- rsp->status = -1;
- return rsp;
- }
-
- /* Write response */
- rsp->status = 0;
- rsp->table_rule_add_default.data = data_out;
-
- return rsp;
-}
-
-static struct pipeline_msg_rsp *
-pipeline_msg_handle_table_rule_add_bulk(struct pipeline_data *p,
- struct pipeline_msg_req *req)
-{
- struct pipeline_msg_rsp *rsp = (struct pipeline_msg_rsp *) req;
-
- uint32_t table_id = req->id;
- struct table_rule_list *list = req->table_rule_add_bulk.list;
- uint32_t bulk = req->table_rule_add_bulk.bulk;
-
- uint32_t n_rules_added;
- int status;
-
- struct table_ll table_ll = {
- .p = p->p,
- .table_id = table_id,
- .a = p->table_data[table_id].a,
- .bulk_supported = bulk,
- };
-
- status = table_rule_add_bulk_ll(&table_ll, list, &n_rules_added);
- if (status) {
- rsp->status = -1;
- rsp->table_rule_add_bulk.n_rules = 0;
- return rsp;
- }
-
- /* Write response */
- rsp->status = 0;
- rsp->table_rule_add_bulk.n_rules = n_rules_added;
- return rsp;
-}
-
-static struct pipeline_msg_rsp *
-pipeline_msg_handle_table_rule_delete(struct pipeline_data *p,
- struct pipeline_msg_req *req)
-{
- union table_rule_match_low_level match_ll;
- struct pipeline_msg_rsp *rsp = (struct pipeline_msg_rsp *) req;
- struct table_rule_match *match = &req->table_rule_delete.match;
- uint32_t table_id = req->id;
- int key_found, status;
-
- status = match_convert(match, &match_ll, 0);
- if (status) {
- rsp->status = -1;
- return rsp;
- }
-
- rsp->status = rte_pipeline_table_entry_delete(p->p,
- table_id,
- &match_ll,
- &key_found,
- NULL);
-
- return rsp;
-}
-
-static struct pipeline_msg_rsp *
-pipeline_msg_handle_table_rule_delete_default(struct pipeline_data *p,
- struct pipeline_msg_req *req)
-{
- struct pipeline_msg_rsp *rsp = (struct pipeline_msg_rsp *) req;
- uint32_t table_id = req->id;
-
- rsp->status = rte_pipeline_table_default_entry_delete(p->p,
- table_id,
- NULL);
-
- return rsp;
-}
-
-static struct pipeline_msg_rsp *
-pipeline_msg_handle_table_rule_stats_read(struct pipeline_data *p,
- struct pipeline_msg_req *req)
-{
- struct pipeline_msg_rsp *rsp = (struct pipeline_msg_rsp *) req;
- uint32_t table_id = req->id;
- void *data = req->table_rule_stats_read.data;
- int clear = req->table_rule_stats_read.clear;
- struct rte_table_action *a = p->table_data[table_id].a;
-
- rsp->status = rte_table_action_stats_read(a,
- data,
- &rsp->table_rule_stats_read.stats,
- clear);
-
- return rsp;
-}
-
-static struct pipeline_msg_rsp *
-pipeline_msg_handle_table_mtr_profile_add(struct pipeline_data *p,
- struct pipeline_msg_req *req)
-{
- struct pipeline_msg_rsp *rsp = (struct pipeline_msg_rsp *) req;
- uint32_t table_id = req->id;
- uint32_t meter_profile_id = req->table_mtr_profile_add.meter_profile_id;
- struct rte_table_action_meter_profile *profile =
- &req->table_mtr_profile_add.profile;
- struct rte_table_action *a = p->table_data[table_id].a;
-
- rsp->status = rte_table_action_meter_profile_add(a,
- meter_profile_id,
- profile);
-
- return rsp;
-}
-
-static struct pipeline_msg_rsp *
-pipeline_msg_handle_table_mtr_profile_delete(struct pipeline_data *p,
- struct pipeline_msg_req *req)
-{
- struct pipeline_msg_rsp *rsp = (struct pipeline_msg_rsp *) req;
- uint32_t table_id = req->id;
- uint32_t meter_profile_id =
- req->table_mtr_profile_delete.meter_profile_id;
- struct rte_table_action *a = p->table_data[table_id].a;
-
- rsp->status = rte_table_action_meter_profile_delete(a,
- meter_profile_id);
-
- return rsp;
-}
-
-static struct pipeline_msg_rsp *
-pipeline_msg_handle_table_rule_mtr_read(struct pipeline_data *p,
- struct pipeline_msg_req *req)
-{
- struct pipeline_msg_rsp *rsp = (struct pipeline_msg_rsp *) req;
- uint32_t table_id = req->id;
- void *data = req->table_rule_mtr_read.data;
- uint32_t tc_mask = req->table_rule_mtr_read.tc_mask;
- int clear = req->table_rule_mtr_read.clear;
- struct rte_table_action *a = p->table_data[table_id].a;
-
- rsp->status = rte_table_action_meter_read(a,
- data,
- tc_mask,
- &rsp->table_rule_mtr_read.stats,
- clear);
-
- return rsp;
-}
-
-static struct pipeline_msg_rsp *
-pipeline_msg_handle_table_dscp_table_update(struct pipeline_data *p,
- struct pipeline_msg_req *req)
-{
- struct pipeline_msg_rsp *rsp = (struct pipeline_msg_rsp *) req;
- uint32_t table_id = req->id;
- uint64_t dscp_mask = req->table_dscp_table_update.dscp_mask;
- struct rte_table_action_dscp_table *dscp_table =
- &req->table_dscp_table_update.dscp_table;
- struct rte_table_action *a = p->table_data[table_id].a;
-
- rsp->status = rte_table_action_dscp_table_update(a,
- dscp_mask,
- dscp_table);
-
- return rsp;
-}
-
-static struct pipeline_msg_rsp *
-pipeline_msg_handle_table_rule_ttl_read(struct pipeline_data *p,
- struct pipeline_msg_req *req)
-{
- struct pipeline_msg_rsp *rsp = (struct pipeline_msg_rsp *) req;
- uint32_t table_id = req->id;
- void *data = req->table_rule_ttl_read.data;
- int clear = req->table_rule_ttl_read.clear;
- struct rte_table_action *a = p->table_data[table_id].a;
-
- rsp->status = rte_table_action_ttl_read(a,
- data,
- &rsp->table_rule_ttl_read.stats,
- clear);
-
- return rsp;
-}
-
-static struct pipeline_msg_rsp *
-pipeline_msg_handle_table_rule_time_read(struct pipeline_data *p,
- struct pipeline_msg_req *req)
-{
- struct pipeline_msg_rsp *rsp = (struct pipeline_msg_rsp *) req;
- uint32_t table_id = req->id;
- void *data = req->table_rule_time_read.data;
- struct rte_table_action *a = p->table_data[table_id].a;
-
- rsp->status = rte_table_action_time_read(a,
- data,
- &rsp->table_rule_time_read.timestamp);
-
- return rsp;
-}
-
-static void
-pipeline_msg_handle(struct pipeline_data *p)
-{
- for ( ; ; ) {
- struct pipeline_msg_req *req;
- struct pipeline_msg_rsp *rsp;
-
- req = pipeline_msg_recv(p->msgq_req);
- if (req == NULL)
- break;
-
- switch (req->type) {
- case PIPELINE_REQ_PORT_IN_STATS_READ:
- rsp = pipeline_msg_handle_port_in_stats_read(p, req);
- break;
-
- case PIPELINE_REQ_PORT_IN_ENABLE:
- rsp = pipeline_msg_handle_port_in_enable(p, req);
- break;
-
- case PIPELINE_REQ_PORT_IN_DISABLE:
- rsp = pipeline_msg_handle_port_in_disable(p, req);
- break;
-
- case PIPELINE_REQ_PORT_OUT_STATS_READ:
- rsp = pipeline_msg_handle_port_out_stats_read(p, req);
- break;
-
- case PIPELINE_REQ_TABLE_STATS_READ:
- rsp = pipeline_msg_handle_table_stats_read(p, req);
- break;
-
- case PIPELINE_REQ_TABLE_RULE_ADD:
- rsp = pipeline_msg_handle_table_rule_add(p, req);
- break;
-
- case PIPELINE_REQ_TABLE_RULE_ADD_DEFAULT:
- rsp = pipeline_msg_handle_table_rule_add_default(p, req);
- break;
-
- case PIPELINE_REQ_TABLE_RULE_ADD_BULK:
- rsp = pipeline_msg_handle_table_rule_add_bulk(p, req);
- break;
-
- case PIPELINE_REQ_TABLE_RULE_DELETE:
- rsp = pipeline_msg_handle_table_rule_delete(p, req);
- break;
-
- case PIPELINE_REQ_TABLE_RULE_DELETE_DEFAULT:
- rsp = pipeline_msg_handle_table_rule_delete_default(p, req);
- break;
-
- case PIPELINE_REQ_TABLE_RULE_STATS_READ:
- rsp = pipeline_msg_handle_table_rule_stats_read(p, req);
- break;
-
- case PIPELINE_REQ_TABLE_MTR_PROFILE_ADD:
- rsp = pipeline_msg_handle_table_mtr_profile_add(p, req);
- break;
-
- case PIPELINE_REQ_TABLE_MTR_PROFILE_DELETE:
- rsp = pipeline_msg_handle_table_mtr_profile_delete(p, req);
- break;
-
- case PIPELINE_REQ_TABLE_RULE_MTR_READ:
- rsp = pipeline_msg_handle_table_rule_mtr_read(p, req);
- break;
-
- case PIPELINE_REQ_TABLE_DSCP_TABLE_UPDATE:
- rsp = pipeline_msg_handle_table_dscp_table_update(p, req);
- break;
-
- case PIPELINE_REQ_TABLE_RULE_TTL_READ:
- rsp = pipeline_msg_handle_table_rule_ttl_read(p, req);
- break;
-
- case PIPELINE_REQ_TABLE_RULE_TIME_READ:
- rsp = pipeline_msg_handle_table_rule_time_read(p, req);
- break;
-
- default:
- rsp = (struct pipeline_msg_rsp *) req;
- rsp->status = -1;
- }
-
- pipeline_msg_send(p->msgq_rsp, rsp);
- }
-}
-
-/**
- * Data plane threads: main
- */
-int
-thread_main(void *arg __rte_unused)
-{
- struct thread_data *t;
- uint32_t thread_id, i;
-
- thread_id = rte_lcore_id();
- t = &thread_data[thread_id];
-
- /* Dispatch loop */
- for (i = 0; ; i++) {
- uint32_t j;
-
- /* Data Plane */
- for (j = 0; j < t->n_pipelines; j++)
- rte_pipeline_run(t->p[j]);
-
- /* Control Plane */
- if ((i & 0xF) == 0) {
- uint64_t time = rte_get_tsc_cycles();
- uint64_t time_next_min = UINT64_MAX;
-
- if (time < t->time_next_min)
- continue;
-
- /* Pipeline message queues */
- for (j = 0; j < t->n_pipelines; j++) {
- struct pipeline_data *p =
- &t->pipeline_data[j];
- uint64_t time_next = p->time_next;
-
- if (time_next <= time) {
- pipeline_msg_handle(p);
- rte_pipeline_flush(p->p);
- time_next = time + p->timer_period;
- p->time_next = time_next;
- }
-
- if (time_next < time_next_min)
- time_next_min = time_next;
- }
-
- /* Thread message queues */
- {
- uint64_t time_next = t->time_next;
-
- if (time_next <= time) {
- thread_msg_handle(t);
- time_next = time + t->timer_period;
- t->time_next = time_next;
- }
-
- if (time_next < time_next_min)
- time_next_min = time_next;
- }
-
- t->time_next_min = time_next_min;
- }
- }
-
- return 0;
-}
diff --git a/examples/ip_pipeline/thread.h b/examples/ip_pipeline/thread.h
deleted file mode 100644
index facdf004eb..0000000000
--- a/examples/ip_pipeline/thread.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2018 Intel Corporation
- */
-
-#ifndef _INCLUDE_THREAD_H_
-#define _INCLUDE_THREAD_H_
-
-#include <stdint.h>
-
-int
-thread_pipeline_enable(uint32_t thread_id,
- const char *pipeline_name);
-
-int
-thread_pipeline_disable(uint32_t thread_id,
- const char *pipeline_name);
-
-int
-thread_init(void);
-
-int
-thread_main(void *arg);
-
-#endif /* _INCLUDE_THREAD_H_ */
diff --git a/examples/ip_pipeline/tmgr.c b/examples/ip_pipeline/tmgr.c
deleted file mode 100644
index 2432b56aee..0000000000
--- a/examples/ip_pipeline/tmgr.c
+++ /dev/null
@@ -1,248 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2018 Intel Corporation
- */
-
-#include <stdlib.h>
-
-#include <rte_common.h>
-#include <rte_string_fns.h>
-
-#include "tmgr.h"
-
-static struct rte_sched_subport_profile_params
- subport_profile[TMGR_SUBPORT_PROFILE_MAX];
-
-static uint32_t n_subport_profiles;
-
-static struct rte_sched_pipe_params
- pipe_profile[TMGR_PIPE_PROFILE_MAX];
-
-static uint32_t n_pipe_profiles;
-
-static const struct rte_sched_subport_params subport_params_default = {
- .n_pipes_per_subport_enabled = 0, /* filled at runtime */
- .qsize = {64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64},
- .pipe_profiles = pipe_profile,
- .n_pipe_profiles = 0, /* filled at run time */
- .n_max_pipe_profiles = RTE_DIM(pipe_profile),
- .cman_params = NULL,
-};
-
-static struct tmgr_port_list tmgr_port_list;
-
-int
-tmgr_init(void)
-{
- TAILQ_INIT(&tmgr_port_list);
-
- return 0;
-}
-
-struct tmgr_port *
-tmgr_port_find(const char *name)
-{
- struct tmgr_port *tmgr_port;
-
- if (name == NULL)
- return NULL;
-
- TAILQ_FOREACH(tmgr_port, &tmgr_port_list, node)
- if (strcmp(tmgr_port->name, name) == 0)
- return tmgr_port;
-
- return NULL;
-}
-
-int
-tmgr_subport_profile_add(struct rte_sched_subport_profile_params *params)
-{
- /* Check input params */
- if (params == NULL)
- return -1;
-
- /* Save profile */
- memcpy(&subport_profile[n_subport_profiles],
- params,
- sizeof(*params));
-
- n_subport_profiles++;
-
- return 0;
-}
-
-int
-tmgr_pipe_profile_add(struct rte_sched_pipe_params *p)
-{
- /* Check input params */
- if (p == NULL)
- return -1;
-
- /* Save profile */
- memcpy(&pipe_profile[n_pipe_profiles],
- p,
- sizeof(*p));
-
- n_pipe_profiles++;
-
- return 0;
-}
-
-struct tmgr_port *
-tmgr_port_create(const char *name, struct tmgr_port_params *params)
-{
- struct rte_sched_subport_params subport_params;
- struct rte_sched_port_params p;
- struct tmgr_port *tmgr_port;
- struct rte_sched_port *s;
- uint32_t i, j;
-
- /* Check input params */
- if ((name == NULL) ||
- tmgr_port_find(name) ||
- (params == NULL) ||
- (params->n_subports_per_port == 0) ||
- (params->n_pipes_per_subport == 0) ||
- (params->cpu_id >= RTE_MAX_NUMA_NODES) ||
- (n_subport_profiles == 0) ||
- (n_pipe_profiles == 0))
- return NULL;
-
- /* Resource create */
- p.name = name;
- p.socket = (int) params->cpu_id;
- p.rate = params->rate;
- p.mtu = params->mtu;
- p.frame_overhead = params->frame_overhead;
- p.n_subports_per_port = params->n_subports_per_port;
- p.n_subport_profiles = n_subport_profiles;
- p.subport_profiles = subport_profile;
- p.n_max_subport_profiles = TMGR_SUBPORT_PROFILE_MAX;
- p.n_pipes_per_subport = params->n_pipes_per_subport;
-
-
- s = rte_sched_port_config(&p);
- if (s == NULL)
- return NULL;
-
- memcpy(&subport_params, &subport_params_default,
- sizeof(subport_params_default));
-
- subport_params.n_pipe_profiles = n_pipe_profiles;
- subport_params.n_pipes_per_subport_enabled =
- params->n_pipes_per_subport;
-
- for (i = 0; i < params->n_subports_per_port; i++) {
- int status;
-
- status = rte_sched_subport_config(
- s,
- i,
- &subport_params,
- 0);
-
- if (status) {
- rte_sched_port_free(s);
- return NULL;
- }
-
- for (j = 0; j < params->n_pipes_per_subport; j++) {
-
- status = rte_sched_pipe_config(
- s,
- i,
- j,
- 0);
-
- if (status) {
- rte_sched_port_free(s);
- return NULL;
- }
- }
- }
-
- /* Node allocation */
- tmgr_port = calloc(1, sizeof(struct tmgr_port));
- if (tmgr_port == NULL) {
- rte_sched_port_free(s);
- return NULL;
- }
-
- /* Node fill in */
- strlcpy(tmgr_port->name, name, sizeof(tmgr_port->name));
- tmgr_port->s = s;
- tmgr_port->n_subports_per_port = params->n_subports_per_port;
- tmgr_port->n_pipes_per_subport = params->n_pipes_per_subport;
-
- /* Node add to list */
- TAILQ_INSERT_TAIL(&tmgr_port_list, tmgr_port, node);
-
- return tmgr_port;
-}
-
-int
-tmgr_subport_config(const char *port_name,
- uint32_t subport_id,
- uint32_t subport_profile_id)
-{
- struct tmgr_port *port;
- int status;
-
- /* Check input params */
- if (port_name == NULL)
- return -1;
-
- port = tmgr_port_find(port_name);
- if ((port == NULL) ||
- (subport_id >= port->n_subports_per_port) ||
- (subport_profile_id >= n_subport_profiles))
- return -1;
-
- /* Resource config */
- status = rte_sched_subport_config(
- port->s,
- subport_id,
- NULL,
- subport_profile_id);
-
- return status;
-}
-
-int
-tmgr_pipe_config(const char *port_name,
- uint32_t subport_id,
- uint32_t pipe_id_first,
- uint32_t pipe_id_last,
- uint32_t pipe_profile_id)
-{
- struct tmgr_port *port;
- uint32_t i;
-
- /* Check input params */
- if (port_name == NULL)
- return -1;
-
- port = tmgr_port_find(port_name);
- if ((port == NULL) ||
- (subport_id >= port->n_subports_per_port) ||
- (pipe_id_first >= port->n_pipes_per_subport) ||
- (pipe_id_last >= port->n_pipes_per_subport) ||
- (pipe_id_first > pipe_id_last) ||
- (pipe_profile_id >= n_pipe_profiles))
- return -1;
-
- /* Resource config */
- for (i = pipe_id_first; i <= pipe_id_last; i++) {
- int status;
-
- status = rte_sched_pipe_config(
- port->s,
- subport_id,
- i,
- (int) pipe_profile_id);
-
- if (status)
- return status;
- }
-
- return 0;
-}
diff --git a/examples/ip_pipeline/tmgr.h b/examples/ip_pipeline/tmgr.h
deleted file mode 100644
index 1994c55bcc..0000000000
--- a/examples/ip_pipeline/tmgr.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2018 Intel Corporation
- */
-
-#ifndef _INCLUDE_TMGR_H_
-#define _INCLUDE_TMGR_H_
-
-#include <stdint.h>
-#include <sys/queue.h>
-
-#include <rte_sched.h>
-#include <rte_red.h>
-
-#include "common.h"
-
-#ifndef TMGR_PIPE_SUBPORT_MAX
-#define TMGR_PIPE_SUBPORT_MAX 4096
-#endif
-
-#ifndef TMGR_SUBPORT_PROFILE_MAX
-#define TMGR_SUBPORT_PROFILE_MAX 256
-#endif
-
-#ifndef TMGR_PIPE_PROFILE_MAX
-#define TMGR_PIPE_PROFILE_MAX 256
-#endif
-
-struct tmgr_port {
- TAILQ_ENTRY(tmgr_port) node;
- char name[NAME_SIZE];
- struct rte_sched_port *s;
- uint32_t n_subports_per_port;
- uint32_t n_pipes_per_subport;
-};
-
-TAILQ_HEAD(tmgr_port_list, tmgr_port);
-
-int
-tmgr_init(void);
-
-struct tmgr_port *
-tmgr_port_find(const char *name);
-
-struct tmgr_port_params {
- uint64_t rate;
- uint32_t n_subports_per_port;
- uint32_t n_pipes_per_subport;
- uint32_t frame_overhead;
- uint32_t mtu;
- uint32_t cpu_id;
-};
-
-int
-tmgr_subport_profile_add(struct rte_sched_subport_profile_params *sp);
-
-int
-tmgr_pipe_profile_add(struct rte_sched_pipe_params *p);
-
-struct tmgr_port *
-tmgr_port_create(const char *name, struct tmgr_port_params *params);
-
-int
-tmgr_subport_config(const char *port_name,
- uint32_t subport_id,
- uint32_t subport_profile_id);
-
-int
-tmgr_pipe_config(const char *port_name,
- uint32_t subport_id,
- uint32_t pipe_id_first,
- uint32_t pipe_id_last,
- uint32_t pipe_profile_id);
-
-#endif /* _INCLUDE_TMGR_H_ */
diff --git a/examples/meson.build b/examples/meson.build
index 25d9c88457..544ec5eadd 100644
--- a/examples/meson.build
+++ b/examples/meson.build
@@ -19,7 +19,6 @@ all_examples = [
'flow_filtering',
'helloworld',
'ip_fragmentation',
- 'ip_pipeline',
'ip_reassembly',
'ipsec-secgw',
'ipv4_multicast',
--
2.53.0
next prev parent reply other threads:[~2026-07-24 16:45 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-24 16:43 [PATCH 0/6] remove legacy Packet Framework API Stephen Hemminger
2026-07-24 16:43 ` [RFC 1/6] app/test: remove packet framework tests Stephen Hemminger
2026-07-24 16:43 ` [RFC 2/6] app/test-pipeline: remove application Stephen Hemminger
2026-07-24 16:43 ` Stephen Hemminger [this message]
2026-07-24 16:44 ` [RFC 4/6] pipeline: remove legacy API Stephen Hemminger
2026-07-24 16:44 ` [RFC 6/6] port: " Stephen Hemminger
2026-07-25 7:54 ` [PATCH 0/6] remove legacy Packet Framework API David Marchand
2026-07-25 13:36 ` Stephen Hemminger
2026-07-27 23:11 ` [RFC v2 0/6] remove legacy packet framework Stephen Hemminger
2026-07-27 23:11 ` [RFC v2 1/6] app/test: remove packet framework tests Stephen Hemminger
2026-07-27 23:11 ` [RFC v2 2/6] app/test-pipeline: remove application Stephen Hemminger
2026-07-27 23:11 ` [RFC v2 3/6] examples/ip_pipeline: remove example Stephen Hemminger
2026-07-27 23:11 ` [RFC v2 4/6] pipeline: remove legacy API Stephen Hemminger
2026-07-27 23:11 ` [RFC v2 6/6] port: " Stephen Hemminger
2026-07-28 14:20 ` [PATCH v3 0/6] remove legacy packet framework Stephen Hemminger
2026-07-28 14:20 ` [PATCH v3 1/6] app/test: remove packet framework tests Stephen Hemminger
2026-07-28 14:20 ` [PATCH v3 2/6] app/test-pipeline: remove application Stephen Hemminger
2026-07-28 14:20 ` [PATCH v3 3/6] examples/ip_pipeline: remove example Stephen Hemminger
2026-07-28 14:20 ` [PATCH v3 4/6] pipeline: remove legacy API Stephen Hemminger
2026-07-28 14:20 ` [PATCH v3 6/6] port: " Stephen Hemminger
2026-07-28 14:48 ` [PATCH v3 0/6] remove legacy packet framework David Marchand
2026-07-28 16:35 ` [PATCH v4 0/7] remove deprecated " Stephen Hemminger
2026-07-28 16:35 ` [PATCH v4 1/7] app/test: remove packet framework tests Stephen Hemminger
2026-07-28 16:35 ` [PATCH v4 2/7] app/test-pipeline: remove application Stephen Hemminger
2026-07-28 16:35 ` [PATCH v4 3/7] examples/ip_pipeline: remove example Stephen Hemminger
2026-07-28 16:35 ` [PATCH v4 4/7] pipeline: remove legacy API Stephen Hemminger
2026-07-28 16:35 ` [PATCH v4 5/7] table: " Stephen Hemminger
2026-07-28 16:35 ` [PATCH v4 6/7] port: " Stephen Hemminger
2026-07-28 16:35 ` [PATCH v4 7/7] doc: remove packet framework images Stephen Hemminger
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=20260724164520.192203-4-stephen@networkplumber.org \
--to=stephen@networkplumber.org \
--cc=cristian.dumitrescu@intel.com \
--cc=dev@dpdk.org \
--cc=thomas@monjalon.net \
/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
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.