File: system-dpdk-macros.at

package info (click to toggle)
openvswitch 3.5.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 97,848 kB
  • sloc: sh: 1,643,930; ansic: 313,386; python: 27,939; xml: 21,526; makefile: 546; javascript: 191
file content (201 lines) | stat: -rw-r--r-- 6,673 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
# OVS_DPDK_PRE_CHECK()
#
# Check prerequisites for DPDK tests. Following settings are checked:
#  - Hugepages
#
m4_define([OVS_DPDK_PRE_CHECK],
  [dnl Check Hugepages
   AT_CHECK([cat /proc/meminfo], [], [stdout])
   AT_SKIP_IF([grep -E 'HugePages_Free: *0' stdout], [], [stdout])
])


# OVS_DPDK_PRE_PHY_SKIP()
#
# Skip any phy related tests if the PHY variable is not set.
# This is done by checking for a bound driver.
#
m4_define([OVS_DPDK_PRE_PHY_SKIP],
  [dnl Perform the precheck
   OVS_DPDK_PRE_CHECK()

   dnl Check if a device is available for DPDK
   AT_SKIP_IF([ ! $abs_top_srcdir/tests/system-dpdk-find-device.py > DPDK_PCI_ADDR ])
])


# OVS_DPDK_START()
#
# Start ovsdb-server. Set dpdk-init to initialize DPDK. Start ovs-vswitchd.
#
m4_define([OVS_DPDK_START],
  [dnl start ovs dpdk
   OVS_DPDK_START_OVSDB($3)
   dnl Enable DPDK functionality
   AT_CHECK([ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true])
   OVS_DPDK_START_VSWITCHD([$1], [$2])
])


