[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <1500997121-3218-2-git-send-email-dsahern@gmail.com>
Date: Tue, 25 Jul 2017 08:38:32 -0700
From: David Ahern <dsahern@...il.com>
To: netdev@...r.kernel.org
Cc: David Ahern <dsahern@...il.com>
Subject: [RFC PATCH 01/10] net: Add sk_lookup struct and helper
Consolidate the socket lookup args into a struct.
Add helper that compares sk_bound_dev_if for a socket to the lookup
parameters.
Signed-off-by: David Ahern <dsahern@...il.com>
---
include/net/sock.h | 38 ++++++++++++++++++++++++++++++++++++++
1 file changed, 38 insertions(+)
diff --git a/include/net/sock.h b/include/net/sock.h
index 7c0632c7e870..a2db5fd30192 100644
--- a/include/net/sock.h
+++ b/include/net/sock.h
@@ -491,6 +491,44 @@ enum sk_pacing {
#define rcu_dereference_sk_user_data(sk) rcu_dereference(__sk_user_data((sk)))
#define rcu_assign_sk_user_data(sk, ptr) rcu_assign_pointer(__sk_user_data((sk)), ptr)
+/* used for socket lookups */
+struct sk_lookup {
+ union {
+ const struct in6_addr *ipv6;
+ __be32 ipv4;
+ } saddr;
+ union {
+ const struct in6_addr *ipv6;
+ __be32 ipv4;
+ } daddr;
+
+ __be16 sport;
+ __be16 dport;
+ unsigned short hnum;
+
+ int dif;
+ bool exact_dif;
+};
+
+/* Compare sk_bound_dev_if to socket lookup dif
+ * Returns:
+ * -1 exact dif required and not met
+ * 0 sk_bound_dev_if is either not set or does not match
+ * 1 sk_bound_dev_if is set and matches dif
+ */
+static inline int sk_lookup_device_cmp(const struct sock *sk,
+ const struct sk_lookup *params)
+{
+ /* exact_dif true == l3mdev case */
+ if (params->exact_dif && sk->sk_bound_dev_if != params->dif)
+ return -1;
+
+ if (sk->sk_bound_dev_if && sk->sk_bound_dev_if == params->dif)
+ return 1;
+
+ return 0;
+}
+
/*
* SK_CAN_REUSE and SK_NO_REUSE on a socket mean that the socket is OK
* or not whether his port will be reused by someone else. SK_FORCE_REUSE
--
2.1.4
Powered by blists - more mailing lists