1 #include <linux/if_bridge.h>
2 #include <linux/netdevice.h>
3 #include <linux/version.h>
5 #ifndef HAVE_DEV_DISABLE_LRO
8 #include <linux/ethtool.h>
11 * dev_disable_lro - disable Large Receive Offload on a device
14 * Disable Large Receive Offload (LRO) on a net device. Must be
15 * called under RTNL. This is needed if received packets may be
16 * forwarded to another interface.
18 void dev_disable_lro(struct net_device *dev)
20 if (dev->ethtool_ops && dev->ethtool_ops->get_flags &&
21 dev->ethtool_ops->set_flags) {
22 u32 flags = dev->ethtool_ops->get_flags(dev);
23 if (flags & ETH_FLAG_LRO) {
24 flags &= ~ETH_FLAG_LRO;
25 dev->ethtool_ops->set_flags(dev, flags);
28 WARN_ON(dev->features & NETIF_F_LRO);
31 void dev_disable_lro(struct net_device *dev) { }
32 #endif /* NETIF_F_LRO */
34 #endif /* HAVE_DEV_DISABLE_LRO */
36 #if !defined HAVE_NETDEV_RX_HANDLER_REGISTER || \
37 defined HAVE_RHEL_OVS_HOOK
39 static int nr_bridges;
41 #ifdef HAVE_RHEL_OVS_HOOK
42 int rpl_netdev_rx_handler_register(struct net_device *dev,
43 openvswitch_handle_frame_hook_t *hook,
44 void *rx_handler_data)
47 rcu_assign_pointer(dev->ax25_ptr, rx_handler_data);
50 rcu_assign_pointer(openvswitch_handle_frame_hook, hook);
53 EXPORT_SYMBOL_GPL(rpl_netdev_rx_handler_register);
56 int rpl_netdev_rx_handler_register(struct net_device *dev,
57 struct sk_buff *(*hook)(struct net_bridge_port *p,
59 void *rx_handler_data)
65 rcu_assign_pointer(dev->br_port, rx_handler_data);
68 br_handle_frame_hook = hook;
71 EXPORT_SYMBOL_GPL(rpl_netdev_rx_handler_register);
74 void rpl_netdev_rx_handler_unregister(struct net_device *dev)
77 #ifdef HAVE_RHEL_OVS_HOOK
78 rcu_assign_pointer(dev->ax25_ptr, NULL);
83 rcu_assign_pointer(openvswitch_handle_frame_hook, NULL);
85 rcu_assign_pointer(dev->br_port, NULL);
90 br_handle_frame_hook = NULL;
93 EXPORT_SYMBOL_GPL(rpl_netdev_rx_handler_unregister);