]> git.proxmox.com Git - mirror_iproute2.git/commitdiff
tipc: fixed node and name table listings
authorJon Maloy <jon.maloy@ericsson.com>
Thu, 17 May 2018 14:02:42 +0000 (16:02 +0200)
committerDavid Ahern <dsahern@gmail.com>
Fri, 18 May 2018 16:12:24 +0000 (09:12 -0700)
We make it easier for users to correlate between 128-bit node
identities and 32-bit node hash number by extending the 'node list'
command to also show the hash number.

We also improve the 'nametable show' command to show the node identity
instead of the node hash number. Since the former potentially is much
longer than the latter, we make room for it by eliminating the (to the
user) irrelevant publication key. We also reorder some of the columns so
that the node id comes last, since this looks nicer and is more logical.

Signed-off-by: David Ahern <dsahern@gmail.com>
tipc/misc.c
tipc/misc.h
tipc/nametable.c
tipc/node.c
tipc/peer.c

index 16849f18cd5cbe89a97d149e9256e0ca2a2500ba..e4b1cd0cc6e5b30e6f26575b9b823e5a778b9fde 100644 (file)
 #include <stdint.h>
 #include <linux/tipc.h>
 #include <string.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <unistd.h>
+#include <errno.h>
 #include "misc.h"
 
 #define IN_RANGE(val, low, high) ((val) <= (high) && (val) >= (low))
@@ -109,3 +113,19 @@ void nodeid2str(uint8_t *id, char *str)
        for (i = 31; str[i] == '0'; i--)
                str[i] = 0;
 }
+
+void hash2nodestr(uint32_t hash, char *str)
+{
+       struct tipc_sioc_nodeid_req nr = {};
+       int sd;
+
+       sd = socket(AF_TIPC, SOCK_RDM, 0);
+       if (sd < 0) {
+               fprintf(stderr, "opening TIPC socket: %s\n", strerror(errno));
+               return;
+       }
+       nr.peer = hash;
+       if (!ioctl(sd, SIOCGETNODEID, &nr))
+               nodeid2str((uint8_t *)nr.node_id, str);
+       close(sd);
+}
index 6e8afddff031918ac64c586dd7a88bfe23056b2d..ff2f31f1561548cc36b5ea37e6646ec851ffabe3 100644 (file)
@@ -17,5 +17,6 @@
 uint32_t str2addr(char *str);
 int str2nodeid(char *str, uint8_t *id);
 void nodeid2str(uint8_t *id, char *str);
+void hash2nodestr(uint32_t hash, char *str);
 
 #endif
index 2578940fe2b2e234fa42e4041efd22893bc7c6f9..ae73dfa5f8b9b8350d9ad4c964b7bcf45178f203 100644 (file)
@@ -20,6 +20,7 @@
 #include "cmdl.h"
 #include "msg.h"
 #include "nametable.h"
+#include "misc.h"
 
 #define PORTID_STR_LEN 45 /* Four u32 and five delimiter chars */
 
@@ -31,6 +32,7 @@ static int nametable_show_cb(const struct nlmsghdr *nlh, void *data)
        struct nlattr *attrs[TIPC_NLA_NAME_TABLE_MAX + 1] = {};
        struct nlattr *publ[TIPC_NLA_PUBL_MAX + 1] = {};
        const char *scope[] = { "", "zone", "cluster", "node" };
+       char str[33] = {0,};
 
        mnl_attr_parse(nlh, sizeof(*genl), parse_attrs, info);
        if (!info[TIPC_NLA_NAME_TABLE])
@@ -45,20 +47,20 @@ static int nametable_show_cb(const struct nlmsghdr *nlh, void *data)
                return MNL_CB_ERROR;
 
        if (!*iteration)
-               printf("%-10s %-10s %-10s %-10s %-10s %-10s\n",
-                      "Type", "Lower", "Upper", "Node", "Port",
-                      "Publication Scope");
+               printf("%-10s %-10s %-10s %-8s %-10s %-33s\n",
+                      "Type", "Lower", "Upper", "Scope", "Port",
+                      "Node");
        (*iteration)++;
 
