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])]
)
|