It is good, when linux bridge compatibility is present inside
kernel in case there is lot of scripts written, which are using
standart bridge-utilities.

Signed-off-by: Tony Zelenoff <[email protected]>
---
 net/openvswitch/Kconfig              |    9 +++++++++
 net/openvswitch/datapath.c           |    6 ++++++
 net/openvswitch/datapath.h           |    4 +++-
 net/openvswitch/vport-internal_dev.c |   14 ++++++++++++++
 4 files changed, 32 insertions(+), 1 deletions(-)

diff --git a/net/openvswitch/Kconfig b/net/openvswitch/Kconfig
index d9ea33c..884b64d 100644
--- a/net/openvswitch/Kconfig
+++ b/net/openvswitch/Kconfig
@@ -26,3 +26,12 @@ config OPENVSWITCH
          called openvswitch.
 
          If unsure, say N.
+
+config OVS_BRCOMPAT
+       tristate "Open vSwitch bridge compatibility"
+       depends on OPENVSWITCH
+       ---help---
+         Enable this option if you want to control Open vSwitch with bridge
+         control utilities like brctl.
+
+         This option adds compatibility layer to implement ioctl transferring.
diff --git a/net/openvswitch/datapath.c b/net/openvswitch/datapath.c
index 2c74daa..1ea9c79 100644
--- a/net/openvswitch/datapath.c
+++ b/net/openvswitch/datapath.c
@@ -76,6 +76,12 @@
  */
 static LIST_HEAD(dps);
 
+#if defined(CONFIG_OVS_BRCOMPAT) || defined(CONFIG_OVS_BRCOMPAT_MODULE)
+/* Allow brcompat module be loaded and hooked to bridge */
+int (*ovs_dp_ioctl_hook)(struct net_device *dev, struct ifreq *rq, int cmd);
+EXPORT_SYMBOL_GPL(ovs_dp_ioctl_hook);
+#endif
+
 #define REHASH_FLOW_INTERVAL (10 * 60 * HZ)
 static void rehash_flow_table(struct work_struct *work);
 static DECLARE_DELAYED_WORK(rehash_flow_wq, rehash_flow_table);
diff --git a/net/openvswitch/datapath.h b/net/openvswitch/datapath.h
index c73370c..edaf1da 100644
--- a/net/openvswitch/datapath.h
+++ b/net/openvswitch/datapath.h
@@ -110,7 +110,9 @@ struct dp_upcall_info {
 
 extern struct notifier_block ovs_dp_device_notifier;
 extern struct genl_multicast_group ovs_dp_vport_multicast_group;
-
+#if defined(CONFIG_OVS_BRCOMPAT) || defined(CONFIG_OVS_BRCOMPAT_MODULE)
+extern int (*ovs_dp_ioctl_hook)(struct net_device *dev, struct ifreq *rq, int 
cmd);
+#endif
 void ovs_dp_process_received_packet(struct vport *, struct sk_buff *);
 void ovs_dp_detach_port(struct vport *);
 int ovs_dp_upcall(struct datapath *, struct sk_buff *,
diff --git a/net/openvswitch/vport-internal_dev.c 
b/net/openvswitch/vport-internal_dev.c
index b6b1d7d..5549674 100644
--- a/net/openvswitch/vport-internal_dev.c
+++ b/net/openvswitch/vport-internal_dev.c
@@ -112,6 +112,17 @@ static int internal_dev_change_mtu(struct net_device 
*netdev, int new_mtu)
        return 0;
 }
 
+#if defined(CONFIG_OVS_BRCOMPAT) || defined(CONFIG_OVS_BRCOMPAT_MODULE)
+static int internal_dev_do_ioctl(struct net_device *dev,
+                                struct ifreq *ifr, int cmd)
+{
+       if (ovs_dp_ioctl_hook)
+               return ovs_dp_ioctl_hook(dev, ifr, cmd);
+
+       return -EOPNOTSUPP;
+}
+#endif
+
 static void internal_dev_destructor(struct net_device *dev)
 {
        struct vport *vport = ovs_internal_dev_get_vport(dev);
@@ -127,6 +138,9 @@ static const struct net_device_ops internal_dev_netdev_ops 
= {
        .ndo_set_mac_address = internal_dev_mac_addr,
        .ndo_change_mtu = internal_dev_change_mtu,
        .ndo_get_stats64 = internal_dev_get_stats,
+#if defined(CONFIG_OVS_BRCOMPAT) || defined(CONFIG_OVS_BRCOMPAT_MODULE)
+       .ndo_do_ioctl = internal_dev_do_ioctl,
+#endif
 };
 
 static void do_setup(struct net_device *netdev)
-- 
1.7.1

_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev

Reply via email to