Merge branch 'selftests: xsk: various simplifications'
Magnus Karlsson says: ==================== This patch set mainly contains various simplifications to the xsk selftests. The only exception is the introduction of packet streams that describes what the Tx process should send and what the Rx process should receive. If it receives anything else, the test fails. This mechanism can be used to produce tests were all packets are not received by the Rx thread or modified in some way. An example of this is if an XDP program does XDP_PASS on some of the packets. This patch set will be followed by another patch set that implements a new structure that will facilitate adding new tests. A couple of new tests will also be included in that patch set. v2 -> v3: * Reworked patch 12 so that it now has functions for creating and destroying ifobjects. Simplifies the code. [Maciej] * The packet stream now allocates the supplied buffer array length, instead of the default one. [Maciej] * pkt_stream_get_pkt() now returns NULL when indexing a non-existing packet. [Maciej] * pkt_validate() is now is_pkt_valid(). [Maciej] * Slowed down packet sending speed even more in patch 11 so that slow systems do not silenty drop packets in skb mode. v1 -> v2: * Dropped the patch with per process limit changes as it is not needed [Yonghong] * Improved the commit message of patch 1 [Yonghong] * Fixed a spelling error in patch 9 Thanks: Magnus ==================== Acked-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
Коммит
7d789bd008
|
@ -63,14 +63,11 @@
|
|||
# ----------------
|
||||
# Must run with CAP_NET_ADMIN capability.
|
||||
#
|
||||
# Run (full color-coded output):
|
||||
# sudo ./test_xsk.sh -c
|
||||
# Run:
|
||||
# sudo ./test_xsk.sh
|
||||
#
|
||||
# If running from kselftests:
|
||||
# sudo make colorconsole=1 run_tests
|
||||
#
|
||||
# Run (full output without color-coding):
|
||||
# sudo ./test_xsk.sh
|
||||
# sudo make run_tests
|
||||
#
|
||||
# Run with verbose output:
|
||||
# sudo ./test_xsk.sh -v
|
||||
|
@ -83,7 +80,6 @@
|
|||
while getopts "cvD" flag
|
||||
do
|
||||
case "${flag}" in
|
||||
c) colorconsole=1;;
|
||||
v) verbose=1;;
|
||||
D) dump_pkts=1;;
|
||||
esac
|
||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -34,28 +34,23 @@
|
|||
#define IP_PKT_TOS 0x9
|
||||
#define UDP_PKT_SIZE (IP_PKT_SIZE - sizeof(struct iphdr))
|
||||
#define UDP_PKT_DATA_SIZE (UDP_PKT_SIZE - sizeof(struct udphdr))
|
||||
#define EOT (-1)
|
||||
#define USLEEP_MAX 200000
|
||||
#define USLEEP_MAX 10000
|
||||
#define SOCK_RECONF_CTR 10
|
||||
#define BATCH_SIZE 64
|
||||
#define BATCH_SIZE 8
|
||||
#define POLL_TMOUT 1000
|
||||
#define DEFAULT_PKT_CNT 10000
|
||||
#define DEFAULT_PKT_CNT (4 * 1024)
|
||||
#define RX_FULL_RXQSIZE 32
|
||||
#define XSK_UMEM__INVALID_FRAME_SIZE (XSK_UMEM__DEFAULT_FRAME_SIZE + 1)
|
||||
|
||||
#define print_verbose(x...) do { if (opt_verbose) ksft_print_msg(x); } while (0)
|
||||
|
||||
typedef __u32 u32;
|
||||
typedef __u16 u16;
|
||||
typedef __u8 u8;
|
||||
|
||||
enum TEST_MODES {
|
||||
TEST_MODE_UNCONFIGURED = -1,
|
||||
enum test_mode {
|
||||
TEST_MODE_SKB,
|
||||
TEST_MODE_DRV,
|
||||
TEST_MODE_MAX
|
||||
};
|
||||
|
||||
enum TEST_TYPES {
|
||||
enum test_type {
|
||||
TEST_TYPE_NOPOLL,
|
||||
TEST_TYPE_POLL,
|
||||
TEST_TYPE_TEARDOWN,
|
||||
|
@ -65,7 +60,7 @@ enum TEST_TYPES {
|
|||
TEST_TYPE_MAX
|
||||
};
|
||||
|
||||
enum STAT_TEST_TYPES {
|
||||
enum stat_test_type {
|
||||
STAT_TEST_RX_DROPPED,
|
||||
STAT_TEST_TX_INVALID,
|
||||
STAT_TEST_RX_FULL,
|
||||
|
@ -73,21 +68,16 @@ enum STAT_TEST_TYPES {
|
|||
STAT_TEST_TYPE_MAX
|
||||
};
|
||||
|
||||
static int configured_mode = TEST_MODE_UNCONFIGURED;
|
||||
static u8 debug_pkt_dump;
|
||||
static u32 num_frames;
|
||||
static int configured_mode;
|
||||
static bool opt_pkt_dump;
|
||||
static u32 num_frames = DEFAULT_PKT_CNT / 4;
|
||||
static bool second_step;
|
||||
static int test_type;
|
||||
|
||||
static int opt_pkt_count;
|
||||
static u8 opt_verbose;
|
||||
static bool opt_verbose;
|
||||
|
||||
static u32 xdp_flags = XDP_FLAGS_UPDATE_IF_NOEXIST;
|
||||
static u32 xdp_bind_flags = XDP_USE_NEED_WAKEUP | XDP_COPY;
|
||||
static u8 pkt_data[XSK_UMEM__DEFAULT_FRAME_SIZE];
|
||||
static u32 pkt_counter;
|
||||
static long prev_pkt = -1;
|
||||
static int sigvar;
|
||||
static int stat_test_type;
|
||||
static u32 rxqsize;
|
||||
static u32 frame_headroom;
|
||||
|
@ -104,10 +94,6 @@ struct xsk_socket_info {
|
|||
struct xsk_ring_prod tx;
|
||||
struct xsk_umem_info *umem;
|
||||
struct xsk_socket *xsk;
|
||||
unsigned long rx_npkts;
|
||||
unsigned long tx_npkts;
|
||||
unsigned long prev_rx_npkts;
|
||||
unsigned long prev_tx_npkts;
|
||||
u32 outstanding_tx;
|
||||
};
|
||||
|
||||
|
@ -118,8 +104,15 @@ struct flow_vector {
|
|||
} vector;
|
||||
};
|
||||
|
||||
struct generic_data {
|
||||
u32 seqnum;
|
||||
struct pkt {
|
||||
u64 addr;
|
||||
u32 len;
|
||||
u32 payload;
|
||||
};
|
||||
|
||||
struct pkt_stream {
|
||||
u32 nb_pkts;
|
||||
struct pkt *pkts;
|
||||
};
|
||||
|
||||
struct ifobject {
|
||||
|
@ -131,8 +124,8 @@ struct ifobject {
|
|||
struct xsk_umem_info *umem;
|
||||
void *(*func_ptr)(void *arg);
|
||||
struct flow_vector fv;
|
||||
struct pkt_stream *pkt_stream;
|
||||
int ns_fd;
|
||||
int ifdict_index;
|
||||
u32 dst_ip;
|
||||
u32 src_ip;
|
||||
u16 src_port;
|
||||
|
@ -149,18 +142,4 @@ static struct ifobject *ifdict_tx;
|
|||
pthread_barrier_t barr;
|
||||
pthread_t t0, t1;
|
||||
|
||||
TAILQ_HEAD(head_s, pkt) head = TAILQ_HEAD_INITIALIZER(head);
|
||||
struct head_s *head_p;
|
||||
struct pkt {
|
||||
char *pkt_frame;
|
||||
|
||||
TAILQ_ENTRY(pkt) pkt_nodes;
|
||||
} *pkt_node_rx, *pkt_node_rx_q;
|
||||
|
||||
struct pkt_frame {
|
||||
char *payload;
|
||||
} *pkt_obj;
|
||||
|
||||
struct pkt_frame **pkt_buf;
|
||||
|
||||
#endif /* XDPXCEIVER_H */
|
||||
|
|
|
@ -8,14 +8,8 @@ ksft_xfail=2
|
|||
ksft_xpass=3
|
||||
ksft_skip=4
|
||||
|
||||
GREEN='\033[0;92m'
|
||||
YELLOW='\033[0;93m'
|
||||
RED='\033[0;31m'
|
||||
NC='\033[0m'
|
||||
STACK_LIM=131072
|
||||
SPECFILE=veth.spec
|
||||
XSKOBJ=xdpxceiver
|
||||
NUMPKTS=10000
|
||||
|
||||
validate_root_exec()
|
||||
{
|
||||
|
@ -50,22 +44,12 @@ validate_veth_spec_file()
|
|||
test_status()
|
||||
{
|
||||
statusval=$1
|
||||
if [ -n "${colorconsole+set}" ]; then
|
||||
if [ $statusval -eq 2 ]; then
|
||||
echo -e "${YELLOW}$2${NC}: [ ${RED}FAIL${NC} ]"
|
||||
elif [ $statusval -eq 1 ]; then
|
||||
echo -e "${YELLOW}$2${NC}: [ ${RED}SKIPPED${NC} ]"
|
||||
elif [ $statusval -eq 0 ]; then
|
||||
echo -e "${YELLOW}$2${NC}: [ ${GREEN}PASS${NC} ]"
|
||||
fi
|
||||
else
|
||||
if [ $statusval -eq 2 ]; then
|
||||
echo -e "$2: [ FAIL ]"
|
||||
elif [ $statusval -eq 1 ]; then
|
||||
echo -e "$2: [ SKIPPED ]"
|
||||
elif [ $statusval -eq 0 ]; then
|
||||
echo -e "$2: [ PASS ]"
|
||||
fi
|
||||
if [ $statusval -eq 2 ]; then
|
||||
echo -e "$2: [ FAIL ]"
|
||||
elif [ $statusval -eq 1 ]; then
|
||||
echo -e "$2: [ SKIPPED ]"
|
||||
elif [ $statusval -eq 0 ]; then
|
||||
echo -e "$2: [ PASS ]"
|
||||
fi
|
||||
}
|
||||
|
||||
|
@ -107,5 +91,5 @@ validate_ip_utility()
|
|||
|
||||
execxdpxceiver()
|
||||
{
|
||||
./${XSKOBJ} -i ${VETH0} -i ${VETH1},${NS1} -C ${NUMPKTS} ${VERBOSE_ARG} ${DUMP_PKTS_ARG}
|
||||
./${XSKOBJ} -i ${VETH0} -i ${VETH1},${NS1} ${VERBOSE_ARG} ${DUMP_PKTS_ARG}
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче