105a14d5eSJesper Dangaard Brouer#!/bin/bash
205a14d5eSJesper Dangaard Brouer#
305a14d5eSJesper Dangaard Brouer# Benchmark script:
405a14d5eSJesper Dangaard Brouer#  - developed for benchmarking ingress qdisc path
505a14d5eSJesper Dangaard Brouer#
605a14d5eSJesper Dangaard Brouer# Script for injecting packets into RX path of the stack with pktgen
705a14d5eSJesper Dangaard Brouer# "xmit_mode netif_receive".  With an invalid dst_mac this will only
805a14d5eSJesper Dangaard Brouer# measure the ingress code path as packets gets dropped in ip_rcv().
905a14d5eSJesper Dangaard Brouer#
1005a14d5eSJesper Dangaard Brouer# This script don't really need any hardware.  It benchmarks software
1105a14d5eSJesper Dangaard Brouer# RX path just after NIC driver level.  With bursting is also
1205a14d5eSJesper Dangaard Brouer# "removes" the SKB alloc/free overhead.
1305a14d5eSJesper Dangaard Brouer#
1405a14d5eSJesper Dangaard Brouer# Setup scenarios for measuring ingress qdisc (with invalid dst_mac):
1505a14d5eSJesper Dangaard Brouer# ------------------------------------------------------------------
1605a14d5eSJesper Dangaard Brouer# (1) no ingress (uses static_key_false(&ingress_needed))
1705a14d5eSJesper Dangaard Brouer#
1805a14d5eSJesper Dangaard Brouer# (2) ingress on other dev (change ingress_needed and calls
1905a14d5eSJesper Dangaard Brouer#     handle_ing() but exit early)
2005a14d5eSJesper Dangaard Brouer#
2105a14d5eSJesper Dangaard Brouer#  config:  tc qdisc add dev $SOMEDEV handle ffff: ingress
2205a14d5eSJesper Dangaard Brouer#
2305a14d5eSJesper Dangaard Brouer# (3) ingress on this dev, handle_ing() -> tc_classify()
2405a14d5eSJesper Dangaard Brouer#
2505a14d5eSJesper Dangaard Brouer#  config:  tc qdisc add dev $DEV handle ffff: ingress
2605a14d5eSJesper Dangaard Brouer#
2705a14d5eSJesper Dangaard Brouer# (4) ingress on this dev + drop at u32 classifier/action.
2805a14d5eSJesper Dangaard Brouer#
2905a14d5eSJesper Dangaard Brouerbasedir=`dirname $0`
3005a14d5eSJesper Dangaard Brouersource ${basedir}/functions.sh
3105a14d5eSJesper Dangaard Brouerroot_check_run_with_sudo "$@"
3205a14d5eSJesper Dangaard Brouer
3305a14d5eSJesper Dangaard Brouer# Parameter parsing via include
3405a14d5eSJesper Dangaard Brouersource ${basedir}/parameters.sh
3505a14d5eSJesper Dangaard Brouer# Using invalid DST_MAC will cause the packets to get dropped in
3605a14d5eSJesper Dangaard Brouer# ip_rcv() which is part of the test
3705a14d5eSJesper Dangaard Brouer[ -z "$DEST_IP" ] && DEST_IP="198.18.0.42"
3805a14d5eSJesper Dangaard Brouer[ -z "$DST_MAC" ] && DST_MAC="90:e2:ba:ff:ff:ff"
3905a14d5eSJesper Dangaard Brouer[ -z "$BURST" ] && BURST=1024
4005a14d5eSJesper Dangaard Brouer
4105a14d5eSJesper Dangaard Brouer# Base Config
4205a14d5eSJesper Dangaard BrouerDELAY="0"        # Zero means max speed
4305a14d5eSJesper Dangaard BrouerCOUNT="10000000" # Zero means indefinitely
4405a14d5eSJesper Dangaard Brouer
4505a14d5eSJesper Dangaard Brouer# General cleanup everything since last run
4605a14d5eSJesper Dangaard Brouerpg_ctrl "reset"
4705a14d5eSJesper Dangaard Brouer
4805a14d5eSJesper Dangaard Brouer# Threads are specified with parameter -t value in $THREADS
4905a14d5eSJesper Dangaard Brouerfor ((thread = 0; thread < $THREADS; thread++)); do
5005a14d5eSJesper Dangaard Brouer    # The device name is extended with @name, using thread number to
5105a14d5eSJesper Dangaard Brouer    # make then unique, but any name will do.
5205a14d5eSJesper Dangaard Brouer    dev=${DEV}@${thread}
5305a14d5eSJesper Dangaard Brouer
5405a14d5eSJesper Dangaard Brouer    # Add remove all other devices and add_device $dev to thread
5505a14d5eSJesper Dangaard Brouer    pg_thread $thread "rem_device_all"
5605a14d5eSJesper Dangaard Brouer    pg_thread $thread "add_device" $dev
5705a14d5eSJesper Dangaard Brouer
5805a14d5eSJesper Dangaard Brouer    # Base config of dev
5905a14d5eSJesper Dangaard Brouer    pg_set $dev "flag QUEUE_MAP_CPU"
6005a14d5eSJesper Dangaard Brouer    pg_set $dev "count $COUNT"
6105a14d5eSJesper Dangaard Brouer    pg_set $dev "pkt_size $PKT_SIZE"
6205a14d5eSJesper Dangaard Brouer    pg_set $dev "delay $DELAY"
6305a14d5eSJesper Dangaard Brouer    pg_set $dev "flag NO_TIMESTAMP"
6405a14d5eSJesper Dangaard Brouer
6505a14d5eSJesper Dangaard Brouer    # Destination
6605a14d5eSJesper Dangaard Brouer    pg_set $dev "dst_mac $DST_MAC"
6705a14d5eSJesper Dangaard Brouer    pg_set $dev "dst $DEST_IP"
6805a14d5eSJesper Dangaard Brouer
6905a14d5eSJesper Dangaard Brouer    # Inject packet into RX path of stack
7005a14d5eSJesper Dangaard Brouer    pg_set $dev "xmit_mode netif_receive"
7105a14d5eSJesper Dangaard Brouer
7205a14d5eSJesper Dangaard Brouer    # Burst allow us to avoid measuring SKB alloc/free overhead
7305a14d5eSJesper Dangaard Brouer    pg_set $dev "burst $BURST"
7405a14d5eSJesper Dangaard Brouerdone
7505a14d5eSJesper Dangaard Brouer
7605a14d5eSJesper Dangaard Brouer# start_run
7705a14d5eSJesper Dangaard Brouerecho "Running... ctrl^C to stop" >&2
7805a14d5eSJesper Dangaard Brouerpg_ctrl "start"
7905a14d5eSJesper Dangaard Brouerecho "Done" >&2
8005a14d5eSJesper Dangaard Brouer
8105a14d5eSJesper Dangaard Brouer# Print results
8205a14d5eSJesper Dangaard Brouerfor ((thread = 0; thread < $THREADS; thread++)); do
8305a14d5eSJesper Dangaard Brouer    dev=${DEV}@${thread}
8405a14d5eSJesper Dangaard Brouer    echo "Device: $dev"
8505a14d5eSJesper Dangaard Brouer    cat /proc/net/pktgen/$dev | grep -A2 "Result:"
8605a14d5eSJesper Dangaard Brouerdone
87