skb: make drop reason booleanable
authorJakub Kicinski <kuba@kernel.org>
Tue, 8 Mar 2022 00:44:21 +0000 (16:44 -0800)
committerDavid S. Miller <davem@davemloft.net>
Wed, 9 Mar 2022 11:22:58 +0000 (11:22 +0000)
We have a number of cases where function returns drop/no drop
decision as a boolean. Now that we want to report the reason
code as well we have to pass extra output arguments.

We can make the reason code evaluate correctly as bool.

I believe we're good to reorder the reasons as they are
reported to user space as strings.

Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Reviewed-by: David Ahern <dsahern@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/skbuff.h
include/net/tcp.h
net/ipv4/tcp.c
net/ipv4/tcp_ipv4.c
net/ipv6/tcp_ipv6.c

index 34f5722..26538ce 100644 (file)
@@ -314,6 +314,7 @@ struct sk_buff;
  * used to translate the reason to string.
  */
 enum skb_drop_reason {
+       SKB_NOT_DROPPED_YET = 0,
        SKB_DROP_REASON_NOT_SPECIFIED,  /* drop reason is not specified */
        SKB_DROP_REASON_NO_SOCKET,      /* socket not found */
        SKB_DROP_REASON_PKT_TOO_SMALL,  /* packet size is too small */
index d486d7b..ee8237b 100644 (file)
@@ -1674,10 +1674,11 @@ tcp_md5_do_lookup(const struct sock *sk, int l3index,
                return NULL;
        return __tcp_md5_do_lookup(sk, l3index, addr, family);
 }
-bool tcp_inbound_md5_hash(const struct sock *sk, const struct sk_buff *skb,
-                         enum skb_drop_reason *reason,
-                         const void *saddr, const void *daddr,
-                         int family, int dif, int sdif);
+
+enum skb_drop_reason
+tcp_inbound_md5_hash(const struct sock *sk, const struct sk_buff *skb,
+                    const void *saddr, const void *daddr,
+                    int family, int dif, int sdif);
 
 
 #define tcp_twsk_md5_key(twsk) ((twsk)->tw_md5_key)
@@ -1688,13 +1689,13 @@ tcp_md5_do_lookup(const struct sock *sk, int l3index,
 {
        return NULL;
 }
-static inline bool tcp_inbound_md5_hash(const struct sock *sk,
-                                       const struct sk_buff *skb,
-                                       enum skb_drop_reason *reason,
-                                       const void *saddr, const void *daddr,
-                                       int family, int dif, int sdif)
+
+static inline enum skb_drop_reason
+tcp_inbound_md5_hash(const struct sock *sk, const struct sk_buff *skb,
+                    const void *saddr, const void *daddr,
+                    int family, int dif, int sdif);
 {
-       return false;
+       return SKB_NOT_DROPPED_YET;
 }
 #define tcp_twsk_md5_key(twsk) NULL
 #endif
index 33f2013..b5f0329 100644 (file)
@@ -4434,10 +4434,10 @@ int tcp_md5_hash_key(struct tcp_md5sig_pool *hp, const struct tcp_md5sig_key *ke
 EXPORT_SYMBOL(tcp_md5_hash_key);
 
 /* Called with rcu_read_lock() */
-bool tcp_inbound_md5_hash(const struct sock *sk, const struct sk_buff *skb,
-                         enum skb_drop_reason *reason,
-                         const void *saddr, const void *daddr,
-                         int family, int dif, int sdif)
+enum skb_drop_reason
+tcp_inbound_md5_hash(const struct sock *sk, const struct sk_buff *skb,
+                    const void *saddr, const void *daddr,
+                    int family, int dif, int sdif)
 {
        /*
         * This gets called for each TCP segment that arrives
@@ -4464,18 +4464,16 @@ bool tcp_inbound_md5_hash(const struct sock *sk, const struct sk_buff *skb,
 
        /* We've parsed the options - do we have a hash? */
        if (!hash_expected && !hash_location)
-               return false;
+               return SKB_NOT_DROPPED_YET;
 
        if (hash_expected && !hash_location) {
-               *reason = SKB_DROP_REASON_TCP_MD5NOTFOUND;
                NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPMD5NOTFOUND);
-               return true;
+               return SKB_DROP_REASON_TCP_MD5NOTFOUND;
        }
 
        if (!hash_expected && hash_location) {
-               *reason = SKB_DROP_REASON_TCP_MD5UNEXPECTED;
                NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPMD5UNEXPECTED);
-               return true;
+               return SKB_DROP_REASON_TCP_MD5UNEXPECTED;
        }
 
        /* check the signature */
@@ -4483,7 +4481,6 @@ bool tcp_inbound_md5_hash(const struct sock *sk, const struct sk_buff *skb,
                                                 NULL, skb);
 
        if (genhash || memcmp(hash_location, newhash, 16) != 0) {
-               *reason = SKB_DROP_REASON_TCP_MD5FAILURE;
                NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPMD5FAILURE);
                if (family == AF_INET) {
                        net_info_ratelimited("MD5 Hash failed for (%pI4, %d)->(%pI4, %d)%s L3 index %d\n",
@@ -4497,9 +4494,9 @@ bool tcp_inbound_md5_hash(const struct sock *sk, const struct sk_buff *skb,
                                        saddr, ntohs(th->source),
                                        daddr, ntohs(th->dest), l3index);
                }
-               return true;
+               return SKB_DROP_REASON_TCP_MD5FAILURE;
        }
-       return false;
+       return SKB_NOT_DROPPED_YET;
 }
 EXPORT_SYMBOL(tcp_inbound_md5_hash);
 
index 411357a..81694a3 100644 (file)
@@ -1965,9 +1965,10 @@ process:
                struct sock *nsk;
 
                sk = req->rsk_listener;
-               if (unlikely(tcp_inbound_md5_hash(sk, skb, &drop_reason,
-                                                 &iph->saddr, &iph->daddr,
-                                                 AF_INET, dif, sdif))) {
+               drop_reason = tcp_inbound_md5_hash(sk, skb,
+                                                  &iph->saddr, &iph->daddr,
+                                                  AF_INET, dif, sdif);
+               if (unlikely(drop_reason)) {
                        sk_drops_add(sk, skb);
                        reqsk_put(req);
                        goto discard_it;
@@ -2041,8 +2042,9 @@ process:
                goto discard_and_relse;
        }
 
-       if (tcp_inbound_md5_hash(sk, skb, &drop_reason, &iph->saddr,
-                                &iph->daddr, AF_INET, dif, sdif))
+       drop_reason = tcp_inbound_md5_hash(sk, skb, &iph->saddr,
+                                          &iph->daddr, AF_INET, dif, sdif);
+       if (drop_reason)
                goto discard_and_relse;
 
        nf_reset_ct(skb);
index cb2bb7d..13678d3 100644 (file)
@@ -1632,8 +1632,10 @@ process:
                struct sock *nsk;
 
                sk = req->rsk_listener;
-               if (tcp_inbound_md5_hash(sk, skb, &drop_reason, &hdr->saddr,
-                                        &hdr->daddr, AF_INET6, dif, sdif)) {
+               drop_reason = tcp_inbound_md5_hash(sk, skb,
+                                                  &hdr->saddr, &hdr->daddr,
+                                                  AF_INET6, dif, sdif);
+               if (drop_reason) {
                        sk_drops_add(sk, skb);
                        reqsk_put(req);
                        goto discard_it;
@@ -1704,8 +1706,9 @@ process:
                goto discard_and_relse;
        }
 
-       if (tcp_inbound_md5_hash(sk, skb, &drop_reason, &hdr->saddr,
-                                &hdr->daddr, AF_INET6, dif, sdif))
+       drop_reason = tcp_inbound_md5_hash(sk, skb, &hdr->saddr, &hdr->daddr,
+                                          AF_INET6, dif, sdif);
+       if (drop_reason)
                goto discard_and_relse;
 
        if (tcp_filter(sk, skb)) {