rstreason: prepare for passive reset
authorJason Xing <kernelxing@tencent.com>
Thu, 25 Apr 2024 03:13:35 +0000 (11:13 +0800)
committerPaolo Abeni <pabeni@redhat.com>
Fri, 26 Apr 2024 13:34:00 +0000 (15:34 +0200)
Adjust the parameter and support passing reason of reset which
is for now NOT_SPECIFIED. No functional changes.

Signed-off-by: Jason Xing <kernelxing@tencent.com>
Acked-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
include/net/request_sock.h
net/dccp/ipv4.c
net/dccp/ipv6.c
net/dccp/minisocks.c
net/ipv4/tcp_ipv4.c
net/ipv4/tcp_minisocks.c
net/ipv6/tcp_ipv6.c
net/mptcp/subflow.c

index 004e651e6067e723ee2e3fc6d80474e4f9c1c1ba..bdc737832da66a1eb5c50928e67d45d8b58d7b8e 100644 (file)
@@ -18,6 +18,7 @@
 #include <linux/refcount.h>
 
 #include <net/sock.h>
+#include <net/rstreason.h>
 
 struct request_sock;
 struct sk_buff;
@@ -34,7 +35,8 @@ struct request_sock_ops {
        void            (*send_ack)(const struct sock *sk, struct sk_buff *skb,
                                    struct request_sock *req);
        void            (*send_reset)(const struct sock *sk,
-                                     struct sk_buff *skb);
+                                     struct sk_buff *skb,
+                                     enum sk_rst_reason reason);
        void            (*destructor)(struct request_sock *req);
        void            (*syn_ack_timeout)(const struct request_sock *req);
 };
index 9fc9cea4c251bfb94904f1ba3b42f54fd9195dd0..ff41bd6f99c31c35cb8c94adc5a8cb658bd3a519 100644 (file)
@@ -24,6 +24,7 @@
 #include <net/xfrm.h>
 #include <net/secure_seq.h>
 #include <net/netns/generic.h>
+#include <net/rstreason.h>
 
 #include "ackvec.h"
 #include "ccid.h"
@@ -521,7 +522,8 @@ out:
        return err;
 }
 
-static void dccp_v4_ctl_send_reset(const struct sock *sk, struct sk_buff *rxskb)
+static void dccp_v4_ctl_send_reset(const struct sock *sk, struct sk_buff *rxskb,
+                                  enum sk_rst_reason reason)
 {
        int err;
        const struct iphdr *rxiph;
@@ -706,7 +708,7 @@ int dccp_v4_do_rcv(struct sock *sk, struct sk_buff *skb)
        return 0;
 
 reset:
-       dccp_v4_ctl_send_reset(sk, skb);
+       dccp_v4_ctl_send_reset(sk, skb, SK_RST_REASON_NOT_SPECIFIED);
        kfree_skb(skb);
        return 0;
 }
@@ -869,7 +871,7 @@ lookup:
                if (nsk == sk) {
                        reqsk_put(req);
                } else if (dccp_child_process(sk, nsk, skb)) {
-                       dccp_v4_ctl_send_reset(sk, skb);
+                       dccp_v4_ctl_send_reset(sk, skb, SK_RST_REASON_NOT_SPECIFIED);
                        goto discard_and_relse;
                } else {
                        sock_put(sk);
@@ -909,7 +911,7 @@ no_dccp_socket:
        if (dh->dccph_type != DCCP_PKT_RESET) {
                DCCP_SKB_CB(skb)->dccpd_reset_code =
                                        DCCP_RESET_CODE_NO_CONNECTION;
-               dccp_v4_ctl_send_reset(sk, skb);
+               dccp_v4_ctl_send_reset(sk, skb, SK_RST_REASON_NOT_SPECIFIED);
        }
 
 discard_it:
index c8ca703dc331a1a030e380daba7bcf6d382d79d6..85f4b8fdbe5e08ffb7a0ee82347cb73d90a21bd7 100644 (file)
@@ -29,6 +29,7 @@
 #include <net/secure_seq.h>
 #include <net/netns/generic.h>
 #include <net/sock.h>
+#include <net/rstreason.h>
 
 #include "dccp.h"
 #include "ipv6.h"
@@ -256,7 +257,8 @@ static void dccp_v6_reqsk_destructor(struct request_sock *req)
        kfree_skb(inet_rsk(req)->pktopts);
 }
 
