Message ID | 20230315154245.3405750-2-edumazet@google.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | inet: better const qualifier awareness | expand |
On Wed, Mar 15, 2023 at 03:42:38PM +0000, Eric Dumazet wrote: > We can change inet_sk() to propagate const qualifier of its argument. > > This should avoid some potential errors caused by accidental > (const -> not_const) promotion. > > Signed-off-by: Eric Dumazet <edumazet@google.com> Thanks Eric, very nice to see this kind of change. Reviewed-by: Simon Horman <simon.horman@corigine.com> ... > diff --git a/include/net/inet_sock.h b/include/net/inet_sock.h > index 51857117ac0995cee20c1e62752c470d2a473fa8..6eb8235be67f8b8265cd86782aed2b489e8850ee 100644 > --- a/include/net/inet_sock.h > +++ b/include/net/inet_sock.h > @@ -305,10 +305,11 @@ static inline struct sock *skb_to_full_sk(const struct sk_buff *skb) > return sk_to_full_sk(skb->sk); > } > > -static inline struct inet_sock *inet_sk(const struct sock *sk) > -{ > - return (struct inet_sock *)sk; > -} > +#define inet_sk(sk) \ > + _Generic(sk, \ nit: checkpatch tells me that There are spaces before tabs (before the '\') on the line above, and this macro uses spaces for indentation. > + const struct sock * : ((const struct inet_sock *)(sk)), \ > + struct sock * : ((struct inet_sock *)(sk)) \ > + ) > > static inline void __inet_sk_copy_descendant(struct sock *sk_to, > const struct sock *sk_from, ...
On Wed, 15 Mar 2023 15:42:38 +0000 Eric Dumazet wrote: > -static inline struct inet_sock *inet_sk(const struct sock *sk) > -{ > - return (struct inet_sock *)sk; > -} > +#define inet_sk(sk) \ > + _Generic(sk, \ > + const struct sock * : ((const struct inet_sock *)(sk)), \ > + struct sock * : ((struct inet_sock *)(sk)) \ > + ) Could we possibly use container_of_const() or define a new common macro for this downcast? I'm worried it will spread and it's a bit verbose. (I think Greg is constifying things too so let me add him and Linus.)
On Wed, Mar 15, 2023 at 2:28 PM Jakub Kicinski <kuba@kernel.org> wrote: > > On Wed, 15 Mar 2023 15:42:38 +0000 Eric Dumazet wrote: > > -static inline struct inet_sock *inet_sk(const struct sock *sk) > > -{ > > - return (struct inet_sock *)sk; > > -} > > +#define inet_sk(sk) \ > > + _Generic(sk, \ > > + const struct sock * : ((const struct inet_sock *)(sk)), \ > > + struct sock * : ((struct inet_sock *)(sk)) \ > > + ) > > Could we possibly use container_of_const() or define a new common > macro for this downcast? I'm worried it will spread and it's a bit > verbose. I did see container_of_const() but the default: case was not appealing to me. Maybe something like this? diff --git a/include/linux/container_of.h b/include/linux/container_of.h index 713890c867bea78804defe1a015e3c362f40f85d..9a24d8db1f4c46166c07589bb084eda9b9ede8ba 100644 --- a/include/linux/container_of.h +++ b/include/linux/container_of.h @@ -35,4 +35,10 @@ default: ((type *)container_of(ptr, type, member)) \ ) +#define promote_to_type(ptr, oldtype, newtype) \ + _Generic(ptr, \ + const oldtype *: ((const newtype *)(ptr)), \ + oldtype *: ((newtype *)(ptr)) \ + ) + #endif /* _LINUX_CONTAINER_OF_H */ diff --git a/include/net/inet_sock.h b/include/net/inet_sock.h index 6eb8235be67f8b8265cd86782aed2b489e8850ee..96f41b3c1a3e4b6ad1c6d2058ca46686be282c03 100644 --- a/include/net/inet_sock.h +++ b/include/net/inet_sock.h @@ -305,11 +305,7 @@ static inline struct sock *skb_to_full_sk(const struct sk_buff *skb) return sk_to_full_sk(skb->sk); } -#define inet_sk(sk) \ - _Generic(sk, \ - const struct sock * : ((const struct inet_sock *)(sk)), \ - struct sock * : ((struct inet_sock *)(sk)) \ - ) +#define inet_sk(sk) promote_to_type(sk, struct sock, struct inet_sock) static inline void __inet_sk_copy_descendant(struct sock *sk_to, const struct sock *sk_from,
On Wed, 15 Mar 2023 15:37:50 -0700 Eric Dumazet wrote: > I did see container_of_const() but the default: case was not appealing to me. > > Maybe something like this? > > diff --git a/include/linux/container_of.h b/include/linux/container_of.h > index 713890c867bea78804defe1a015e3c362f40f85d..9a24d8db1f4c46166c07589bb084eda9b9ede8ba > 100644 > --- a/include/linux/container_of.h > +++ b/include/linux/container_of.h > @@ -35,4 +35,10 @@ > default: ((type *)container_of(ptr, type, member)) \ > ) > > +#define promote_to_type(ptr, oldtype, newtype) \ > + _Generic(ptr, \ > + const oldtype *: ((const newtype *)(ptr)), \ > + oldtype *: ((newtype *)(ptr)) \ > + ) Perfect, I'll defer to you on whether you want to patch it on top or repost the series.
On Wed, Mar 15, 2023 at 4:08 PM Jakub Kicinski <kuba@kernel.org> wrote: > > On Wed, 15 Mar 2023 15:37:50 -0700 Eric Dumazet wrote: > > I did see container_of_const() but the default: case was not appealing to me. > > > > Maybe something like this? > > > > diff --git a/include/linux/container_of.h b/include/linux/container_of.h > > index 713890c867bea78804defe1a015e3c362f40f85d..9a24d8db1f4c46166c07589bb084eda9b9ede8ba > > 100644 > > --- a/include/linux/container_of.h > > +++ b/include/linux/container_of.h > > @@ -35,4 +35,10 @@ > > default: ((type *)container_of(ptr, type, member)) \ > > ) > > > > +#define promote_to_type(ptr, oldtype, newtype) \ > > + _Generic(ptr, \ > > + const oldtype *: ((const newtype *)(ptr)), \ > > + oldtype *: ((newtype *)(ptr)) \ > > + ) > > Perfect, I'll defer to you on whether you want to patch it on top > or repost the series. I'll post a v2 tomorrow, thank you.
On Wed, Mar 15, 2023 at 3:38 PM Eric Dumazet <edumazet@google.com> wrote: > > Maybe something like this? Please no. > +#define promote_to_type(ptr, oldtype, newtype) \ > + _Generic(ptr, \ > + const oldtype *: ((const newtype *)(ptr)), \ > + oldtype *: ((newtype *)(ptr)) \ > + ) That's just a very ugly way to just do a cast. It's wrong. > +#define inet_sk(sk) promote_to_type(sk, struct sock, struct inet_sock) This is horrid. Why isn't this just doing #define inet_sk(ptr) container_of(ptr, struct inet_sock, sk) which is different from a plain cast in that it actually checks that "yes, struct inet_sock has a member called 'sk' that has the right type, so now we can convert from that sk to the containing structure". That's very different from just randomly casting a pointer to another pointer, like the current inet_sk() does, and like that disgusting promote_to_type() macro does. We really strive for proper type safety in the kernel. And that very much means *not* doing random casts. At least that "inet_sk(sk)" version using generics didn't take random pointer types. But I really don't see why you don't just use "container_of()", which is actually type-safe, and would allow "struct inet_sock" to contain the "struct sock" somewhere else than in the first field. Hmm? Am I missing something that is happening in linux-next? Linus
On Wed, Mar 15, 2023 at 4:21 PM Linus Torvalds <torvalds@linux-foundation.org> wrote: > > On Wed, Mar 15, 2023 at 3:38 PM Eric Dumazet <edumazet@google.com> wrote: > > > > Maybe something like this? > > Please no. > > > +#define promote_to_type(ptr, oldtype, newtype) \ > > + _Generic(ptr, \ > > + const oldtype *: ((const newtype *)(ptr)), \ > > + oldtype *: ((newtype *)(ptr)) \ > > + ) > > That's just a very ugly way to just do a cast. It's wrong. > > > +#define inet_sk(sk) promote_to_type(sk, struct sock, struct inet_sock) > > This is horrid. > > Why isn't this just doing > > #define inet_sk(ptr) container_of(ptr, struct inet_sock, sk) > > which is different from a plain cast in that it actually checks that > "yes, struct inet_sock has a member called 'sk' that has the right > type, so now we can convert from that sk to the containing structure". > > That's very different from just randomly casting a pointer to another > pointer, like the current inet_sk() does, and like that disgusting > promote_to_type() macro does. > > We really strive for proper type safety in the kernel. And that very > much means *not* doing random casts. > > At least that "inet_sk(sk)" version using generics didn't take random > pointer types. But I really don't see why you don't just use > "container_of()", which is actually type-safe, and would allow "struct > inet_sock" to contain the "struct sock" somewhere else than in the > first field. > > Hmm? Am I missing something that is happening in linux-next? Yep. my goal was to have const awareness. https://patchwork.kernel.org/project/netdevbpf/patch/20230315154245.3405750-2-edumazet@google.com/ (and whole series in https://patchwork.kernel.org/project/netdevbpf/list/?series=730398&state=* ) This: #define inet_sk(ptr) container_of(ptr, struct inet_sock, sk) does not really cover what I wanted, does it ? > > Linus
On Wed, Mar 15, 2023 at 4:21 PM Linus Torvalds <torvalds@linux-foundation.org> wrote: > > But I really don't see why you don't just use > "container_of()", which is actually type-safe, and would allow "struct > inet_sock" to contain the "struct sock" somewhere else than in the > first field. I guess that doesn't work, because of how sk_alloc() and friends are set up. But I do think the networking code should strive to avoid those "randomly cast one socket type to another". For example, when you have a TCP socket, instead of casting from "struct sock *" to "struct tcp_sock *" in tcp_sk(), and getting it all wrong wrt const, I think you should do the same thing: #define tcp_sock(ptr) container_of(ptr, struct tcp_sock, inet_conn.icsk_inet.sk) to really *show* that you know that "yes, struct tcp_sock contains a 'sk' embedded three structures down!". And no, I did not actually *test* that at all. But it should get 'const' right (because container_of() gets const right these days), _and_ it actually verifies that the type you claim has another type embedded in it actually does so. Linus
On Wed, Mar 15, 2023 at 4:40 PM Linus Torvalds <torvalds@linux-foundation.org> wrote: > > On Wed, Mar 15, 2023 at 4:21 PM Linus Torvalds > <torvalds@linux-foundation.org> wrote: > > > > But I really don't see why you don't just use > > "container_of()", which is actually type-safe, and would allow "struct > > inet_sock" to contain the "struct sock" somewhere else than in the > > first field. > > I guess that doesn't work, because of how sk_alloc() and friends are set up. > > But I do think the networking code should strive to avoid those > "randomly cast one socket type to another". Note that my v1 proposed this thing: #define inet_sk(sk) \ + _Generic(sk, \ + const struct sock * : ((const struct inet_sock *)(sk)), \ + struct sock * : ((struct inet_sock *)(sk)) \ + ) Jakub feedback was to instead use a common helper, and CCed you on the discussion. I do not see yet how to do this 'without cast' Let me know if you are ok with the v1 approach. > > For example, when you have a TCP socket, instead of casting from > "struct sock *" to "struct tcp_sock *" in tcp_sk(), and getting it all > wrong wrt const, I think you should do the same thing: > > #define tcp_sock(ptr) container_of(ptr, struct tcp_sock, > inet_conn.icsk_inet.sk) > > to really *show* that you know that "yes, struct tcp_sock contains a > 'sk' embedded three structures down!". > > And no, I did not actually *test* that at all. But it should get > 'const' right (because container_of() gets const right these days), > _and_ it actually verifies that the type you claim has another type > embedded in it actually does so. > > Linus
On Wed, Mar 15, 2023 at 4:37 PM Eric Dumazet <edumazet@google.com> wrote: > > Yep. my goal was to have const awareness. > > This: > > #define inet_sk(ptr) container_of(ptr, struct inet_sock, sk) > > does not really cover what I wanted, does it ? Ugh. You should use "container_of_const()" of course. I *thought* we already fixed plain "container_of()" to do the right thing,, and got rid of "container_of_const()", but that was obviously in my dreams. Linus
On Wed, Mar 15, 2023 at 4:46 PM Eric Dumazet <edumazet@google.com> wrote: > > Note that my v1 proposed this thing: > > #define inet_sk(sk) \ > + _Generic(sk, \ > + const struct sock * : ((const struct inet_sock *)(sk)), \ > + struct sock * : ((struct inet_sock *)(sk)) \ > + ) Right. That was better. But: > Jakub feedback was to instead use a common helper, and CCed you on the > discussion. > I do not see yet how to do this 'without cast' That's _exactly_ what container_of_const() does. I actually would want to make "container_of()" itself do that correctly, but we clearly have too many broken cases as-is, so 'container_of_const' it is. Linus
On Wed, Mar 15, 2023 at 4:54 PM Linus Torvalds <torvalds@linux-foundation.org> wrote: > > On Wed, Mar 15, 2023 at 4:46 PM Eric Dumazet <edumazet@google.com> wrote: > > > > Note that my v1 proposed this thing: > > > > #define inet_sk(sk) \ > > + _Generic(sk, \ > > + const struct sock * : ((const struct inet_sock *)(sk)), \ > > + struct sock * : ((struct inet_sock *)(sk)) \ > > + ) > > Right. That was better. > > But: > > > Jakub feedback was to instead use a common helper, and CCed you on the > > discussion. > > I do not see yet how to do this 'without cast' > > That's _exactly_ what container_of_const() does. > > I actually would want to make "container_of()" itself do that > correctly, but we clearly have too many broken cases as-is, so > 'container_of_const' it is. container_of_const() does not detect this bug at compile time, does it ? struct sk_buff *skb = ...; struct inet_sk *inet = inet_sk(skb);
On Wed, Mar 15, 2023 at 4:56 PM Eric Dumazet <edumazet@google.com> wrote: > > container_of_const() does not detect this bug at compile time, does it ? > > struct sk_buff *skb = ...; > > struct inet_sk *inet = inet_sk(skb); You didn't actually test it, did you? I get about 40 lines of error messages about how broken that is, starting with ./include/linux/build_bug.h:78:41: error: static assertion failed: "pointer type mismatch in container_of()" exactly because yes, 'container_of()' is very pissy indeed about bogus conversions. You can only convert a named member into a containing structure, and 'inet_sk' does not contain a member named 'sk' that is of type 'struct skb_buff'. Linus
On Wed, Mar 15, 2023 at 5:02 PM Linus Torvalds <torvalds@linux-foundation.org> wrote: > > On Wed, Mar 15, 2023 at 4:56 PM Eric Dumazet <edumazet@google.com> wrote: > > > > container_of_const() does not detect this bug at compile time, does it ? > > > > struct sk_buff *skb = ...; > > > > struct inet_sk *inet = inet_sk(skb); > > You didn't actually test it, did you? I thought I did, sorry. I will spend more time on it. > > I get about 40 lines of error messages about how broken that is, starting with > > ./include/linux/build_bug.h:78:41: error: static assertion failed: > "pointer type mismatch in container_of()" > > exactly because yes, 'container_of()' is very pissy indeed about bogus > conversions. > > You can only convert a named member into a containing structure, and > 'inet_sk' does not contain a member named 'sk' that is of type 'struct > skb_buff'. > > Linus
On Wed, Mar 15, 2023 at 5:11 PM Eric Dumazet <edumazet@google.com> wrote: > > On Wed, Mar 15, 2023 at 5:02 PM Linus Torvalds > <torvalds@linux-foundation.org> wrote: > > > > On Wed, Mar 15, 2023 at 4:56 PM Eric Dumazet <edumazet@google.com> wrote: > > > > > > container_of_const() does not detect this bug at compile time, does it ? > > > > > > struct sk_buff *skb = ...; > > > > > > struct inet_sk *inet = inet_sk(skb); > > > > You didn't actually test it, did you? > > I thought I did, sorry. I will spend more time on it. Oh I might have been fooled, because of course we can not use sk for the macro parameter name. -ENOTENOUGHSLEEP Basically something like this should work just fine diff --git a/include/net/inet_sock.h b/include/net/inet_sock.h index 6eb8235be67f8b8265cd86782aed2b489e8850ee..caa20a9055310f5ef108f9b1bb43214a3d598b9e 100644 --- a/include/net/inet_sock.h +++ b/include/net/inet_sock.h @@ -305,11 +305,7 @@ static inline struct sock *skb_to_full_sk(const struct sk_buff *skb) return sk_to_full_sk(skb->sk); } -#define inet_sk(sk) \ - _Generic(sk, \ - const struct sock * : ((const struct inet_sock *)(sk)), \ - struct sock * : ((struct inet_sock *)(sk)) \ - ) +#define inet_sk(ptr) container_of_const(ptr, struct inet_sock, sk) static inline void __inet_sk_copy_descendant(struct sock *sk_to, const struct sock *sk_from,
On Wed, Mar 15, 2023 at 5:23 PM Eric Dumazet <edumazet@google.com> wrote: > > Oh I might have been fooled, because of course we can not use sk for > the macro parameter name. Heh. Yeah, that will rename the 'sk' member name too, and cause some *very* strange errors. > Basically something like this should work just fine Yup. I'm testing it on the current git tree, and I'm finding a number of random issues, but it looks manageable. Attached is what I ended up with. You have presumably already fixed these issues in your tree. Btw, it's very much things like 'tcp_sk()' too, and doing that with #define tcp_sk(ptr) container_of_const(ptr, struct tcp_sock, inet_conn.icsk_inet.sk) actually shows some fundamental problems. For example, we have tcp_synq_overflow() that takes a const sk pointer, but then it does WRITE_ONCE(tcp_sk(sk)->rx_opt.ts_recent_stamp, now); which is a big no-no and writes to that sock thing. I didn't even try any of the other 'xyzzy_sk()' conversions. Linus
diff --git a/include/net/inet_sock.h b/include/net/inet_sock.h index 51857117ac0995cee20c1e62752c470d2a473fa8..6eb8235be67f8b8265cd86782aed2b489e8850ee 100644 --- a/include/net/inet_sock.h +++ b/include/net/inet_sock.h @@ -305,10 +305,11 @@ static inline struct sock *skb_to_full_sk(const struct sk_buff *skb) return sk_to_full_sk(skb->sk); } -static inline struct inet_sock *inet_sk(const struct sock *sk) -{ - return (struct inet_sock *)sk; -} +#define inet_sk(sk) \ + _Generic(sk, \ + const struct sock * : ((const struct inet_sock *)(sk)), \ + struct sock * : ((struct inet_sock *)(sk)) \ + ) static inline void __inet_sk_copy_descendant(struct sock *sk_to, const struct sock *sk_from, diff --git a/include/trace/events/sock.h b/include/trace/events/sock.h index 03d19fc562f872d68cfb2349797f0924cfba718b..fd206a6ab5b85a8eb50fc9303abc28d74c50ea07 100644 --- a/include/trace/events/sock.h +++ b/include/trace/events/sock.h @@ -158,7 +158,7 @@ TRACE_EVENT(inet_sock_set_state, ), TP_fast_assign( - struct inet_sock *inet = inet_sk(sk); + const struct inet_sock *inet = inet_sk(sk); struct in6_addr *pin6; __be32 *p32; @@ -222,7 +222,7 @@ TRACE_EVENT(inet_sk_error_report, ), TP_fast_assign( - struct inet_sock *inet = inet_sk(sk); + const struct inet_sock *inet = inet_sk(sk); struct in6_addr *pin6; __be32 *p32; diff --git a/include/trace/events/tcp.h b/include/trace/events/tcp.h index 901b440238d5fc203b78cff1081b4b7e1e2eb4bd..bf06db8d2046c4a7f59070b724ce6fc7762f9d4b 100644 --- a/include/trace/events/tcp.h +++ b/include/trace/events/tcp.h @@ -67,7 +67,7 @@ DECLARE_EVENT_CLASS(tcp_event_sk_skb, ), TP_fast_assign( - struct inet_sock *inet = inet_sk(sk); + const struct inet_sock *inet = inet_sk(sk); __be32 *p32; __entry->skbaddr = skb; diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index e7bef36ce26f5b5e5503eaf14319b2465b779598..cb04dbad9ea474fcaa4b5ba31c4a37299c4e1a8d 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c @@ -129,7 +129,8 @@ int ip_local_out(struct net *net, struct sock *sk, struct sk_buff *skb) } EXPORT_SYMBOL_GPL(ip_local_out); -static inline int ip_select_ttl(struct inet_sock *inet, struct dst_entry *dst) +static inline int ip_select_ttl(const struct inet_sock *inet, + const struct dst_entry *dst) { int ttl = inet->uc_ttl; @@ -146,7 +147,7 @@ int ip_build_and_send_pkt(struct sk_buff *skb, const struct sock *sk, __be32 saddr, __be32 daddr, struct ip_options_rcu *opt, u8 tos) { - struct inet_sock *inet = inet_sk(sk); + const struct inet_sock *inet = inet_sk(sk); struct rtable *rt = skb_rtable(skb); struct net *net = sock_net(sk); struct iphdr *iph; diff --git a/net/ipv6/ping.c b/net/ipv6/ping.c index 808983bc2ec9f92be7d13237fb7d52b6423ccf23..c4835dbdfcff7912465713cdac9914b0f5585972 100644 --- a/net/ipv6/ping.c +++ b/net/ipv6/ping.c @@ -237,7 +237,7 @@ static int ping_v6_seq_show(struct seq_file *seq, void *v) seq_puts(seq, IPV6_SEQ_DGRAM_HEADER); } else { int bucket = ((struct ping_iter_state *) seq->private)->bucket; - struct inet_sock *inet = inet_sk(v); + struct inet_sock *inet = inet_sk((struct sock *)v); __u16 srcp = ntohs(inet->inet_sport); __u16 destp = ntohs(inet->inet_dport); ip6_dgram_sock_seq_show(seq, v, srcp, destp, bucket); diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index 9fb2f33ee3a76a09bbe15a9aaf1371a804f91ee2..ab4ae886235ac9557219c901c5041adfa8b026ef 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c @@ -1708,7 +1708,7 @@ int udp6_seq_show(struct seq_file *seq, void *v) seq_puts(seq, IPV6_SEQ_DGRAM_HEADER); } else { int bucket = ((struct udp_iter_state *)seq->private)->bucket; - struct inet_sock *inet = inet_sk(v); + const struct inet_sock *inet = inet_sk((const struct sock *)v); __u16 srcp = ntohs(inet->inet_sport); __u16 destp = ntohs(inet->inet_dport); __ip6_dgram_sock_seq_show(seq, v, srcp, destp, diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c index 8a9656248b0f09e78ebf3d6d787449f33505b81f..5cef4d3d21ac824ab6d3a5ee8be3bd00cce63925 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -1046,7 +1046,7 @@ static int mptcp_getsockopt_tcpinfo(struct mptcp_sock *msk, char __user *optval, static void mptcp_get_sub_addrs(const struct sock *sk, struct mptcp_subflow_addrs *a) { - struct inet_sock *inet = inet_sk(sk); + const struct inet_sock *inet = inet_sk(sk); memset(a, 0, sizeof(*a)); diff --git a/security/lsm_audit.c b/security/lsm_audit.c index a7355b4b9bb86d173f94e43109148bc0ea27d1b3..00d3bdd386e294ecd562bfa8ce502bf179ad32d9 100644 --- a/security/lsm_audit.c +++ b/security/lsm_audit.c @@ -317,7 +317,7 @@ static void dump_common_audit_data(struct audit_buffer *ab, switch (sk->sk_family) { case AF_INET: { - struct inet_sock *inet = inet_sk(sk); + const struct inet_sock *inet = inet_sk(sk); print_ipv4_addr(ab, inet->inet_rcv_saddr, inet->inet_sport, @@ -329,7 +329,7 @@ static void dump_common_audit_data(struct audit_buffer *ab, } #if IS_ENABLED(CONFIG_IPV6) case AF_INET6: { - struct inet_sock *inet = inet_sk(sk); + const struct inet_sock *inet = inet_sk(sk); print_ipv6_addr(ab, &sk->sk_v6_rcv_saddr, inet->inet_sport,
We can change inet_sk() to propagate const qualifier of its argument. This should avoid some potential errors caused by accidental (const -> not_const) promotion. Signed-off-by: Eric Dumazet <edumazet@google.com> --- include/net/inet_sock.h | 9 +++++---- include/trace/events/sock.h | 4 ++-- include/trace/events/tcp.h | 2 +- net/ipv4/ip_output.c | 5 +++-- net/ipv6/ping.c | 2 +- net/ipv6/udp.c | 2 +- net/mptcp/sockopt.c | 2 +- security/lsm_audit.c | 4 ++-- 8 files changed, 16 insertions(+), 14 deletions(-)