Commit 3b28be6e authored by vadimk's avatar vadimk Committed by Stephen Hemminger

ss: Use generic handle_netlink_request for packet

Get rid of self-handling and creating of Netlink socket for show packet
socket stats.
Signed-off-by: default avatarVadim Kochan <vadim4j@gmail.com>
parent 1f299e92
...@@ -2788,86 +2788,13 @@ static int packet_show_sock(struct nlmsghdr *nlh, struct filter *f) ...@@ -2788,86 +2788,13 @@ static int packet_show_sock(struct nlmsghdr *nlh, struct filter *f)
static int packet_show_netlink(struct filter *f, FILE *dump_fp) static int packet_show_netlink(struct filter *f, FILE *dump_fp)
{ {
int fd;
DIAG_REQUEST(req, struct packet_diag_req r); DIAG_REQUEST(req, struct packet_diag_req r);
char buf[16384];
if ((fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_INET_DIAG)) < 0)
return -1;
req.r.sdiag_family = AF_PACKET; req.r.sdiag_family = AF_PACKET;
req.r.pdiag_show = PACKET_SHOW_INFO | PACKET_SHOW_MEMINFO | PACKET_SHOW_FILTER; req.r.pdiag_show = PACKET_SHOW_INFO | PACKET_SHOW_MEMINFO | PACKET_SHOW_FILTER;
if (send(fd, &req, sizeof(req), 0) < 0) { return handle_netlink_request(f, dump_fp, &req.nlh, sizeof(req),
close(fd); packet_show_sock);
return -1;
}
while (1) {
ssize_t status;
struct nlmsghdr *h;
struct sockaddr_nl nladdr;
socklen_t slen = sizeof(nladdr);
status = recvfrom(fd, buf, sizeof(buf), 0,
(struct sockaddr *) &nladdr, &slen);
if (status < 0) {
if (errno == EINTR)
continue;
perror("OVERRUN");
continue;
}
if (status == 0) {
fprintf(stderr, "EOF on netlink\n");
goto close_it;
}
if (dump_fp)
fwrite(buf, 1, NLMSG_ALIGN(status), dump_fp);
h = (struct nlmsghdr*)buf;
while (NLMSG_OK(h, status)) {
int err;
if (h->nlmsg_seq != 123456)
goto skip_it;
if (h->nlmsg_type == NLMSG_DONE)
goto close_it;
if (h->nlmsg_type == NLMSG_ERROR) {
struct nlmsgerr *err = (struct nlmsgerr*)NLMSG_DATA(h);
if (h->nlmsg_len < NLMSG_LENGTH(sizeof(struct nlmsgerr))) {
fprintf(stderr, "ERROR truncated\n");
} else {
errno = -err->error;
if (errno != ENOENT)
fprintf(stderr, "UDIAG answers %d\n", errno);
}
close(fd);
return -1;
}
if (!dump_fp) {
err = packet_show_sock(h, f);
if (err < 0) {
close(fd);
return err;
}
}
skip_it:
h = NLMSG_NEXT(h, status);
}
if (status) {
fprintf(stderr, "!!!Remnant of size %zd\n", status);
exit(1);
}
}
close_it:
close(fd);
return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment