* [PATCH ipsec 0/3] xfrm: a few fixes for espintcp
@ 2020-07-16 8:09 Sabrina Dubroca
2020-07-16 8:09 ` [PATCH ipsec 1/3] espintcp: support non-blocking sends Sabrina Dubroca
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: Sabrina Dubroca @ 2020-07-16 8:09 UTC (permalink / raw)
To: netdev; +Cc: Steffen Klassert, Sabrina Dubroca
Andrew Cagney reported some issues when trying to use async operations
on the encapsulation socket. Patches 1 and 2 take care of these bugs.
In addition, I missed a spot when adding IPv6 support and converting
to the common config option.
Sabrina Dubroca (3):
espintcp: support non-blocking sends
espintcp: recv() should return 0 when the peer socket is closed
xfrm: policy: fix IPv6-only espintcp
net/xfrm/espintcp.c | 31 +++++++++++++++++--------------
net/xfrm/xfrm_policy.c | 4 ++--
2 files changed, 19 insertions(+), 16 deletions(-)
--
2.27.0
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH ipsec 1/3] espintcp: support non-blocking sends
2020-07-16 8:09 [PATCH ipsec 0/3] xfrm: a few fixes for espintcp Sabrina Dubroca
@ 2020-07-16 8:09 ` Sabrina Dubroca
2020-07-16 8:09 ` [PATCH ipsec 2/3] espintcp: recv() should return 0 when the peer socket is closed Sabrina Dubroca
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Sabrina Dubroca @ 2020-07-16 8:09 UTC (permalink / raw)
To: netdev; +Cc: Steffen Klassert, Sabrina Dubroca, Andrew Cagney
Currently, non-blocking sends from userspace result in EOPNOTSUPP.
To support this, we need to tell espintcp_sendskb_locked() and
espintcp_sendskmsg_locked() that non-blocking operation was requested
from espintcp_sendmsg().
Fixes: e27cca96cd68 ("xfrm: add espintcp (RFC 8229)")
Reported-by: Andrew Cagney <cagney@libreswan.org>
Tested-by: Andrew Cagney <cagney@libreswan.org>
Signed-off-by: Sabrina Dubroca <sd@queasysnail.net>
---
net/xfrm/espintcp.c | 26 +++++++++++++-------------
1 file changed, 13 insertions(+), 13 deletions(-)
diff --git a/net/xfrm/espintcp.c b/net/xfrm/espintcp.c
index 100e29682b48..5d3d2b98c62d 100644
--- a/net/xfrm/espintcp.c
+++ b/net/xfrm/espintcp.c
@@ -213,7 +213,7 @@ static int espintcp_sendskmsg_locked(struct sock *sk,
return 0;
}
-static int espintcp_push_msgs(struct sock *sk)
+static int espintcp_push_msgs(struct sock *sk, int flags)
{
struct espintcp_ctx *ctx = espintcp_getctx(sk);
struct espintcp_msg *emsg = &ctx->partial;
@@ -227,12 +227,12 @@ static int espintcp_push_msgs(struct sock *sk)
ctx->tx_running = 1;
if (emsg->skb)
- err = espintcp_sendskb_locked(sk, emsg, 0);
+ err = espintcp_sendskb_locked(sk, emsg, flags);
else
- err = espintcp_sendskmsg_locked(sk, emsg, 0);
+ err = espintcp_sendskmsg_locked(sk, emsg, flags);
if (err == -EAGAIN) {
ctx->tx_running = 0;
- return 0;
+ return flags & MSG_DONTWAIT ? -EAGAIN : 0;
}
if (!err)
memset(emsg, 0, sizeof(*emsg));
@@ -257,7 +257,7 @@ int espintcp_push_skb(struct sock *sk, struct sk_buff *skb)
offset = skb_transport_offset(skb);
len = skb->len - offset;
- espintcp_push_msgs(sk);
+ espintcp_push_msgs(sk, 0);
if (emsg->len) {
kfree_skb(skb);
@@ -270,7 +270,7 @@ int espintcp_push_skb(struct sock *sk, struct sk_buff *skb)
emsg->len = len;
emsg->skb = skb;
- espintcp_push_msgs(sk);
+ espintcp_push_msgs(sk, 0);
return 0;
}
@@ -287,7 +287,7 @@ static int espintcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size)
char buf[2] = {0};
int err, end;
- if (msg->msg_flags)
+ if (msg->msg_flags & ~MSG_DONTWAIT)
return -EOPNOTSUPP;
if (size > MAX_ESPINTCP_MSG)
@@ -298,9 +298,10 @@ static int espintcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size)
lock_sock(sk);
- err = espintcp_push_msgs(sk);
+ err = espintcp_push_msgs(sk, msg->msg_flags & MSG_DONTWAIT);
if (err < 0) {
- err = -ENOBUFS;
+ if (err != -EAGAIN || !(msg->msg_flags & MSG_DONTWAIT))
+ err = -ENOBUFS;
goto unlock;
}
@@ -337,10 +338,9 @@ static int espintcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size)
tcp_rate_check_app_limited(sk);
- err = espintcp_push_msgs(sk);
+ err = espintcp_push_msgs(sk, msg->msg_flags & MSG_DONTWAIT);
/* this message could be partially sent, keep it */
- if (err < 0)
- goto unlock;
+
release_sock(sk);
return size;
@@ -374,7 +374,7 @@ static void espintcp_tx_work(struct work_struct *work)
lock_sock(sk);
if (!ctx->tx_running)
- espintcp_push_msgs(sk);
+ espintcp_push_msgs(sk, 0);
release_sock(sk);
}
--
2.27.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH ipsec 2/3] espintcp: recv() should return 0 when the peer socket is closed
2020-07-16 8:09 [PATCH ipsec 0/3] xfrm: a few fixes for espintcp Sabrina Dubroca
2020-07-16 8:09 ` [PATCH ipsec 1/3] espintcp: support non-blocking sends Sabrina Dubroca
@ 2020-07-16 8:09 ` Sabrina Dubroca
2020-07-16 8:09 ` [PATCH ipsec 3/3] xfrm: policy: fix IPv6-only espintcp compilation Sabrina Dubroca
2020-07-21 6:06 ` [PATCH ipsec 0/3] xfrm: a few fixes for espintcp Steffen Klassert
3 siblings, 0 replies; 5+ messages in thread
From: Sabrina Dubroca @ 2020-07-16 8:09 UTC (permalink / raw)
To: netdev; +Cc: Steffen Klassert, Sabrina Dubroca, Andrew Cagney
man 2 recv says:
RETURN VALUE
When a stream socket peer has performed an orderly shutdown, the
return value will be 0 (the traditional "end-of-file" return).
Currently, this works for blocking reads, but non-blocking reads will
return -EAGAIN. This patch overwrites that return value when the peer
won't send us any more data.
Fixes: e27cca96cd68 ("xfrm: add espintcp (RFC 8229)")
Reported-by: Andrew Cagney <cagney@libreswan.org>
Tested-by: Andrew Cagney <cagney@libreswan.org>
Signed-off-by: Sabrina Dubroca <sd@queasysnail.net>
---
net/xfrm/espintcp.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/net/xfrm/espintcp.c b/net/xfrm/espintcp.c
index 5d3d2b98c62d..cb83e3664680 100644
--- a/net/xfrm/espintcp.c
+++ b/net/xfrm/espintcp.c
@@ -109,8 +109,11 @@ static int espintcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
flags |= nonblock ? MSG_DONTWAIT : 0;
skb = __skb_recv_datagram(sk, &ctx->ike_queue, flags, &off, &err);
- if (!skb)
+ if (!skb) {
+ if (err == -EAGAIN && sk->sk_shutdown & RCV_SHUTDOWN)
+ return 0;
return err;
+ }
copied = len;
if (copied > skb->len)
--
2.27.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH ipsec 3/3] xfrm: policy: fix IPv6-only espintcp compilation
2020-07-16 8:09 [PATCH ipsec 0/3] xfrm: a few fixes for espintcp Sabrina Dubroca
2020-07-16 8:09 ` [PATCH ipsec 1/3] espintcp: support non-blocking sends Sabrina Dubroca
2020-07-16 8:09 ` [PATCH ipsec 2/3] espintcp: recv() should return 0 when the peer socket is closed Sabrina Dubroca
@ 2020-07-16 8:09 ` Sabrina Dubroca
2020-07-21 6:06 ` [PATCH ipsec 0/3] xfrm: a few fixes for espintcp Steffen Klassert
3 siblings, 0 replies; 5+ messages in thread
From: Sabrina Dubroca @ 2020-07-16 8:09 UTC (permalink / raw)
To: netdev; +Cc: Steffen Klassert, Sabrina Dubroca
In case we're compiling espintcp support only for IPv6, we should
still initialize the common code.
Fixes: 26333c37fc28 ("xfrm: add IPv6 support for espintcp")
Signed-off-by: Sabrina Dubroca <sd@queasysnail.net>
---
net/xfrm/xfrm_policy.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c
index 6847b3579f54..19c5e0fa3f44 100644
--- a/net/xfrm/xfrm_policy.c
+++ b/net/xfrm/xfrm_policy.c
@@ -39,7 +39,7 @@
#ifdef CONFIG_XFRM_STATISTICS
#include <net/snmp.h>
#endif
-#ifdef CONFIG_INET_ESPINTCP
+#ifdef CONFIG_XFRM_ESPINTCP
#include <net/espintcp.h>
#endif
@@ -4149,7 +4149,7 @@ void __init xfrm_init(void)
seqcount_init(&xfrm_policy_hash_generation);
xfrm_input_init();
-#ifdef CONFIG_INET_ESPINTCP
+#ifdef CONFIG_XFRM_ESPINTCP
espintcp_init();
#endif
--
2.27.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH ipsec 0/3] xfrm: a few fixes for espintcp
2020-07-16 8:09 [PATCH ipsec 0/3] xfrm: a few fixes for espintcp Sabrina Dubroca
` (2 preceding siblings ...)
2020-07-16 8:09 ` [PATCH ipsec 3/3] xfrm: policy: fix IPv6-only espintcp compilation Sabrina Dubroca
@ 2020-07-21 6:06 ` Steffen Klassert
3 siblings, 0 replies; 5+ messages in thread
From: Steffen Klassert @ 2020-07-21 6:06 UTC (permalink / raw)
To: Sabrina Dubroca; +Cc: netdev
On Thu, Jul 16, 2020 at 10:09:00AM +0200, Sabrina Dubroca wrote:
> Andrew Cagney reported some issues when trying to use async operations
> on the encapsulation socket. Patches 1 and 2 take care of these bugs.
>
> In addition, I missed a spot when adding IPv6 support and converting
> to the common config option.
>
> Sabrina Dubroca (3):
> espintcp: support non-blocking sends
> espintcp: recv() should return 0 when the peer socket is closed
> xfrm: policy: fix IPv6-only espintcp
All applied, thanks a lot Sabrina!
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2020-07-21 6:06 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-07-16 8:09 [PATCH ipsec 0/3] xfrm: a few fixes for espintcp Sabrina Dubroca
2020-07-16 8:09 ` [PATCH ipsec 1/3] espintcp: support non-blocking sends Sabrina Dubroca
2020-07-16 8:09 ` [PATCH ipsec 2/3] espintcp: recv() should return 0 when the peer socket is closed Sabrina Dubroca
2020-07-16 8:09 ` [PATCH ipsec 3/3] xfrm: policy: fix IPv6-only espintcp compilation Sabrina Dubroca
2020-07-21 6:06 ` [PATCH ipsec 0/3] xfrm: a few fixes for espintcp Steffen Klassert
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.