All of lore.kernel.org
 help / color / mirror / Atom feed
* [iproute PATCH 0/3] ss: Allow excluding a socket table from being queried
@ 2018-03-24 18:18 Phil Sutter
  2018-03-24 18:18 ` [iproute PATCH 1/3] " Phil Sutter
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Phil Sutter @ 2018-03-24 18:18 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: netdev

The first patch in this series adds the new functionality, the remaining
two refactor the code a bit.

Phil Sutter (3):
  ss: Allow excluding a socket table from being queried
  ss: Put filter DB parsing into a separate function
  ss: Drop filter_default_dbs()

 man/man8/ss.8 |   8 +++-
 misc/ss.c     | 147 +++++++++++++++++++++++++++-------------------------------
 2 files changed, 76 insertions(+), 79 deletions(-)

-- 
2.16.1

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [iproute PATCH 1/3] ss: Allow excluding a socket table from being queried
  2018-03-24 18:18 [iproute PATCH 0/3] ss: Allow excluding a socket table from being queried Phil Sutter
@ 2018-03-24 18:18 ` Phil Sutter
  2018-03-24 18:18 ` [iproute PATCH 2/3] ss: Put filter DB parsing into a separate function Phil Sutter
  2018-03-24 18:18 ` [iproute PATCH 3/3] ss: Drop filter_default_dbs() Phil Sutter
  2 siblings, 0 replies; 6+ messages in thread
From: Phil Sutter @ 2018-03-24 18:18 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: netdev

The original problem was that a simple call to 'ss' leads to loading of
sctp_diag kernel module which might not be desired. While searching for
a workaround, it became clear how inconvenient it is to exclude a single
socket table from being queried.

This patch allows to prefix an item passed to '-A' parameter with an
exclamation mark to inverse its meaning.

Signed-off-by: Phil Sutter <phil@nwl.cc>
---
 man/man8/ss.8 |   8 ++++-
 misc/ss.c     | 108 ++++++++++++++++++++++++++++++++--------------------------
 2 files changed, 66 insertions(+), 50 deletions(-)

diff --git a/man/man8/ss.8 b/man/man8/ss.8
index 973afbe0b386b..28033d8f01dda 100644
--- a/man/man8/ss.8
+++ b/man/man8/ss.8
@@ -317,7 +317,10 @@ Currently the following families are supported: unix, inet, inet6, link, netlink
 List of socket tables to dump, separated by commas. The following identifiers
 are understood: all, inet, tcp, udp, raw, unix, packet, netlink, unix_dgram,
 unix_stream, unix_seqpacket, packet_raw, packet_dgram, dccp, sctp,
-vsock_stream, vsock_dgram.
+vsock_stream, vsock_dgram. Any item in the list may optionally be prefixed by
+an exclamation mark
+.RB ( ! )
+to exclude that socket table from being dumped.
 .TP
 .B \-D FILE, \-\-diag=FILE
 Do not display anything, just dump raw information about TCP sockets to FILE after applying filters. If FILE is - stdout is used.
@@ -380,6 +383,9 @@ Find all local processes connected to X server.
 .TP
 .B ss -o state fin-wait-1 '( sport = :http or sport = :https )' dst 193.233.7/24
 List all the tcp sockets in state FIN-WAIT-1 for our apache to network 193.233.7/24 and look at their timers.
+.TP
+.B ss -a -A 'all,!tcp'
+List sockets in all states from all socket tables but TCP.
 .SH SEE ALSO
 .BR ip (8),
 .br
