--- zzzz-none-000/linux-2.6.32.61/include/linux/netdevice.h 2013-06-10 09:43:48.000000000 +0000 +++ virian-300e-630/linux-2.6.32.61/include/linux/netdevice.h 2014-09-24 15:12:05.000000000 +0000 @@ -49,6 +49,7 @@ #ifdef CONFIG_DCB #include #endif +#include struct vlan_group; struct netpoll_info; @@ -69,6 +70,12 @@ #define NET_XMIT_POLICED 3 /* skb is shot by police */ #define NET_XMIT_MASK 0xFFFF /* qdisc flags in net/sch_generic.h */ +/* AVM: backport: 2afb9b533423a9b97f84181e773cf9361d98fed6 + * + * ethtool: set addr_assign_type to NET_ADDR_SET when addr is passed on create */ +#define NET_ADDR_SET 3 /* address is set using + * dev_set_mac_address() */ + /* Backlog congestion levels */ #define NET_RX_SUCCESS 0 /* keep 'em coming, baby */ #define NET_RX_DROP 1 /* packet dropped */ @@ -356,6 +363,8 @@ GRO_DROP, }; +typedef struct sk_buff *rx_handler_func_t(struct sk_buff *skb); + extern void __napi_schedule(struct napi_struct *n); static inline int napi_disable_pending(struct napi_struct *n) @@ -636,6 +645,17 @@ int (*ndo_fcoe_ddp_done)(struct net_device *dev, u16 xid); #endif + int (*ndo_fdb_add)(struct ndmsg *ndm, + struct net_device *dev, + unsigned char *addr, + u16 flags); + int (*ndo_fdb_del)(struct ndmsg *ndm, + struct net_device *dev, + unsigned char *addr); + int (*ndo_fdb_dump)(struct sk_buff *skb, + struct netlink_callback *cb, + struct net_device *dev, + int idx); }; /* @@ -750,7 +770,13 @@ struct iw_public_data * wireless_data; #endif /* Management operations */ + +#ifdef CONFIG_LANTIQ + struct net_device_ops *netdev_ops; +#else const struct net_device_ops *netdev_ops; +#endif + const struct ethtool_ops *ethtool_ops; /* Hardware header description */ @@ -781,6 +807,7 @@ /* Interface address info. */ unsigned char perm_addr[MAX_ADDR_LEN]; /* permanent hw address */ + unsigned char addr_assign_type; /* hw address assignment type */ unsigned char addr_len; /* hardware address length */ unsigned short dev_id; /* for shared network cards */ @@ -807,6 +834,7 @@ void *ax25_ptr; /* AX.25 specific data */ struct wireless_dev *ieee80211_ptr; /* IEEE 802.11 specific data, assign before registering */ + void *phy_ptr; /* PHY device specific data */ /* * Cache line mostly used on receive path (including eth_type_trans()) @@ -823,6 +851,8 @@ unsigned char broadcast[MAX_ADDR_LEN]; /* hw bcast add */ struct netdev_queue rx_queue; + rx_handler_func_t *rx_handler; + void *rx_handler_data; struct netdev_queue *_tx ____cacheline_aligned_in_smp; @@ -885,8 +915,24 @@ /* mid-layer private */ void *ml_priv; +#ifdef CONFIG_AVM_PA + union { + struct avm_pa_dev_info devinfo; + u8 buf[32]; + } avm_pa; +#define AVM_PA_DEVINFO(dev) (&(dev)->avm_pa.devinfo) +#endif + +#if 0 + /* + * AVM: present in 2.6.32 but removed in later commit around 2.35 + * + * commit: + * f350a0a87374418635689471606454abc7beaa3a bridge: use rx_handler_data pointer to store net_bridge_port pointer + */ /* bridge stuff */ struct net_bridge_port *br_port; +#endif /* macvlan */ struct macvlan_port *macvlan_port; /* GARP */ @@ -944,7 +990,7 @@ * Net namespace inlines */ static inline -struct net *dev_net(const struct net_device *dev) +struct net *dev_net(const struct net_device *dev __attribute__ ((unused))) { #ifdef CONFIG_NET_NS return dev->nd_net; @@ -954,7 +1000,7 @@ } static inline -void dev_net_set(struct net_device *dev, struct net *net) +void dev_net_set(struct net_device *dev __attribute__ ((unused)), struct net *net __attribute__ ((unused))) { #ifdef CONFIG_NET_NS release_net(dev->nd_net); @@ -962,7 +1008,7 @@ #endif } -static inline bool netdev_uses_dsa_tags(struct net_device *dev) +static inline bool netdev_uses_dsa_tags(struct net_device *dev __attribute__ ((unused))) { #ifdef CONFIG_NET_DSA_TAG_DSA if (dev->dsa_ptr != NULL) @@ -972,7 +1018,7 @@ return 0; } -static inline bool netdev_uses_trailer_tags(struct net_device *dev) +static inline bool netdev_uses_trailer_tags(struct net_device *dev __attribute__ ((unused))) { #ifdef CONFIG_NET_DSA_TAG_TRAILER if (dev->dsa_ptr != NULL) @@ -1065,6 +1111,13 @@ int (*gro_complete)(struct sk_buff *skb); void *af_packet_priv; struct list_head list; +#ifdef CONFIG_AVM_PA + union { + struct avm_pa_dev_info devinfo; + u8 buf[32]; + } avm_pa; +#define AVM_PA_PTYPE_DEVINFO(ptype) (&(ptype)->avm_pa.devinfo) +#endif }; #include @@ -1114,6 +1167,7 @@ extern int dev_open(struct net_device *dev); extern int dev_close(struct net_device *dev); extern void dev_disable_lro(struct net_device *dev); +extern struct netdev_queue *dev_pick_tx(struct net_device *dev, struct sk_buff *skb); extern int dev_queue_xmit(struct sk_buff *skb); extern int register_netdevice(struct net_device *dev); extern void unregister_netdevice(struct net_device *dev); @@ -1124,6 +1178,23 @@ extern int init_dummy_netdev(struct net_device *dev); extern void netdev_resync_ops(struct net_device *dev); +/* +++ + * AVM: backport from 3.15 + */ +#define for_each_netdev(net, d) \ + list_for_each_entry(d, &(net)->dev_base_head, dev_list) +#define for_each_netdev_reverse(net, d) \ + list_for_each_entry_reverse(d, &(net)->dev_base_head, dev_list) +#define for_each_netdev_rcu(net, d) \ + list_for_each_entry_rcu(d, &(net)->dev_base_head, dev_list) +#define for_each_netdev_safe(net, d, n) \ + list_for_each_entry_safe(d, n, &(net)->dev_base_head, dev_list) +#define for_each_netdev_continue(net, d) \ + list_for_each_entry_continue(d, &(net)->dev_base_head, dev_list) +#define for_each_netdev_continue_rcu(net, d) \ + list_for_each_entry_continue_rcu(d, &(net)->dev_base_head, dev_list) +/* +++ */ + extern int call_netdevice_notifiers(unsigned long val, struct net_device *dev); extern struct net_device *dev_get_by_index(struct net *net, int ifindex); extern struct net_device *__dev_get_by_index(struct net *net, int ifindex); @@ -1489,6 +1560,11 @@ napi->skb = NULL; } +extern int netdev_rx_handler_register(struct net_device *dev, + rx_handler_func_t *rx_handler, + void *rx_handler_data); +extern void netdev_rx_handler_unregister(struct net_device *dev); + extern void netif_nit_deliver(struct sk_buff *skb); extern int dev_valid_name(const char *name); extern int dev_ioctl(struct net *net, unsigned int cmd, void __user *); @@ -1676,7 +1752,7 @@ static inline u32 netif_msg_init(int debug_value, int default_msg_enable_bits) { /* use default */ - if (debug_value < 0 || debug_value >= (sizeof(u32) * 8)) + if (debug_value < 0 || debug_value >= (int) (sizeof(u32) * 8)) return default_msg_enable_bits; if (debug_value == 0) /* no output */ return 0; @@ -1894,7 +1970,7 @@ #ifdef CONFIG_BUG extern void netdev_rx_csum_fault(struct net_device *dev); #else -static inline void netdev_rx_csum_fault(struct net_device *dev) +static inline void netdev_rx_csum_fault(struct net_device *dev __attribute__ ((unused))) { } #endif @@ -1967,7 +2043,18 @@ if (master->priv_flags & IFF_MASTER_ARPMON) dev->last_rx = jiffies; +#if 0 + /* + * AVM: present in 2.6.32 but removed in later commit around 2.35 + * + * commit: + * f350a0a87374418635689471606454abc7beaa3a bridge: use rx_handler_data pointer to store net_bridge_port pointer + */ if ((master->priv_flags & IFF_MASTER_ALB) && master->br_port) { +#else + if ((master->priv_flags & IFF_MASTER_ALB) && + (master->priv_flags & IFF_BRIDGE_PORT)) { +#endif /* Do address unmangle. The local destination address * will be always the one master has. Provides the right * functionality in a bridge. @@ -2019,6 +2106,76 @@ return dev->ethtool_ops->get_flags(dev); } +/* AVM: Cherry-picked from 571ba42303813106d533bf6bda929d8e289f51bf */ +/* Logging, debugging and troubleshooting/diagnostic helpers. */ + +/* netdev_printk helpers, similar to dev_printk */ + +static inline const char *netdev_name(const struct net_device *dev) +{ + if (dev->reg_state != NETREG_REGISTERED) + return "(unregistered net_device)"; + return dev->name; +} + +#define netdev_printk(level, netdev, format, args...) \ + dev_printk(level, (netdev)->dev.parent, \ + "%s: " format, \ + netdev_name(netdev), ##args) + +#define netdev_emerg(dev, format, args...) \ + netdev_printk(KERN_EMERG, dev, format, ##args) +#define netdev_alert(dev, format, args...) \ + netdev_printk(KERN_ALERT, dev, format, ##args) +#define netdev_crit(dev, format, args...) \ + netdev_printk(KERN_CRIT, dev, format, ##args) +#define netdev_err(dev, format, args...) \ + netdev_printk(KERN_ERR, dev, format, ##args) +#define netdev_warn(dev, format, args...) \ + netdev_printk(KERN_WARNING, dev, format, ##args) +#define netdev_notice(dev, format, args...) \ + netdev_printk(KERN_NOTICE, dev, format, ##args) +#define netdev_info(dev, format, args...) \ + netdev_printk(KERN_INFO, dev, format, ##args) + +#if defined(DEBUG) +#define netdev_dbg(__dev, format, args...) \ + netdev_printk(KERN_DEBUG, __dev, format, ##args) +#elif defined(CONFIG_DYNAMIC_DEBUG) +#define netdev_dbg(__dev, format, args...) \ +do { \ + dynamic_dev_dbg((__dev)->dev.parent, "%s: " format, \ + netdev_name(__dev), ##args); \ +} while (0) +#else +#define netdev_dbg(__dev, format, args...) \ +({ \ + if (0) \ + netdev_printk(KERN_DEBUG, __dev, format, ##args); \ + 0; \ +}) +#endif + +#if defined(VERBOSE_DEBUG) +#define netdev_vdbg netdev_dbg +#else + +#define netdev_vdbg(dev, format, args...) \ +({ \ + if (0) \ + netdev_printk(KERN_DEBUG, dev, format, ##args); \ + 0; \ +}) +#endif + +/* + * netdev_WARN() acts like dev_printk(), but with the key difference + * of using a WARN/WARN_ON to get the message out, including the + * file/line information and a backtrace. + */ +#define netdev_WARN(dev, format, args...) \ + WARN(1, "netdevice: %s\n" format, netdev_name(dev), ##args); + #define MODULE_ALIAS_NETDEV(device) \ MODULE_ALIAS("netdev-" device)