No Qdisc TCA_STATS_BASIC after redirection to ifb0

Linux Advanced Routing and Traffic Control

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

I am redirecting ingress traffic from eth0 to ifb0 in order to do some
ingress traffic shaping:

$ tc qdisc add dev eth0 handle ffff: ingress
$ tc filter add dev eth0 parent ffff: protocol ip u32 match u32 0 0 \
              action mirred egress redirect dev ifb0

$ tc qdisc add dev ifb0 handle 1:0 root dsmark indices 4 default_index 0
$ tc qdisc add dev ifb0 handle 2:0 parent 1:0 htb r2q 2
... etc.

The ingress traffic shaping works but the stats don't seem to work
correctly:

$ nl-qdisc-list --stats 
qdisc ingress dev eth0 id ffff: parent ingress
  refcnt 1 no options
    Stats:    bytes    packets      drops overlimits       qlen    backlog
         305.15 MiB     223339          0          0          0          0
        0.000000000 B/s        0 pps
qdisc dsmark dev ifb0 id 1: parent root indices 0x0004
  refcnt 2  default index 0x0000
    Stats:    bytes    packets      drops overlimits       qlen    backlog
        0.000000000 B          0          0          0          0          0
        0.000000000 B/s        0 pps indices 0x0004
qdisc htb dev ifb0 id 2: parent 1: r2q 2 default-class none
  refcnt 1 no options
    Stats:    bytes    packets      drops overlimits       qlen    backlog
        0.000000000 B          0          0          0          0          0
        0.000000000 B/s        0 pps r2q 2 default-class none
...

I am expecting to see as many bytes and packets in dsmark on ifb0 than
ingress on eth0. The buffers are correctly accounted in the ingress
qdisc, but after the redirection to ifb0, the counters remain at zero. 

- Do I miss something, like a kernel CONFIG to enable stats on ifb0?

- Even on the ingress qdisc, the stats are partial: TCA_STATS2 contains
  TCA_STATS_BASIC and TCA_STATS_QUEUE but TCA_STATS_RATE_EST is missing. 

My tests are on a 3.8.0 kernel.

As far as I understand, the skb in ifb0 is a clone from the initial skb:
net/sched/act_mirred.c:tcf_mirred calls skb_act_clone.

And cloning don't copy the control buffer (struct sk_buff)->cb where
qdisc_skb_cb(skb)->pkt_len is stored. I am not sure where it is initialized
in this case.

Best regards,
Alban
--
To unsubscribe from this list: send the line "unsubscribe lartc" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [LARTC Home Page]     [Netfilter]     [Netfilter Development]     [Network Development]     [Bugtraq]     [GCC Help]     [Yosemite News]     [Linux Kernel]     [Fedora Users]
  Powered by Linux