DPDK patches and discussions
 help / color / mirror / Atom feed
* [dpdk-dev] [PATCH 0/2] net/tap: simplfication and servicabilty improvements
@ 2020-04-24 23:36 Stephen Hemminger
  2020-04-24 23:36 ` [dpdk-dev] [PATCH 1/2] net/tap: simplify netlink send/receive functions Stephen Hemminger
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Stephen Hemminger @ 2020-04-24 23:36 UTC (permalink / raw)
  To: dev, keith.wiles; +Cc: Stephen Hemminger

These are a couple of small fixes to the TAP driver. The first makes it
more robust to random signals, and the second one adds better error
reporting.

Stephen Hemminger (2):
  net/tap: simplify netlink send/receive functions
  net/tap: use netlink extended ack support

 drivers/net/tap/tap_netlink.c | 123 +++++++++++++++++++++++++---------
 1 file changed, 92 insertions(+), 31 deletions(-)

-- 
2.20.1


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

* [dpdk-dev] [PATCH 1/2] net/tap: simplify netlink send/receive functions
  2020-04-24 23:36 [dpdk-dev] [PATCH 0/2] net/tap: simplfication and servicabilty improvements Stephen Hemminger
@ 2020-04-24 23:36 ` Stephen Hemminger
  2020-04-24 23:36 ` [dpdk-dev] [PATCH 2/2] net/tap: use netlink extended ack support Stephen Hemminger
  2020-04-25 13:14 ` [dpdk-dev] [PATCH 0/2] net/tap: simplfication and servicabilty improvements Wiles, Keith
  2 siblings, 0 replies; 8+ messages in thread
From: Stephen Hemminger @ 2020-04-24 23:36 UTC (permalink / raw)
  To: dev, keith.wiles; +Cc: Stephen Hemminger

The tap_nl_recv() function does not need to use the full
complex recvmsg() system call, basic recv() will work here.

Ditto for tap_nl_send() full sendmsg is not needed.

Add logic to retry in case EINTR rather than forcing
error handling back in driver or worse to ethdev API.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 drivers/net/tap/tap_netlink.c | 45 +++++++++++------------------------
 1 file changed, 14 insertions(+), 31 deletions(-)

