* iproute2 bug in json output for encap
@ 2023-04-14 8:29 Lars Ekman
2023-04-14 15:21 ` Stephen Hemminger
0 siblings, 1 reply; 6+ messages in thread
From: Lars Ekman @ 2023-04-14 8:29 UTC (permalink / raw)
To: netdev
The destination is lost in json printout and replaced by the encap
destination. The destination can even be ipv6 for an ipv4 route.
Example:
vm-002 ~ # ip route add 10.0.0.0/24 proto 5 dev ip6tnl6 encap ip6 dst
fd00::192.168.2.221
vm-002 ~ # ip route show proto 5
10.0.0.0/24 encap ip6 id 0 src :: dst fd00::c0a8:2dd hoplimit 0 tc 0
dev ip6tnl6 scope link
vm-002 ~ # ip -j route show proto 5 | jq
[
{
"dst": "fd00::c0a8:2dd",
"encap": "ip6",
"id": 0,
"src": "::",
"hoplimit": 0,
"tc": 0,
"dev": "ip6tnl6",
"scope": "link",
"flags": []
}
]
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: iproute2 bug in json output for encap 2023-04-14 8:29 iproute2 bug in json output for encap Lars Ekman @ 2023-04-14 15:21 ` Stephen Hemminger 2023-04-14 16:12 ` Lars Ekman 0 siblings, 1 reply; 6+ messages in thread From: Stephen Hemminger @ 2023-04-14 15:21 UTC (permalink / raw) To: Lars Ekman; +Cc: netdev On Fri, 14 Apr 2023 10:29:15 +0200 Lars Ekman <uablrek@gmail.com> wrote: > The destination is lost in json printout and replaced by the encap > destination. The destination can even be ipv6 for an ipv4 route. > > Example: > > vm-002 ~ # ip route add 10.0.0.0/24 proto 5 dev ip6tnl6 encap ip6 dst > fd00::192.168.2.221 > vm-002 ~ # ip route show proto 5 > 10.0.0.0/24 encap ip6 id 0 src :: dst fd00::c0a8:2dd hoplimit 0 tc 0 > dev ip6tnl6 scope link > vm-002 ~ # ip -j route show proto 5 | jq > [ > { > "dst": "fd00::c0a8:2dd", > "encap": "ip6", > "id": 0, > "src": "::", > "hoplimit": 0, > "tc": 0, > "dev": "ip6tnl6", > "scope": "link", > "flags": [] > } > ] > Both JSON and regular output show the same address which is coming from the kernel. I.e not a JSON problem. Also, you don't need to use jq ip has -p flag to pretty print. I can not reproduce this with current kernel and iproute2. # ip route add 192.168.11.0/24 proto 5 dev dummy0 encap ip6 dst fd00::192.168.2.221 # ip route show proto 5 192.168.11.0/24 encap ip6 id 0 src :: dst fd00::c0a8:2dd hoplimit 0 tc 0 dev dummy0 scope link # ip -j -p route show proto 5 [ { "dst": "192.168.11.0/24", "encap": "ip6", "id": 0, "src": "::", "dst": "fd00::c0a8:2dd", "hoplimit": 0, "tc": 0, "dev": "dummy0", "scope": "link", "flags": [ ] } ] # ip -V ip utility, iproute2-6.1.0, libbpf 1.1.0 # uname -r 6.1.0-7-amd64 ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: iproute2 bug in json output for encap 2023-04-14 15:21 ` Stephen Hemminger @ 2023-04-14 16:12 ` Lars Ekman 2023-04-14 16:26 ` Lars Ekman 0 siblings, 1 reply; 6+ messages in thread From: Lars Ekman @ 2023-04-14 16:12 UTC (permalink / raw) To: Stephen Hemminger; +Cc: netdev Hi, Thanks for the reply. You are right, it is jq that eats one ot the double "dst" items. vm-002 ~ # ip -j -p route show proto 5 [ { "dst": "192.168.11.0/24", "encap": "ip6", "id": 0, "src": "::", "dst": "fd00::c0a8:2dd", "hoplimit": 0, "tc": 0, "dev": "dummy0", "scope": "link", "flags": [ ] } ] vm-002 ~ # ip -j -p route show proto 5 | jq [ { "dst": "fd00::c0a8:2dd", "encap": "ip6", "id": 0, "src": "::", "hoplimit": 0, "tc": 0, "dev": "dummy0", "scope": "link", "flags": [] } ] Sorry for the fuss. Best Regards, Lars Ekman And btw I did upgrade *before* posting :-) vm-002 ~ # ip -V ip utility, iproute2-6.2.0, libbpf 1.1.0 vm-002 ~ # uname -r 6.2.7 On 2023-04-14 17:21, Stephen Hemminger wrote: > On Fri, 14 Apr 2023 10:29:15 +0200 > Lars Ekman <uablrek@gmail.com> wrote: > >> The destination is lost in json printout and replaced by the encap >> destination. The destination can even be ipv6 for an ipv4 route. >> >> Example: >> >> vm-002 ~ # ip route add 10.0.0.0/24 proto 5 dev ip6tnl6 encap ip6 dst >> fd00::192.168.2.221 >> vm-002 ~ # ip route show proto 5 >> 10.0.0.0/24 encap ip6 id 0 src :: dst fd00::c0a8:2dd hoplimit 0 tc 0 >> dev ip6tnl6 scope link >> vm-002 ~ # ip -j route show proto 5 | jq >> [ >> { >> "dst": "fd00::c0a8:2dd", >> "encap": "ip6", >> "id": 0, >> "src": "::", >> "hoplimit": 0, >> "tc": 0, >> "dev": "ip6tnl6", >> "scope": "link", >> "flags": [] >> } >> ] >> > Both JSON and regular output show the same address which is coming from > the kernel. I.e not a JSON problem. Also, you don't need to use jq > ip has -p flag to pretty print. > > I can not reproduce this with current kernel and iproute2. > # ip route add 192.168.11.0/24 proto 5 dev dummy0 encap ip6 dst fd00::192.168.2.221 > > # ip route show proto 5 > 192.168.11.0/24 encap ip6 id 0 src :: dst fd00::c0a8:2dd hoplimit 0 tc 0 dev dummy0 scope link > > # ip -j -p route show proto 5 > [ { > "dst": "192.168.11.0/24", > "encap": "ip6", > "id": 0, > "src": "::", > "dst": "fd00::c0a8:2dd", > "hoplimit": 0, > "tc": 0, > "dev": "dummy0", > "scope": "link", > "flags": [ ] > } ] > > > # ip -V > ip utility, iproute2-6.1.0, libbpf 1.1.0 > # uname -r > 6.1.0-7-amd64 > > ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: iproute2 bug in json output for encap 2023-04-14 16:12 ` Lars Ekman @ 2023-04-14 16:26 ` Lars Ekman 2023-04-14 16:44 ` Stephen Hemminger 2023-04-14 17:01 ` Stephen Hemminger 0 siblings, 2 replies; 6+ messages in thread From: Lars Ekman @ 2023-04-14 16:26 UTC (permalink / raw) To: Stephen Hemminger; +Cc: netdev Hi again, Digging a little deeper I see that the double "dst" items will cause problems with most (all?) json parsers. I intend to use "go" and json parsing will be parsed to a "map" (hash-table) so duplicate keys will not work. https://stackoverflow.com/questions/21832701/does-json-syntax-allow-duplicate-keys-in-an-object IMHO it would be better to use a structured "encap" item. Something like; [ { "dst": "192.168.11.0/24", "encap": { "protocol": "ip6", "id": 0, "src": "::", "dst": "fd00::c0a8:2dd", "hoplimit": 0, "tc": 0 }, "scope": "link", "flags": [ ] } ] Best Regards, Lars Ekman On 2023-04-14 18:12, Lars Ekman wrote: > Hi, > > Thanks for the reply. You are right, it is jq that eats one ot the > double "dst" items. > > vm-002 ~ # ip -j -p route show proto 5 > [ { > "dst": "192.168.11.0/24", > "encap": "ip6", > "id": 0, > "src": "::", > "dst": "fd00::c0a8:2dd", > "hoplimit": 0, > "tc": 0, > "dev": "dummy0", > "scope": "link", > "flags": [ ] > } ] > vm-002 ~ # ip -j -p route show proto 5 | jq > [ > { > "dst": "fd00::c0a8:2dd", > "encap": "ip6", > "id": 0, > "src": "::", > "hoplimit": 0, > "tc": 0, > "dev": "dummy0", > "scope": "link", > "flags": [] > } > ] > > Sorry for the fuss. > > Best Regards, > > Lars Ekman > > > And btw I did upgrade *before* posting :-) > > vm-002 ~ # ip -V > ip utility, iproute2-6.2.0, libbpf 1.1.0 > vm-002 ~ # uname -r > 6.2.7 > > > > On 2023-04-14 17:21, Stephen Hemminger wrote: >> On Fri, 14 Apr 2023 10:29:15 +0200 >> Lars Ekman <uablrek@gmail.com> wrote: >> >>> The destination is lost in json printout and replaced by the encap >>> destination. The destination can even be ipv6 for an ipv4 route. >>> >>> Example: >>> >>> vm-002 ~ # ip route add 10.0.0.0/24 proto 5 dev ip6tnl6 encap ip6 dst >>> fd00::192.168.2.221 >>> vm-002 ~ # ip route show proto 5 >>> 10.0.0.0/24 encap ip6 id 0 src :: dst fd00::c0a8:2dd hoplimit 0 tc 0 >>> dev ip6tnl6 scope link >>> vm-002 ~ # ip -j route show proto 5 | jq >>> [ >>> { >>> "dst": "fd00::c0a8:2dd", >>> "encap": "ip6", >>> "id": 0, >>> "src": "::", >>> "hoplimit": 0, >>> "tc": 0, >>> "dev": "ip6tnl6", >>> "scope": "link", >>> "flags": [] >>> } >>> ] >>> >> Both JSON and regular output show the same address which is coming from >> the kernel. I.e not a JSON problem. Also, you don't need to use jq >> ip has -p flag to pretty print. >> >> I can not reproduce this with current kernel and iproute2. >> # ip route add 192.168.11.0/24 proto 5 dev dummy0 encap ip6 dst fd00::192.168.2.221 >> >> # ip route show proto 5 >> 192.168.11.0/24 encap ip6 id 0 src :: dst fd00::c0a8:2dd hoplimit 0 tc 0 dev dummy0 scope link >> >> # ip -j -p route show proto 5 >> [ { >> "dst": "192.168.11.0/24", >> "encap": "ip6", >> "id": 0, >> "src": "::", >> "dst": "fd00::c0a8:2dd", >> "hoplimit": 0, >> "tc": 0, >> "dev": "dummy0", >> "scope": "link", >> "flags": [ ] >> } ] >> >> >> # ip -V >> ip utility, iproute2-6.1.0, libbpf 1.1.0 >> # uname -r >> 6.1.0-7-amd64 >> >> ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: iproute2 bug in json output for encap 2023-04-14 16:26 ` Lars Ekman @ 2023-04-14 16:44 ` Stephen Hemminger 2023-04-14 17:01 ` Stephen Hemminger 1 sibling, 0 replies; 6+ messages in thread From: Stephen Hemminger @ 2023-04-14 16:44 UTC (permalink / raw) To: Lars Ekman; +Cc: netdev On Fri, 14 Apr 2023 18:26:03 +0200 Lars Ekman <uablrek@gmail.com> wrote: > Hi again, > > Digging a little deeper I see that the double "dst" items will cause > problems with most (all?) json parsers. I intend to use "go" and json > parsing will be parsed to a "map" (hash-table) so duplicate keys will > not work. > > https://stackoverflow.com/questions/21832701/does-json-syntax-allow-duplicate-keys-in-an-object > > IMHO it would be better to use a structured "encap" item. Something like; > > [ { > "dst": "192.168.11.0/24", > "encap": { > "protocol": "ip6", > "id": 0, > "src": "::", > "dst": "fd00::c0a8:2dd", > "hoplimit": 0, > "tc": 0 > }, > "scope": "link", > "flags": [ ] > } ] > > Best Regards, > > Lars Ekman That makes sense, not sure if it would break any existing scripts. Probably true for ip link as well. ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: iproute2 bug in json output for encap 2023-04-14 16:26 ` Lars Ekman 2023-04-14 16:44 ` Stephen Hemminger @ 2023-04-14 17:01 ` Stephen Hemminger 1 sibling, 0 replies; 6+ messages in thread From: Stephen Hemminger @ 2023-04-14 17:01 UTC (permalink / raw) To: Lars Ekman; +Cc: netdev On Fri, 14 Apr 2023 18:26:03 +0200 Lars Ekman <uablrek@gmail.com> wrote: > Hi again, > > Digging a little deeper I see that the double "dst" items will cause > problems with most (all?) json parsers. I intend to use "go" and json > parsing will be parsed to a "map" (hash-table) so duplicate keys will > not work. > > https://stackoverflow.com/questions/21832701/does-json-syntax-allow-duplicate-keys-in-an-object > > IMHO it would be better to use a structured "encap" item. Something like; > > [ { > "dst": "192.168.11.0/24", > "encap": { > "protocol": "ip6", > "id": 0, > "src": "::", > "dst": "fd00::c0a8:2dd", > "hoplimit": 0, > "tc": 0 > }, > "scope": "link", > "flags": [ ] > } ] Something like this? diff --git a/ip/iproute_lwtunnel.c b/ip/iproute_lwtunnel.c index 52221c6976b3..37730024caaf 100644 --- a/ip/iproute_lwtunnel.c +++ b/ip/iproute_lwtunnel.c @@ -834,14 +834,15 @@ static void print_encap_xfrm(FILE *fp, struct rtattr *encap) void lwt_print_encap(FILE *fp, struct rtattr *encap_type, struct rtattr *encap) { - int et; + uint16_t et; if (!encap_type) return; et = rta_getattr_u16(encap_type); - - print_string(PRINT_ANY, "encap", " encap %s ", format_encap_type(et)); + open_json_object("encap"); + print_string(PRINT_ANY, "encap_type", " encap %s ", + format_encap_type(et)); switch (et) { case LWTUNNEL_ENCAP_MPLS: @@ -875,6 +876,7 @@ void lwt_print_encap(FILE *fp, struct rtattr *encap_type, print_encap_xfrm(fp, encap); break; } + close_json_object(); } static struct ipv6_sr_hdr *parse_srh(char *segbuf, int hmac, bool encap) ^ permalink raw reply related [flat|nested] 6+ messages in thread
end of thread, other threads:[~2023-04-14 17:01 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2023-04-14 8:29 iproute2 bug in json output for encap Lars Ekman 2023-04-14 15:21 ` Stephen Hemminger 2023-04-14 16:12 ` Lars Ekman 2023-04-14 16:26 ` Lars Ekman 2023-04-14 16:44 ` Stephen Hemminger 2023-04-14 17:01 ` Stephen Hemminger
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).