mirror of
https://git.proxmox.com/git/mirror_iproute2
synced 2025-10-07 04:50:22 +00:00
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: Vadim Kochan <vadim4j@gmail.com>
This commit is contained in:
parent
666cdc506f
commit
eef43b5052
23
etc/iproute2/nl_protos
Normal file
23
etc/iproute2/nl_protos
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
# 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);
|
const char * ll_proto_n2a(unsigned short id, char *buf, int len);
|
||||||
int ll_proto_a2n(unsigned short *id, const char *buf);
|
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
|
#endif
|
||||||
|
@ -525,3 +525,85 @@ const char *rtnl_group_n2a(int id, char *buf, int len)
|
|||||||
snprintf(buf, len, "%d", id);
|
snprintf(buf, len, "%d", id);
|
||||||
return buf;
|
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;
|
||||||
|
}
|
||||||
|
17
misc/ss.c
17
misc/ss.c
@ -2979,6 +2979,8 @@ static void netlink_show_one(struct filter *f,
|
|||||||
int rq, int wq,
|
int rq, int wq,
|
||||||
unsigned long long sk, unsigned long long cb)
|
unsigned long long sk, unsigned long long cb)
|
||||||
{
|
{
|
||||||
|
SPRINT_BUF(prot_name);
|
||||||
|
|
||||||
if (f->f) {
|
if (f->f) {
|
||||||
struct tcpstat tst;
|
struct tcpstat tst;
|
||||||
tst.local.family = AF_NETLINK;
|
tst.local.family = AF_NETLINK;
|
||||||
@ -2996,14 +2998,13 @@ static void netlink_show_one(struct filter *f,
|
|||||||
if (state_width)
|
if (state_width)
|
||||||
printf("%-*s ", state_width, "UNCONN");
|
printf("%-*s ", state_width, "UNCONN");
|
||||||
printf("%-6d %-6d ", rq, wq);
|
printf("%-6d %-6d ", rq, wq);
|
||||||
if (resolve_services && prot == 0)
|
|
||||||
printf("%*s:", addr_width, "rtnl");
|
if (resolve_services)
|
||||||
else if (resolve_services && prot == 3)
|
{
|
||||||
printf("%*s:", addr_width, "fw");
|
printf("%*s:", addr_width, nl_proto_n2a(prot, prot_name,
|
||||||
else if (resolve_services && prot == 4)
|
sizeof(prot_name)));
|
||||||
printf("%*s:", addr_width, "tcpdiag");
|
}
|
||||||
else
|
|
||||||
printf("%*d:", addr_width, prot);
|
|
||||||
if (pid == -1) {
|
if (pid == -1) {
|
||||||
printf("%-*s ", serv_width, "*");
|
printf("%-*s ", serv_width, "*");
|
||||||
} else if (resolve_services) {
|
} else if (resolve_services) {
|
||||||
|
Loading…
Reference in New Issue
Block a user