diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/openvswitch/datapath.c | 9 | ||||
-rw-r--r-- | net/openvswitch/vport-internal_dev.c | 16 | ||||
-rw-r--r-- | net/openvswitch/vport-internal_dev.h | 2 |
3 files changed, 26 insertions, 1 deletions
diff --git a/net/openvswitch/datapath.c b/net/openvswitch/datapath.c index 0d407bca81e3..fe95b6c224a7 100644 --- a/net/openvswitch/datapath.c +++ b/net/openvswitch/datapath.c | |||
@@ -2054,10 +2054,14 @@ static int __init dp_init(void) | |||
2054 | 2054 | ||
2055 | pr_info("Open vSwitch switching datapath\n"); | 2055 | pr_info("Open vSwitch switching datapath\n"); |
2056 | 2056 | ||
2057 | err = ovs_flow_init(); | 2057 | err = ovs_internal_dev_rtnl_link_register(); |
2058 | if (err) | 2058 | if (err) |
2059 | goto error; | 2059 | goto error; |
2060 | 2060 | ||
2061 | err = ovs_flow_init(); | ||
2062 | if (err) | ||
2063 | goto error_unreg_rtnl_link; | ||
2064 | |||
2061 | err = ovs_vport_init(); | 2065 | err = ovs_vport_init(); |
2062 | if (err) | 2066 | if (err) |
2063 | goto error_flow_exit; | 2067 | goto error_flow_exit; |
@@ -2084,6 +2088,8 @@ error_vport_exit: | |||
2084 | ovs_vport_exit(); | 2088 | ovs_vport_exit(); |
2085 | error_flow_exit: | 2089 | error_flow_exit: |
2086 | ovs_flow_exit(); | 2090 | ovs_flow_exit(); |
2091 | error_unreg_rtnl_link: | ||
2092 | ovs_internal_dev_rtnl_link_unregister(); | ||
2087 | error: | 2093 | error: |
2088 | return err; | 2094 | return err; |
2089 | } | 2095 | } |
@@ -2096,6 +2102,7 @@ static void dp_cleanup(void) | |||
2096 | rcu_barrier(); | 2102 | rcu_barrier(); |
2097 | ovs_vport_exit(); | 2103 | ovs_vport_exit(); |
2098 | ovs_flow_exit(); | 2104 | ovs_flow_exit(); |
2105 | ovs_internal_dev_rtnl_link_unregister(); | ||
2099 | } | 2106 | } |
2100 | 2107 | ||
2101 | module_init(dp_init); | 2108 | module_init(dp_init); |
diff --git a/net/openvswitch/vport-internal_dev.c b/net/openvswitch/vport-internal_dev.c index 789af9280e77..295471a66c78 100644 --- a/net/openvswitch/vport-internal_dev.c +++ b/net/openvswitch/vport-internal_dev.c | |||
@@ -26,6 +26,7 @@ | |||
26 | 26 | ||
27 | #include <net/dst.h> | 27 | #include <net/dst.h> |
28 | #include <net/xfrm.h> | 28 | #include <net/xfrm.h> |
29 | #include <net/rtnetlink.h> | ||
29 | 30 | ||
30 | #include "datapath.h" | 31 | #include "datapath.h" |
31 | #include "vport-internal_dev.h" | 32 | #include "vport-internal_dev.h" |
@@ -121,6 +122,10 @@ static const struct net_device_ops internal_dev_netdev_ops = { | |||
121 | .ndo_get_stats64 = internal_dev_get_stats, | 122 | .ndo_get_stats64 = internal_dev_get_stats, |
122 | }; | 123 | }; |
123 | 124 | ||
125 | static struct rtnl_link_ops internal_dev_link_ops __read_mostly = { | ||
126 | .kind = "openvswitch", | ||
127 | }; | ||
128 | |||
124 | static void do_setup(struct net_device *netdev) | 129 | static void do_setup(struct net_device *netdev) |
125 | { | 130 | { |
126 | ether_setup(netdev); | 131 | ether_setup(netdev); |
@@ -131,6 +136,7 @@ static void do_setup(struct net_device *netdev) | |||
131 | netdev->priv_flags |= IFF_LIVE_ADDR_CHANGE; | 136 | netdev->priv_flags |= IFF_LIVE_ADDR_CHANGE; |
132 | netdev->destructor = internal_dev_destructor; | 137 | netdev->destructor = internal_dev_destructor; |
133 | netdev->ethtool_ops = &internal_dev_ethtool_ops; | 138 | netdev->ethtool_ops = &internal_dev_ethtool_ops; |
139 | netdev->rtnl_link_ops = &internal_dev_link_ops; | ||
134 | netdev->tx_queue_len = 0; | 140 | netdev->tx_queue_len = 0; |
135 | 141 | ||
136 | netdev->features = NETIF_F_LLTX | NETIF_F_SG | NETIF_F_FRAGLIST | | 142 | netdev->features = NETIF_F_LLTX | NETIF_F_SG | NETIF_F_FRAGLIST | |
@@ -248,3 +254,13 @@ struct vport *ovs_internal_dev_get_vport(struct net_device *netdev) | |||
248 | 254 | ||
249 | return internal_dev_priv(netdev)->vport; | 255 | return internal_dev_priv(netdev)->vport; |
250 | } | 256 | } |
257 | |||
258 | int ovs_internal_dev_rtnl_link_register(void) | ||
259 | { | ||
260 | return rtnl_link_register(&internal_dev_link_ops); | ||
261 | } | ||
262 | |||
263 | void ovs_internal_dev_rtnl_link_unregister(void) | ||
264 | { | ||
265 | rtnl_link_unregister(&internal_dev_link_ops); | ||
266 | } | ||
diff --git a/net/openvswitch/vport-internal_dev.h b/net/openvswitch/vport-internal_dev.h index 9a7d30ecc6a2..1b179a190cff 100644 --- a/net/openvswitch/vport-internal_dev.h +++ b/net/openvswitch/vport-internal_dev.h | |||
@@ -24,5 +24,7 @@ | |||
24 | 24 | ||
25 | int ovs_is_internal_dev(const struct net_device *); | 25 | int ovs_is_internal_dev(const struct net_device *); |
26 | struct vport *ovs_internal_dev_get_vport(struct net_device *); | 26 | struct vport *ovs_internal_dev_get_vport(struct net_device *); |
27 | int ovs_internal_dev_rtnl_link_register(void); | ||
28 | void ovs_internal_dev_rtnl_link_unregister(void); | ||
27 | 29 | ||
28 | #endif /* vport-internal_dev.h */ | 30 | #endif /* vport-internal_dev.h */ |