]> git.ipfire.org Git - thirdparty/iproute2.git/commitdiff
ss: Show more info (ring,fanout) for packet socks
authorVadim Kochan <vadim4j@gmail.com>
Fri, 15 May 2015 14:19:30 +0000 (17:19 +0300)
committerStephen Hemminger <shemming@brocade.com>
Thu, 21 May 2015 21:47:44 +0000 (14:47 -0700)
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>
misc/ss.c

index 870cad185341b5732295e0bb95f6c9d96b346154..347e3a12d082199aa392e1169604026e58b1d0e2 100644 (file)
--- a/misc/ss.c
+++ b/misc/ss.c
@@ -2834,13 +2834,27 @@ static int packet_stats_print(struct sockstat *s, const struct filter *f)
        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,
                struct nlmsghdr *nlh, void *arg)
 {
        const struct filter *f = arg;
        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 sockstat stat = {};
+       uint32_t fanout = 0;
+       bool has_fanout = false;
 
        parse_rtattr(tb, PACKET_DIAG_MAX, (struct rtattr*)(r+1),
                     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]) {
-               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;
        }
 
        if (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))
                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]) {
                struct sock_filter *fil =
                       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);
 
        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);
 }