diff --git a/misc/ss.c b/misc/ss.c
index e087bef739b0d..2044776ba310b 100644
--- a/misc/ss.c
+++ b/misc/ss.c
@@ -329,10 +329,14 @@ static const struct filter default_afs[AF_MAX] = {
 static int do_default = 1;
 static struct filter current_filter;
 
-static void filter_db_set(struct filter *f, int db)
+static void filter_db_set(struct filter *f, int db, bool enable)
 {
-	f->states   |= default_dbs[db].states;
-	f->dbs	    |= 1 << db;
+	if (enable) {
+		f->states   |= default_dbs[db].states;
+		f->dbs	    |= 1 << db;
+	} else {
+		f->dbs &= ~(1 << db);
+	}
 	do_default   = 0;
 }
 
@@ -349,21 +353,21 @@ static int filter_af_get(struct filter *f, int af)
 	return !!(f->families & FAMILY_MASK(af));
 }
 
-static void filter_default_dbs(struct filter *f)
+static void filter_default_dbs(struct filter *f, bool enable)
 {
-	filter_db_set(f, UDP_DB);
-	filter_db_set(f, DCCP_DB);
-	filter_db_set(f, TCP_DB);
-	filter_db_set(f, RAW_DB);
-	filter_db_set(f, UNIX_ST_DB);
-	filter_db_set(f, UNIX_DG_DB);
-	filter_db_set(f, UNIX_SQ_DB);
-	filter_db_set(f, PACKET_R_DB);
-	filter_db_set(f, PACKET_DG_DB);
-	filter_db_set(f, NETLINK_DB);
-	filter_db_set(f, SCTP_DB);
-	filter_db_set(f, VSOCK_ST_DB);
-	filter_db_set(f, VSOCK_DG_DB);
+	filter_db_set(f, UDP_DB, enable);
+	filter_db_set(f, DCCP_DB, enable);
+	filter_db_set(f, TCP_DB, enable);
+	filter_db_set(f, RAW_DB, enable);
+	filter_db_set(f, UNIX_ST_DB, enable);
+	filter_db_set(f, UNIX_DG_DB, enable);
+	filter_db_set(f, UNIX_SQ_DB, enable);
+	filter_db_set(f, PACKET_R_DB, enable);
+	filter_db_set(f, PACKET_DG_DB, enable);
+	filter_db_set(f, NETLINK_DB, enable);
+	filter_db_set(f, SCTP_DB, enable);
+	filter_db_set(f, VSOCK_ST_DB, enable);
+	filter_db_set(f, VSOCK_DG_DB, enable);
 }
 
 static void filter_states_set(struct filter *f, int states)
@@ -4684,19 +4688,19 @@ int main(int argc, char *argv[])
 			follow_events = 1;
 			break;
 		case 'd':
-			filter_db_set(&current_filter, DCCP_DB);
+			filter_db_set(&current_filter, DCCP_DB, true);
 			break;
 		case 't':
-			filter_db_set(&current_filter, TCP_DB);
+			filter_db_set(&current_filter, TCP_DB, true);
 			break;
 		case 'S':
-			filter_db_set(&current_filter, SCTP_DB);
+			filter_db_set(&current_filter, SCTP_DB, true);
 			break;
 		case 'u':
-			filter_db_set(&current_filter, UDP_DB);
+			filter_db_set(&current_filter, UDP_DB, true);
 			break;
 		case 'w':
-			filter_db_set(&current_filter, RAW_DB);
+			filter_db_set(&current_filter, RAW_DB, true);
 			break;
 		case 'x':
 			filter_af_set(&current_filter, AF_UNIX);
