int force;
int max_flush_loops = 10;
int batch_mode;
+int numeric;
bool do_all;
struct rtnl_handle rth = { .fd = -1 };
static void usage(void)
{
fprintf(stderr,
-"Usage: ip [ OPTIONS ] OBJECT { COMMAND | help }\n"
-" ip [ -force ] -batch filename\n"
-"where OBJECT := { link | address | addrlabel | route | rule | neigh | ntable |\n"
-" tunnel | tuntap | maddress | mroute | mrule | monitor | xfrm |\n"
-" netns | l2tp | fou | macsec | tcp_metrics | token | netconf | ila |\n"
-" vrf | sr }\n"
-" OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] |\n"
-" -h[uman-readable] | -iec | -j[son] | -p[retty] |\n"
-" -f[amily] { inet | inet6 | mpls | bridge | link } |\n"
-" -4 | -6 | -I | -D | -M | -B | -0 |\n"
-" -l[oops] { maximum-addr-flush-attempts } | -br[ief] |\n"
-" -o[neline] | -t[imestamp] | -ts[hort] | -b[atch] [filename] |\n"
-" -rc[vbuf] [size] | -n[etns] name | -a[ll] | -c[olor]}\n");
+ "Usage: ip [ OPTIONS ] OBJECT { COMMAND | help }\n"
+ " ip [ -force ] -batch filename\n"
+ "where OBJECT := { link | address | addrlabel | route | rule | neigh | ntable |\n"
+ " tunnel | tuntap | maddress | mroute | mrule | monitor | xfrm |\n"
+ " netns | l2tp | fou | macsec | tcp_metrics | token | netconf | ila |\n"
+ " vrf | sr | nexthop }\n"
+ " OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] |\n"
+ " -h[uman-readable] | -iec | -j[son] | -p[retty] |\n"
+ " -f[amily] { inet | inet6 | mpls | bridge | link } |\n"
+ " -4 | -6 | -I | -D | -M | -B | -0 |\n"
+ " -l[oops] { maximum-addr-flush-attempts } | -br[ief] |\n"
+ " -o[neline] | -t[imestamp] | -ts[hort] | -b[atch] [filename] |\n"
+ " -rc[vbuf] [size] | -n[etns] name | -N[umeric] | -a[ll] |\n"
+ " -c[olor]}\n");
exit(-1);
}
{ "netconf", do_ipnetconf },
{ "vrf", do_ipvrf},
{ "sr", do_seg6 },
+ { "nexthop", do_ipnh },
{ "help", do_help },
{ 0 }
};
NEXT_ARG();
if (netns_switch(argv[1]))
exit(-1);
+ } else if (matches(opt, "-Numeric") == 0) {
+ ++numeric;
} else if (matches(opt, "-all") == 0) {
do_all = true;
} else {