* [PATCH iproute2 0/7] ss: Unify socket info output to common funcs
@ 2015-02-13 20:13 Vadim Kochan
2015-02-13 20:13 ` [PATCH iproute2 1/7] ss: Split tcpstap struct to sockstat & tcpstat Vadim Kochan
` (6 more replies)
0 siblings, 7 replies; 8+ messages in thread
From: Vadim Kochan @ 2015-02-13 20:13 UTC (permalink / raw)
To: netdev; +Cc: Vadim Kochan
From: Vadim Kochan <vadim4j@gmail.com>
Split tcpstat struct into sockstat & tcpstat, old sockstat renamed
to sksummary.
Refactored printing socket info to common funcs.
Also fixed wrong setting tcp ato value.
Vadim Kochan (7):
ss: Split tcpstap struct to sockstat & tcpstat
ss: Replace pktstat struct by new sockstat struct
ss: Replace unixstat struct by new sockstat struct
ss: Unify state socket output:netid, state, rq, wq
ss: Unify details info output:ino,uid,sk
ss: Unify socket address output by one generic func
ss: Fixed wrong tcp ato value from netlink
include/utils.h | 2 +
lib/utils.c | 6 +
misc/ss.c | 539 +++++++++++++++++++++++++++++---------------------------
3 files changed, 290 insertions(+), 257 deletions(-)
--
2.2.2
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH iproute2 1/7] ss: Split tcpstap struct to sockstat & tcpstat
2015-02-13 20:13 [PATCH iproute2 0/7] ss: Unify socket info output to common funcs Vadim Kochan
@ 2015-02-13 20:13 ` Vadim Kochan
2015-02-13 20:13 ` [PATCH iproute2 2/7] ss: Replace pktstat struct by new sockstat struct Vadim Kochan
` (5 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Vadim Kochan @ 2015-02-13 20:13 UTC (permalink / raw)
To: netdev; +Cc: Vadim Kochan
From: Vadim Kochan <vadim4j@gmail.com>
Signed-off-by: Vadim Kochan <vadim4j@gmail.com>
---
misc/ss.c | 154 +++++++++++++++++++++++++++++++++++---------------------------
1 file changed, 86 insertions(+), 68 deletions(-)
diff --git a/misc/ss.c b/misc/ss.c
index 0a6a65e..7e11fc0 100644
--- a/misc/ss.c
+++ b/misc/ss.c
@@ -690,16 +690,7 @@ static const char *sstate_namel[] = {
[SS_CLOSING] = "closing",
};
-struct dctcpstat
-{
- unsigned int ce_state;
- unsigned int alpha;
- unsigned int ab_ecn;
- unsigned int ab_tot;
- bool enabled;
-};
-
-struct tcpstat
+struct sockstat
{
inet_prefix local;
inet_prefix remote;
@@ -712,6 +703,20 @@ struct tcpstat
int refcnt;
unsigned int iface;
unsigned long long sk;
+};
+
+struct dctcpstat
+{
+ unsigned int ce_state;
+ unsigned int alpha;
+ unsigned int ab_ecn;
+ unsigned int ab_tot;
+ bool enabled;
+};
+
+struct tcpstat
+{
+ struct sockstat ss;
int timer;
int timeout;
int probes;
@@ -999,7 +1004,7 @@ static int unix_match(const inet_prefix *a, const inet_prefix *p)
return !fnmatch(pattern, addr, 0);
}
-static int run_ssfilter(struct ssfilter *f, struct tcpstat *s)
+static int run_ssfilter(struct ssfilter *f, struct sockstat *s)
{
switch (f->type) {
case SSF_S_AUTO:
@@ -1484,7 +1489,7 @@ static char *proto_name(int protocol)
return "???";
}
-static void inet_stats_print(struct tcpstat *s, int protocol)
+static void inet_stats_print(struct sockstat *s, int protocol)
{
char *buf = NULL;
@@ -1498,17 +1503,6 @@ static void inet_stats_print(struct tcpstat *s, int protocol)
formatted_print(&s->local, s->lport, s->iface);
formatted_print(&s->remote, s->rport, 0);
- if (show_options) {
- if (s->timer) {
- if (s->timer > 4)
- s->timer = 5;
- printf(" timer:(%s,%s,%d)",
- tmr_name[s->timer],
- print_ms_timer(s->timeout),
- s->retrans);
- }
- }
-
if (show_proc_ctx || show_sock_ctx) {
if (find_entry(s->ino, &buf,
(show_proc_ctx & show_sock_ctx) ?
@@ -1524,7 +1518,8 @@ static void inet_stats_print(struct tcpstat *s, int protocol)
}
}
-static int proc_parse_inet_addr(char *loc, char *rem, int family, struct tcpstat *s)
+static int proc_parse_inet_addr(char *loc, char *rem, int family, struct
+ sockstat *s)
{
s->local.family = s->remote.family = family;
if (family == AF_INET) {
@@ -1655,7 +1650,7 @@ static void tcp_stats_print(struct tcpstat *s)
printf(" retrans:%u/%u", s->retrans, s->retrans_total);
if (s->lost)
printf(" lost:%u", s->lost);
- if (s->sacked && s->state != SS_LISTEN)
+ if (s->sacked && s->ss.state != SS_LISTEN)
printf(" sacked:%u", s->sacked);
if (s->fackets)
printf(" fackets:%u", s->fackets);
@@ -1667,6 +1662,18 @@ static void tcp_stats_print(struct tcpstat *s)
printf(" rcv_space:%d", s->rcv_space);
}
+static void tcp_timer_print(struct tcpstat *s)
+{
+ if (s->timer) {
+ if (s->timer > 4)
+ s->timer = 5;
+ printf(" timer:(%s,%s,%d)",
+ tmr_name[s->timer],
+ print_ms_timer(s->timeout),
+ s->retrans);
+ }
+}
+
static int tcp_show_line(char *line, const struct filter *f, int family)
{
int rto = 0, ato = 0;
@@ -1683,17 +1690,17 @@ static int tcp_show_line(char *line, const struct filter *f, int family)
if (!(f->states & (1 << state)))
return 0;
- proc_parse_inet_addr(loc, rem, family, &s);
+ proc_parse_inet_addr(loc, rem, family, &s.ss);
- if (f->f && run_ssfilter(f->f, &s) == 0)
+ if (f->f && run_ssfilter(f->f, &s.ss) == 0)
return 0;
opt[0] = 0;
n = sscanf(data, "%x %x:%x %x:%x %x %d %d %u %d %llx %d %d %d %d %d %[^\n]\n",
- &s.state, &s.wq, &s.rq,
- &s.timer, &s.timeout, &s.retrans, &s.uid, &s.probes, &s.ino,
- &s.refcnt, &s.sk, &rto, &ato, &s.qack,
- &s.cwnd, &s.ssthresh, opt);
+ &s.ss.state, &s.ss.wq, &s.ss.rq,
+ &s.timer, &s.timeout, &s.retrans, &s.ss.uid, &s.probes,
+ &s.ss.ino, &s.ss.refcnt, &s.ss.sk, &rto, &ato, &s.qack, &s.cwnd,
+ &s.ssthresh, opt);
if (n < 17)
opt[0] = 0;
@@ -1713,13 +1720,16 @@ static int tcp_show_line(char *line, const struct filter *f, int family)
s.ssthresh = s.ssthresh == -1 ? 0 : s.ssthresh;
s.rto = s.rto != 3 * hz ? s.rto / hz : 0;
- inet_stats_print(&s, IPPROTO_TCP);
+ inet_stats_print(&s.ss, IPPROTO_TCP);
+
+ if (show_options)
+ tcp_timer_print(&s);
if (show_details) {
- if (s.uid)
- printf(" uid:%u", (unsigned)s.uid);
- printf(" ino:%u", s.ino);
- printf(" sk:%llx", s.sk);
+ if (s.ss.uid)
+ printf(" uid:%u", (unsigned)s.ss.uid);
+ printf(" ino:%u", s.ss.ino);
+ printf(" sk:%llx", s.ss.sk);
if (opt[0])
printf(" opt:\"%s\"", opt);
}
@@ -1804,6 +1814,8 @@ static void tcp_show_info(const struct nlmsghdr *nlh, struct inet_diag_msg *r,
double rtt = 0;
struct tcpstat s = {};
+ s.ss.state = r->idiag_state;
+
print_skmeminfo(tb, INET_DIAG_SKMEMINFO);
if (tb[INET_DIAG_INFO]) {
@@ -1913,7 +1925,7 @@ static int inet_show_sock(struct nlmsghdr *nlh, struct filter *f, int protocol)
{
struct rtattr * tb[INET_DIAG_MAX+1];
struct inet_diag_msg *r = NLMSG_DATA(nlh);
- struct tcpstat s = {};
+ struct sockstat s = {};
parse_rtattr(tb, INET_DIAG_MAX, (struct rtattr*)(r+1),
nlh->nlmsg_len - NLMSG_LENGTH(sizeof(*r)));
@@ -1924,9 +1936,6 @@ static int inet_show_sock(struct nlmsghdr *nlh, struct filter *f, int protocol)
s.rport = ntohs(r->id.idiag_dport);
s.wq = r->idiag_wqueue;
s.rq = r->idiag_rqueue;
- s.timer = r->idiag_timer;
- s.timeout = r->idiag_expires;
- s.retrans = r->idiag_retrans;
s.ino = r->idiag_inode;
s.uid = r->idiag_uid;
s.iface = r->id.idiag_if;
@@ -1945,6 +1954,15 @@ static int inet_show_sock(struct nlmsghdr *nlh, struct filter *f, int protocol)
inet_stats_print(&s, protocol);
+ if (show_options) {
+ struct tcpstat t = {};
+
+ t.timer = r->idiag_timer;
+ t.timeout = r->idiag_expires;
+ t.retrans = r->idiag_retrans;
+ tcp_timer_print(&t);
+ }
+
if (show_details) {
if (r->idiag_uid)
printf(" uid:%u", (unsigned)r->idiag_uid);
@@ -2286,7 +2304,7 @@ outerr:
static int dgram_show_line(char *line, const struct filter *f, int family)
{
- struct tcpstat s = {};
+ struct sockstat s = {};
char *loc, *rem, *data;
char opt[256];
int n;
@@ -2483,15 +2501,15 @@ static void unix_stats_print(struct unixstat *list, struct filter *f)
}
if (f->f) {
- struct tcpstat tst;
- tst.local.family = AF_UNIX;
- tst.remote.family = AF_UNIX;
- memcpy(tst.local.data, &s->name, sizeof(s->name));
+ struct sockstat st;
+ st.local.family = AF_UNIX;
+ st.remote.family = AF_UNIX;
+ memcpy(st.local.data, &s->name, sizeof(s->name));
if (strcmp(peer, "*") == 0)
- memset(tst.remote.data, 0, sizeof(peer));
+ memset(st.remote.data, 0, sizeof(peer));
else
- memcpy(tst.remote.data, &peer, sizeof(peer));
- if (run_ssfilter(f->f, &tst) == 0)
+ memcpy(st.remote.data, &peer, sizeof(peer));
+ if (run_ssfilter(f->f, &st) == 0)
continue;
}
@@ -2716,14 +2734,14 @@ static int packet_stats_print(struct pktstat *s, const struct filter *f)
char *buf = NULL;
if (f->f) {
- struct tcpstat tst;
- tst.local.family = AF_PACKET;
- tst.remote.family = AF_PACKET;
- tst.rport = 0;
- tst.lport = s->iface;
- tst.local.data[0] = s->prot;
- tst.remote.data[0] = 0;
- if (run_ssfilter(f->f, &tst) == 0)
+ struct sockstat st;
+ st.local.family = AF_PACKET;
+ st.remote.family = AF_PACKET;
+ st.rport = 0;
+ st.lport = s->iface;
+ st.local.data[0] = s->prot;
+ st.remote.data[0] = 0;
+ if (run_ssfilter(f->f, &st) == 0)
return 1;
}
@@ -2899,14 +2917,14 @@ static void netlink_show_one(struct filter *f,
SPRINT_BUF(prot_name);
if (f->f) {
- struct tcpstat tst;
- tst.local.family = AF_NETLINK;
- tst.remote.family = AF_NETLINK;
- tst.rport = -1;
- tst.lport = pid;
- tst.local.data[0] = prot;
- tst.remote.data[0] = 0;
- if (run_ssfilter(f->f, &tst) == 0)
+ struct sockstat st;
+ st.local.family = AF_NETLINK;
+ st.remote.family = AF_NETLINK;
+ st.rport = -1;
+ st.lport = pid;
+ st.local.data[0] = prot;
+ st.remote.data[0] = 0;
+ if (run_ssfilter(f->f, &st) == 0)
return;
}
@@ -3117,7 +3135,7 @@ static int get_snmp_int(char *proto, char *key, int *result)
/* Get stats from sockstat */
-struct sockstat
+struct ssummary
{
int socks;
int tcp_mem;
@@ -3136,7 +3154,7 @@ struct sockstat
int frag6_mem;
};
-static void get_sockstat_line(char *line, struct sockstat *s)
+static void get_sockstat_line(char *line, struct ssummary *s)
{
char id[256], rem[256];
@@ -3165,7 +3183,7 @@ static void get_sockstat_line(char *line, struct sockstat *s)
&s->tcp_orphans, &s->tcp_tws, &s->tcp_total, &s->tcp_mem);
}
-static int get_sockstat(struct sockstat *s)
+static int get_sockstat(struct ssummary *s)
{
char buf[256];
FILE *fp;
@@ -3189,7 +3207,7 @@ static int get_sockstat(struct sockstat *s)
static int print_summary(void)
{
- struct sockstat s;
+ struct ssummary s;
struct snmpstat sn;
if (get_sockstat(&s) < 0)
--
2.2.2
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH iproute2 2/7] ss: Replace pktstat struct by new sockstat struct
2015-02-13 20:13 [PATCH iproute2 0/7] ss: Unify socket info output to common funcs Vadim Kochan
2015-02-13 20:13 ` [PATCH iproute2 1/7] ss: Split tcpstap struct to sockstat & tcpstat Vadim Kochan
@ 2015-02-13 20:13 ` Vadim Kochan
2015-02-13 20:14 ` [PATCH iproute2 3/7] ss: Replace unixstat " Vadim Kochan
` (4 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Vadim Kochan @ 2015-02-13 20:13 UTC (permalink / raw)
To: netdev; +Cc: Vadim Kochan
From: Vadim Kochan <vadim4j@gmail.com>
Signed-off-by: Vadim Kochan <vadim4j@gmail.com>
---
misc/ss.c | 33 ++++++++++++---------------------
1 file changed, 12 insertions(+), 21 deletions(-)
diff --git a/misc/ss.c b/misc/ss.c
index 7e11fc0..f033892 100644
--- a/misc/ss.c
+++ b/misc/ss.c
@@ -692,6 +692,8 @@ static const char *sstate_namel[] = {
struct sockstat
{
+ uint8_t type;
+ uint16_t prot;
inet_prefix local;
inet_prefix remote;
int lport;
@@ -2719,29 +2721,18 @@ static int unix_show(struct filter *f)
return 0;
}
-struct pktstat {
- uint8_t type;
- uint16_t prot;
- uint32_t iface;
- int state;
- uint32_t rq;
- uid_t uid;
- ino_t ino;
-};
-
-static int packet_stats_print(struct pktstat *s, const struct filter *f)
+static int packet_stats_print(struct sockstat *s, const struct filter *f)
{
char *buf = NULL;
if (f->f) {
- struct sockstat st;
- st.local.family = AF_PACKET;
- st.remote.family = AF_PACKET;
- st.rport = 0;
- st.lport = s->iface;
- st.local.data[0] = s->prot;
- st.remote.data[0] = 0;
- if (run_ssfilter(f->f, &st) == 0)
+ s->local.family = AF_PACKET;
+ s->remote.family = AF_PACKET;
+ s->rport = 0;
+ s->lport = s->iface;
+ s->local.data[0] = s->prot;
+ s->remote.data[0] = 0;
+ if (run_ssfilter(f->f, s) == 0)
return 1;
}
@@ -2790,7 +2781,7 @@ static int packet_show_sock(const struct sockaddr_nl *addr,
const struct filter *f = arg;
struct packet_diag_msg *r = NLMSG_DATA(nlh);
struct rtattr *tb[PACKET_DIAG_MAX+1];
- struct pktstat stat = {};
+ struct sockstat stat = {};
parse_rtattr(tb, PACKET_DIAG_MAX, (struct rtattr*)(r+1),
nlh->nlmsg_len - NLMSG_LENGTH(sizeof(*r)));
@@ -2859,7 +2850,7 @@ static int packet_show_netlink(struct filter *f)
static int packet_show_line(char *buf, const struct filter *f, int fam)
{
unsigned long long sk;
- struct pktstat stat = {};
+ struct sockstat stat = {};
int type, prot, iface, state, rq, uid, ino;
sscanf(buf, "%llx %*d %d %x %d %d %u %u %u",
--
2.2.2
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH iproute2 3/7] ss: Replace unixstat struct by new sockstat struct
2015-02-13 20:13 [PATCH iproute2 0/7] ss: Unify socket info output to common funcs Vadim Kochan
2015-02-13 20:13 ` [PATCH iproute2 1/7] ss: Split tcpstap struct to sockstat & tcpstat Vadim Kochan
2015-02-13 20:13 ` [PATCH iproute2 2/7] ss: Replace pktstat struct by new sockstat struct Vadim Kochan
@ 2015-02-13 20:14 ` Vadim Kochan
2015-02-13 20:14 ` [PATCH iproute2 4/7] ss: Unify state socket output:netid, state, rq, wq Vadim Kochan
` (3 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Vadim Kochan @ 2015-02-13 20:14 UTC (permalink / raw)
To: netdev; +Cc: Vadim Kochan
From: Vadim Kochan <vadim4j@gmail.com>
Signed-off-by: Vadim Kochan <vadim4j@gmail.com>
---
misc/ss.c | 141 +++++++++++++++++++++++++++++++++-----------------------------
1 file changed, 75 insertions(+), 66 deletions(-)
diff --git a/misc/ss.c b/misc/ss.c
index f033892..54f2e21 100644
--- a/misc/ss.c
+++ b/misc/ss.c
@@ -660,6 +660,18 @@ static int get_slabstat(struct slabstat *s)
return 0;
}
+static inline void sock_addr_set_str(inet_prefix *prefix, char **ptr)
+{
+ memcpy(prefix->data, ptr, sizeof(char *));
+}
+
+static inline char *sock_addr_get_str(const inet_prefix *prefix)
+{
+ char *tmp ;
+ memcpy(&tmp, prefix->data, sizeof(char *));
+ return tmp;
+}
+
static const char *sstate_name[] = {
"UNKNOWN",
[SS_ESTABLISHED] = "ESTAB",
@@ -692,7 +704,8 @@ static const char *sstate_namel[] = {
struct sockstat
{
- uint8_t type;
+ struct sockstat *next;
+ unsigned int type;
uint16_t prot;
inet_prefix local;
inet_prefix remote;
@@ -996,9 +1009,9 @@ static int inet2_addr_match(const inet_prefix *a, const inet_prefix *p,
static int unix_match(const inet_prefix *a, const inet_prefix *p)
{
- char *addr, *pattern;
- memcpy(&addr, a->data, sizeof(addr));
- memcpy(&pattern, p->data, sizeof(pattern));
+ char *addr = sock_addr_get_str(a);
+ char *pattern = sock_addr_get_str(p);
+
if (pattern == NULL)
return 1;
if (addr == NULL)
@@ -1014,8 +1027,7 @@ static int run_ssfilter(struct ssfilter *f, struct sockstat *s)
static int low, high=65535;
if (s->local.family == AF_UNIX) {
- char *p;
- memcpy(&p, s->local.data, sizeof(p));
+ char *p = sock_addr_get_str(&s->local);
return p == NULL || (p[0] == '@' && strlen(p) == 6 &&
strspn(p+1, "0123456789abcdef") == 5);
}
@@ -1338,7 +1350,7 @@ void *parse_hostcond(char *addr)
addr+=5;
p = strdup(addr);
a.addr.bitlen = 8*strlen(p);
- memcpy(a.addr.data, &p, sizeof(p));
+ sock_addr_set_str(&a.addr, &p);
fam = AF_UNIX;
goto out;
}
@@ -2415,31 +2427,21 @@ outerr:
} while (0);
}
-struct unixstat
-{
- struct unixstat *next;
- int ino;
- int peer;
- char *peer_name;
- int rq;
- int wq;
- int state;
- int type;
- char *name;
-};
-
int unix_state_map[] = { SS_CLOSE, SS_SYN_SENT,
SS_ESTABLISHED, SS_CLOSING };
-#define MAX_UNIX_REMEMBER (1024*1024/sizeof(struct unixstat))
+#define MAX_UNIX_REMEMBER (1024*1024/sizeof(struct sockstat))
-static void unix_list_free(struct unixstat *list)
+static void unix_list_free(struct sockstat *list)
{
while (list) {
- struct unixstat *s = list;
+ struct sockstat *s = list;
+ char *name = sock_addr_get_str(&s->local);
+
list = list->next;
- if (s->name)
- free(s->name);
+
+ if (name)
+ free(name);
free(s);
}
}
@@ -2463,7 +2465,7 @@ static const char *unix_netid_name(int type)
return netid;
}
-static bool unix_type_skip(struct unixstat *s, struct filter *f)
+static bool unix_type_skip(struct sockstat *s, struct filter *f)
{
if (s->type == SOCK_STREAM && !(f->dbs&(1<<UNIX_ST_DB)))
return true;
@@ -2474,44 +2476,49 @@ static bool unix_type_skip(struct unixstat *s, struct filter *f)
return false;
}
-static void unix_stats_print(struct unixstat *list, struct filter *f)
+static bool unix_use_proc(void)
+{
+ return getenv("PROC_NET_UNIX") || getenv("PROC_ROOT");
+}
+
+static void unix_stats_print(struct sockstat *list, struct filter *f)
{
- struct unixstat *s;
- char *peer;
+ struct sockstat *s;
+ char *local, *peer;
+ bool use_proc = unix_use_proc();
for (s = list; s; s = s->next) {
- if (!(f->states & (1<<s->state)))
+ if (!(f->states & (1 << s->state)))
continue;
if (unix_type_skip(s, f))
continue;
- peer = "*";
- if (s->peer_name)
- peer = s->peer_name;
+ local = sock_addr_get_str(&s->local);
+ peer = "*";
+
+ if (s->rport && use_proc) {
+ struct sockstat *p;
- if (s->peer && !s->peer_name) {
- struct unixstat *p;
for (p = list; p; p = p->next) {
- if (s->peer == p->ino)
+ if (s->rport == p->lport)
break;
}
+
if (!p) {
peer = "?";
} else {
- peer = p->name ? : "*";
+ peer = sock_addr_get_str(&p->local);
+ peer = peer ? : "*";
}
}
if (f->f) {
- struct sockstat st;
- st.local.family = AF_UNIX;
- st.remote.family = AF_UNIX;
- memcpy(st.local.data, &s->name, sizeof(s->name));
if (strcmp(peer, "*") == 0)
- memset(st.remote.data, 0, sizeof(peer));
+ memset(s->remote.data, 0, sizeof(char *));
else
- memcpy(st.remote.data, &peer, sizeof(peer));
- if (run_ssfilter(f->f, &st) == 0)
+ sock_addr_set_str(&s->remote, &peer);
+
+ if (run_ssfilter(f->f, s) == 0)
continue;
}
@@ -2522,8 +2529,8 @@ static void unix_stats_print(struct unixstat *list, struct filter *f)
printf("%-*s ", state_width, sstate_name[s->state]);
printf("%-6d %-6d ", s->rq, s->wq);
printf("%*s %-*d %*s %-*d",
- addr_width, s->name ? : "*", serv_width, s->ino,
- addr_width, peer, serv_width, s->peer);
+ addr_width, local ? : "*", serv_width,
+ s->lport, addr_width, peer, serv_width, s->rport);
char *buf = NULL;
if (show_proc_ctx || show_sock_ctx) {
@@ -2549,15 +2556,16 @@ static int unix_show_sock(const struct sockaddr_nl *addr, struct nlmsghdr *nlh,
struct filter *f = (struct filter *)arg;
struct unix_diag_msg *r = NLMSG_DATA(nlh);
struct rtattr *tb[UNIX_DIAG_MAX+1];
- char name[128];
- struct unixstat stat = { .name = "*" , .peer_name = "*" };
+ char *name = NULL;
+ struct sockstat stat = {};
parse_rtattr(tb, UNIX_DIAG_MAX, (struct rtattr*)(r+1),
nlh->nlmsg_len - NLMSG_LENGTH(sizeof(*r)));
stat.type = r->udiag_type;
stat.state = r->udiag_state;
- stat.ino = r->udiag_ino;
+ stat.ino = stat.lport = r->udiag_ino;
+ stat.local.family = stat.remote.family = AF_UNIX;
if (unix_type_skip(&stat, f))
return 0;
@@ -2570,14 +2578,15 @@ static int unix_show_sock(const struct sockaddr_nl *addr, struct nlmsghdr *nlh,
if (tb[UNIX_DIAG_NAME]) {
int len = RTA_PAYLOAD(tb[UNIX_DIAG_NAME]);
+ name = malloc(len + 1);
memcpy(name, RTA_DATA(tb[UNIX_DIAG_NAME]), len);
name[len] = '\0';
if (name[0] == '\0')
name[0] = '@';
- stat.name = &name[0];
+ sock_addr_set_str(&stat.local, &name);
}
if (tb[UNIX_DIAG_PEER])
- stat.peer = rta_getattr_u32(tb[UNIX_DIAG_PEER]);
+ stat.rport = rta_getattr_u32(tb[UNIX_DIAG_PEER]);
unix_stats_print(&stat, f);
@@ -2594,6 +2603,9 @@ static int unix_show_sock(const struct sockaddr_nl *addr, struct nlmsghdr *nlh,
}
if (show_mem || show_details)
printf("\n");
+
+ if (name)
+ free(name);
return 0;
}
@@ -2640,13 +2652,12 @@ static int unix_show(struct filter *f)
char name[128];
int newformat = 0;
int cnt;
- struct unixstat *list = NULL;
+ struct sockstat *list = NULL;
if (!filter_af_get(f, AF_UNIX))
return 0;
- if (!getenv("PROC_NET_UNIX") && !getenv("PROC_ROOT")
- && unix_show_netlink(f) == 0)
+ if (!unix_use_proc() && unix_show_netlink(f) == 0)
return 0;
if ((fp = net_unix_open()) == NULL)
@@ -2658,31 +2669,30 @@ static int unix_show(struct filter *f)
cnt = 0;
while (fgets(buf, sizeof(buf)-1, fp)) {
- struct unixstat *u, **insp;
+ struct sockstat *u, **insp;
int flags;
if (!(u = malloc(sizeof(*u))))
break;
- u->name = NULL;
- u->peer_name = NULL;
if (sscanf(buf, "%x: %x %x %x %x %x %d %s",
- &u->peer, &u->rq, &u->wq, &flags, &u->type,
+ &u->rport, &u->rq, &u->wq, &flags, &u->type,
&u->state, &u->ino, name) < 8)
name[0] = 0;
- if (flags&(1<<16)) {
+ u->lport = u->ino;
+ u->local.family = u->remote.family = AF_UNIX;
+
+ if (flags & (1 << 16)) {
u->state = SS_LISTEN;
} else {
u->state = unix_state_map[u->state-1];
- if (u->type == SOCK_DGRAM &&
- u->state == SS_CLOSE &&
- u->peer)
+ if (u->type == SOCK_DGRAM && u->state == SS_CLOSE && u->rport)
u->state = SS_ESTABLISHED;
}
if (!newformat) {
- u->peer = 0;
+ u->rport = 0;
u->rq = 0;
u->wq = 0;
}
@@ -2699,9 +2709,8 @@ static int unix_show(struct filter *f)
*insp = u;
if (name[0]) {
- if ((u->name = malloc(strlen(name)+1)) == NULL)
- break;
- strcpy(u->name, name);
+ char *tmp = strdup(name);
+ sock_addr_set_str(&u->local, &tmp);
}
if (++cnt > MAX_UNIX_REMEMBER) {
unix_stats_print(list, f);
--
2.2.2
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH iproute2 4/7] ss: Unify state socket output:netid, state, rq, wq
2015-02-13 20:13 [PATCH iproute2 0/7] ss: Unify socket info output to common funcs Vadim Kochan
` (2 preceding siblings ...)
2015-02-13 20:14 ` [PATCH iproute2 3/7] ss: Replace unixstat " Vadim Kochan
@ 2015-02-13 20:14 ` Vadim Kochan
2015-02-13 20:14 ` [PATCH iproute2 5/7] ss: Unify details info output:ino,uid,sk Vadim Kochan
` (2 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Vadim Kochan @ 2015-02-13 20:14 UTC (permalink / raw)
To: netdev; +Cc: Vadim Kochan
From: Vadim Kochan <vadim4j@gmail.com>
Signed-off-by: Vadim Kochan <vadim4j@gmail.com>
---
misc/ss.c | 61 ++++++++++++++++++++++++++++---------------------------------
1 file changed, 28 insertions(+), 33 deletions(-)
diff --git a/misc/ss.c b/misc/ss.c
index 54f2e21..305ab38 100644
--- a/misc/ss.c
+++ b/misc/ss.c
@@ -765,6 +765,16 @@ struct tcpstat
struct dctcpstat *dctcp;
};
+static void sock_state_print(struct sockstat *s, const char *sock_name)
+{
+ if (netid_width)
+ printf("%-*s ", netid_width, sock_name);
+ if (state_width)
+ printf("%-*s ", state_width, sstate_name[s->state]);
+
+ printf("%-6d %-6d ", s->rq, s->wq);
+}
+
static const char *tmr_name[] = {
"off",
"on",
@@ -1507,12 +1517,7 @@ static void inet_stats_print(struct sockstat *s, int protocol)
{
char *buf = NULL;
- if (netid_width)
- printf("%-*s ", netid_width, proto_name(protocol));
- if (state_width)
- printf("%-*s ", state_width, sstate_name[s->state]);
-
- printf("%-6d %-6d ", s->rq, s->wq);
+ sock_state_print(s, proto_name(protocol));
formatted_print(&s->local, s->lport, s->iface);
formatted_print(&s->remote, s->rport, 0);
@@ -2522,12 +2527,8 @@ static void unix_stats_print(struct sockstat *list, struct filter *f)
continue;
}
- if (netid_width)
- printf("%-*s ", netid_width,
- unix_netid_name(s->type));
- if (state_width)
- printf("%-*s ", state_width, sstate_name[s->state]);
- printf("%-6d %-6d ", s->rq, s->wq);
+ sock_state_print(s, unix_netid_name(s->type));
+
printf("%*s %-*d %*s %-*d",
addr_width, local ? : "*", serv_width,
s->lport, addr_width, peer, serv_width, s->rport);
@@ -2737,21 +2738,13 @@ static int packet_stats_print(struct sockstat *s, const struct filter *f)
if (f->f) {
s->local.family = AF_PACKET;
s->remote.family = AF_PACKET;
- s->rport = 0;
- s->lport = s->iface;
s->local.data[0] = s->prot;
- s->remote.data[0] = 0;
if (run_ssfilter(f->f, s) == 0)
return 1;
}
- if (netid_width)
- printf("%-*s ", netid_width,
- s->type == SOCK_RAW ? "p_raw" : "p_dgr");
- if (state_width)
- printf("%-*s ", state_width, "UNCONN");
+ sock_state_print(s, s->type == SOCK_RAW ? "p_raw" : "p_dgr");
- printf("%-6d %-6d ", s->rq, 0);
if (s->prot == 3) {
printf("%*s:", addr_width, "*");
} else {
@@ -2799,9 +2792,10 @@ static int packet_show_sock(const struct sockaddr_nl *addr,
if (!tb[PACKET_DIAG_MEMINFO])
return -1;
- stat.type = r->pdiag_type;
- stat.prot = r->pdiag_num;
- stat.ino = r->pdiag_ino;
+ stat.type = r->pdiag_type;
+ stat.prot = r->pdiag_num;
+ stat.ino = r->pdiag_ino;
+ stat.state = SS_CLOSE;
if (tb[PACKET_DIAG_MEMINFO]) {
__u32 *skmeminfo = RTA_DATA(tb[PACKET_DIAG_MEMINFO]);
@@ -2810,7 +2804,7 @@ 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]);
- stat.iface = pinfo->pdi_index;
+ stat.lport = stat.iface = pinfo->pdi_index;
}
if (packet_stats_print(&stat, f))
@@ -2874,11 +2868,13 @@ static int packet_show_line(char *buf, const struct filter *f, int fam)
stat.type = type;
stat.prot = prot;
- stat.iface = iface;
+ stat.lport = stat.iface = iface;
stat.state = state;
stat.rq = rq;
stat.uid = uid;
stat.ino = ino;
+ stat.state = SS_CLOSE;
+
if (packet_stats_print(&stat, f))
return 0;
@@ -2914,25 +2910,24 @@ static void netlink_show_one(struct filter *f,
int rq, int wq,
unsigned long long sk, unsigned long long cb)
{
+ struct sockstat st;
SPRINT_BUF(prot_name);
+ st.state = SS_CLOSE;
+ st.rq = rq;
+ st.wq = wq;
+
if (f->f) {
- struct sockstat st;
st.local.family = AF_NETLINK;
st.remote.family = AF_NETLINK;
st.rport = -1;
st.lport = pid;
st.local.data[0] = prot;
- st.remote.data[0] = 0;
if (run_ssfilter(f->f, &st) == 0)
return;
}
- if (netid_width)
- printf("%-*s ", netid_width, "nl");
- if (state_width)
- printf("%-*s ", state_width, "UNCONN");
- printf("%-6d %-6d ", rq, wq);
+ sock_state_print(&st, "nl");
if (resolve_services) {
printf("%*s:", addr_width, nl_proto_n2a(prot, prot_name,
--
2.2.2
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH iproute2 5/7] ss: Unify details info output:ino,uid,sk
2015-02-13 20:13 [PATCH iproute2 0/7] ss: Unify socket info output to common funcs Vadim Kochan
` (3 preceding siblings ...)
2015-02-13 20:14 ` [PATCH iproute2 4/7] ss: Unify state socket output:netid, state, rq, wq Vadim Kochan
@ 2015-02-13 20:14 ` Vadim Kochan
2015-02-13 20:14 ` [PATCH iproute2 6/7] ss: Unify socket address output by one generic func Vadim Kochan
2015-02-13 20:14 ` [PATCH iproute2 7/7] ss: Fixed wrong tcp ato value from netlink Vadim Kochan
6 siblings, 0 replies; 8+ messages in thread
From: Vadim Kochan @ 2015-02-13 20:14 UTC (permalink / raw)
To: netdev; +Cc: Vadim Kochan
From: Vadim Kochan <vadim4j@gmail.com>
Signed-off-by: Vadim Kochan <vadim4j@gmail.com>
---
misc/ss.c | 78 ++++++++++++++++++++++++++++-----------------------------------
1 file changed, 35 insertions(+), 43 deletions(-)
diff --git a/misc/ss.c b/misc/ss.c
index 305ab38..905cec9 100644
--- a/misc/ss.c
+++ b/misc/ss.c
@@ -672,6 +672,11 @@ static inline char *sock_addr_get_str(const inet_prefix *prefix)
return tmp;
}
+static unsigned long cookie_sk_get(uint32_t *cookie)
+{
+ return (((unsigned long)cookie[1] << 31) << 1) | cookie[0];
+}
+
static const char *sstate_name[] = {
"UNKNOWN",
[SS_ESTABLISHED] = "ESTAB",
@@ -775,6 +780,15 @@ static void sock_state_print(struct sockstat *s, const char *sock_name)
printf("%-6d %-6d ", s->rq, s->wq);
}
+static void sock_details_print(struct sockstat *s)
+{
+ if (s->uid)
+ printf(" uid:%u", s->uid);
+
+ printf(" ino:%u", s->ino);
+ printf(" sk:%llx", s->sk);
+}
+
static const char *tmr_name[] = {
"off",
"on",
@@ -1745,10 +1759,7 @@ static int tcp_show_line(char *line, const struct filter *f, int family)
tcp_timer_print(&s);
if (show_details) {
- if (s.ss.uid)
- printf(" uid:%u", (unsigned)s.ss.uid);
- printf(" ino:%u", s.ss.ino);
- printf(" sk:%llx", s.ss.sk);
+ sock_details_print(&s.ss);
if (opt[0])
printf(" opt:\"%s\"", opt);
}
@@ -1949,15 +1960,16 @@ static int inet_show_sock(struct nlmsghdr *nlh, struct filter *f, int protocol)
parse_rtattr(tb, INET_DIAG_MAX, (struct rtattr*)(r+1),
nlh->nlmsg_len - NLMSG_LENGTH(sizeof(*r)));
- s.state = r->idiag_state;
- s.local.family = s.remote.family = r->idiag_family;
- s.lport = ntohs(r->id.idiag_sport);
- s.rport = ntohs(r->id.idiag_dport);
- s.wq = r->idiag_wqueue;
- s.rq = r->idiag_rqueue;
- s.ino = r->idiag_inode;
- s.uid = r->idiag_uid;
- s.iface = r->id.idiag_if;
+ s.state = r->idiag_state;
+ s.local.family = s.remote.family = r->idiag_family;
+ s.lport = ntohs(r->id.idiag_sport);
+ s.rport = ntohs(r->id.idiag_dport);
+ s.wq = r->idiag_wqueue;
+ s.rq = r->idiag_rqueue;
+ s.ino = r->idiag_inode;
+ s.uid = r->idiag_uid;
+ s.iface = r->id.idiag_if;
+ s.sk = cookie_sk_get(&r->id.idiag_cookie[0]);
if (s.local.family == AF_INET) {
s.local.bytelen = s.remote.bytelen = 4;
@@ -1983,13 +1995,7 @@ static int inet_show_sock(struct nlmsghdr *nlh, struct filter *f, int protocol)
}
if (show_details) {
- if (r->idiag_uid)
- printf(" uid:%u", (unsigned)r->idiag_uid);
- printf(" ino:%u", r->idiag_inode);
- printf(" sk:");
- if (r->id.idiag_cookie[1] != 0)
- printf("%08x", r->id.idiag_cookie[1]);
- printf("%08x", r->id.idiag_cookie[0]);
+ sock_details_print(&s);
if (tb[INET_DIAG_SHUTDOWN]) {
unsigned char mask;
mask = *(__u8 *)RTA_DATA(tb[INET_DIAG_SHUTDOWN]);
@@ -2351,14 +2357,8 @@ static int dgram_show_line(char *line, const struct filter *f, int family)
inet_stats_print(&s, IPPROTO_UDP);
- if (show_details) {
- if (s.uid)
- printf(" uid=%u", (unsigned)s.uid);
- printf(" ino=%u", s.ino);
- printf(" sk=%llx", s.sk);
- if (opt[0])
- printf(" opt:\"%s\"", opt);
- }
+ if (show_details && opt[0])
+ printf(" opt:\"%s\"", opt);
printf("\n");
return 0;
@@ -2774,6 +2774,9 @@ static int packet_stats_print(struct sockstat *s, const struct filter *f)
}
}
+ if (show_details)
+ sock_details_print(s);
+
return 0;
}
@@ -2796,6 +2799,7 @@ static int packet_show_sock(const struct sockaddr_nl *addr,
stat.prot = r->pdiag_num;
stat.ino = r->pdiag_ino;
stat.state = SS_CLOSE;
+ stat.sk = cookie_sk_get(&r->pdiag_cookie[0]);
if (tb[PACKET_DIAG_MEMINFO]) {
__u32 *skmeminfo = RTA_DATA(tb[PACKET_DIAG_MEMINFO]);
@@ -2807,21 +2811,12 @@ static int packet_show_sock(const struct sockaddr_nl *addr,
stat.lport = stat.iface = pinfo->pdi_index;
}
+ if (tb[PACKET_DIAG_UID])
+ stat.uid = *(__u32 *)RTA_DATA(tb[PACKET_DIAG_UID]);
+
if (packet_stats_print(&stat, f))
return 0;
- if (show_details) {
- __u32 uid = 0;
-
- if (tb[PACKET_DIAG_UID])
- uid = *(__u32 *)RTA_DATA(tb[PACKET_DIAG_UID]);
-
- printf(" ino=%u uid=%u sk=", r->pdiag_ino, uid);
- if (r->pdiag_cookie[1] != 0)
- printf("%08x", r->pdiag_cookie[1]);
- printf("%08x", r->pdiag_cookie[0]);
- }
-
if (show_bpf && tb[PACKET_DIAG_FILTER]) {
struct sock_filter *fil =
RTA_DATA(tb[PACKET_DIAG_FILTER]);
@@ -2878,9 +2873,6 @@ static int packet_show_line(char *buf, const struct filter *f, int fam)
if (packet_stats_print(&stat, f))
return 0;
- if (show_details) {
- printf(" ino=%u uid=%u sk=%llx", ino, uid, sk);
- }
printf("\n");
return 0;
}
--
2.2.2
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH iproute2 6/7] ss: Unify socket address output by one generic func
2015-02-13 20:13 [PATCH iproute2 0/7] ss: Unify socket info output to common funcs Vadim Kochan
` (4 preceding siblings ...)
2015-02-13 20:14 ` [PATCH iproute2 5/7] ss: Unify details info output:ino,uid,sk Vadim Kochan
@ 2015-02-13 20:14 ` Vadim Kochan
2015-02-13 20:14 ` [PATCH iproute2 7/7] ss: Fixed wrong tcp ato value from netlink Vadim Kochan
6 siblings, 0 replies; 8+ messages in thread
From: Vadim Kochan @ 2015-02-13 20:14 UTC (permalink / raw)
To: netdev; +Cc: Vadim Kochan
From: Vadim Kochan <vadim4j@gmail.com>
Signed-off-by: Vadim Kochan <vadim4j@gmail.com>
---
include/utils.h | 2 +
lib/utils.c | 6 +++
misc/ss.c | 124 ++++++++++++++++++++++++++++++++------------------------
3 files changed, 80 insertions(+), 52 deletions(-)
diff --git a/include/utils.h b/include/utils.h
index 3da2283..fec9ef4 100644
--- a/include/utils.h
+++ b/include/utils.h
@@ -167,4 +167,6 @@ int iplink_parse(int argc, char **argv, struct iplink_req *req,
extern int do_each_netns(int (*func)(char *nsname, void *arg), void *arg,
bool show_label);
+char *int_to_str(int val, char *buf);
+
#endif /* __UTILS_H__ */
diff --git a/lib/utils.c b/lib/utils.c
index efebe18..e2b05bc 100644
--- a/lib/utils.c
+++ b/lib/utils.c
@@ -906,3 +906,9 @@ int do_each_netns(int (*func)(char *nsname, void *arg), void *arg,
return netns_foreach(on_netns, &nsf);
}
+
+char *int_to_str(int val, char *buf)
+{
+ sprintf(buf, "%d", val);
+ return buf;
+}
diff --git a/misc/ss.c b/misc/ss.c
index 905cec9..9cf0055 100644
--- a/misc/ss.c
+++ b/misc/ss.c
@@ -789,6 +789,24 @@ static void sock_details_print(struct sockstat *s)
printf(" sk:%llx", s->sk);
}
+static void sock_addr_print_width(int addr_len, const char *addr, char *delim,
+ int port_len, const char *port, const char *ifname)
+{
+ if (ifname) {
+ printf("%*s%%%s%s%-*s ", addr_len, addr, ifname, delim,
+ port_len, port);
+ }
+ else {
+ printf("%*s%s%-*s ", addr_len, addr, delim, port_len, port);
+ }
+}
+
+static void sock_addr_print(const char *addr, char *delim, const char *port,
+ const char *ifname)
+{
+ sock_addr_print_width(addr_width, addr, delim, serv_width, port, ifname);
+}
+
static const char *tmr_name[] = {
"off",
"on",
@@ -971,13 +989,12 @@ static const char *resolve_service(int port)
return buf;
}
-static void formatted_print(const inet_prefix *a, int port, unsigned int ifindex)
+static void inet_addr_print(const inet_prefix *a, int port, unsigned int ifindex)
{
char buf[1024];
const char *ap = buf;
- int est_len;
-
- est_len = addr_width;
+ int est_len = addr_width;
+ const char *ifname = NULL;
if (a->family == AF_INET) {
if (a->data[0] == 0) {
@@ -994,14 +1011,14 @@ static void formatted_print(const inet_prefix *a, int port, unsigned int ifindex
else
est_len = addr_width + ((est_len-addr_width+3)/4)*4;
}
+
if (ifindex) {
- const char *ifname = ll_index_to_name(ifindex);
- const int len = strlen(ifname) + 1; /* +1 for percent char */
+ ifname = ll_index_to_name(ifindex);
+ est_len -= strlen(ifname) + 1; /* +1 for percent char */
+ }
- printf("%*s%%%s:%-*s ", est_len - len, ap, ifname, serv_width,
- resolve_service(port));
- } else
- printf("%*s:%-*s ", est_len, ap, serv_width, resolve_service(port));
+ sock_addr_print_width(est_len, ap, ":", serv_width, resolve_service(port),
+ ifname);
}
struct aafilter
@@ -1533,8 +1550,8 @@ static void inet_stats_print(struct sockstat *s, int protocol)
sock_state_print(s, proto_name(protocol));
- formatted_print(&s->local, s->lport, s->iface);
- formatted_print(&s->remote, s->rport, 0);
+ inet_addr_print(&s->local, s->lport, s->iface);
+ inet_addr_print(&s->remote, s->rport, 0);
if (show_proc_ctx || show_sock_ctx) {
if (find_entry(s->ino, &buf,
@@ -2490,7 +2507,9 @@ static void unix_stats_print(struct sockstat *list, struct filter *f)
{
struct sockstat *s;
char *local, *peer;
+ char *ctx_buf = NULL;
bool use_proc = unix_use_proc();
+ char port_name[30] = {};
for (s = list; s; s = s->next) {
if (!(f->states & (1 << s->state)))
@@ -2529,22 +2548,22 @@ static void unix_stats_print(struct sockstat *list, struct filter *f)
sock_state_print(s, unix_netid_name(s->type));
- printf("%*s %-*d %*s %-*d",
- addr_width, local ? : "*", serv_width,
- s->lport, addr_width, peer, serv_width, s->rport);
- char *buf = NULL;
+ sock_addr_print(local ?: "*", " ",
+ int_to_str(s->lport, port_name), NULL);
+ sock_addr_print(peer, " ", int_to_str(s->rport, port_name),
+ NULL);
if (show_proc_ctx || show_sock_ctx) {
- if (find_entry(s->ino, &buf,
+ if (find_entry(s->ino, &ctx_buf,
(show_proc_ctx & show_sock_ctx) ?
PROC_SOCK_CTX : PROC_CTX) > 0) {
- printf(" users:(%s)", buf);
- free(buf);
+ printf(" users:(%s)", ctx_buf);
+ free(ctx_buf);
}
} else if (show_users) {
- if (find_entry(s->ino, &buf, USERS) > 0) {
- printf(" users:(%s)", buf);
- free(buf);
+ if (find_entry(s->ino, &ctx_buf, USERS) > 0) {
+ printf(" users:(%s)", ctx_buf);
+ free(ctx_buf);
}
}
printf("\n");
@@ -2734,6 +2753,8 @@ static int unix_show(struct filter *f)
static int packet_stats_print(struct sockstat *s, const struct filter *f)
{
char *buf = NULL;
+ const char *addr, *port;
+ char ll_name[16];
if (f->f) {
s->local.family = AF_PACKET;
@@ -2745,20 +2766,18 @@ static int packet_stats_print(struct sockstat *s, const struct filter *f)
sock_state_print(s, s->type == SOCK_RAW ? "p_raw" : "p_dgr");
- if (s->prot == 3) {
- printf("%*s:", addr_width, "*");
- } else {
- char tb[16];
- printf("%*s:", addr_width,
- ll_proto_n2a(htons(s->prot), tb, sizeof(tb)));
- }
- if (s->iface == 0) {
- printf("%-*s ", serv_width, "*");
- } else {
- printf("%-*s ", serv_width, xll_index_to_name(s->iface));
- }
+ if (s->prot == 3)
+ addr = "*";
+ else
+ addr = ll_proto_n2a(htons(s->prot), ll_name, sizeof(ll_name));
+
+ if (s->iface == 0)
+ port = "*";
+ else
+ port = xll_index_to_name(s->iface);
- printf("%*s*%-*s", addr_width, "", serv_width, "");
+ sock_addr_print(addr, ":", port, NULL);
+ sock_addr_print("", "*", "", NULL);
if (show_proc_ctx || show_sock_ctx) {
if (find_entry(s->ino, &buf,
@@ -2903,7 +2922,9 @@ static void netlink_show_one(struct filter *f,
unsigned long long sk, unsigned long long cb)
{
struct sockstat st;
- SPRINT_BUF(prot_name);
+ SPRINT_BUF(prot_buf) = {};
+ const char *prot_name;
+ char procname[64] = {};
st.state = SS_CLOSE;
st.rq = rq;
@@ -2921,46 +2942,45 @@ static void netlink_show_one(struct filter *f,
sock_state_print(&st, "nl");
- if (resolve_services) {
- printf("%*s:", addr_width, nl_proto_n2a(prot, prot_name,
- sizeof(prot_name)));
- } else {
- printf("%*d:", addr_width, prot);
- }
+ if (resolve_services)
+ prot_name = nl_proto_n2a(prot, prot_buf, sizeof(prot_buf));
+ else
+ prot_name = int_to_str(prot, prot_buf);
if (pid == -1) {
- printf("%-*s ", serv_width, "*");
+ procname[0] = '*';
} else if (resolve_services) {
int done = 0;
if (!pid) {
done = 1;
- printf("%-*s ", serv_width, "kernel");
+ strncpy(procname, "kernel", 6);
} else if (pid > 0) {
- char procname[64];
FILE *fp;
sprintf(procname, "%s/%d/stat",
getenv("PROC_ROOT") ? : "/proc", pid);
if ((fp = fopen(procname, "r")) != NULL) {
if (fscanf(fp, "%*d (%[^)])", procname) == 1) {
sprintf(procname+strlen(procname), "/%d", pid);
- printf("%-*s ", serv_width, procname);
done = 1;
}
fclose(fp);
}
}
if (!done)
- printf("%-*d ", serv_width, pid);
+ int_to_str(pid, procname);
} else {
- printf("%-*d ", serv_width, pid);
+ int_to_str(pid, procname);
}
+ sock_addr_print(prot_name, ":", procname, NULL);
+
if (state == NETLINK_CONNECTED) {
- printf("%*d:%-*d",
- addr_width, dst_group, serv_width, dst_pid);
+ char dst_group_buf[30];
+ char dst_pid_buf[30];
+ sock_addr_print(int_to_str(dst_group, dst_group_buf), ":",
+ int_to_str(dst_pid, dst_pid_buf), NULL);
} else {
- printf("%*s*%-*s",
- addr_width, "", serv_width, "");
+ sock_addr_print("", "*", "", NULL);
}
char *pid_context = NULL;
--
2.2.2
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH iproute2 7/7] ss: Fixed wrong tcp ato value from netlink
2015-02-13 20:13 [PATCH iproute2 0/7] ss: Unify socket info output to common funcs Vadim Kochan
` (5 preceding siblings ...)
2015-02-13 20:14 ` [PATCH iproute2 6/7] ss: Unify socket address output by one generic func Vadim Kochan
@ 2015-02-13 20:14 ` Vadim Kochan
6 siblings, 0 replies; 8+ messages in thread
From: Vadim Kochan @ 2015-02-13 20:14 UTC (permalink / raw)
To: netdev; +Cc: Vadim Kochan
From: Vadim Kochan <vadim4j@gmail.com>
Signed-off-by: Vadim Kochan <vadim4j@gmail.com>
---
misc/ss.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/misc/ss.c b/misc/ss.c
index 9cf0055..69794ea 100644
--- a/misc/ss.c
+++ b/misc/ss.c
@@ -1903,7 +1903,7 @@ static void tcp_show_info(const struct nlmsghdr *nlh, struct inet_diag_msg *r,
s.backoff = info->tcpi_backoff;
s.rtt = (double)info->tcpi_rtt / 1000;
s.rttvar = (double)info->tcpi_rttvar / 1000;
- s.ato = (double)info->tcpi_rttvar / 1000;
+ s.ato = (double)info->tcpi_ato / 1000;
s.mss = info->tcpi_snd_mss;
s.rcv_space = info->tcpi_rcv_space;
s.rcv_rtt = (double)info->tcpi_rcv_rtt / 1000;
--
2.2.2
^ permalink raw reply related [flat|nested] 8+ messages in thread
end of thread, other threads:[~2015-02-13 20:25 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-02-13 20:13 [PATCH iproute2 0/7] ss: Unify socket info output to common funcs Vadim Kochan
2015-02-13 20:13 ` [PATCH iproute2 1/7] ss: Split tcpstap struct to sockstat & tcpstat Vadim Kochan
2015-02-13 20:13 ` [PATCH iproute2 2/7] ss: Replace pktstat struct by new sockstat struct Vadim Kochan
2015-02-13 20:14 ` [PATCH iproute2 3/7] ss: Replace unixstat " Vadim Kochan
2015-02-13 20:14 ` [PATCH iproute2 4/7] ss: Unify state socket output:netid, state, rq, wq Vadim Kochan
2015-02-13 20:14 ` [PATCH iproute2 5/7] ss: Unify details info output:ino,uid,sk Vadim Kochan
2015-02-13 20:14 ` [PATCH iproute2 6/7] ss: Unify socket address output by one generic func Vadim Kochan
2015-02-13 20:14 ` [PATCH iproute2 7/7] ss: Fixed wrong tcp ato value from netlink Vadim Kochan
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).