-       printf("%-10u %-10u %-10u %-10x %-10u %-12u",
+       hash2nodestr(mnl_attr_get_u32(publ[TIPC_NLA_PUBL_NODE]), str);
+
+       printf("%-10u %-10u %-10u %-8s %-10u %s\n",
               mnl_attr_get_u32(publ[TIPC_NLA_PUBL_TYPE]),
               mnl_attr_get_u32(publ[TIPC_NLA_PUBL_LOWER]),
               mnl_attr_get_u32(publ[TIPC_NLA_PUBL_UPPER]),
-              mnl_attr_get_u32(publ[TIPC_NLA_PUBL_NODE]),
+              scope[mnl_attr_get_u32(publ[TIPC_NLA_PUBL_SCOPE])],
               mnl_attr_get_u32(publ[TIPC_NLA_PUBL_REF]),
-              mnl_attr_get_u32(publ[TIPC_NLA_PUBL_KEY]));
-
-       printf("%s\n", scope[mnl_attr_get_u32(publ[TIPC_NLA_PUBL_SCOPE])]);
+              str);
 
        return MNL_CB_OK;
 }
index b73b644cebbfe96e0a7d6735635e7d07a5e8176e..0fa1064c72a172f19793bb8a7b8463ef45c3ee33 100644 (file)
 
 static int node_list_cb(const struct nlmsghdr *nlh, void *data)
 {
-       uint32_t addr;
        struct genlmsghdr *genl = mnl_nlmsg_get_payload(nlh);
        struct nlattr *info[TIPC_NLA_MAX + 1] = {};
        struct nlattr *attrs[TIPC_NLA_NODE_MAX + 1] = {};
+       char str[33] = {};
+       uint32_t addr;
 
        mnl_attr_parse(nlh, sizeof(*genl), parse_attrs, info);
        if (!info[TIPC_NLA_NODE])
@@ -40,13 +41,12 @@ static int node_list_cb(const struct nlmsghdr *nlh, void *data)
                return MNL_CB_ERROR;
 
        addr = mnl_attr_get_u32(attrs[TIPC_NLA_NODE_ADDR]);
-       printf("%x: ", addr);
-
+       hash2nodestr(addr, str);
+       printf("%-32s %08x ", str, addr);
        if (attrs[TIPC_NLA_NODE_UP])
                printf("up\n");
        else
                printf("down\n");
-
        return MNL_CB_OK;
 }
 
@@ -64,7 +64,7 @@ static int cmd_node_list(struct nlmsghdr *nlh, const struct cmd *cmd,
                fprintf(stderr, "error, message initialisation failed\n");
                return -1;
        }
-
+       printf("Node Identity                    Hash     State\n");
        return msg_dumpit(nlh, node_list_cb, NULL);
 }
 
@@ -120,7 +120,7 @@ static int cmd_node_get_addr(struct nlmsghdr *nlh, const struct cmd *cmd,
        }
        close(sk);
 
-       printf("%x\n", addr.addr.id.node);
+       printf("%08x\n", addr.addr.id.node);
        return 0;
 }
 
@@ -167,7 +167,6 @@ static int nodeid_get_cb(const struct nlmsghdr *nlh, void *data)
        uint8_t id[16] = {0,};
        uint64_t *w0 = (uint64_t *) &id[0];
        uint64_t *w1 = (uint64_t *) &id[8];
-       int i;
 
        mnl_attr_parse(nlh, sizeof(*genl), parse_attrs, info);
        if (!info[TIPC_NLA_NET])
@@ -180,10 +179,8 @@ static int nodeid_get_cb(const struct nlmsghdr *nlh, void *data)
        *w0 = mnl_attr_get_u64(attrs[TIPC_NLA_NET_NODEID]);
        *w1 = mnl_attr_get_u64(attrs[TIPC_NLA_NET_NODEID_W1]);
        nodeid2str(id, str);
-       printf("Node Identity                     Hash\n");
-       printf("%s", str);
-       for (i = strlen(str); i <= 33; i++)
-               printf(" ");
+       printf("Node Identity                    Hash\n");
+       printf("%-33s", str);
        cmd_node_get_addr(NULL, NULL, NULL, NULL);
        return MNL_CB_OK;
 }
index de0c73c31fc440a5a3813002ada155efdb92bd46..f6380777033daece73af24c5f177cc45d7692466 100644 (file)
@@ -39,7 +39,11 @@ static int cmd_peer_rm_addr(struct nlmsghdr *nlh, const struct cmd *cmd,
        }
 
        str = shift_cmdl(cmdl);
+
+       /* First try legacy Z.C.N format, then integer format */
        addr = str2addr(str);
+       if (!addr)
+               addr = atoi(str);
        if (!addr)
                return -1;