@@ -4753,59 +4757,65 @@ int main(int argc, char *argv[])
 			}
 			p = p1 = optarg;
 			do {
+				bool enable = true;
+
 				if ((p1 = strchr(p, ',')) != NULL)
 					*p1 = 0;
+				if (p[0] == '!') {
+					enable = false;
+					p++;
+				}
 				if (strcmp(p, "all") == 0) {
-					filter_default_dbs(&current_filter);
+					filter_default_dbs(&current_filter, enable);
 				} else if (strcmp(p, "inet") == 0) {
-					filter_db_set(&current_filter, UDP_DB);
-					filter_db_set(&current_filter, DCCP_DB);
-					filter_db_set(&current_filter, TCP_DB);
-					filter_db_set(&current_filter, SCTP_DB);
-					filter_db_set(&current_filter, RAW_DB);
+					filter_db_set(&current_filter, UDP_DB, enable);
+					filter_db_set(&current_filter, DCCP_DB, enable);
+					filter_db_set(&current_filter, TCP_DB, enable);
+					filter_db_set(&current_filter, SCTP_DB, enable);
+					filter_db_set(&current_filter, RAW_DB, enable);
 				} else if (strcmp(p, "udp") == 0) {
-					filter_db_set(&current_filter, UDP_DB);
+					filter_db_set(&current_filter, UDP_DB, enable);
 				} else if (strcmp(p, "dccp") == 0) {
-					filter_db_set(&current_filter, DCCP_DB);
+					filter_db_set(&current_filter, DCCP_DB, enable);
 				} else if (strcmp(p, "tcp") == 0) {
-					filter_db_set(&current_filter, TCP_DB);
+					filter_db_set(&current_filter, TCP_DB, enable);
 				} else if (strcmp(p, "sctp") == 0) {
-					filter_db_set(&current_filter, SCTP_DB);
+					filter_db_set(&current_filter, SCTP_DB, enable);
 				} else if (strcmp(p, "raw") == 0) {
-					filter_db_set(&current_filter, RAW_DB);
+					filter_db_set(&current_filter, RAW_DB, enable);
 				} else if (strcmp(p, "unix") == 0) {
-					filter_db_set(&current_filter, UNIX_ST_DB);
-					filter_db_set(&current_filter, UNIX_DG_DB);
-					filter_db_set(&current_filter, UNIX_SQ_DB);
+					filter_db_set(&current_filter, UNIX_ST_DB, enable);
+					filter_db_set(&current_filter, UNIX_DG_DB, enable);
+					filter_db_set(&current_filter, UNIX_SQ_DB, enable);
 				} else if (strcasecmp(p, "unix_stream") == 0 ||
 					   strcmp(p, "u_str") == 0) {
-					filter_db_set(&current_filter, UNIX_ST_DB);
+					filter_db_set(&current_filter, UNIX_ST_DB, enable);
 				} else if (strcasecmp(p, "unix_dgram") == 0 ||
 					   strcmp(p, "u_dgr") == 0) {
-					filter_db_set(&current_filter, UNIX_DG_DB);
+					filter_db_set(&current_filter, UNIX_DG_DB, enable);
 				} else if (strcasecmp(p, "unix_seqpacket") == 0 ||
 					   strcmp(p, "u_seq") == 0) {
-					filter_db_set(&current_filter, UNIX_SQ_DB);
+					filter_db_set(&current_filter, UNIX_SQ_DB, enable);
 				} else if (strcmp(p, "packet") == 0) {
-					filter_db_set(&current_filter, PACKET_R_DB);
-					filter_db_set(&current_filter, PACKET_DG_DB);
+					filter_db_set(&current_filter, PACKET_R_DB, enable);
+					filter_db_set(&current_filter, PACKET_DG_DB, enable);
 				} else if (strcmp(p, "packet_raw") == 0 ||
 					   strcmp(p, "p_raw") == 0) {
-					filter_db_set(&current_filter, PACKET_R_DB);
+					filter_db_set(&current_filter, PACKET_R_DB, enable);
 				} else if (strcmp(p, "packet_dgram") == 0 ||
 					   strcmp(p, "p_dgr") == 0) {
-					filter_db_set(&current_filter, PACKET_DG_DB);
+					filter_db_set(&current_filter, PACKET_DG_DB, enable);
 				} else if (strcmp(p, "netlink") == 0) {
-					filter_db_set(&current_filter, NETLINK_DB);
+					filter_db_set(&current_filter, NETLINK_DB, enable);
 				} else if (strcmp(p, "vsock") == 0) {
-					filter_db_set(&current_filter, VSOCK_ST_DB);
-					filter_db_set(&current_filter, VSOCK_DG_DB);
+					filter_db_set(&current_filter, VSOCK_ST_DB, enable);
+					filter_db_set(&current_filter, VSOCK_DG_DB, enable);
 				} else if (strcmp(p, "vsock_stream") == 0 ||
 					   strcmp(p, "v_str") == 0) {
-					filter_db_set(&current_filter, VSOCK_ST_DB);
+					filter_db_set(&current_filter, VSOCK_ST_DB, enable);
 				} else if (strcmp(p, "vsock_dgram") == 0 ||
 					   strcmp(p, "v_dgr") == 0) {
-					filter_db_set(&current_filter, VSOCK_DG_DB);
+					filter_db_set(&current_filter, VSOCK_DG_DB, enable);
 				} else {
 					fprintf(stderr, "ss: \"%s\" is illegal socket table id\n", p);
 					usage();
@@ -4898,7 +4908,7 @@ int main(int argc, char *argv[])
 
 	if (do_default) {
 		state_filter = state_filter ? state_filter : SS_CONN;
-		filter_default_dbs(&current_filter);
+		filter_default_dbs(&current_filter, true);
 	}
 
 	filter_states_set(&current_filter, state_filter);
-- 
2.16.1

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [iproute PATCH 2/3] ss: Put filter DB parsing into a separate function
  2018-03-24 18:18 [iproute PATCH 0/3] ss: Allow excluding a socket table from being queried Phil Sutter
  2018-03-24 18:18 ` [iproute PATCH 1/3] " Phil Sutter
@ 2018-03-24 18:18 ` Phil Sutter
  2018-03-27 18:46   ` Stephen Hemminger
  2018-03-24 18:18 ` [iproute PATCH 3/3] ss: Drop filter_default_dbs() Phil Sutter
  2 siblings, 1 reply; 6+ messages in thread
From: Phil Sutter @ 2018-03-24 18:18 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: netdev

Use a table for database name parsing. The tricky bit is to allow for
association of a (nearly) arbitrary number of DBs with each name.
Luckily the number is not fully arbitrary as there is an upper bound of
MAX_DB items. Since it is not possible to have a variable length
array inside a variable length array, use this knowledge to make the
inner array of fixed length. But since DB values start from zero, an
explicit end entry needs to be present as well, so the inner array has
to be MAX_DB + 1 in size.

Signed-off-by: Phil Sutter <phil@nwl.cc>
---
 misc/ss.c | 114 ++++++++++++++++++++++++++++++--------------------------------
 1 file changed, 56 insertions(+), 58 deletions(-)

diff --git a/misc/ss.c b/misc/ss.c
index 2044776ba310b..e6511014ba3f4 100644
--- a/misc/ss.c
+++ b/misc/ss.c
@@ -340,6 +340,61 @@ static void filter_db_set(struct filter *f, int db, bool enable)
 	do_default   = 0;
 }
 
+static int filter_db_parse(struct filter *f, const char *s)
+{
+	const struct {
+		const char *name;
+		int dbs[MAX_DB + 1];
+	} db_name_tbl[] = {
+#define ENTRY(name, ...) { #name, { __VA_ARGS__, MAX_DB }}
+		ENTRY(all, UDP_DB, DCCP_DB, TCP_DB, RAW_DB, \
+			   UNIX_ST_DB, UNIX_DG_DB, UNIX_SQ_DB, \
+			   PACKET_R_DB, PACKET_DG_DB, NETLINK_DB, \
+			   SCTP_DB, VSOCK_ST_DB, VSOCK_DG_DB),
+		ENTRY(inet, UDP_DB, DCCP_DB, TCP_DB, SCTP_DB, RAW_DB),
+		ENTRY(udp, UDP_DB),
+		ENTRY(dccp, DCCP_DB),
+		ENTRY(tcp, TCP_DB),
+		ENTRY(sctp, SCTP_DB),
+		ENTRY(raw, RAW_DB),
+		ENTRY(unix, UNIX_ST_DB, UNIX_DG_DB, UNIX_SQ_DB),
+		ENTRY(unix_stream, UNIX_ST_DB),
+		ENTRY(u_str, UNIX_ST_DB),	/* alias for unix_stream */
+		ENTRY(unix_dgram, UNIX_DG_DB),
+		ENTRY(u_dgr, UNIX_DG_DB),	/* alias for unix_dgram */
+		ENTRY(unix_seqpacket, UNIX_SQ_DB),
+		ENTRY(u_seq, UNIX_SQ_DB),	/* alias for unix_seqpacket */
+		ENTRY(packet, PACKET_R_DB, PACKET_DG_DB),
+		ENTRY(packet_raw, PACKET_R_DB),
+		ENTRY(p_raw, PACKET_R_DB),	/* alias for packet_raw */
+		ENTRY(packet_dgram, PACKET_DG_DB),
+		ENTRY(p_dgr, PACKET_DG_DB),	/* alias for packet_dgram */
+		ENTRY(netlink, NETLINK_DB),
+		ENTRY(vsock, VSOCK_ST_DB, VSOCK_DG_DB),
+		ENTRY(vsock_stream, VSOCK_ST_DB),
+		ENTRY(v_str, VSOCK_ST_DB),	/* alias for vsock_stream */
+		ENTRY(vsock_dgram, VSOCK_DG_DB),
+		ENTRY(v_dgr, VSOCK_DG_DB),	/* alias for vsock_dgram */
+#undef ENTRY
+	};
+	bool enable = true;
+	unsigned int i;
+	const int *dbp;
+
+	if (s[0] == '!') {
+		enable = false;
+		s++;
+	}
+	for (i = 0; i < ARRAY_SIZE(db_name_tbl); i++) {
+		if (strcmp(s, db_name_tbl[i].name))
+			continue;
+		for (dbp = db_name_tbl[i].dbs; *dbp != MAX_DB; dbp++)
+			filter_db_set(f, *dbp, enable);
+		return 0;
+	}
+	return -1;
+}
+
 static void filter_af_set(struct filter *f, int af)
 {
 	f->states	   |= default_afs[af].states;
@@ -4757,66 +4812,9 @@ int main(int argc, char *argv[])
 			}
 			p = p1 = optarg;
 			do {
-				bool enable = true;
-
 				if ((p1 = strchr(p, ',')) != NULL)
 					*p1 = 0;
-				if (p[0] == '!') {
-					enable = false;
-					p++;
-				}
-				if (strcmp(p, "all") == 0) {
-					filter_default_dbs(&current_filter, enable);
-				} else if (strcmp(p, "inet") == 0) {
-					filter_db_set(&current_filter, UDP_DB, enable);
-					filter_db_set(&current_filter, DCCP_DB, enable);
-					filter_db_set(&current_filter, TCP_DB, enable);
-					filter_db_set(&current_filter, SCTP_DB, enable);
-					filter_db_set(&current_filter, RAW_DB, enable);
-				} else if (strcmp(p, "udp") == 0) {
-					filter_db_set(&current_filter, UDP_DB, enable);
-				} else if (strcmp(p, "dccp") == 0) {
-					filter_db_set(&current_filter, DCCP_DB, enable);
-				} else if (strcmp(p, "tcp") == 0) {
-					filter_db_set(&current_filter, TCP_DB, enable);
-				} else if (strcmp(p, "sctp") == 0) {
-					filter_db_set(&current_filter, SCTP_DB, enable);
-				} else if (strcmp(p, "raw") == 0) {
-					filter_db_set(&current_filter, RAW_DB, enable);
-				} else if (strcmp(p, "unix") == 0) {
-					filter_db_set(&current_filter, UNIX_ST_DB, enable);
-					filter_db_set(&current_filter, UNIX_DG_DB, enable);
-					filter_db_set(&current_filter, UNIX_SQ_DB, enable);
-				} else if (strcasecmp(p, "unix_stream") == 0 ||
-					   strcmp(p, "u_str") == 0) {
-					filter_db_set(&current_filter, UNIX_ST_DB, enable);
-				} else if (strcasecmp(p, "unix_dgram") == 0 ||
-					   strcmp(p, "u_dgr") == 0) {
-					filter_db_set(&current_filter, UNIX_DG_DB, enable);
-				} else if (strcasecmp(p, "unix_seqpacket") == 0 ||
-					   strcmp(p, "u_seq") == 0) {
-					filter_db_set(&current_filter, UNIX_SQ_DB, enable);
-				} else if (strcmp(p, "packet") == 0) {
-					filter_db_set(&current_filter, PACKET_R_DB, enable);
-					filter_db_set(&current_filter, PACKET_DG_DB, enable);
-				} else if (strcmp(p, "packet_raw") == 0 ||
-					   strcmp(p, "p_raw") == 0) {
-					filter_db_set(&current_filter, PACKET_R_DB, enable);
-				} else if (strcmp(p, "packet_dgram") == 0 ||
-					   strcmp(p, "p_dgr") == 0) {
-					filter_db_set(&current_filter, PACKET_DG_DB, enable);
-				} else if (strcmp(p, "netlink") == 0) {
-					filter_db_set(&current_filter, NETLINK_DB, enable);
-				} else if (strcmp(p, "vsock") == 0) {
-					filter_db_set(&current_filter, VSOCK_ST_DB, enable);
-					filter_db_set(&current_filter, VSOCK_DG_DB, enable);
-				} else if (strcmp(p, "vsock_stream") == 0 ||
-					   strcmp(p, "v_str") == 0) {
-					filter_db_set(&current_filter, VSOCK_ST_DB, enable);
-				} else if (strcmp(p, "vsock_dgram") == 0 ||
-					   strcmp(p, "v_dgr") == 0) {
-					filter_db_set(&current_filter, VSOCK_DG_DB, enable);
-				} else {
+				if (filter_db_parse(&current_filter, p)) {
 					fprintf(stderr, "ss: \"%s\" is illegal socket table id\n", p);
 					usage();
 				}
-- 
2.16.1

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [iproute PATCH 3/3] ss: Drop filter_default_dbs()
  2018-03-24 18:18 [iproute PATCH 0/3] ss: Allow excluding a socket table from being queried Phil Sutter
  2018-03-24 18:18 ` [iproute PATCH 1/3] " Phil Sutter
  2018-03-24 18:18 ` [iproute PATCH 2/3] ss: Put filter DB parsing into a separate function Phil Sutter
@ 2018-03-24 18:18 ` Phil Sutter
  2 siblings, 0 replies; 6+ messages in thread
From: Phil Sutter @ 2018-03-24 18:18 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: netdev

Instead call filter_db_parse(..., "all"). This eliminates the duplicate
default DB definition.

Signed-off-by: Phil Sutter <phil@nwl.cc>
---
 misc/ss.c | 19 +------------------
 1 file changed, 1 insertion(+), 18 deletions(-)

diff --git a/misc/ss.c b/misc/ss.c
index e6511014ba3f4..ab2f07b9e5d4d 100644
--- a/misc/ss.c
+++ b/misc/ss.c
@@ -408,23 +408,6 @@ static int filter_af_get(struct filter *f, int af)
 	return !!(f->families & FAMILY_MASK(af));
 }
 
-static void filter_default_dbs(struct filter *f, bool enable)
-{
-	filter_db_set(f, UDP_DB, enable);
-	filter_db_set(f, DCCP_DB, enable);
-	filter_db_set(f, TCP_DB, enable);
-	filter_db_set(f, RAW_DB, enable);
-	filter_db_set(f, UNIX_ST_DB, enable);
-	filter_db_set(f, UNIX_DG_DB, enable);
-	filter_db_set(f, UNIX_SQ_DB, enable);
-	filter_db_set(f, PACKET_R_DB, enable);
-	filter_db_set(f, PACKET_DG_DB, enable);
-	filter_db_set(f, NETLINK_DB, enable);
-	filter_db_set(f, SCTP_DB, enable);
-	filter_db_set(f, VSOCK_ST_DB, enable);
-	filter_db_set(f, VSOCK_DG_DB, enable);
-}
-
 static void filter_states_set(struct filter *f, int states)
 {
 	if (states)
@@ -4906,7 +4889,7 @@ int main(int argc, char *argv[])
 
 	if (do_default) {
 		state_filter = state_filter ? state_filter : SS_CONN;
-		filter_default_dbs(&current_filter, true);
+		filter_db_parse(&current_filter, "all");
 	}
 
 	filter_states_set(&current_filter, state_filter);
-- 
2.16.1

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [iproute PATCH 2/3] ss: Put filter DB parsing into a separate function
  2018-03-24 18:18 ` [iproute PATCH 2/3] ss: Put filter DB parsing into a separate function Phil Sutter
@ 2018-03-27 18:46   ` Stephen Hemminger
  2018-03-27 23:39     ` Phil Sutter
  0 siblings, 1 reply; 6+ messages in thread
From: Stephen Hemminger @ 2018-03-27 18:46 UTC (permalink / raw)
  To: Phil Sutter; +Cc: netdev

On Sat, 24 Mar 2018 19:18:10 +0100
Phil Sutter <phil@nwl.cc> wrote:

> +#define ENTRY(name, ...) { #name, { __VA_ARGS__, MAX_DB }}

> +		ENTRY(all, UDP_DB, DCCP_DB, TCP_DB, RAW_DB, \
> +			   UNIX_ST_DB, UNIX_DG_DB, UNIX_SQ_DB, \
> +			   PACKET_R_DB, PACKET_DG_DB, NETLINK_DB, \
> +			   SCTP_DB, VSOCK_ST_DB, VSOCK_DG_DB),

Checkpatch complains that line continuations are not necessary here;
and it is right. Macro usage can cross lines.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [iproute PATCH 2/3] ss: Put filter DB parsing into a separate function
  2018-03-27 18:46   ` Stephen Hemminger
@ 2018-03-27 23:39     ` Phil Sutter
  0 siblings, 0 replies; 6+ messages in thread
From: Phil Sutter @ 2018-03-27 23:39 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: netdev

On Tue, Mar 27, 2018 at 11:46:01AM -0700, Stephen Hemminger wrote:
> On Sat, 24 Mar 2018 19:18:10 +0100
> Phil Sutter <phil@nwl.cc> wrote:
> 
> > +#define ENTRY(name, ...) { #name, { __VA_ARGS__, MAX_DB }}
> 
> > +		ENTRY(all, UDP_DB, DCCP_DB, TCP_DB, RAW_DB, \
> > +			   UNIX_ST_DB, UNIX_DG_DB, UNIX_SQ_DB, \
> > +			   PACKET_R_DB, PACKET_DG_DB, NETLINK_DB, \
> > +			   SCTP_DB, VSOCK_ST_DB, VSOCK_DG_DB),
> 
> Checkpatch complains that line continuations are not necessary here;
> and it is right. Macro usage can cross lines.

Interesting. Seems I should fix my muscle memory when it comes to
macros. :)

I'll follow-up with a fixed version.

Thanks, Phil

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2018-03-27 23:39 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-03-24 18:18 [iproute PATCH 0/3] ss: Allow excluding a socket table from being queried Phil Sutter
2018-03-24 18:18 ` [iproute PATCH 1/3] " Phil Sutter
2018-03-24 18:18 ` [iproute PATCH 2/3] ss: Put filter DB parsing into a separate function Phil Sutter
2018-03-27 18:46   ` Stephen Hemminger
2018-03-27 23:39     ` Phil Sutter
2018-03-24 18:18 ` [iproute PATCH 3/3] ss: Drop filter_default_dbs() Phil Sutter

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.