Subject: Re: vrf saddr selection

From: David Ahern <[email-masked]>
Date: Sat, 29 Aug 2015 16:43:27 -0700

On 8/29/15 4:40 PM, David Miller wrote:
>
> In the output path we go:
>
> 	struct flowi4 fl4 = {
> 		/* needed to match OIF rule */
> 		.flowi4_oif = vrf_dev->ifindex,
> 		.flowi4_iif = LOOPBACK_IFINDEX,
> 		.flowi4_tos = RT_TOS(ip4h->tos),
> 		.flowi4_flags = FLOWI_FLAG_ANYSRC | FLOWI_FLAG_VRFSRC,
> 		.daddr = ip4h->daddr,
> 	};
>
> 	if (vrf_send_v4_prep(skb, &fl4, vrf_dev))
> 		goto err;
>
> 	if (!ip4h->saddr) {
> 		ip4h->saddr = inet_select_addr(skb_dst(skb)->dev, 0,
> 					       RT_SCOPE_LINK);
> 	}
>
> So in the case where the source address is needed, this
> inet_select_addr() call looks like useless work.
>
> The route lookup already filled in fl4.saddr for you, why don't we
> just use that?
>

We will. My intention is to remove the udp_sendmsg change and fill in 
the saddr in the VRF driver. In the process a fixed version of the above 
snippet is used.

David