netdev
[Top] [All Lists]

Re: [patch] clean up tcp_sk(), 2.6.0

To: "David S. Miller" <davem@xxxxxxxxxx>
Subject: Re: [patch] clean up tcp_sk(), 2.6.0
From: Ingo Molnar <mingo@xxxxxxx>
Date: Wed, 31 Dec 2003 11:12:07 +0100
Cc: linux-kernel@xxxxxxxxxxxxxxx, netdev@xxxxxxxxxxx
In-reply-to: <20031230144608.4c7e66f2.davem@xxxxxxxxxx>
References: <20031230163230.GA12553@xxxxxxx> <20031230144608.4c7e66f2.davem@xxxxxxxxxx>
Sender: netdev-bounce@xxxxxxxxxxx
User-agent: Mutt/1.4.1i
* David S. Miller <davem@xxxxxxxxxx> wrote:

> On Tue, 30 Dec 2003 17:32:30 +0100
> Ingo Molnar <mingo@xxxxxxx> wrote:
> 
> > i recently wasted a few hours on a bug where i used "tcp_sk(sock)"
> > instead of "tcp_sk(sock->sk)" - the former, while being blatantly
> > incorrect, compiles just fine on 2.6.0. The patch below is equivalent to
> > the define but is also type-safe. Compiles cleanly & boots fine on
> > 2.6.0.
> 
> Applied, and I'll happily accept patches for udp_sk() and all
> the other ones too :)

sure - patch for udp_sk, inet6_sk/raw6_sk and inet_sk attached. Compiles
cleanly and boots. The inet_sk one uncovered a couple of other bugs in
my code. (The other defines for protocol-private sockets seem to be safe
because they all use ->sk_protinfo which forces the type.)

        Ingo

--- linux/include/linux/udp.h.orig
+++ linux/include/linux/udp.h
@@ -60,7 +60,10 @@ struct udp_sock {
        struct udp_opt    udp;
 };
 
-#define udp_sk(__sk) (&((struct udp_sock *)__sk)->udp)
+static inline struct udp_opt * udp_sk(const struct sock *__sk)
+{
+       return &((struct udp_sock *)__sk)->udp;
+}
 
 #endif
 
--- linux/include/linux/ipv6.h.orig
+++ linux/include/linux/ipv6.h
@@ -270,8 +270,15 @@ struct tcp6_sock {
        struct ipv6_pinfo inet6;
 };
 
-#define inet6_sk(__sk) ((struct raw6_sock *)__sk)->pinet6
-#define raw6_sk(__sk) (&((struct raw6_sock *)__sk)->raw6)
+static inline struct ipv6_pinfo * inet6_sk(const struct sock *__sk)
+{
+       return ((struct raw6_sock *)__sk)->pinet6;
+}
+
+static inline struct raw6_opt * raw6_sk(const struct sock *__sk)
+{
+       return &((struct raw6_sock *)__sk)->raw6;
+}
 
 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
 #define __ipv6_only_sock(sk)   (inet6_sk(sk)->ipv6only)
--- linux/include/linux/ip.h.orig
+++ linux/include/linux/ip.h
@@ -159,7 +159,10 @@ struct inet_sock {
        struct inet_opt   inet;
 };
 
-#define inet_sk(__sk) (&((struct inet_sock *)__sk)->inet)
+static inline struct inet_opt * inet_sk(const struct sock *__sk)
+{
+       return &((struct inet_sock *)__sk)->inet;
+}
 
 #endif
 

<Prev in Thread] Current Thread [Next in Thread>