]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
ip: IP cmsg cleanup
authorTom Herbert <therbert@google.com>
Mon, 5 Jan 2015 21:56:15 +0000 (13:56 -0800)
committerDavid S. Miller <davem@davemloft.net>
Tue, 6 Jan 2015 03:44:46 +0000 (22:44 -0500)
Move the IP_CMSG_* constants from ip_sockglue.c to inet_sock.h so that
they can be referenced in other source files.

Restructure ip_cmsg_recv to not go through flags using shift, check
for flags by 'and'. This eliminates both the shift and a conditional
per flag check.

Signed-off-by: Tom Herbert <therbert@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/inet_sock.h
net/ipv4/ip_sockglue.c

index 360b110b3e36267399b83decddb7290b1a81fafa..605ca421d5ab32f3ae46f6252eeaad1958fcea30 100644 (file)
@@ -16,7 +16,7 @@
 #ifndef _INET_SOCK_H
 #define _INET_SOCK_H
 
-
+#include <linux/bitops.h>
 #include <linux/kmemcheck.h>
 #include <linux/string.h>
 #include <linux/types.h>
@@ -195,6 +195,15 @@ struct inet_sock {
 #define IPCORK_OPT     1       /* ip-options has been held in ipcork.opt */
 #define IPCORK_ALLFRAG 2       /* always fragment (for ipv6 for now) */
 
+/* cmsg flags for inet */
+#define IP_CMSG_PKTINFO                BIT(0)
+#define IP_CMSG_TTL            BIT(1)
+#define IP_CMSG_TOS            BIT(2)
+#define IP_CMSG_RECVOPTS       BIT(3)
+#define IP_CMSG_RETOPTS                BIT(4)
+#define IP_CMSG_PASSSEC                BIT(5)
+#define IP_CMSG_ORIGDSTADDR    BIT(6)
+
 static inline struct inet_sock *inet_sk(const struct sock *sk)
 {
        return (struct inet_sock *)sk;
index 8a89c738b7a3b43407293f521bd6d7e009ee7c80..80f78565b41b5d0149549a322be52d815004b2a6 100644 (file)
 #include <linux/errqueue.h>
 #include <asm/uaccess.h>
 
-#define IP_CMSG_PKTINFO                1
-#define IP_CMSG_TTL            2
-#define IP_CMSG_TOS            4
-#define IP_CMSG_RECVOPTS       8
-#define IP_CMSG_RETOPTS                16
-#define IP_CMSG_PASSSEC                32
-#define IP_CMSG_ORIGDSTADDR     64
-
 /*
  *     SOL_IP control messages.
  */
@@ -150,37 +142,55 @@ void ip_cmsg_recv(struct msghdr *msg, struct sk_buff *skb)
        unsigned int flags = inet->cmsg_flags;
 
        /* Ordered by supposed usage frequency */
-       if (flags & 1)
+       if (flags & IP_CMSG_PKTINFO) {
                ip_cmsg_recv_pktinfo(msg, skb);
-       if ((flags >>= 1) == 0)
-               return;
 
-       if (flags & 1)
+               flags &= ~IP_CMSG_PKTINFO;
+               if (!flags)
+                       return;
+       }
+
+       if (flags & IP_CMSG_TTL) {
                ip_cmsg_recv_ttl(msg, skb);
-       if ((flags >>= 1) == 0)
-               return;
 
-       if (flags & 1)
+               flags &= ~IP_CMSG_TTL;
+               if (!flags)
+                       return;
+       }
+
+       if (flags & IP_CMSG_TOS) {
                ip_cmsg_recv_tos(msg, skb);
-       if ((flags >>= 1) == 0)
-               return;
 
-       if (flags & 1)
+               flags &= ~IP_CMSG_TOS;
+               if (!flags)
+                       return;
+       }
+
+       if (flags & IP_CMSG_RECVOPTS) {
                ip_cmsg_recv_opts(msg, skb);
-       if ((flags >>= 1) == 0)
-               return;
 
-       if (flags & 1)
+               flags &= ~IP_CMSG_RECVOPTS;
+               if (!flags)
+                       return;
+       }
+
+       if (flags & IP_CMSG_RETOPTS) {
                ip_cmsg_recv_retopts(msg, skb);
-       if ((flags >>= 1) == 0)
-               return;
 
-       if (flags & 1)
+               flags &= ~IP_CMSG_RETOPTS;
+               if (!flags)
+                       return;
+       }
+
+       if (flags & IP_CMSG_PASSSEC) {
                ip_cmsg_recv_security(msg, skb);
 
-       if ((flags >>= 1) == 0)
-               return;
-       if (flags & 1)
+               flags &= ~IP_CMSG_PASSSEC;
+               if (!flags)
+                       return;
+       }
+
+       if (flags & IP_CMSG_ORIGDSTADDR)
                ip_cmsg_recv_dstaddr(msg, skb);
 
 }