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