Skip to content

Commit

Permalink
net: Add IPv6 support to l3mdev
Browse files Browse the repository at this point in the history
Add operations to retrieve cached IPv6 dst entry from l3mdev device
and lookup IPv6 source address.

Signed-off-by: David Ahern <dsa@cumulusnetworks.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
David Ahern authored and David S. Miller committed Oct 13, 2015
1 parent af37939 commit ccf3c8c
Showing 1 changed file with 46 additions and 0 deletions.
46 changes: 46 additions & 0 deletions include/net/l3mdev.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,22 @@
* @l3mdev_get_rtable: Get cached IPv4 rtable (dst_entry) for device
*
* @l3mdev_get_saddr: Get source address for a flow
*
* @l3mdev_get_rt6_dst: Get cached IPv6 rt6_info (dst_entry) for device
*/

struct l3mdev_ops {
u32 (*l3mdev_fib_table)(const struct net_device *dev);

/* IPv4 ops */
struct rtable * (*l3mdev_get_rtable)(const struct net_device *dev,
const struct flowi4 *fl4);
void (*l3mdev_get_saddr)(struct net_device *dev,
struct flowi4 *fl4);

/* IPv6 ops */
struct dst_entry * (*l3mdev_get_rt6_dst)(const struct net_device *dev,
const struct flowi6 *fl6);
};

#ifdef CONFIG_NET_L3_MASTER_DEV
Expand Down Expand Up @@ -123,6 +131,31 @@ static inline void l3mdev_get_saddr(struct net *net, int ifindex,
}
}

static inline struct dst_entry *l3mdev_get_rt6_dst(const struct net_device *dev,
const struct flowi6 *fl6)
{
if (netif_is_l3_master(dev) && dev->l3mdev_ops->l3mdev_get_rt6_dst)
return dev->l3mdev_ops->l3mdev_get_rt6_dst(dev, fl6);

return NULL;
}

static inline
struct dst_entry *l3mdev_rt6_dst_by_oif(struct net *net,
const struct flowi6 *fl6)
{
struct dst_entry *dst = NULL;
struct net_device *dev;

dev = dev_get_by_index(net, fl6->flowi6_oif);
if (dev) {
dst = l3mdev_get_rt6_dst(dev, fl6);
dev_put(dev);
}

return dst;
}

#else

static inline int l3mdev_master_ifindex_rcu(struct net_device *dev)
Expand Down Expand Up @@ -171,6 +204,19 @@ static inline void l3mdev_get_saddr(struct net *net, int ifindex,
struct flowi4 *fl4)
{
}

static inline
struct dst_entry *l3mdev_get_rt6_dst(const struct net_device *dev,
const struct flowi6 *fl6)
{
return NULL;
}
static inline
struct dst_entry *l3mdev_rt6_dst_by_oif(struct net *net,
const struct flowi6 *fl6)
{
return NULL;
}
#endif

#endif /* _NET_L3MDEV_H_ */

0 comments on commit ccf3c8c

Please sign in to comment.