diff --git a/drivers/net/tap/tap_netlink.c b/drivers/net/tap/tap_netlink.c
index 14bbbec754f6..64220178a6ba 100644
--- a/drivers/net/tap/tap_netlink.c
+++ b/drivers/net/tap/tap_netlink.c
@@ -101,26 +101,17 @@ tap_nl_final(int nlsk_fd)
 int
 tap_nl_send(int nlsk_fd, struct nlmsghdr *nh)
 {
-	/* man 7 netlink EXAMPLE */
-	struct sockaddr_nl sa = {
-		.nl_family = AF_NETLINK,
-	};
-	struct iovec iov = {
-		.iov_base = nh,
-		.iov_len = nh->nlmsg_len,
-	};
-	struct msghdr msg = {
-		.msg_name = &sa,
-		.msg_namelen = sizeof(sa),
-		.msg_iov = &iov,
-		.msg_iovlen = 1,
-	};
 	int send_bytes;
 
 	nh->nlmsg_pid = 0; /* communication with the kernel uses pid 0 */
 	nh->nlmsg_seq = (uint32_t)rte_rand();
-	send_bytes = sendmsg(nlsk_fd, &msg, 0);
+
+retry:
+	send_bytes = send(nlsk_fd, nh, nh->nlmsg_len, 0);
 	if (send_bytes < 0) {
+		if (errno == EINTR)
+			goto retry;
+
 		TAP_LOG(ERR, "Failed to send netlink message: %s (%d)",
 			strerror(errno), errno);
 		return -1;
@@ -161,30 +152,22 @@ tap_nl_recv_ack(int nlsk_fd)
 int
 tap_nl_recv(int nlsk_fd, int (*cb)(struct nlmsghdr *, void *arg), void *arg)
 {
-	/* man 7 netlink EXAMPLE */
-	struct sockaddr_nl sa;
 	char buf[BUF_SIZE];
-	struct iovec iov = {
-		.iov_base = buf,
-		.iov_len = sizeof(buf),
-	};
-	struct msghdr msg = {
-		.msg_name = &sa,
-		.msg_namelen = sizeof(sa),
-		.msg_iov = &iov,
-		/* One message at a time */
-		.msg_iovlen = 1,
-	};
 	int multipart = 0;
 	int ret = 0;
 
 	do {
 		struct nlmsghdr *nh;
-		int recv_bytes = 0;
+		int recv_bytes;
 
-		recv_bytes = recvmsg(nlsk_fd, &msg, 0);
-		if (recv_bytes < 0)
+retry:
+		recv_bytes = recv(nlsk_fd, buf, sizeof(buf), 0);
+		if (recv_bytes < 0) {
+			if (errno == EINTR)
+				goto retry;
 			return -1;
+		}
+
 		for (nh = (struct nlmsghdr *)buf;
 		     NLMSG_OK(nh, (unsigned int)recv_bytes);
 		     nh = NLMSG_NEXT(nh, recv_bytes)) {
-- 
2.20.1


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

* [dpdk-dev] [PATCH 2/2] net/tap: use netlink extended ack support
  2020-04-24 23:36 [dpdk-dev] [PATCH 0/2] net/tap: simplfication and servicabilty improvements Stephen Hemminger
  2020-04-24 23:36 ` [dpdk-dev] [PATCH 1/2] net/tap: simplify netlink send/receive functions Stephen Hemminger
@ 2020-04-24 23:36 ` Stephen Hemminger
  2020-04-27 11:32   ` Andrzej Ostruszka [C]
  2020-04-25 13:14 ` [dpdk-dev] [PATCH 0/2] net/tap: simplfication and servicabilty improvements Wiles, Keith
  2 siblings, 1 reply; 8+ messages in thread
From: Stephen Hemminger @ 2020-04-24 23:36 UTC (permalink / raw)
  To: dev, keith.wiles; +Cc: Stephen Hemminger

In recent Linux kernels, there is support for extended acknowledgement
to netlink messages. This is quite useful for diagnosing errors
in configuration in the kernel with TAP.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 drivers/net/tap/tap_netlink.c | 78 +++++++++++++++++++++++++++++++++++
 1 file changed, 78 insertions(+)

diff --git a/drivers/net/tap/tap_netlink.c b/drivers/net/tap/tap_netlink.c
index 64220178a6ba..2365678a9c13 100644
--- a/drivers/net/tap/tap_netlink.c
+++ b/drivers/net/tap/tap_netlink.c
@@ -9,10 +9,12 @@
 #include <string.h>
 #include <sys/socket.h>
 #include <unistd.h>
+#include <stdbool.h>
 
 #include <rte_malloc.h>
 #include <tap_netlink.h>
 #include <rte_random.h>
+
 #include "tap_log.h"
 
 /* Must be quite large to support dumping a huge list of QDISC or filters. */
@@ -43,6 +45,7 @@ tap_nl_init(uint32_t nl_groups)
 		.nl_family = AF_NETLINK,
 		.nl_groups = nl_groups,
 	};
+	int one = 1;
 
 	fd = socket(AF_NETLINK, SOCK_RAW | SOCK_CLOEXEC, NETLINK_ROUTE);
 	if (fd < 0) {
@@ -59,6 +62,12 @@ tap_nl_init(uint32_t nl_groups)
 		close(fd);
 		return -1;
 	}
+
+#ifdef NETLINK_EXT_ACK
+	/* Ask for extended ACK response. on older kernel will ignore request. */
+	setsockopt(fd, SOL_NETLINK, NETLINK_EXT_ACK, &one, sizeof(one));
+#endif
+
 	if (bind(fd, (struct sockaddr *)&local, sizeof(local)) < 0) {
 		TAP_LOG(ERR, "Unable to bind to the netlink socket");
 		close(fd);
@@ -119,6 +128,74 @@ tap_nl_send(int nlsk_fd, struct nlmsghdr *nh)
 	return send_bytes;
 }
 
+#ifdef NETLINK_EXT_ACK
+static const struct nlattr *
+tap_nl_attr_first(const struct nlmsghdr *nh, size_t offset)
+{
+	return (const struct nlattr *)((const char *)nh + NLMSG_SPACE(offset));
+}
+
+static const struct nlattr *
+tap_nl_attr_next(const struct nlattr *attr)
+{
+	return (const struct nlattr *)((const char *)attr
+				       + NLMSG_ALIGN(attr->nla_len));
+}
+
+static bool
+tap_nl_attr_ok(const struct nlattr *attr, int len)
+{
+	if (len < (int)sizeof(struct nlattr))
+		return false; /* missing header */
+	if (attr->nla_len < sizeof(struct nlattr))
+		return false; /* attribute length should include itself */
+	if ((int)attr->nla_len  > len)
+		return false; /* attribute is truncated */
+	return true;
+}
+
+
+/* Decode extended errors from kernel */
+static void
+tap_nl_dump_ext_ack(const struct nlmsghdr *nh, const struct nlmsgerr *err)
+{
+	const struct nlattr *attr;
+	const char *tail = (const char *)nh + NLMSG_ALIGN(nh->nlmsg_len);
+	size_t hlen = sizeof(*err);
+
+	/* no TLVs, no extended response */
+	if (!(nh->nlmsg_flags & NLM_F_ACK_TLVS))
+		return;
+
+	if (!(nh->nlmsg_flags & NLM_F_CAPPED))
+		hlen += err->msg.nlmsg_len - NLMSG_HDRLEN;
+
+	for (attr = tap_nl_attr_first(nh, hlen);
+	     tap_nl_attr_ok(attr, tail - (const char *)attr);
+	     attr = tap_nl_attr_next(attr)) {
+		uint16_t type = attr->nla_type & NLA_TYPE_MASK;
+
+		if (type == NLMSGERR_ATTR_MSG) {
+			const char *msg = (const char *)attr
+				+ NLMSG_ALIGN(sizeof(*attr));
+
+			if (err->error)
+				TAP_LOG(ERR, "%s", msg);
+			else
+
+				TAP_LOG(WARNING, "%s", msg);
+			break;
+		}
+	}
+}
+#else
+/*
+ * External ACK support was added in Linux kernel 4.17
+ * on older kernels, just ignore that part of message
+ */
+#define tap_nl_dump_ext_ack(nh, err) do { } while();
+#endif
+
 /**
  * Check that the kernel sends an appropriate ACK in response
  * to an tap_nl_send().
@@ -174,6 +251,7 @@ tap_nl_recv(int nlsk_fd, int (*cb)(struct nlmsghdr *, void *arg), void *arg)
 			if (nh->nlmsg_type == NLMSG_ERROR) {
 				struct nlmsgerr *err_data = NLMSG_DATA(nh);
 
+				tap_nl_dump_ext_ack(nh, err_data);
 				if (err_data->error < 0) {
 					errno = -err_data->error;
 					return -1;
-- 
2.20.1


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

* Re: [dpdk-dev] [PATCH 0/2] net/tap: simplfication and servicabilty improvements
  2020-04-24 23:36 [dpdk-dev] [PATCH 0/2] net/tap: simplfication and servicabilty improvements Stephen Hemminger
  2020-04-24 23:36 ` [dpdk-dev] [PATCH 1/2] net/tap: simplify netlink send/receive functions Stephen Hemminger
  2020-04-24 23:36 ` [dpdk-dev] [PATCH 2/2] net/tap: use netlink extended ack support Stephen Hemminger
@ 2020-04-25 13:14 ` Wiles, Keith
  2020-05-06 18:41   ` Ferruh Yigit
  2 siblings, 1 reply; 8+ messages in thread
From: Wiles, Keith @ 2020-04-25 13:14 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: dev



> On Apr 24, 2020, at 6:36 PM, Stephen Hemminger <stephen@networkplumber.org> wrote:
> 
> These are a couple of small fixes to the TAP driver. The first makes it
> more robust to random signals, and the second one adds better error
> reporting.
> 
> Stephen Hemminger (2):
>  net/tap: simplify netlink send/receive functions
>  net/tap: use netlink extended ack support
> 
> drivers/net/tap/tap_netlink.c | 123 +++++++++++++++++++++++++---------
> 1 file changed, 92 insertions(+), 31 deletions(-)
> 
> 2.20.1
> 

Acked-by: Keith Wiles <keith.wiles@intel.com>


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

* Re: [dpdk-dev] [PATCH 2/2] net/tap: use netlink extended ack support
  2020-04-24 23:36 ` [dpdk-dev] [PATCH 2/2] net/tap: use netlink extended ack support Stephen Hemminger
@ 2020-04-27 11:32   ` Andrzej Ostruszka [C]
  2020-05-06 18:41     ` Ferruh Yigit
  0 siblings, 1 reply; 8+ messages in thread
From: Andrzej Ostruszka [C] @ 2020-04-27 11:32 UTC (permalink / raw)
  To: dev

On 25/04/2020 01:36, Stephen Hemminger wrote:
> In recent Linux kernels, there is support for extended acknowledgement
> to netlink messages. This is quite useful for diagnosing errors
> in configuration in the kernel with TAP.
> 
> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> ---
[...]
> +#else
> +/*
> + * External ACK support was added in Linux kernel 4.17
> + * on older kernels, just ignore that part of message
> + */
> +#define tap_nl_dump_ext_ack(nh, err) do { } while();

Maybe "while(0)" here?

With regards
Andrzej Ostruszka

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

* Re: [dpdk-dev] [PATCH 2/2] net/tap: use netlink extended ack support
  2020-04-27 11:32   ` Andrzej Ostruszka [C]
@ 2020-05-06 18:41     ` Ferruh Yigit
  2020-05-06 20:19       ` Stephen Hemminger
  0 siblings, 1 reply; 8+ messages in thread
From: Ferruh Yigit @ 2020-05-06 18:41 UTC (permalink / raw)
  To: Andrzej Ostruszka [C], dev

On 4/27/2020 12:32 PM, Andrzej Ostruszka [C] wrote:
> On 25/04/2020 01:36, Stephen Hemminger wrote:
>> In recent Linux kernels, there is support for extended acknowledgement
>> to netlink messages. This is quite useful for diagnosing errors
>> in configuration in the kernel with TAP.
>>
>> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
>> ---
> [...]
>> +#else
>> +/*
>> + * External ACK support was added in Linux kernel 4.17
>> + * on older kernels, just ignore that part of message
>> + */
>> +#define tap_nl_dump_ext_ack(nh, err) do { } while();
> 
> Maybe "while(0)" here?
> 

+1, will fix while merging.

I assume since it is in #else leg it has not been tested but #if leg tested well.

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

* Re: [dpdk-dev] [PATCH 0/2] net/tap: simplfication and servicabilty improvements
  2020-04-25 13:14 ` [dpdk-dev] [PATCH 0/2] net/tap: simplfication and servicabilty improvements Wiles, Keith
@ 2020-05-06 18:41   ` Ferruh Yigit
  0 siblings, 0 replies; 8+ messages in thread
From: Ferruh Yigit @ 2020-05-06 18:41 UTC (permalink / raw)
  To: Wiles, Keith, Stephen Hemminger; +Cc: dev

On 4/25/2020 2:14 PM, Wiles, Keith wrote:
> 
> 
>> On Apr 24, 2020, at 6:36 PM, Stephen Hemminger <stephen@networkplumber.org> wrote:
>>
>> These are a couple of small fixes to the TAP driver. The first makes it
>> more robust to random signals, and the second one adds better error
>> reporting.
>>
>> Stephen Hemminger (2):
>>  net/tap: simplify netlink send/receive functions
>>  net/tap: use netlink extended ack support
>>
>> drivers/net/tap/tap_netlink.c | 123 +++++++++++++++++++++++++---------
>> 1 file changed, 92 insertions(+), 31 deletions(-)
>>
>> 2.20.1
>>
> 
> Acked-by: Keith Wiles <keith.wiles@intel.com>
> 

Series applied to dpdk-next-net/master, thanks.

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

* Re: [dpdk-dev] [PATCH 2/2] net/tap: use netlink extended ack support
  2020-05-06 18:41     ` Ferruh Yigit
@ 2020-05-06 20:19       ` Stephen Hemminger
  0 siblings, 0 replies; 8+ messages in thread
From: Stephen Hemminger @ 2020-05-06 20:19 UTC (permalink / raw)
  To: Ferruh Yigit; +Cc: Andrzej Ostruszka [C], dev

On Wed, 6 May 2020 19:41:28 +0100
Ferruh Yigit <ferruh.yigit@intel.com> wrote:

> On 4/27/2020 12:32 PM, Andrzej Ostruszka [C] wrote:
> > On 25/04/2020 01:36, Stephen Hemminger wrote:  
> >> In recent Linux kernels, there is support for extended acknowledgement
> >> to netlink messages. This is quite useful for diagnosing errors
> >> in configuration in the kernel with TAP.
> >>
> >> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> >> ---  
> > [...]  
> >> +#else
> >> +/*
> >> + * External ACK support was added in Linux kernel 4.17
> >> + * on older kernels, just ignore that part of message
> >> + */
> >> +#define tap_nl_dump_ext_ack(nh, err) do { } while();  
> > 
> > Maybe "while(0)" here?
> >   
> 
> +1, will fix while merging.
> 
> I assume since it is in #else leg it has not been tested but #if leg tested well.

Yes, haven't built on distros that are old enough to hit the #else :-(

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

end of thread, other threads:[~2020-05-06 20:19 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-04-24 23:36 [dpdk-dev] [PATCH 0/2] net/tap: simplfication and servicabilty improvements Stephen Hemminger
2020-04-24 23:36 ` [dpdk-dev] [PATCH 1/2] net/tap: simplify netlink send/receive functions Stephen Hemminger
2020-04-24 23:36 ` [dpdk-dev] [PATCH 2/2] net/tap: use netlink extended ack support Stephen Hemminger
2020-04-27 11:32   ` Andrzej Ostruszka [C]
2020-05-06 18:41     ` Ferruh Yigit
2020-05-06 20:19       ` Stephen Hemminger
2020-04-25 13:14 ` [dpdk-dev] [PATCH 0/2] net/tap: simplfication and servicabilty improvements Wiles, Keith
2020-05-06 18:41   ` Ferruh Yigit

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