Commit ee15ee5d authored by David Ahern's avatar David Ahern Committed by David S. Miller

net: Add support for l3mdev ops to VRF driver

Signed-off-by: default avatarDavid Ahern <dsa@cumulusnetworks.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 1b69c6d0
...@@ -299,6 +299,7 @@ config NLMON ...@@ -299,6 +299,7 @@ config NLMON
config NET_VRF config NET_VRF
tristate "Virtual Routing and Forwarding (Lite)" tristate "Virtual Routing and Forwarding (Lite)"
depends on IP_MULTIPLE_TABLES && IPV6_MULTIPLE_TABLES depends on IP_MULTIPLE_TABLES && IPV6_MULTIPLE_TABLES
depends on NET_L3_MASTER_DEV
---help--- ---help---
This option enables the support for mapping interfaces into VRF's. The This option enables the support for mapping interfaces into VRF's. The
support enables VRF devices. support enables VRF devices.
......
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
#include <net/route.h> #include <net/route.h>
#include <net/addrconf.h> #include <net/addrconf.h>
#include <net/vrf.h> #include <net/vrf.h>
#include <net/l3mdev.h>
#define DRV_NAME "vrf" #define DRV_NAME "vrf"
#define DRV_VERSION "1.0" #define DRV_VERSION "1.0"
...@@ -529,6 +530,33 @@ static const struct net_device_ops vrf_netdev_ops = { ...@@ -529,6 +530,33 @@ static const struct net_device_ops vrf_netdev_ops = {
.ndo_del_slave = vrf_del_slave, .ndo_del_slave = vrf_del_slave,
}; };
static u32 vrf_fib_table(const struct net_device *dev)
{
struct net_vrf *vrf = netdev_priv(dev);
return vrf->tb_id;
}
static struct rtable *vrf_get_rtable(const struct net_device *dev,
const struct flowi4 *fl4)
{
struct rtable *rth = NULL;
if (!(fl4->flowi4_flags & FLOWI_FLAG_VRFSRC)) {
struct net_vrf *vrf = netdev_priv(dev);
rth = vrf->rth;
atomic_inc(&rth->dst.__refcnt);
}
return rth;
}
static const struct l3mdev_ops vrf_l3mdev_ops = {
.l3mdev_fib_table = vrf_fib_table,
.l3mdev_get_rtable = vrf_get_rtable,
};
static void vrf_get_drvinfo(struct net_device *dev, static void vrf_get_drvinfo(struct net_device *dev,
struct ethtool_drvinfo *info) struct ethtool_drvinfo *info)
{ {
...@@ -546,6 +574,7 @@ static void vrf_setup(struct net_device *dev) ...@@ -546,6 +574,7 @@ static void vrf_setup(struct net_device *dev)
/* Initialize the device structure. */ /* Initialize the device structure. */
dev->netdev_ops = &vrf_netdev_ops; dev->netdev_ops = &vrf_netdev_ops;
dev->l3mdev_ops = &vrf_l3mdev_ops;
dev->ethtool_ops = &vrf_ethtool_ops; dev->ethtool_ops = &vrf_ethtool_ops;
dev->destructor = free_netdev; dev->destructor = free_netdev;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment