cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

test_xsk.sh (4722B)


      1#!/bin/bash
      2# SPDX-License-Identifier: GPL-2.0
      3# Copyright(c) 2020 Intel Corporation, Weqaar Janjua <weqaar.a.janjua@intel.com>
      4
      5# AF_XDP selftests based on veth
      6#
      7# End-to-end AF_XDP over Veth test
      8#
      9# Topology:
     10# ---------
     11#                 -----------
     12#               _ | Process | _
     13#              /  -----------  \
     14#             /        |        \
     15#            /         |         \
     16#      -----------     |     -----------
     17#      | Thread1 |     |     | Thread2 |
     18#      -----------     |     -----------
     19#           |          |          |
     20#      -----------     |     -----------
     21#      |  xskX   |     |     |  xskY   |
     22#      -----------     |     -----------
     23#           |          |          |
     24#      -----------     |     ----------
     25#      |  vethX  | --------- |  vethY |
     26#      -----------   peer    ----------
     27#           |          |          |
     28#      namespaceX      |     namespaceY
     29#
     30# AF_XDP is an address family optimized for high performance packet processing,
     31# it is XDP’s user-space interface.
     32#
     33# An AF_XDP socket is linked to a single UMEM which is a region of virtual
     34# contiguous memory, divided into equal-sized frames.
     35#
     36# Refer to AF_XDP Kernel Documentation for detailed information:
     37# https://www.kernel.org/doc/html/latest/networking/af_xdp.html
     38#
     39# Prerequisites setup by script:
     40#
     41#   Set up veth interfaces as per the topology shown ^^:
     42#   * setup two veth interfaces and one namespace
     43#   ** veth<xxxx> in root namespace
     44#   ** veth<yyyy> in af_xdp<xxxx> namespace
     45#   ** namespace af_xdp<xxxx>
     46#   *** xxxx and yyyy are randomly generated 4 digit numbers used to avoid
     47#       conflict with any existing interface
     48#   * tests the veth and xsk layers of the topology
     49#
     50# See the source xdpxceiver.c for information on each test
     51#
     52# Kernel configuration:
     53# ---------------------
     54# See "config" file for recommended kernel config options.
     55#
     56# Turn on XDP sockets and veth support when compiling i.e.
     57# 	Networking support -->
     58# 		Networking options -->
     59# 			[ * ] XDP sockets
     60#
     61# Executing Tests:
     62# ----------------
     63# Must run with CAP_NET_ADMIN capability.
     64#
     65# Run:
     66#   sudo ./test_xsk.sh
     67#
     68# If running from kselftests:
     69#   sudo make run_tests
     70#
     71# Run with verbose output:
     72#   sudo ./test_xsk.sh -v
     73#
     74# Run and dump packet contents:
     75#   sudo ./test_xsk.sh -D
     76
     77. xsk_prereqs.sh
     78
     79while getopts "vD" flag
     80do
     81	case "${flag}" in
     82		v) verbose=1;;
     83		D) dump_pkts=1;;
     84	esac
     85done
     86
     87TEST_NAME="PREREQUISITES"
     88
     89URANDOM=/dev/urandom
     90[ ! -e "${URANDOM}" ] && { echo "${URANDOM} not found. Skipping tests."; test_exit $ksft_fail; }
     91
     92VETH0_POSTFIX=$(cat ${URANDOM} | tr -dc '0-9' | fold -w 256 | head -n 1 | head --bytes 4)
     93VETH0=ve${VETH0_POSTFIX}
     94VETH1_POSTFIX=$(cat ${URANDOM} | tr -dc '0-9' | fold -w 256 | head -n 1 | head --bytes 4)
     95VETH1=ve${VETH1_POSTFIX}
     96NS0=root
     97NS1=af_xdp${VETH1_POSTFIX}
     98MTU=1500
     99
    100trap ctrl_c INT
    101
    102function ctrl_c() {
    103        cleanup_exit ${VETH0} ${VETH1} ${NS1}
    104	exit 1
    105}
    106
    107setup_vethPairs() {
    108	if [[ $verbose -eq 1 ]]; then
    109	        echo "setting up ${VETH0}: namespace: ${NS0}"
    110	fi
    111	ip netns add ${NS1}
    112	ip link add ${VETH0} numtxqueues 4 numrxqueues 4 type veth peer name ${VETH1} numtxqueues 4 numrxqueues 4
    113	if [ -f /proc/net/if_inet6 ]; then
    114		echo 1 > /proc/sys/net/ipv6/conf/${VETH0}/disable_ipv6
    115	fi
    116	if [[ $verbose -eq 1 ]]; then
    117	        echo "setting up ${VETH1}: namespace: ${NS1}"
    118	fi
    119
    120	if [[ $busy_poll -eq 1 ]]; then
    121	        echo 2 > /sys/class/net/${VETH0}/napi_defer_hard_irqs
    122		echo 200000 > /sys/class/net/${VETH0}/gro_flush_timeout
    123		echo 2 > /sys/class/net/${VETH1}/napi_defer_hard_irqs
    124		echo 200000 > /sys/class/net/${VETH1}/gro_flush_timeout
    125	fi
    126
    127	ip link set ${VETH1} netns ${NS1}
    128	ip netns exec ${NS1} ip link set ${VETH1} mtu ${MTU}
    129	ip link set ${VETH0} mtu ${MTU}
    130	ip netns exec ${NS1} ip link set ${VETH1} up
    131	ip netns exec ${NS1} ip link set dev lo up
    132	ip link set ${VETH0} up
    133}
    134
    135validate_root_exec
    136validate_veth_support ${VETH0}
    137validate_ip_utility
    138setup_vethPairs
    139
    140retval=$?
    141if [ $retval -ne 0 ]; then
    142	test_status $retval "${TEST_NAME}"
    143	cleanup_exit ${VETH0} ${VETH1} ${NS1}
    144	exit $retval
    145fi
    146
    147if [[ $verbose -eq 1 ]]; then
    148	ARGS+="-v "
    149fi
    150
    151if [[ $dump_pkts -eq 1 ]]; then
    152	ARGS="-D "
    153fi
    154
    155test_status $retval "${TEST_NAME}"
    156
    157## START TESTS
    158
    159statusList=()
    160
    161TEST_NAME="XSK_SELFTESTS_SOFTIRQ"
    162
    163execxdpxceiver
    164
    165cleanup_exit ${VETH0} ${VETH1} ${NS1}
    166TEST_NAME="XSK_SELFTESTS_BUSY_POLL"
    167busy_poll=1
    168
    169setup_vethPairs
    170execxdpxceiver
    171
    172## END TESTS
    173
    174cleanup_exit ${VETH0} ${VETH1} ${NS1}
    175
    176failures=0
    177echo -e "\nSummary:"
    178for i in "${!statusList[@]}"
    179do
    180	if [ ${statusList[$i]} -ne 0 ]; then
    181	        test_status ${statusList[$i]} ${nameList[$i]}
    182		failures=1
    183	fi
    184done
    185
    186if [ $failures -eq 0 ]; then
    187        echo "All tests successful!"
    188fi