netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH net-next iproute2 0/2 v2] Add support for operating raw sockest via diag interface
@ 2016-11-02 13:14 Cyrill Gorcunov
  2016-11-02 13:14 ` [PATCH net-next iproute2 1/2 v2] libnetlink: Add test for error code returned from netlink reply Cyrill Gorcunov
  2016-11-02 13:14 ` [PATCH net-next iproute2 PATCH 2/2 v2] ss: Add inet raw sockets information gathering via netlink diag interface Cyrill Gorcunov
  0 siblings, 2 replies; 6+ messages in thread
From: Cyrill Gorcunov @ 2016-11-02 13:14 UTC (permalink / raw)
  To: netdev; +Cc: stephen, avagin, Cyrill Gorcunov

The diag interface for raw sockets is now in linux-net-next
http://git.kernel.org/cgit/linux/kernel/git/davem/net-next.git/commit/?id=432490f9d455fb842d70219f22d9d2c812371676
so here is early patches for misc/ss

I've to update libnetlink code to keep backward compatibility and switch to
parse procfs output if no raw_diag module present in the system. Note the error
reporting sitting in the kernel since 2006 so it's not something new, I guess
this hasn't been done for other diag modules because it been assumed that they
are always here. Which is not applied to fresh raw-diag module.

	Cyrill
-- 
2.7.4

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

* [PATCH net-next iproute2 1/2 v2] libnetlink: Add test for error code returned from netlink reply
  2016-11-02 13:14 [PATCH net-next iproute2 0/2 v2] Add support for operating raw sockest via diag interface Cyrill Gorcunov
@ 2016-11-02 13:14 ` Cyrill Gorcunov
  2016-11-02 13:14 ` [PATCH net-next iproute2 PATCH 2/2 v2] ss: Add inet raw sockets information gathering via netlink diag interface Cyrill Gorcunov
  1 sibling, 0 replies; 6+ messages in thread
From: Cyrill Gorcunov @ 2016-11-02 13:14 UTC (permalink / raw)
  To: netdev; +Cc: stephen, avagin, Cyrill Gorcunov

In case if some diag module is not present in the system,
say the kernel is not modern enough, we simply skip the
error code reported. Instead we should check for data
length in NLMSG_DONE and process unsupported case.

Signed-off-by: Cyrill Gorcunov <gorcunov@gmail.com>
---
 lib/libnetlink.c | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/lib/libnetlink.c b/lib/libnetlink.c
