mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/herbert/cryptodev-2.6.git
synced 2026-04-18 03:23:53 -04:00
ovpn: add support for MSG_NOSIGNAL in tcp_sendmsg
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>
This commit is contained in:
committed by
Paolo Abeni
parent
17240749f2
commit
36bb1d713a
@@ -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)
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user