-static void dccp_v6_ctl_send_reset(const struct sock *sk, struct sk_buff *rxskb)
+static void dccp_v6_ctl_send_reset(const struct sock *sk, struct sk_buff *rxskb,
+                                  enum sk_rst_reason reason)
 {
        const struct ipv6hdr *rxip6h;
        struct sk_buff *skb;
@@ -656,7 +658,7 @@ static int dccp_v6_do_rcv(struct sock *sk, struct sk_buff *skb)
        return 0;
 
 reset:
-       dccp_v6_ctl_send_reset(sk, skb);
+       dccp_v6_ctl_send_reset(sk, skb, SK_RST_REASON_NOT_SPECIFIED);
 discard:
        if (opt_skb != NULL)
                __kfree_skb(opt_skb);
@@ -762,7 +764,7 @@ lookup:
                if (nsk == sk) {
                        reqsk_put(req);
                } else if (dccp_child_process(sk, nsk, skb)) {
-                       dccp_v6_ctl_send_reset(sk, skb);
+                       dccp_v6_ctl_send_reset(sk, skb, SK_RST_REASON_NOT_SPECIFIED);
                        goto discard_and_relse;
                } else {
                        sock_put(sk);
@@ -801,7 +803,7 @@ no_dccp_socket:
        if (dh->dccph_type != DCCP_PKT_RESET) {
                DCCP_SKB_CB(skb)->dccpd_reset_code =
                                        DCCP_RESET_CODE_NO_CONNECTION;
-               dccp_v6_ctl_send_reset(sk, skb);
+               dccp_v6_ctl_send_reset(sk, skb, SK_RST_REASON_NOT_SPECIFIED);
        }
 
 discard_it:
index 64d805b27addea27b3fb0b93fb27514a5ec0ae64..251a57cf58223b07a7a29e81e049532c46fe74e6 100644 (file)
@@ -15,6 +15,7 @@
 #include <net/sock.h>
 #include <net/xfrm.h>
 #include <net/inet_timewait_sock.h>
+#include <net/rstreason.h>
 
 #include "ackvec.h"
 #include "ccid.h"
@@ -202,7 +203,7 @@ struct sock *dccp_check_req(struct sock *sk, struct sk_buff *skb,
        DCCP_SKB_CB(skb)->dccpd_reset_code = DCCP_RESET_CODE_TOO_BUSY;
 drop:
        if (dccp_hdr(skb)->dccph_type != DCCP_PKT_RESET)
-               req->rsk_ops->send_reset(sk, skb);
+               req->rsk_ops->send_reset(sk, skb, SK_RST_REASON_NOT_SPECIFIED);
 
        inet_csk_reqsk_queue_drop(sk, req);
 out:
index e06f0cd04f7eee2b00fcaebe17cbd23c26f1d28f..202f6dfa958b74a1b7f0a5345d2f23e93726d858 100644 (file)
@@ -70,6 +70,7 @@
 #include <net/xfrm.h>
 #include <net/secure_seq.h>
 #include <net/busy_poll.h>
+#include <net/rstreason.h>
 
 #include <linux/inet.h>
 #include <linux/ipv6.h>
@@ -723,7 +724,8 @@ out:
  *     Exception: precedence violation. We do not implement it in any case.
  */
 
-static void tcp_v4_send_reset(const struct sock *sk, struct sk_buff *skb)
+static void tcp_v4_send_reset(const struct sock *sk, struct sk_buff *skb,
+                             enum sk_rst_reason reason)
 {
        const struct tcphdr *th = tcp_hdr(skb);
        struct {
@@ -1934,7 +1936,7 @@ int tcp_v4_do_rcv(struct sock *sk, struct sk_buff *skb)
        return 0;
 
 reset:
-       tcp_v4_send_reset(rsk, skb);
+       tcp_v4_send_reset(rsk, skb, SK_RST_REASON_NOT_SPECIFIED);
 discard:
        kfree_skb_reason(skb, reason);
        /* Be careful here. If this function gets more complicated and
@@ -2285,7 +2287,7 @@ lookup:
                } else {
                        drop_reason = tcp_child_process(sk, nsk, skb);
                        if (drop_reason) {
-                               tcp_v4_send_reset(nsk, skb);
+                               tcp_v4_send_reset(nsk, skb, SK_RST_REASON_NOT_SPECIFIED);
                                goto discard_and_relse;
                        }
                        sock_put(sk);
@@ -2364,7 +2366,7 @@ csum_error:
 bad_packet:
                __TCP_INC_STATS(net, TCP_MIB_INERRS);
        } else {
-               tcp_v4_send_reset(NULL, skb);
+               tcp_v4_send_reset(NULL, skb, SK_RST_REASON_NOT_SPECIFIED);
        }
 
 discard_it:
@@ -2416,7 +2418,7 @@ do_time_wait:
                tcp_v4_timewait_ack(sk, skb);
                break;
        case TCP_TW_RST:
-               tcp_v4_send_reset(sk, skb);
+               tcp_v4_send_reset(sk, skb, SK_RST_REASON_NOT_SPECIFIED);
                inet_twsk_deschedule_put(inet_twsk(sk));
                goto discard_it;
        case TCP_TW_SUCCESS:;
index 146c061145b4602082d149e65f8e6bbcf4bd311b..7d543569a1809909f5d9a17830de298cfb73205b 100644 (file)
@@ -22,6 +22,7 @@
 #include <net/tcp.h>
 #include <net/xfrm.h>
 #include <net/busy_poll.h>
+#include <net/rstreason.h>
 
 static bool tcp_in_window(u32 seq, u32 end_seq, u32 s_win, u32 e_win)
 {
@@ -878,7 +879,7 @@ embryonic_reset:
                 * avoid becoming vulnerable to outside attack aiming at
                 * resetting legit local connections.
                 */
-               req->rsk_ops->send_reset(sk, skb);
+               req->rsk_ops->send_reset(sk, skb, SK_RST_REASON_NOT_SPECIFIED);
        } else if (fastopen) { /* received a valid RST pkt */
                reqsk_fastopen_remove(sk, req, true);
                tcp_reset(sk, skb);
index bb7c3caf4f8536dabdcb3dbe7c90aff9c8985c90..017f6293b5f4617a5c459cd15a6b09047a254eea 100644 (file)
@@ -60,6 +60,7 @@
 #include <net/secure_seq.h>
 #include <net/hotdata.h>
 #include <net/busy_poll.h>
+#include <net/rstreason.h>
 
 #include <linux/proc_fs.h>
 #include <linux/seq_file.h>
@@ -69,7 +70,8 @@
 
 #include <trace/events/tcp.h>
 
-static void    tcp_v6_send_reset(const struct sock *sk, struct sk_buff *skb);
+static void tcp_v6_send_reset(const struct sock *sk, struct sk_buff *skb,
+                             enum sk_rst_reason reason);
 static void    tcp_v6_reqsk_send_ack(const struct sock *sk, struct sk_buff *skb,
                                      struct request_sock *req);
 
@@ -1008,7 +1010,8 @@ static void tcp_v6_send_response(const struct sock *sk, struct sk_buff *skb, u32
        kfree_skb(buff);
 }
 
-static void tcp_v6_send_reset(const struct sock *sk, struct sk_buff *skb)
+static void tcp_v6_send_reset(const struct sock *sk, struct sk_buff *skb,
+                             enum sk_rst_reason reason)
 {
        const struct tcphdr *th = tcp_hdr(skb);
        struct ipv6hdr *ipv6h = ipv6_hdr(skb);
@@ -1677,7 +1680,7 @@ int tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb)
        return 0;
 
 reset:
-       tcp_v6_send_reset(sk, skb);
+       tcp_v6_send_reset(sk, skb, SK_RST_REASON_NOT_SPECIFIED);
 discard:
        if (opt_skb)
                __kfree_skb(opt_skb);
@@ -1862,7 +1865,7 @@ lookup:
                } else {
                        drop_reason = tcp_child_process(sk, nsk, skb);
                        if (drop_reason) {
-                               tcp_v6_send_reset(nsk, skb);
+                               tcp_v6_send_reset(nsk, skb, SK_RST_REASON_NOT_SPECIFIED);
                                goto discard_and_relse;
                        }
                        sock_put(sk);
@@ -1939,7 +1942,7 @@ csum_error:
 bad_packet:
                __TCP_INC_STATS(net, TCP_MIB_INERRS);
        } else {
-               tcp_v6_send_reset(NULL, skb);
+               tcp_v6_send_reset(NULL, skb, SK_RST_REASON_NOT_SPECIFIED);
        }
 
 discard_it:
@@ -1995,7 +1998,7 @@ do_time_wait:
                tcp_v6_timewait_ack(sk, skb);
                break;
        case TCP_TW_RST:
-               tcp_v6_send_reset(sk, skb);
+               tcp_v6_send_reset(sk, skb, SK_RST_REASON_NOT_SPECIFIED);
                inet_twsk_deschedule_put(inet_twsk(sk));
                goto discard_it;
        case TCP_TW_SUCCESS:
index b94d1dca1094f44a0ce292facefb56e4e6adf7a5..32fe2ef36d56bc12150de763ff1edf9b86f74d23 100644 (file)
@@ -20,6 +20,8 @@
 #include <net/transp_v6.h>
 #endif
 #include <net/mptcp.h>
+#include <net/rstreason.h>
+
 #include "protocol.h"
 #include "mib.h"
 
@@ -308,7 +310,7 @@ static struct dst_entry *subflow_v4_route_req(const struct sock *sk,
 
        dst_release(dst);
        if (!req->syncookie)
-               tcp_request_sock_ops.send_reset(sk, skb);
+               tcp_request_sock_ops.send_reset(sk, skb, SK_RST_REASON_NOT_SPECIFIED);
        return NULL;
 }
 
@@ -376,7 +378,7 @@ static struct dst_entry *subflow_v6_route_req(const struct sock *sk,
 
        dst_release(dst);
        if (!req->syncookie)
-               tcp6_request_sock_ops.send_reset(sk, skb);
+               tcp6_request_sock_ops.send_reset(sk, skb, SK_RST_REASON_NOT_SPECIFIED);
        return NULL;
 }
 #endif
@@ -911,7 +913,7 @@ dispose_child:
        tcp_rsk(req)->drop_req = true;
        inet_csk_prepare_for_destroy_sock(child);
        tcp_done(child);
-       req->rsk_ops->send_reset(sk, skb);
+       req->rsk_ops->send_reset(sk, skb, SK_RST_REASON_NOT_SPECIFIED);
 
        /* The last child reference will be released by the caller */
        return child;