Commit eef43b50 authored by vadimk's avatar vadimk Committed by Stephen Hemminger

ss: Identify more netlink protocol names

There were only few Netlink protocol names
which were printed on the screen:

    rtnl, fw, tcpdiag

So added the ability to identify Netlink proto name
from /etc/iproute/nl_protos or from static table.
Signed-off-by: default avatarVadim Kochan <vadim4j@gmail.com>
parent 666cdc50
# Netlink protocol names mapping
0 rtnl
1 unused
2 usersock
3 fw
4 tcpdiag
5 nflog
6 xfrm
7 selinux
8 iscsi
9 audit
10 fiblookup
11 connector
12 nft
13 ip6fw
14 dec-rt
15 uevent
16 genl
18 scsi-trans
19 ecryptfs
20 rdma
21 crypto
......@@ -29,5 +29,7 @@ int ll_addr_a2n(char *lladdr, int len, const char *arg);
const char * ll_proto_n2a(unsigned short id, char *buf, int len);
int ll_proto_a2n(unsigned short *id, const char *buf);
const char *nl_proto_n2a(int id, char *buf, int len);
int nl_proto_a2n(__u32 *id, const char *arg);
#endif
......@@ -525,3 +525,85 @@ const char *rtnl_group_n2a(int id, char *buf, int len)
snprintf(buf, len, "%d", id);
return buf;
}
static char *nl_proto_tab[256] = {
[NETLINK_ROUTE] = "rtnl",
[NETLINK_UNUSED] = "unused",
[NETLINK_USERSOCK] = "usersock",
[NETLINK_FIREWALL] = "fw",
[NETLINK_SOCK_DIAG] = "tcpdiag",
[NETLINK_NFLOG] = "nflog",
[NETLINK_XFRM] = "xfrm",
[NETLINK_SELINUX] = "selinux",
[NETLINK_ISCSI] = "iscsi",
[NETLINK_AUDIT] = "audit",
[NETLINK_FIB_LOOKUP] = "fiblookup",
[NETLINK_CONNECTOR] = "connector",
[NETLINK_NETFILTER] = "nft",
[NETLINK_IP6_FW] = "ip6fw",
[NETLINK_DNRTMSG] = "dec-rt",
[NETLINK_KOBJECT_UEVENT] = "uevent",
[NETLINK_GENERIC] = "genl",
[NETLINK_SCSITRANSPORT] = "scsi-trans",
[NETLINK_ECRYPTFS] = "ecryptfs",
[NETLINK_RDMA] = "rdma",
[NETLINK_CRYPTO] = "crypto",
};
static int nl_proto_init;
static void nl_proto_initialize(void)
{
nl_proto_init = 1;
rtnl_tab_initialize(CONFDIR "/nl_protos",
nl_proto_tab, 256);
}
const char *nl_proto_n2a(int id, char *buf, int len)
{
if (id < 0 || id >= 256) {
snprintf(buf, len, "%u", id);
return buf;
}
if (!nl_proto_init)
nl_proto_initialize();
if (nl_proto_tab[id])
return nl_proto_tab[id];
snprintf(buf, len, "%u", id);
return buf;
}
int nl_proto_a2n(__u32 *id, const char *arg)
{
static char *cache = NULL;
static unsigned long res;
char *end;
int i;
if (cache && strcmp(cache, arg) == 0) {
*id = res;
return 0;
}
if (!nl_proto_init)
nl_proto_initialize();
for (i = 0; i < 256; i++) {
if (nl_proto_tab[i] &&
strcmp(nl_proto_tab[i], arg) == 0) {
cache = nl_proto_tab[i];
res = i;
*id = res;
return 0;
}
}
res = strtoul(arg, &end, 0);
if (!end || end == arg || *end || res > 255)
return -1;
*id = res;
return 0;
}
......@@ -2979,6 +2979,8 @@ static void netlink_show_one(struct filter *f,
int rq, int wq,
unsigned long long sk, unsigned long long cb)
{
SPRINT_BUF(prot_name);
if (f->f) {
struct tcpstat tst;
tst.local.family = AF_NETLINK;
......@@ -2996,14 +2998,13 @@ static void netlink_show_one(struct filter *f,
if (state_width)
printf("%-*s ", state_width, "UNCONN");
printf("%-6d %-6d ", rq, wq);
if (resolve_services && prot == 0)
printf("%*s:", addr_width, "rtnl");
else if (resolve_services && prot == 3)
printf("%*s:", addr_width, "fw");
else if (resolve_services && prot == 4)
printf("%*s:", addr_width, "tcpdiag");
else
printf("%*d:", addr_width, prot);
if (resolve_services)
{
printf("%*s:", addr_width, nl_proto_n2a(prot, prot_name,
sizeof(prot_name)));
}
if (pid == -1) {
printf("%-*s ", serv_width, "*");
} else if (resolve_services) {
......
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