diff mbox

[RFC,1/7] fou: Get net from sock_net if dev_net unavailable

Message ID 1464043706-2843932-2-git-send-email-tom@herbertland.com
State RFC, archived
Delegated to: David Miller
Headers show

Commit Message

Tom Herbert May 23, 2016, 10:48 p.m. UTC
With the implementation of Transports over UDP fou and gue build header
may be called before skb->dev is set. This patch checks skb->dev and
if it is not set then tries to get net from sock_net.

Signed-off-by: Tom Herbert <tom@herbertland.com>
---
 net/ipv4/fou.c | 22 ++++++++++++++++++----
 1 file changed, 18 insertions(+), 4 deletions(-)

Comments

David Miller May 24, 2016, 10:01 p.m. UTC | #1
From: Tom Herbert <tom@herbertland.com>
Date: Mon, 23 May 2016 15:48:20 -0700

> diff --git a/net/ipv4/fou.c b/net/ipv4/fou.c
> index 5f9207c..96260c6 100644
> --- a/net/ipv4/fou.c
> +++ b/net/ipv4/fou.c
> @@ -807,13 +807,20 @@ int __fou_build_header(struct sk_buff *skb, struct ip_tunnel_encap *e,
>  		       u8 *protocol, __be16 *sport, int type)
>  {
>  	int err;
> +	struct net *net;
>  

Please order local variables from longest to shortest line.

>  	err = iptunnel_handle_offloads(skb, type);
>  	if (err)
>  		return err;
>  
> -	*sport = e->sport ? : udp_flow_src_port(dev_net(skb->dev),
> -						skb, 0, 0, false);
> +	if (skb->dev)
> +		net = dev_net(skb->dev);
> +	else if (skb->sk)
> +		net = sock_net(skb->sk);

This is getting rediculous.  Why not just put the net namespace pointer into
the tunnel encap object?
Tom Herbert May 24, 2016, 10:40 p.m. UTC | #2
On Tue, May 24, 2016 at 3:01 PM, David Miller <davem@davemloft.net> wrote:
> From: Tom Herbert <tom@herbertland.com>
> Date: Mon, 23 May 2016 15:48:20 -0700
>
>> diff --git a/net/ipv4/fou.c b/net/ipv4/fou.c
>> index 5f9207c..96260c6 100644
>> --- a/net/ipv4/fou.c
>> +++ b/net/ipv4/fou.c
>> @@ -807,13 +807,20 @@ int __fou_build_header(struct sk_buff *skb, struct ip_tunnel_encap *e,
>>                      u8 *protocol, __be16 *sport, int type)
>>  {
>>       int err;
>> +     struct net *net;
>>
>
> Please order local variables from longest to shortest line.
>
>>       err = iptunnel_handle_offloads(skb, type);
>>       if (err)
>>               return err;
>>
>> -     *sport = e->sport ? : udp_flow_src_port(dev_net(skb->dev),
>> -                                             skb, 0, 0, false);
>> +     if (skb->dev)
>> +             net = dev_net(skb->dev);
>> +     else if (skb->sk)
>> +             net = sock_net(skb->sk);
>
> This is getting rediculous.  Why not just put the net namespace pointer into
> the tunnel encap object?

Thanks, in this case it will be easier to just pass net in as an argument.

Tom
diff mbox

Patch

diff --git a/net/ipv4/fou.c b/net/ipv4/fou.c
index 5f9207c..96260c6 100644
--- a/net/ipv4/fou.c
+++ b/net/ipv4/fou.c
@@ -807,13 +807,20 @@  int __fou_build_header(struct sk_buff *skb, struct ip_tunnel_encap *e,
 		       u8 *protocol, __be16 *sport, int type)
 {
 	int err;
+	struct net *net;
 
 	err = iptunnel_handle_offloads(skb, type);
 	if (err)
 		return err;
 
-	*sport = e->sport ? : udp_flow_src_port(dev_net(skb->dev),
-						skb, 0, 0, false);
+	if (skb->dev)
+		net = dev_net(skb->dev);
+	else if (skb->sk)
+		net = sock_net(skb->sk);
+	else
+		return -EINVAL;
+
+	*sport = e->sport ? : udp_flow_src_port(net, skb, 0, 0, false);
 
 	return 0;
 }
@@ -845,6 +852,14 @@  int __gue_build_header(struct sk_buff *skb, struct ip_tunnel_encap *e,
 	void *data;
 	bool need_priv = false;
 	int err;
+	struct net *net;
+
+	if (skb->dev)
+		net = dev_net(skb->dev);
+	else if (skb->sk)
+		net = sock_net(skb->sk);
+	else
+		return -EINVAL;
 
 	if ((e->flags & TUNNEL_ENCAP_FLAG_REMCSUM) &&
 	    skb->ip_summed == CHECKSUM_PARTIAL) {
@@ -860,8 +875,7 @@  int __gue_build_header(struct sk_buff *skb, struct ip_tunnel_encap *e,
 		return err;
 
 	/* Get source port (based on flow hash) before skb_push */
-	*sport = e->sport ? : udp_flow_src_port(dev_net(skb->dev),
-						skb, 0, 0, false);
+	*sport = e->sport ? : udp_flow_src_port(net, skb, 0, 0, false);
 
 	hdrlen = sizeof(struct guehdr) + optlen;