aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ipvlan/ipvlan_main.c
diff options
context:
space:
mode:
authorSainath Grandhi <sainath.grandhi@intel.com>2017-02-10 19:03:52 -0500
committerDavid S. Miller <davem@davemloft.net>2017-02-11 20:59:41 -0500
commit235a9d89da976e2975b3de9afc0bed7b72557983 (patch)
treeb7d5175e7c84f0a806b52064b34f1ef0fd780111 /drivers/net/ipvlan/ipvlan_main.c
parent9a393b5d5988ea4eaa3e0da138321abe0dc03a68 (diff)
ipvtap: IP-VLAN based tap driver
This patch adds a tap character device driver that is based on the IP-VLAN network interface, called ipvtap. An ipvtap device can be created in the same way as an ipvlan device, using 'type ipvtap', and then accessed using the tap user space interface. Signed-off-by: Sainath Grandhi <sainath.grandhi@intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ipvlan/ipvlan_main.c')
-rw-r--r--drivers/net/ipvlan/ipvlan_main.c27
1 files changed, 15 insertions, 12 deletions
diff --git a/drivers/net/ipvlan/ipvlan_main.c b/drivers/net/ipvlan/ipvlan_main.c
index 95b18f4602cf..aa8575ccbce3 100644
--- a/drivers/net/ipvlan/ipvlan_main.c
+++ b/drivers/net/ipvlan/ipvlan_main.c
@@ -496,8 +496,8 @@ err:
496 return ret; 496 return ret;
497} 497}
498 498
499static int ipvlan_link_new(struct net *src_net, struct net_device *dev, 499int ipvlan_link_new(struct net *src_net, struct net_device *dev,
500 struct nlattr *tb[], struct nlattr *data[]) 500 struct nlattr *tb[], struct nlattr *data[])
501{ 501{
502 struct ipvl_dev *ipvlan = netdev_priv(dev); 502 struct ipvl_dev *ipvlan = netdev_priv(dev);
503 struct ipvl_port *port; 503 struct ipvl_port *port;
@@ -594,8 +594,9 @@ destroy_ipvlan_port:
594 ipvlan_port_destroy(phy_dev); 594 ipvlan_port_destroy(phy_dev);
595 return err; 595 return err;
596} 596}
597EXPORT_SYMBOL_GPL(ipvlan_link_new);
597 598
598static void ipvlan_link_delete(struct net_device *dev, struct list_head *head) 599void ipvlan_link_delete(struct net_device *dev, struct list_head *head)
599{ 600{
600 struct ipvl_dev *ipvlan = netdev_priv(dev); 601 struct ipvl_dev *ipvlan = netdev_priv(dev);
601 struct ipvl_addr *addr, *next; 602 struct ipvl_addr *addr, *next;
@@ -611,8 +612,9 @@ static void ipvlan_link_delete(struct net_device *dev, struct list_head *head)
611 unregister_netdevice_queue(dev, head); 612 unregister_netdevice_queue(dev, head);
612 netdev_upper_dev_unlink(ipvlan->phy_dev, dev); 613 netdev_upper_dev_unlink(ipvlan->phy_dev, dev);
613} 614}
615EXPORT_SYMBOL_GPL(ipvlan_link_delete);
614 616
615static void ipvlan_link_setup(struct net_device *dev) 617void ipvlan_link_setup(struct net_device *dev)
616{ 618{
617 ether_setup(dev); 619 ether_setup(dev);
618 620
@@ -623,6 +625,7 @@ static void ipvlan_link_setup(struct net_device *dev)
623 dev->header_ops = &ipvlan_header_ops; 625 dev->header_ops = &ipvlan_header_ops;
624 dev->ethtool_ops = &ipvlan_ethtool_ops; 626 dev->ethtool_ops = &ipvlan_ethtool_ops;
625} 627}
628EXPORT_SYMBOL_GPL(ipvlan_link_setup);
626 629
627static const struct nla_policy ipvlan_nl_policy[IFLA_IPVLAN_MAX + 1] = 630static const struct nla_policy ipvlan_nl_policy[IFLA_IPVLAN_MAX + 1] =
628{ 631{
@@ -633,22 +636,22 @@ static struct rtnl_link_ops ipvlan_link_ops = {
633 .kind = "ipvlan", 636 .kind = "ipvlan",
634 .priv_size = sizeof(struct ipvl_dev), 637 .priv_size = sizeof(struct ipvl_dev),
635 638
636 .get_size = ipvlan_nl_getsize,
637 .policy = ipvlan_nl_policy,
638 .validate = ipvlan_nl_validate,
639 .fill_info = ipvlan_nl_fillinfo,
640 .changelink = ipvlan_nl_changelink,
641 .maxtype = IFLA_IPVLAN_MAX,
642
643 .setup = ipvlan_link_setup, 639 .setup = ipvlan_link_setup,
644 .newlink = ipvlan_link_new, 640 .newlink = ipvlan_link_new,
645 .dellink = ipvlan_link_delete, 641 .dellink = ipvlan_link_delete,
646}; 642};
647 643
648static int ipvlan_link_register(struct rtnl_link_ops *ops) 644int ipvlan_link_register(struct rtnl_link_ops *ops)
649{ 645{
646 ops->get_size = ipvlan_nl_getsize;
647 ops->policy = ipvlan_nl_policy;
648 ops->validate = ipvlan_nl_validate;
649 ops->fill_info = ipvlan_nl_fillinfo;
650 ops->changelink = ipvlan_nl_changelink;
651 ops->maxtype = IFLA_IPVLAN_MAX;
650 return rtnl_link_register(ops); 652 return rtnl_link_register(ops);
651} 653}
654EXPORT_SYMBOL_GPL(ipvlan_link_register);
652 655
653static int ipvlan_device_event(struct notifier_block *unused, 656static int ipvlan_device_event(struct notifier_block *unused,
654 unsigned long event, void *ptr) 657 unsigned long event, void *ptr)