ping_test $h1.200 2001:db8:2::1 " IPv6"
 }
 
-get_l3_stat()
-{
-       local selector=$1; shift
-
-       ip -j stats show dev $rp1.200 group offload subgroup l3_stats |
-                 jq '.[0].stats64.'$selector
-}
-
 send_packets_rx_ipv4()
 {
        # Send 21 packets instead of 20, because the first one might trap and go
        local a
        local b
 
-       a=$(get_l3_stat ${dir}.packets)
+       a=$(hw_stats_get l3_stats $rp1.200 ${dir} packets)
        send_packets_${dir}_${prot}
        "$@"
        b=$(busywait "$TC_HIT_TIMEOUT" until_counter_is ">= $a + 20" \
-                      get_l3_stat ${dir}.packets)
+                      hw_stats_get l3_stats $rp1.200 ${dir} packets)
        check_err $? "Traffic not reflected in the counter: $a -> $b"
 }
 
 
        RET=0
 
-       a=$(get_l3_stat ${dir}.packets)
+       a=$(hw_stats_get l3_stats $rp1.200 ${dir} packets)
        send_packets_${dir}_${prot}
        ip address flush dev $rp1.200
        b=$(busywait "$TC_HIT_TIMEOUT" until_counter_is ">= $a + 20" \
-                      get_l3_stat ${dir}.packets)
+                      hw_stats_get l3_stats $rp1.200 ${dir} packets)
        check_err $? "Traffic not reflected in the counter: $a -> $b"
        log_test "Test ${dir} packets: stats pushed on loss of L3"
 
 
        cat /proc/net/dev_snmp6/$dev | grep "^$stat" | cut -f2
 }
 
+hw_stats_get()
+{
+       local suite=$1; shift
+       local if_name=$1; shift
+       local dir=$1; shift
+       local stat=$1; shift
+
+       ip -j stats show dev $if_name group offload subgroup $suite |
+               jq ".[0].stats64.$dir.$stat"
+}
+
 humanize()
 {
        local speed=$1; shift