ndp: Bring back the -A option for the netlink implementation

This was lost during the conversion to netlink.

Reviewed by:	kp
Fixes:		91fbe0819b ndp: convert ndp(8) to netlink
MFC after:	1 week
Differential Revision:	https://reviews.freebsd.org/D47234
This commit is contained in:
Zhenlei Huang 2024-11-01 00:32:14 +08:00
parent 12c04071cf
commit b6d4e3bee3

View File

@ -314,12 +314,24 @@ print_entries_nl(uint32_t ifindex, struct sockaddr_in6 *addr, bool cflag)
struct snl_state ss_req = {}, ss_cmd = {};
struct snl_parsed_link_simple link = {};
struct snl_writer nw;
struct nlmsghdr *hdr;
struct ndmsg *ndmsg;
nl_init_socket(&ss_req);
snl_init_writer(&ss_req, &nw);
struct nlmsghdr *hdr = snl_create_msg_request(&nw, RTM_GETNEIGH);
struct ndmsg *ndmsg = snl_reserve_msg_object(&nw, struct ndmsg);
/* Print header */
if (!opts.tflag && !cflag) {
char xobuf[200];
snprintf(xobuf, sizeof(xobuf),
"{T:/%%-%d.%ds} {T:/%%-%d.%ds} {T:/%%%d.%ds} {T:/%%-9.9s} {T:/%%1s} {T:/%%5s}\n",
W_ADDR, W_ADDR, W_LL, W_LL, W_IF, W_IF);
xo_emit(xobuf, "Neighbor", "Linklayer Address", "Netif", "Expire", "S", "Flags");
}
again:
hdr = snl_create_msg_request(&nw, RTM_GETNEIGH);
ndmsg = snl_reserve_msg_object(&nw, struct ndmsg);
if (ndmsg != NULL) {
ndmsg->ndm_family = AF_INET6;
ndmsg->ndm_ifindex = ifindex;
@ -335,14 +347,6 @@ print_entries_nl(uint32_t ifindex, struct sockaddr_in6 *addr, bool cflag)
int count = 0;
nl_init_socket(&ss_cmd);
/* Print header */
if (!opts.tflag && !cflag) {
char xobuf[200];
snprintf(xobuf, sizeof(xobuf),
"{T:/%%-%d.%ds} {T:/%%-%d.%ds} {T:/%%%d.%ds} {T:/%%-9.9s} {T:/%%1s} {T:/%%5s}\n",
W_ADDR, W_ADDR, W_LL, W_LL, W_IF, W_IF);
xo_emit(xobuf, "Neighbor", "Linklayer Address", "Netif", "Expire", "S", "Flags");
}
xo_open_list("neighbor-cache");
while ((hdr = snl_read_reply_multi(&ss_req, nlmsg_seq, &e)) != NULL) {
@ -381,6 +385,12 @@ print_entries_nl(uint32_t ifindex, struct sockaddr_in6 *addr, bool cflag)
count++;
snl_clear_lb(&ss_req);
}
if (opts.repeat) {
xo_emit("\n");
xo_flush();
sleep(opts.repeat);
goto again;
}
xo_close_list("neighbor-cache");
snl_free(&ss_req);