]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ovpn: add support for MSG_NOSIGNAL in tcp_sendmsg
authorAntonio Quartulli <antonio@openvpn.net>
Tue, 15 Apr 2025 11:17:30 +0000 (13:17 +0200)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 17 Apr 2025 10:30:03 +0000 (12:30 +0200)
Userspace may want to pass the MSG_NOSIGNAL flag to
tcp_sendmsg() in order to avoid generating a SIGPIPE.

To pass this flag down the TCP stack a new skb sending API
accepting a flags argument is introduced.

Cc: Eric Dumazet <edumazet@google.com>
Cc: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Antonio Quartulli <antonio@openvpn.net>
Link: https://patch.msgid.link/20250415-b4-ovpn-v26-13-577f6097b964@openvpn.net
Reviewed-by: Sabrina Dubroca <sd@queasysnail.net>
Tested-by: Oleksandr Natalenko <oleksandr@natalenko.name>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ovpn/skb.h
drivers/net/ovpn/tcp.c

index bd3cbcfc770d2c28d234fcdd081b4d02e6496ea0..64430880f1dae33a41f698d713cf151be5b38577 100644 (file)
@@ -25,6 +25,7 @@ struct ovpn_cb {
        struct scatterlist *sg;
        u8 *iv;
        unsigned int payload_offset;
+       bool nosignal;
 };
 
 static inline struct ovpn_cb *ovpn_skb_cb(struct sk_buff *skb)
index 588ff6b0440103f6620837a75ea2f1029d91b8a3..7c42d84987ad362289dbf5e7992403c76e910ed9 100644 (file)
@@ -220,6 +220,7 @@ void ovpn_tcp_socket_wait_finish(struct ovpn_socket *sock)
 static void ovpn_tcp_send_sock(struct ovpn_peer *peer, struct sock *sk)
 {
        struct sk_buff *skb = peer->tcp.out_msg.skb;
+       int ret, flags;
 
        if (!skb)
                return;
@@ -230,9 +231,11 @@ static void ovpn_tcp_send_sock(struct ovpn_peer *peer, struct sock *sk)
        peer->tcp.tx_in_progress = true;
 
        do {
-               int ret = skb_send_sock_locked(sk, skb,
-                                              peer->tcp.out_msg.offset,
-                                              peer->tcp.out_msg.len);
+               flags = ovpn_skb_cb(skb)->nosignal ? MSG_NOSIGNAL : 0;
+               ret = skb_send_sock_locked_with_flags(sk, skb,
+                                                     peer->tcp.out_msg.offset,
+                                                     peer->tcp.out_msg.len,
+                                                     flags);
                if (unlikely(ret < 0)) {
                        if (ret == -EAGAIN)
                                goto out;
@@ -380,7 +383,7 @@ static int ovpn_tcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size)
        rcu_read_unlock();
        peer = sock->peer;
 
-       if (msg->msg_flags & ~MSG_DONTWAIT) {
+       if (msg->msg_flags & ~(MSG_DONTWAIT | MSG_NOSIGNAL)) {
                ret = -EOPNOTSUPP;
                goto peer_free;
        }
@@ -413,6 +416,7 @@ static int ovpn_tcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size)
                goto peer_free;
        }
 
+       ovpn_skb_cb(skb)->nosignal = msg->msg_flags & MSG_NOSIGNAL;
        ovpn_tcp_send_sock_skb(peer, sk, skb);
        ret = size;
 peer_free: