From: Julien Fortin <jul...@cumulusnetworks.com> Schema: { "remote": { "type": "string", "attr": "IFLA_VTI_REMOTE" }, "local": { "type": "string", "attr": "IFLA_VTI_LOCAL" }, "link": { "type": "string", "attr": "IFLA_VTI_LINK", "mutually_exclusive": { "link_index": { "type": "uint", } } }, "ikey": { "type": "string", "attr": "IFLA_VTI_IKEY" }, "okey": { "type": "string", "attr": "IFLA_VTI_OKEY" } }
$ ip tunnel add vti0 mode vti local 192.0.2.1 remote 198.51.100.3 $ ip link show 10: ip_vti0@NONE: <NOARP> mtu 1428 qdisc noop state DOWN mode DEFAULT group default link/ipip 0.0.0.0 brd 0.0.0.0 11: vti0@NONE: <POINTOPOINT,NOARP> mtu 1428 qdisc noop state DOWN mode DEFAULT group default link/ipip 192.0.2.1 peer 198.51.100.3 $ ./ip -details -json link show [{ "ifindex": 10, "ifname": "ip_vti0", "link": null, "flags": ["NOARP"], "mtu": 1428, "qdisc": "noop", "operstate": "DOWN", "linkmode": "DEFAULT", "group": "default", "link_type": "ipip", "address": "0.0.0.0", "broadcast": "0.0.0.0", "promiscuity": 0, "linkinfo": { "info_kind": "vti", "info_data": { "remote": "any", "local": "any", "ikey": "0.0.0.0", "okey": "0.0.0.0" } }, "inet6_addr_gen_mode": "eui64", "num_tx_queues": 1, "num_rx_queues": 1, "gso_max_size": 65536, "gso_max_segs": 65535 },{ "ifindex": 11, "ifname": "vti0", "link": null, "flags": ["POINTOPOINT","NOARP"], "mtu": 1428, "qdisc": "noop", "operstate": "DOWN", "linkmode": "DEFAULT", "group": "default", "link_type": "ipip", "address": "192.0.2.1", "link_pointtopoint": true, "broadcast": "198.51.100.3", "promiscuity": 0, "linkinfo": { "info_kind": "vti", "info_data": { "remote": "198.51.100.3", "local": "192.0.2.1", "ikey": "0.0.0.0", "okey": "0.0.0.0" } }, "inet6_addr_gen_mode": "eui64", "num_tx_queues": 1, "num_rx_queues": 1, "gso_max_size": 65536, "gso_max_segs": 65535 } ] $ Signed-off-by: Julien Fortin <jul...@cumulusnetworks.com> --- ip/link_vti.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/ip/link_vti.c b/ip/link_vti.c index d5242ac7..74336aff 100644 --- a/ip/link_vti.c +++ b/ip/link_vti.c @@ -223,7 +223,7 @@ static void vti_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[]) remote = format_host(AF_INET, 4, &addr); } - fprintf(f, "remote %s ", remote); + print_string(PRINT_ANY, "remote", "remote %s ", remote); if (tb[IFLA_VTI_LOCAL]) { unsigned int addr = rta_getattr_u32(tb[IFLA_VTI_LOCAL]); @@ -232,31 +232,36 @@ static void vti_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[]) local = format_host(AF_INET, 4, &addr); } - fprintf(f, "local %s ", local); + print_string(PRINT_ANY, "local", "local %s ", local); if (tb[IFLA_VTI_LINK] && (link = rta_getattr_u32(tb[IFLA_VTI_LINK]))) { const char *n = if_indextoname(link, s2); if (n) - fprintf(f, "dev %s ", n); + print_string(PRINT_ANY, "link", "dev %s ", n); else - fprintf(f, "dev %u ", link); + print_uint(PRINT_ANY, "link_index", "dev %u ", link); } if (tb[IFLA_VTI_IKEY]) { inet_ntop(AF_INET, RTA_DATA(tb[IFLA_VTI_IKEY]), s2, sizeof(s2)); - fprintf(f, "ikey %s ", s2); + print_string(PRINT_ANY, "ikey", "ikey %s ", s2); } if (tb[IFLA_VTI_OKEY]) { inet_ntop(AF_INET, RTA_DATA(tb[IFLA_VTI_OKEY]), s2, sizeof(s2)); - fprintf(f, "okey %s ", s2); + print_string(PRINT_ANY, "okey", "okey %s ", s2); } - if (tb[IFLA_VTI_FWMARK] && rta_getattr_u32(tb[IFLA_VTI_FWMARK])) { - fprintf(f, "fwmark 0x%x ", - rta_getattr_u32(tb[IFLA_VTI_FWMARK])); + if (tb[IFLA_VTI_FWMARK]) { + __u32 fwmark = rta_getattr_u32(tb[IFLA_VTI_FWMARK]); + + if (fwmark) { + snprintf(s2, sizeof(s2), "0x%x", fwmark); + + print_string(PRINT_ANY, "fwmark", "fwmark %s ", s2); + } } } -- 2.13.3