net: vrf: Implement get_saddr for IPv6
IPv6 source address selection needs to consider the real egress route. Similar to IPv4 implement a get_saddr6 method which is called if source address has not been set. The get_saddr6 method does a full lookup which means pulling a route from the VRF FIB table and properly considering linklocal/multicast destination addresses. Lookup failures (eg., unreachable) then cause the source address selection to fail which gets propagated back to the caller. Signed-off-by: David Ahern <dsa@cumulusnetworks.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
a2e2ff560f
commit
0d240e7811
@@ -39,6 +39,9 @@ struct l3mdev_ops {
|
||||
/* IPv6 ops */
|
||||
struct dst_entry * (*l3mdev_get_rt6_dst)(const struct net_device *dev,
|
||||
struct flowi6 *fl6);
|
||||
int (*l3mdev_get_saddr6)(struct net_device *dev,
|
||||
const struct sock *sk,
|
||||
struct flowi6 *fl6);
|
||||
};
|
||||
|
||||
#ifdef CONFIG_NET_L3_MASTER_DEV
|
||||
@@ -140,6 +143,8 @@ static inline bool netif_index_is_l3_master(struct net *net, int ifindex)
|
||||
int l3mdev_get_saddr(struct net *net, int ifindex, struct flowi4 *fl4);
|
||||
|
||||
struct dst_entry *l3mdev_get_rt6_dst(struct net *net, struct flowi6 *fl6);
|
||||
int l3mdev_get_saddr6(struct net *net, const struct sock *sk,
|
||||
struct flowi6 *fl6);
|
||||
|
||||
static inline
|
||||
struct sk_buff *l3mdev_l3_rcv(struct sk_buff *skb, u16 proto)
|
||||
@@ -230,6 +235,12 @@ struct dst_entry *l3mdev_get_rt6_dst(struct net *net, struct flowi6 *fl6)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline int l3mdev_get_saddr6(struct net *net, const struct sock *sk,
|
||||
struct flowi6 *fl6)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline
|
||||
struct sk_buff *l3mdev_ip_rcv(struct sk_buff *skb)
|
||||
{
|
||||
|
Reference in New Issue
Block a user