ss: Show more info (ring,fanout) for packet socks
Print such info like version, tx/rx ring, fanout for packet sockets when '-e' option was specified. Signed-off-by: Vadim Kochan <vadim4j@gmail.com>
This commit is contained in:
parent
fede6dd9b3
commit
2631b85666
85
misc/ss.c
85
misc/ss.c
|
|
@ -2834,13 +2834,27 @@ static int packet_stats_print(struct sockstat *s, const struct filter *f)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void packet_show_ring(struct packet_diag_ring *ring)
|
||||||
|
{
|
||||||
|
printf("blk_size:%d", ring->pdr_block_size);
|
||||||
|
printf(",blk_nr:%d", ring->pdr_block_nr);
|
||||||
|
printf(",frm_size:%d", ring->pdr_frame_size);
|
||||||
|
printf(",frm_nr:%d", ring->pdr_frame_nr);
|
||||||
|
printf(",tmo:%d", ring->pdr_retire_tmo);
|
||||||
|
printf(",features:0x%x", ring->pdr_features);
|
||||||
|
}
|
||||||
|
|
||||||
static int packet_show_sock(const struct sockaddr_nl *addr,
|
static int packet_show_sock(const struct sockaddr_nl *addr,
|
||||||
struct nlmsghdr *nlh, void *arg)
|
struct nlmsghdr *nlh, void *arg)
|
||||||
{
|
{
|
||||||
const struct filter *f = arg;
|
const struct filter *f = arg;
|
||||||
struct packet_diag_msg *r = NLMSG_DATA(nlh);
|
struct packet_diag_msg *r = NLMSG_DATA(nlh);
|
||||||
|
struct packet_diag_info *pinfo = NULL;
|
||||||
|
struct packet_diag_ring *ring_rx = NULL, *ring_tx = NULL;
|
||||||
struct rtattr *tb[PACKET_DIAG_MAX+1];
|
struct rtattr *tb[PACKET_DIAG_MAX+1];
|
||||||
struct sockstat stat = {};
|
struct sockstat stat = {};
|
||||||
|
uint32_t fanout = 0;
|
||||||
|
bool has_fanout = false;
|
||||||
|
|
||||||
parse_rtattr(tb, PACKET_DIAG_MAX, (struct rtattr*)(r+1),
|
parse_rtattr(tb, PACKET_DIAG_MAX, (struct rtattr*)(r+1),
|
||||||
nlh->nlmsg_len - NLMSG_LENGTH(sizeof(*r)));
|
nlh->nlmsg_len - NLMSG_LENGTH(sizeof(*r)));
|
||||||
|
|
@ -2861,16 +2875,82 @@ static int packet_show_sock(const struct sockaddr_nl *addr,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tb[PACKET_DIAG_INFO]) {
|
if (tb[PACKET_DIAG_INFO]) {
|
||||||
struct packet_diag_info *pinfo = RTA_DATA(tb[PACKET_DIAG_INFO]);
|
pinfo = RTA_DATA(tb[PACKET_DIAG_INFO]);
|
||||||
stat.lport = stat.iface = pinfo->pdi_index;
|
stat.lport = stat.iface = pinfo->pdi_index;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tb[PACKET_DIAG_UID])
|
if (tb[PACKET_DIAG_UID])
|
||||||
stat.uid = *(__u32 *)RTA_DATA(tb[PACKET_DIAG_UID]);
|
stat.uid = *(__u32 *)RTA_DATA(tb[PACKET_DIAG_UID]);
|
||||||
|
|
||||||
|
if (tb[PACKET_DIAG_RX_RING])
|
||||||
|
ring_rx = RTA_DATA(tb[PACKET_DIAG_RX_RING]);
|
||||||
|
|
||||||
|
if (tb[PACKET_DIAG_TX_RING])
|
||||||
|
ring_tx = RTA_DATA(tb[PACKET_DIAG_TX_RING]);
|
||||||
|
|
||||||
|
if (tb[PACKET_DIAG_FANOUT]) {
|
||||||
|
has_fanout = true;
|
||||||
|
fanout = *(uint32_t *)RTA_DATA(tb[PACKET_DIAG_FANOUT]);
|
||||||
|
}
|
||||||
|
|
||||||
if (packet_stats_print(&stat, f))
|
if (packet_stats_print(&stat, f))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
if (show_details) {
|
||||||
|
if (pinfo) {
|
||||||
|
printf("\n\tver:%d", pinfo->pdi_version);
|
||||||
|
printf(" cpy_thresh:%d", pinfo->pdi_copy_thresh);
|
||||||
|
printf(" flags( ");
|
||||||
|
if (pinfo->pdi_flags & PDI_RUNNING)
|
||||||
|
printf("running");
|
||||||
|
if (pinfo->pdi_flags & PDI_AUXDATA)
|
||||||
|
printf(" auxdata");
|
||||||
|
if (pinfo->pdi_flags & PDI_ORIGDEV)
|
||||||
|
printf(" origdev");
|
||||||
|
if (pinfo->pdi_flags & PDI_VNETHDR)
|
||||||
|
printf(" vnethdr");
|
||||||
|
if (pinfo->pdi_flags & PDI_LOSS)
|
||||||
|
printf(" loss");
|
||||||
|
if (!pinfo->pdi_flags)
|
||||||
|
printf("0");
|
||||||
|
printf(" )");
|
||||||
|
}
|
||||||
|
if (ring_rx) {
|
||||||
|
printf("\n\tring_rx(");
|
||||||
|
packet_show_ring(ring_rx);
|
||||||
|
printf(")");
|
||||||
|
}
|
||||||
|
if (ring_tx) {
|
||||||
|
printf("\n\tring_tx(");
|
||||||
|
packet_show_ring(ring_tx);
|
||||||
|
printf(")");
|
||||||
|
}
|
||||||
|
if (has_fanout) {
|
||||||
|
uint16_t type = (fanout >> 16) & 0xffff;
|
||||||
|
|
||||||
|
printf("\n\tfanout(");
|
||||||
|
printf("id:%d,", fanout & 0xffff);
|
||||||
|
printf("type:");
|
||||||
|
|
||||||
|
if (type == 0)
|
||||||
|
printf("hash");
|
||||||
|
else if (type == 1)
|
||||||
|
printf("lb");
|
||||||
|
else if (type == 2)
|
||||||
|
printf("cpu");
|
||||||
|
else if (type == 3)
|
||||||
|
printf("roll");
|
||||||
|
else if (type == 4)
|
||||||
|
printf("random");
|
||||||
|
else if (type == 5)
|
||||||
|
printf("qm");
|
||||||
|
else
|
||||||
|
printf("0x%x", type);
|
||||||
|
|
||||||
|
printf(")");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (show_bpf && tb[PACKET_DIAG_FILTER]) {
|
if (show_bpf && tb[PACKET_DIAG_FILTER]) {
|
||||||
struct sock_filter *fil =
|
struct sock_filter *fil =
|
||||||
RTA_DATA(tb[PACKET_DIAG_FILTER]);
|
RTA_DATA(tb[PACKET_DIAG_FILTER]);
|
||||||
|
|
@ -2894,7 +2974,8 @@ static int packet_show_netlink(struct filter *f)
|
||||||
DIAG_REQUEST(req, struct packet_diag_req r);
|
DIAG_REQUEST(req, struct packet_diag_req r);
|
||||||
|
|
||||||
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 | PACKET_SHOW_RING_CFG | PACKET_SHOW_FANOUT;
|
||||||
|
|
||||||
return handle_netlink_request(f, &req.nlh, sizeof(req), packet_show_sock);
|
return handle_netlink_request(f, &req.nlh, sizeof(req), packet_show_sock);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue