2.3. spp_mirror¶
spp_mirror is an implementation of TaaS feature as a SPP secondary process
for port mirroring.
Each of spp_mirror processes is managed with mirror command. Because
basic design of spp_mirror is derived from spp_vf, its commands are
almost similar to spp_vf.
Secondary ID is referred as --client-id which is given as an argument
while launching spp_mirror. It should be unique among all of secondary
processes including spp_nfv and others.
mirror command takes an secondary ID and one of sub commands. Secondary ID
and sub command should be separated with delimiter ;, or failed to a
command error. Some of sub commands take additional arguments for
configuration of the process or its resource management.
spp > mirror SEC_ID; SUB_CMD
In this example, SEC_ID is a secondary ID and SUB_CMD is one of the
following sub commands. Details of each of sub commands are described in the
next sections.
- status
- component
- port
spp_mirror supports TAB completion. You can complete all of the name
of commands and its arguments. For instance, you find all of sub commands
by pressing TAB after mirror SEC_ID;.
spp > mirror 1; # press TAB key
component port status
It tries to complete all of possible arguments. However, spp_mirror takes
also an arbitrary parameter which cannot be predicted, for example, name of
component. In this cases, spp_mirror shows capitalized keyword for
indicating it is an arbitrary parameter. Here is an exmaple of component
command to initialize a worker thread. Keyword NAME should be replaced with
your favorite name for the worker of the role.
spp > mirror 1; component st # press TAB key to show args starting 'st'
start stop
spp > mirror 1; component start NAME # 'NAME' is shown with TAB after start
spp > mirror 1; component start mr1 # replace 'NAME' with favorite name
spp > mirror 1; component start mr1 # then, press TAB to show core IDs
5 6 7
It is another example of replacing keyword. port is a sub command for
assigning a resource to a worker thread. RES_UID is replaced with
resource UID which is a combination of port type and its ID such as
ring:0 or vhost:1 to assign it as RX port of forwarder mr1.
spp > mirror 1; port add RES_UID
spp > mirror 1; port add ring:0 rx mr1
If you are reached to the end of arguments, no candidate keyword is displayed.
It is a completed statement of component command, and TAB
completion does not work after mirror because it is ready to run.
spp > mirror 1; component start mr1 5 mirror
Succeeded to start component 'mr1' on core:5
It is also completed secondary IDs of spp_mirror and it is helpful if you run
several spp_mirror processes.
spp > mirror # press TAB after space following 'mirror'
1; 3; # you find two spp_mirror processes of sec ID 1, 3
By the way, it is also a case of no candidate keyword is displayed if your command statement is wrong. You might be encountered an error if you run the wrong command. Please take care.
spp > mirror 1; compa # no candidate shown for wrong command
Invalid command "compa".
2.3.1. status¶
Show the information of worker threads and its resources. Status information consists of three parts.
spp > vf 1; status
Basic Information:
- client-id: 3
- ports: [phy:0, phy:1, ring:0, ring:1, ring:2, ring:3, ring:4]
Components:
- core:5 'mr1' (type: mirror)
- rx: ring:0
- tx: [ring:1, ring:2]
- core:6 'mr2' (type: mirror)
- rx: ring:3
- tx: [ring:4, ring:5]
- core:7 '' (type: unuse)
Basic Information is for describing attributes of spp_mirror itself.
client-id is a secondary ID of the process and ports is a list of
all of ports owned the process.
Components is a list of all of worker threads. Each of workers has a
core ID running on, type of the worker and a list of resources.
Entry of no name with unuse type means that no worker thread assigned to
the core. In other words, it is ready to be assinged.
2.3.2. component¶
Assing or release a role of forwarding to worker threads running on each of
cores which are reserved with -c or -l option while launching
spp_mirror. Unlike spp_vf, spp_mirror only has one role, mirror.
# assign 'ROLE' to worker on 'CORE_ID' with a 'NAME'
spp > mirror SEC_ID; component start NAME CORE_ID ROLE
# release worker 'NAME' from the role
spp > mirror SEC_ID; component stop NAME
Here is some examples of assigning roles with component command.
# assign 'mirror' role with name 'mr1' on core 2
spp > mirror 2; component start mr1 2 mirror
Or examples of releasing roles.
# release mirror role
spp > vf 2; component stop mr1
2.3.3. port¶
Add or delete a port to a worker.
2.3.3.1. Adding port¶
spp > vf SEC_ID; port add RES_UID DIR NAME
RES_UID is with replaced with resource UID such as ring:0 or
vhost:1. spp_mirror supports three types of port.
phy: Physical NICring: Ring PMDvhost: Vhost PMD
DIR means the direction of forwarding and it should be rx or tx.
NAME is the same as for component command.
This is an example for adding ports to mr1. In this case, it is configured
to receive packets from ring:0 and send it to vhost:0 and vhost:1
by duplicating the packets.
# recieve from 'phy:0'
spp > mirror 2; port add ring:0 rx mr1
# send to 'ring:0' and 'ring:1'
spp > mirror 2; port add vhost:0 tx mr1
spp > mirror 2; port add vhost:1 tx mr1
2.3.3.2. Deleting port¶
Delete a port which is not used anymore. It is almost same as adding port.
spp > mirror SEC_ID; port del RES_UID DIR NAME
Here is an example.
# delete rx port 'ring:0' from 'mr1'
spp > mirror 2; port del ring:0 rx mr1
# delete tx port 'vhost:1' from 'mr1'
spp > mirror 2; port del vhost:1 tx mr1