linux/samples/pktgen/pktgen_bench_xmit_mode_netif_receive.sh
<<
>>
Prefs
   1#!/bin/bash
   2# SPDX-License-Identifier: GPL-2.0
   3#
   4# Benchmark script:
   5#  - developed for benchmarking ingress qdisc path
   6#
   7# Script for injecting packets into RX path of the stack with pktgen
   8# "xmit_mode netif_receive".  With an invalid dst_mac this will only
   9# measure the ingress code path as packets gets dropped in ip_rcv().
  10#
  11# This script don't really need any hardware.  It benchmarks software
  12# RX path just after NIC driver level.  With bursting is also
  13# "removes" the SKB alloc/free overhead.
  14#
  15# Setup scenarios for measuring ingress qdisc (with invalid dst_mac):
  16# ------------------------------------------------------------------
  17# (1) no ingress (uses static_key_false(&ingress_needed))
  18#
  19# (2) ingress on other dev (change ingress_needed and calls
  20#     handle_ing() but exit early)
  21#
  22#  config:  tc qdisc add dev $SOMEDEV handle ffff: ingress
  23#
  24# (3) ingress on this dev, handle_ing() -> tc_classify()
  25#
  26#  config:  tc qdisc add dev $DEV handle ffff: ingress
  27#
  28# (4) ingress on this dev + drop at u32 classifier/action.
  29#
  30basedir=`dirname $0`
  31source ${basedir}/functions.sh
  32root_check_run_with_sudo "$@"
  33
  34# Parameter parsing via include
  35source ${basedir}/parameters.sh
  36# Using invalid DST_MAC will cause the packets to get dropped in
  37# ip_rcv() which is part of the test
  38if [ -z "$DEST_IP" ]; then
  39    [ -z "$IP6" ] && DEST_IP="198.18.0.42" || DEST_IP="FD00::1"
  40fi
  41[ -z "$DST_MAC" ] && DST_MAC="90:e2:ba:ff:ff:ff"
  42[ -z "$BURST" ] && BURST=1024
  43[ -z "$COUNT" ] && COUNT="10000000" # Zero means indefinitely
  44if [ -n "$DEST_IP" ]; then
  45    validate_addr${IP6} $DEST_IP
  46    read -r DST_MIN DST_MAX <<< $(parse_addr${IP6} $DEST_IP)
  47fi
  48if [ -n "$DST_PORT" ]; then
  49    read -r UDP_DST_MIN UDP_DST_MAX <<< $(parse_ports $DST_PORT)
  50    validate_ports $UDP_DST_MIN $UDP_DST_MAX
  51fi
  52
  53# General cleanup everything since last run
  54pg_ctrl "reset"
  55
  56# Threads are specified with parameter -t value in $THREADS
  57for ((thread = $F_THREAD; thread <= $L_THREAD; thread++)); do
  58    # The device name is extended with @name, using thread number to
  59    # make then unique, but any name will do.
  60    dev=${DEV}@${thread}
  61
  62    # Add remove all other devices and add_device $dev to thread
  63    pg_thread $thread "rem_device_all"
  64    pg_thread $thread "add_device" $dev
  65
  66    # Base config of dev
  67    pg_set $dev "flag QUEUE_MAP_CPU"
  68    pg_set $dev "count $COUNT"
  69    pg_set $dev "pkt_size $PKT_SIZE"
  70    pg_set $dev "delay $DELAY"
  71    pg_set $dev "flag NO_TIMESTAMP"
  72
  73    # Destination
  74    pg_set $dev "dst_mac $DST_MAC"
  75    pg_set $dev "dst${IP6}_min $DST_MIN"
  76    pg_set $dev "dst${IP6}_max $DST_MAX"
  77
  78    if [ -n "$DST_PORT" ]; then
  79        # Single destination port or random port range
  80        pg_set $dev "flag UDPDST_RND"
  81        pg_set $dev "udp_dst_min $UDP_DST_MIN"
  82        pg_set $dev "udp_dst_max $UDP_DST_MAX"
  83    fi
  84
  85    # Inject packet into RX path of stack
  86    pg_set $dev "xmit_mode netif_receive"
  87
  88    # Burst allow us to avoid measuring SKB alloc/free overhead
  89    pg_set $dev "burst $BURST"
  90done
  91
  92# start_run
  93echo "Running... ctrl^C to stop" >&2
  94pg_ctrl "start"
  95echo "Done" >&2
  96
  97# Print results
  98for ((thread = $F_THREAD; thread <= $L_THREAD; thread++)); do
  99    dev=${DEV}@${thread}
 100    echo "Device: $dev"
 101    cat /proc/net/pktgen/$dev | grep -A2 "Result:"
 102done
 103