[Cake] NLA_F_NESTED is missing
Dean Scarff
dos at scarff.id.au
Tue Nov 3 03:07:31 EST 2020
On Tue, 03 Nov 2020 12:11:06 +1100, Dean Scarff wrote:
> I should be able to figure it out by poking around in tc with gdb.
I did this, and I confirmed that tc isn't trying to send any nested
attributes. So I think the problem is on the kernel side, since it
seems to be hallucinating attributes it expects to be nested but aren't.
Note that "tc" does send an empty options attribute:
addattr_l(n, 1024, TCA_OPTIONS, NULL, 0);
https://salsa.debian.org/debian/iproute2/-/blob/v5.7.0/tc/q_cake.c#L356
It's the same in upstream iproute2 and iproute2-next:
https://git.kernel.org/pub/scm/network/iproute2/iproute2.git/tree/tc/q_cake.c#n356
https://git.kernel.org/pub/scm/network/iproute2/iproute2-next.git/tree/tc/q_cake.c#n356
This looks valid to me. While I'm less sure about all the other
attributes being added in cake_parse_opt (i.e. whether they should be
nested under TCA_OPTIONS), that's moot in my repro case, because they're
not being set anyway.
---
Interesting parts of the gdb session:
(gdb) run qdisc add dev ppp0 root cake
Starting program: /home/dean/iproute2/tc/tc qdisc add dev ppp0 root
cake
Breakpoint 10, rtnl_talk (rtnl=0xc72d0 <rth>, n=0x7efefb78, answer=0x0)
at libnetlink.c:1048
1048 return __rtnl_talk(rtnl, n, answer, true, NULL);
(gdb) p *rtnl
$14 = {fd = 3, local = {nl_family = 16, nl_pad = 0, nl_pid = 18698,
nl_groups = 0}, peer = {nl_family = 0, nl_pad = 0, nl_pid = 0,
nl_groups = 0}, seq = 1604370876, dump = 1604370876, proto = 0,
dump_fp = 0x0, flags = 0}
(gdb) p *n
$15 = {nlmsg_len = 52, nlmsg_type = 36, nlmsg_flags = 1537, nlmsg_seq =
0,
nlmsg_pid = 0}
(gdb) p sizeof(struct nlmsghdr)
$16 = 16
(gdb) call print_qdisc(n, stdout)
added qdisc cake 0: dev ppp0 root refcnt 0 nonat nowash no-ack-filter
no-split-gso noatm overhead 0
$17 = 0
I've annotated the following to show the structure of the request.
There are only two attributes, TCA_KIND and TCA_OPTIONS, and neither of
those is nested.
(gdb) x/52xb n
nlmsghdr:
0x7efefb78: [0x34] 0x00 0x00 0x00 [0x24] 0x00 0x01 0x06
len=52 RTM_NEWQDISC
0x7efefb80: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
payload:
family header:
0x7efefb88: [0x00][0x00][0x00 0x00][0x05 0x00][0x00 0x00]
family=AF_UNSPEC ifindex=ppp0
pad1 pad2 alignment
0x7efefb90: [0x00 0x00 0x00 0x00][0xff 0xff 0xff 0xff]
handle=0 parent=TC_H_ROOT
attributes:
0x7efefb98: [0x00 0x00 0x00 0x00][0x09 0x00][0x01 0x00]
info=0 rta_len=9 rta_type=TCA_KIND
0x7efefba0: [0x63 0x61 0x6b 0x65 0x00][0x00 0x00 0x00]
rta_data=“cake” alignment
0x7efefba8: [0x04 0x00][0x02 0x00]
rta_len=4 rta_type=TCA_OPTIONS
(gdb) up
#1 0x000199a4 in tc_qdisc_modify (cmd=36, flags=1536, argc=0,
argv=0x7efffd70)
at tc_qdisc.c:208
208 if (rtnl_talk(&rth, &req.n, NULL) < 0)
(gdb) p req.t
$19 = {tcm_family = 0 '\000', tcm__pad1 = 0 '\000', tcm__pad2 = 0,
tcm_ifindex = 5, tcm_handle = 0, tcm_parent = 4294967295, tcm_info =
0}
More information about the Cake
mailing list