linux/samples/pktgen/pktgen_sample02_multiqueue.sh
<<
>>
Prefs
   1#!/bin/bash
   2# SPDX-License-Identifier: GPL-2.0
   3#
   4# Multiqueue: Using pktgen threads for sending on multiple CPUs
   5#  * adding devices to kernel threads
   6#  * notice the naming scheme for keeping device names unique
   7#  * nameing scheme: dev@thread_number
   8#  * flow variation via random UDP source port
   9#
  10basedir=`dirname $0`
  11source ${basedir}/functions.sh
  12root_check_run_with_sudo "$@"
  13#
  14# Required param: -i dev in $DEV
  15source ${basedir}/parameters.sh
  16
  17[ -z "$COUNT" ] && COUNT="100000" # Zero means indefinitely
  18
  19# Base Config
  20[ -z "$CLONE_SKB" ] && CLONE_SKB="0"
  21
  22# Flow variation random source port between min and max
  23UDP_SRC_MIN=9
  24UDP_SRC_MAX=109
  25
  26# (example of setting default params in your script)
  27if [ -z "$DEST_IP" ]; then
  28    [ -z "$IP6" ] && DEST_IP="198.18.0.42" || DEST_IP="FD00::1"
  29fi
  30[ -z "$DST_MAC" ] && DST_MAC="90:e2:ba:ff:ff:ff"
  31if [ -n "$DEST_IP" ]; then
  32    validate_addr${IP6} $DEST_IP
  33    read -r DST_MIN DST_MAX <<< $(parse_addr${IP6} $DEST_IP)
  34fi
  35if [ -n "$DST_PORT" ]; then
  36    read -r UDP_DST_MIN UDP_DST_MAX <<< $(parse_ports $DST_PORT)
  37    validate_ports $UDP_DST_MIN $UDP_DST_MAX
  38fi
  39
  40# General cleanup everything since last run
  41[ -z "$APPEND" ] && pg_ctrl "reset"
  42
  43# Threads are specified with parameter -t value in $THREADS
  44for ((thread = $F_THREAD; thread <= $L_THREAD; thread++)); do
  45    # The device name is extended with @name, using thread number to
  46    # make then unique, but any name will do.
  47    dev=${DEV}@${thread}
  48
  49    # Add remove all other devices and add_device $dev to thread
  50    [ -z "$APPEND" ] && pg_thread $thread "rem_device_all"
  51    pg_thread $thread "add_device" $dev
  52
  53    # Notice config queue to map to cpu (mirrors smp_processor_id())
  54    # It is beneficial to map IRQ /proc/irq/*/smp_affinity 1:1 to CPU number
  55    pg_set $dev "flag QUEUE_MAP_CPU"
  56
  57    # Base config of dev
  58    pg_set $dev "count $COUNT"
  59    pg_set $dev "clone_skb $CLONE_SKB"
  60    pg_set $dev "pkt_size $PKT_SIZE"
  61    pg_set $dev "delay $DELAY"
  62
  63    # Flag example disabling timestamping
  64    pg_set $dev "flag NO_TIMESTAMP"
  65
  66    # Destination
  67    pg_set $dev "dst_mac $DST_MAC"
  68    pg_set $dev "dst${IP6}_min $DST_MIN"
  69    pg_set $dev "dst${IP6}_max $DST_MAX"
  70
  71    if [ -n "$DST_PORT" ]; then
  72        # Single destination port or random port range
  73        pg_set $dev "flag UDPDST_RND"
  74        pg_set $dev "udp_dst_min $UDP_DST_MIN"
  75        pg_set $dev "udp_dst_max $UDP_DST_MAX"
  76    fi
  77
  78    [ ! -z "$UDP_CSUM" ] && pg_set $dev "flag UDPCSUM"
  79
  80    # Setup random UDP port src range
  81    pg_set $dev "flag UDPSRC_RND"
  82    pg_set $dev "udp_src_min $UDP_SRC_MIN"
  83    pg_set $dev "udp_src_max $UDP_SRC_MAX"
  84done
  85
  86# Run if user hits control-c
  87function print_result() {
  88    # Print results
  89    for ((thread = $F_THREAD; thread <= $L_THREAD; thread++)); do
  90        dev=${DEV}@${thread}
  91        echo "Device: $dev"
  92        cat /proc/net/pktgen/$dev | grep -A2 "Result:"
  93    done
  94}
  95# trap keyboard interrupt (Ctrl-C)
  96trap true SIGINT
  97
  98if [ -z "$APPEND" ]; then
  99    # start_run
 100    echo "Running... ctrl^C to stop" >&2
 101    pg_ctrl "start"
 102    echo "Done" >&2
 103
 104    print_result
 105else
 106    echo "Append mode: config done. Do more or use 'pg_ctrl start' to run"
 107fi
 108