1 #include <linux/if_bridge.h>
2 #include <linux/netdevice.h>
3 #include <linux/version.h>
4 #include <net/rtnetlink.h>
6 #ifndef HAVE_DEV_DISABLE_LRO
9 #include <linux/ethtool.h>
12 * dev_disable_lro - disable Large Receive Offload on a device
15 * Disable Large Receive Offload (LRO) on a net device. Must be
16 * called under RTNL. This is needed if received packets may be
17 * forwarded to another interface.
19 void dev_disable_lro(struct net_device *dev)
21 if (dev->ethtool_ops && dev->ethtool_ops->get_flags &&
22 dev->ethtool_ops->set_flags) {
23 u32 flags = dev->ethtool_ops->get_flags(dev);
24 if (flags & ETH_FLAG_LRO) {
25 flags &= ~ETH_FLAG_LRO;
26 dev->ethtool_ops->set_flags(dev, flags);
29 WARN_ON(dev->features & NETIF_F_LRO);
32 void dev_disable_lro(struct net_device *dev) { }
33 #endif /* NETIF_F_LRO */
35 #endif /* HAVE_DEV_DISABLE_LRO */
37 #if !defined HAVE_NETDEV_RX_HANDLER_REGISTER || \
38 defined HAVE_RHEL_OVS_HOOK
40 static int nr_bridges;
42 #ifdef HAVE_RHEL_OVS_HOOK
43 int rpl_netdev_rx_handler_register(struct net_device *dev,
44 openvswitch_handle_frame_hook_t *hook,
45 void *rx_handler_data)
48 rcu_assign_pointer(dev->ax25_ptr, rx_handler_data);
51 rcu_assign_pointer(openvswitch_handle_frame_hook, hook);
54 EXPORT_SYMBOL_GPL(rpl_netdev_rx_handler_register);
57 int rpl_netdev_rx_handler_register(struct net_device *dev,
58 struct sk_buff *(*hook)(struct net_bridge_port *p,
60 void *rx_handler_data)
66 rcu_assign_pointer(dev->br_port, rx_handler_data);
69 br_handle_frame_hook = hook;
72 EXPORT_SYMBOL_GPL(rpl_netdev_rx_handler_register);
75 void rpl_netdev_rx_handler_unregister(struct net_device *dev)
78 #ifdef HAVE_RHEL_OVS_HOOK
79 rcu_assign_pointer(dev->ax25_ptr, NULL);
84 rcu_assign_pointer(openvswitch_handle_frame_hook, NULL);
86 rcu_assign_pointer(dev->br_port, NULL);
91 br_handle_frame_hook = NULL;
94 EXPORT_SYMBOL_GPL(rpl_netdev_rx_handler_unregister);
98 int rpl_rtnl_delete_link(struct net_device *dev)
100 const struct rtnl_link_ops *ops;
102 ops = dev->rtnl_link_ops;
103 if (!ops || !ops->dellink)
106 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,34)
110 LIST_HEAD(list_kill);
112 ops->dellink(dev, &list_kill);
113 unregister_netdevice_many(&list_kill);