index 2279935..232daee 100644
--- a/lib/libnetlink.c
+++ b/lib/libnetlink.c
@@ -312,6 +312,22 @@ int rtnl_dump_filter_l(struct rtnl_handle *rth,
 					dump_intr = 1;
 
 				if (h->nlmsg_type == NLMSG_DONE) {
+					if (rth->proto == NETLINK_SOCK_DIAG) {
+						if (h->nlmsg_len < NLMSG_LENGTH(sizeof(int))) {
+							fprintf(stderr, "DONE truncated\n");
+							return -1;
+						} else {
+							int len = *(int *)NLMSG_DATA(h);
+							if (len < 0) {
+								errno = -len;
+								if (errno == ENOENT ||
+								    errno == EOPNOTSUPP)
+									return -1;
+								perror("RTNETLINK answers");
+								return len;
+							}
+						}
+					}
 					found_done = 1;
 					break; /* process next filter */
 				}
-- 
2.7.4

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

* [PATCH net-next iproute2 PATCH 2/2 v2] ss: Add inet raw sockets information gathering via netlink diag interface
  2016-11-02 13:14 [PATCH net-next iproute2 0/2 v2] Add support for operating raw sockest via diag interface Cyrill Gorcunov
  2016-11-02 13:14 ` [PATCH net-next iproute2 1/2 v2] libnetlink: Add test for error code returned from netlink reply Cyrill Gorcunov
@ 2016-11-02 13:14 ` Cyrill Gorcunov
  2016-11-02 21:24   ` David Ahern
  2016-12-01 18:57   ` Stephen Hemminger
  1 sibling, 2 replies; 6+ messages in thread
From: Cyrill Gorcunov @ 2016-11-02 13:14 UTC (permalink / raw)
  To: netdev; +Cc: stephen, avagin, Cyrill Gorcunov

unix, tcp, udp[lite], packet, netlink sockets already support diag
interface for their collection and killing. Implement support
for raw sockets.

Signed-off-by: Cyrill Gorcunov <gorcunov@gmail.com>
---
 include/linux/inet_diag.h | 15 +++++++++++++++
 misc/ss.c                 | 20 ++++++++++++++++++--
 2 files changed, 33 insertions(+), 2 deletions(-)

diff --git a/include/linux/inet_diag.h b/include/linux/inet_diag.h
index f5f5c1b..ac66148 100644
--- a/include/linux/inet_diag.h
+++ b/include/linux/inet_diag.h
@@ -43,6 +43,21 @@ struct inet_diag_req_v2 {
 	struct inet_diag_sockid id;
 };
 
+/*
+ * An alias for struct inet_diag_req_v2,
+ * @sdiag_raw_protocol member shadows
+ * @pad explicitly, it is done this way
+ * for backward compatibility sake.
+ */
+struct inet_diag_req_raw {
+	__u8	sdiag_family;
+	__u8	sdiag_protocol;
+	__u8	idiag_ext;
+	__u8	sdiag_raw_protocol;
+	__u32	idiag_states;
+	struct inet_diag_sockid id;
+};
+
 enum {
 	INET_DIAG_REQ_NONE,
 	INET_DIAG_REQ_BYTECODE,
diff --git a/misc/ss.c b/misc/ss.c
index dd77b81..e8c4010 100644
--- a/misc/ss.c
+++ b/misc/ss.c
@@ -724,6 +724,7 @@ struct sockstat {
 	struct sockstat	   *next;
 	unsigned int	    type;
 	uint16_t	    prot;
+	uint16_t	    raw_prot;
 	inet_prefix	    local;
 	inet_prefix	    remote;
 	int		    lport;
@@ -2190,6 +2191,10 @@ static void parse_diag_msg(struct nlmsghdr *nlh, struct sockstat *s)
 	s->mark = 0;
 	if (tb[INET_DIAG_MARK])
 		s->mark = *(__u32 *) RTA_DATA(tb[INET_DIAG_MARK]);
+	if (tb[INET_DIAG_PROTOCOL])
+		s->raw_prot = *(__u8 *)RTA_DATA(tb[INET_DIAG_PROTOCOL]);
+	else
+		s->raw_prot = 0;
 
 	if (s->local.family == AF_INET)
 		s->local.bytelen = s->remote.bytelen = 4;
@@ -2384,7 +2389,7 @@ struct inet_diag_arg {
 	struct rtnl_handle *rth;
 };
 
-static int kill_inet_sock(struct nlmsghdr *h, void *arg)
+static int kill_inet_sock(struct nlmsghdr *h, void *arg, struct sockstat *s)
 {
 	struct inet_diag_msg *d = NLMSG_DATA(h);
 	struct inet_diag_arg *diag_arg = arg;
@@ -2399,6 +2404,13 @@ static int kill_inet_sock(struct nlmsghdr *h, void *arg)
 	req.r.sdiag_protocol = diag_arg->protocol;
 	req.r.id = d->id;
 
+	if (diag_arg->protocol == IPPROTO_RAW) {
+		struct inet_diag_req_raw *raw = (void *)&req.r;
+
+		BUILD_BUG_ON(sizeof(req.r) != sizeof(*raw));
+		raw->sdiag_raw_protocol = s->raw_prot;
+	}
+
 	return rtnl_talk(rth, &req.nlh, NULL, 0);
 }
 
@@ -2418,7 +2430,7 @@ static int show_one_inet_sock(const struct sockaddr_nl *addr,
 	if (diag_arg->f->f && run_ssfilter(diag_arg->f->f, &s) == 0)
 		return 0;
 
-	if (diag_arg->f->kill && kill_inet_sock(h, arg) != 0) {
+	if (diag_arg->f->kill && kill_inet_sock(h, arg, &s) != 0) {
 		if (errno == EOPNOTSUPP || errno == ENOENT) {
 			/* Socket can't be closed, or is already closed. */
 			return 0;
@@ -2715,6 +2727,10 @@ static int raw_show(struct filter *f)
 
 	dg_proto = RAW_PROTO;
 
+	if (!getenv("PROC_NET_RAW") && !getenv("PROC_ROOT") &&
+	    inet_show_netlink(f, NULL, IPPROTO_RAW) == 0)
+		return 0;
+
 	if (f->families&(1<<AF_INET)) {
 		if ((fp = net_raw_open()) == NULL)
 			goto outerr;
-- 
2.7.4

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

* Re: [PATCH net-next iproute2 PATCH 2/2 v2] ss: Add inet raw sockets information gathering via netlink diag interface
  2016-11-02 13:14 ` [PATCH net-next iproute2 PATCH 2/2 v2] ss: Add inet raw sockets information gathering via netlink diag interface Cyrill Gorcunov
@ 2016-11-02 21:24   ` David Ahern
  2016-12-01 18:57   ` Stephen Hemminger
  1 sibling, 0 replies; 6+ messages in thread
From: David Ahern @ 2016-11-02 21:24 UTC (permalink / raw)
  To: Cyrill Gorcunov, netdev; +Cc: stephen, avagin

On 11/2/16 7:14 AM, Cyrill Gorcunov wrote:
> unix, tcp, udp[lite], packet, netlink sockets already support diag
> interface for their collection and killing. Implement support
> for raw sockets.
> 
> Signed-off-by: Cyrill Gorcunov <gorcunov@gmail.com>
> ---
>  include/linux/inet_diag.h | 15 +++++++++++++++
>  misc/ss.c                 | 20 ++++++++++++++++++--
>  2 files changed, 33 insertions(+), 2 deletions(-)

worked for me. 

Acked-by: David Ahern <dsa@cumulusnetworks.com>

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

* Re: [PATCH net-next iproute2 PATCH 2/2 v2] ss: Add inet raw sockets information gathering via netlink diag interface
  2016-11-02 13:14 ` [PATCH net-next iproute2 PATCH 2/2 v2] ss: Add inet raw sockets information gathering via netlink diag interface Cyrill Gorcunov
  2016-11-02 21:24   ` David Ahern
@ 2016-12-01 18:57   ` Stephen Hemminger
  2016-12-01 19:13     ` Cyrill Gorcunov
  1 sibling, 1 reply; 6+ messages in thread
From: Stephen Hemminger @ 2016-12-01 18:57 UTC (permalink / raw)
  To: Cyrill Gorcunov; +Cc: netdev, avagin

On Wed,  2 Nov 2016 16:14:56 +0300
Cyrill Gorcunov <gorcunov@gmail.com> wrote:

> unix, tcp, udp[lite], packet, netlink sockets already support diag
> interface for their collection and killing. Implement support
> for raw sockets.
> 
> Signed-off-by: Cyrill Gorcunov <gorcunov@gmail.com>

Applied both patches, but needed to remove inet_diag.h since
already updated kernel headers.

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

* Re: [PATCH net-next iproute2 PATCH 2/2 v2] ss: Add inet raw sockets information gathering via netlink diag interface
  2016-12-01 18:57   ` Stephen Hemminger
@ 2016-12-01 19:13     ` Cyrill Gorcunov
  0 siblings, 0 replies; 6+ messages in thread
From: Cyrill Gorcunov @ 2016-12-01 19:13 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: netdev, avagin

On Thu, Dec 01, 2016 at 10:57:01AM -0800, Stephen Hemminger wrote:
> 
> Applied both patches, but needed to remove inet_diag.h since
> already updated kernel headers.

Thank you! I think we might need to extend the matching interface
for killing raw sockets in near future, because for now it is
too wildcard. I put this into my todo list, once I finish with
more urgent tasks will back to this one.

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

end of thread, other threads:[~2016-12-01 19:13 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-11-02 13:14 [PATCH net-next iproute2 0/2 v2] Add support for operating raw sockest via diag interface Cyrill Gorcunov
2016-11-02 13:14 ` [PATCH net-next iproute2 1/2 v2] libnetlink: Add test for error code returned from netlink reply Cyrill Gorcunov
2016-11-02 13:14 ` [PATCH net-next iproute2 PATCH 2/2 v2] ss: Add inet raw sockets information gathering via netlink diag interface Cyrill Gorcunov
2016-11-02 21:24   ` David Ahern
2016-12-01 18:57   ` Stephen Hemminger
2016-12-01 19:13     ` Cyrill Gorcunov

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).