# OVS_DPDK_START_OVSDB()
#
# Create an empty database and start ovsdb-server.
#
m4_define([OVS_DPDK_START_OVSDB],
  [dnl Create database.
   AT_CHECK([touch .conf.db.~lock~])
   AT_CHECK([ovsdb-tool create conf.db $abs_top_srcdir/vswitchd/vswitch.ovsschema])

   dnl Start ovsdb-server.
   AT_CHECK([ovsdb-server --detach --no-chdir --pidfile --log-file --remote=punix:$OVS_RUNDIR/db.sock], [0], [stdout], [stderr])
   on_exit "kill `cat ovsdb-server.pid`"
   AT_CHECK([[sed < stderr '
/vlog|INFO|opened log file/d
/ovsdb_server|INFO|ovsdb-server (Open vSwitch)/d']])
   AT_CAPTURE_FILE([ovsdb-server.log])

   dnl Initialize database.
   AT_CHECK([ovs-vsctl --no-wait init $1])
])


# OVS_DPDK_START_VSWITCHD()
#
# Add special configuration for dpdk-init. Start ovs-vswitchd.
#
m4_define([OVS_DPDK_START_VSWITCHD],
  [dnl Change DPDK drivers log levels so that tests only catch errors
   AT_CHECK([ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-extra="--log-level=pmd.*:error $1"])

   dnl Start ovs-vswitchd.
   AT_CHECK([ovs-vswitchd $2 --detach --no-chdir --pidfile --log-file -vvconn -vofproto_dpif -vunixctl], [0], [stdout], [stderr])
   AT_CAPTURE_FILE([ovs-vswitchd.log])
   on_exit "kill_ovs_vswitchd `cat ovs-vswitchd.pid`"
])


m4_define([OVS_DPDK_STOP_VSWITCHD],
  [OVS_VSWITCHD_STOP([dnl
$1";/does not exist. The Open vSwitch kernel module is probably not loaded./d
/does not support MTU configuration,/d
/EAL: No \(available\|free\) .*hugepages reported/d
/Failed to enable flow control/d
/ice_vsi_config_outer_vlan_stripping(): Single VLAN mode (SVM) does not support qinq/d
/Rx checksum offload is not supported on/d
/TELEMETRY: No legacy callbacks, legacy socket not created/d"])
])


# OVS_DPDK_CHECK_TESTPMD()
#
# Check dpdk-testpmd availability.
#
m4_define([OVS_DPDK_CHECK_TESTPMD],
  [AT_SKIP_IF([! which dpdk-testpmd >/dev/null 2>/dev/null])
])


# OVS_DPDK_START_TESTPMD()
#
# Start dpdk-testpmd in background.
#
m4_define([OVS_DPDK_START_TESTPMD],
  [AT_CHECK([lscpu], [], [stdout])
   AT_CHECK([cat stdout | grep "NUMA node(s)" | awk '{c=1; while (c++<$(3)) {printf "512,"}; print "512"}' > NUMA_NODE])
   eal_options="$DPDK_EAL_OPTIONS --in-memory --socket-mem="$(cat NUMA_NODE)" --single-file-segments --no-pci --file-prefix testpmd"
   options="$1"
   test "$options" != "${options%% -- *}" || options="$options -- "
   eal_options="$eal_options ${options%% -- *}"
   testpmd_options="-a --stats-period 2 ${options#* -- }"
   echo "dpdk-testpmd $eal_options -- $testpmd_options" >testpmd.cmd
   dpdk-testpmd $eal_options -- $testpmd_options >testpmd.log 2>&1 & \
   echo $! > testpmd.pid
   on_exit "kill -9 `cat testpmd.pid`"
])


# OVS_DPDK_STOP_TESTPMD()
#
# Stop background dpdk-testpmd.
#
m4_define([OVS_DPDK_STOP_TESTPMD],
  [AT_CHECK([kill `cat testpmd.pid`])
   OVS_WAIT([kill -0 `cat testpmd.pid`], [kill -9 `cat testpmd.pid`])
])


# OVS_TRAFFIC_VSWITCHD_START([vsctl-args], [vsctl-output], [dbinit-aux-args])
#
# Creates a database and starts ovsdb-server, starts ovs-vswitchd
# connected to that database, calls ovs-vsctl to create a bridge named
# br0 with predictable settings, passing 'vsctl-args' as additional
# commands to ovs-vsctl.  If 'vsctl-args' causes ovs-vsctl to provide
# output (e.g. because it includes "create" commands) then 'vsctl-output'
# specifies the expected output after filtering through uuidfilt.
# 'dbinit-aux-args' are passed as additional commands to 'ovs-vsctl init'
# before starting ovs-vswitchd.
m4_define([OVS_TRAFFIC_VSWITCHD_START],
  [
   OVS_DPDK_PRE_CHECK()
   OVS_WAIT_WHILE([ip link show ovs-netdev])
   dnl For functional tests, no need for DPDK PCI probing.
   OVS_DPDK_START([--no-pci], [--disable-system], [$3])
   dnl Add bridges, ports, etc.
   OVS_WAIT_WHILE([ip link show br0])
   AT_CHECK([ovs-vsctl -- _ADD_BR([br0]) -- $1 m4_if([$2], [], [], [| uuidfilt])], [0], [$2])
])


# OVS_TRAFFIC_VSWITCHD_STOP([ALLOWLIST], [extra_cmds])
#
# Gracefully stops ovs-vswitchd and ovsdb-server, checking their log files
# for messages with severity WARN or higher and signaling an error if any
# is present.  The optional ALLOWLIST may contain shell-quoted "sed"
# commands to delete any warnings that are actually expected, e.g.:
#
#   OVS_TRAFFIC_VSWITCHD_STOP(["/expected error/d"])
#
# 'extra_cmds' are shell commands to be executed after OVS_VSWITCHD_STOP() is
# invoked. They can be used to perform additional cleanups such as name space
# removal.
m4_define([OVS_TRAFFIC_VSWITCHD_STOP],
  [OVS_DPDK_STOP_VSWITCHD([$1])
   AT_CHECK([:; $2])
])


# Plug a veth into OVS via DPDK net/af_xdp.
m4_define([ADD_VETH],
    [ AT_CHECK([ip link add $1 type veth peer name ovs-$1 || return 77])
      CONFIGURE_VETH_OFFLOADS([$1])
      AT_CHECK([ip link set $1 netns $2])
      AT_CHECK([ip link set dev ovs-$1 up])
      AT_CHECK([ovs-vsctl add-port $3 ovs-$1 -- \
                set interface ovs-$1 external-ids:iface-id="$1" -- \
                set interface ovs-$1 type=dpdk -- \
                set interface ovs-$1 options:dpdk-devargs=net_af_xdp$1,iface=ovs-$1])
      NS_CHECK_EXEC([$2], [ip addr add $4 dev $1 $7])
      NS_CHECK_EXEC([$2], [ip link set dev $1 up])
      if test -n "$5"; then
        NS_CHECK_EXEC([$2], [ip link set dev $1 address $5])
      fi
      if test -n "$6"; then
        NS_CHECK_EXEC([$2], [ip route add default via $6])
      fi
      on_exit 'ip link del ovs-$1'
    ]
)


m4_define([OVS_CHECK_8021AD],
    [AT_SKIP_IF([:])])


m4_define([OVS_CHECK_TC_QDISC],
    [AT_SKIP_IF([:])])


m4_define([CONFIGURE_VETH_OFFLOADS],
    [AT_CHECK([ethtool -K $1 tx off], [0], [ignore], [ignore])
     AT_CHECK([ethtool -K $1 txvlan off], [0], [ignore], [ignore])]
)