aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/netdevice.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux/netdevice.h')
-rw-r--r--include/linux/netdevice.h75
1 files changed, 61 insertions, 14 deletions
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index bc747e5d7138..9264139bd8df 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -187,7 +187,7 @@ struct hh_cache
187{ 187{
188 struct hh_cache *hh_next; /* Next entry */ 188 struct hh_cache *hh_next; /* Next entry */
189 atomic_t hh_refcnt; /* number of users */ 189 atomic_t hh_refcnt; /* number of users */
190 unsigned short hh_type; /* protocol identifier, f.e ETH_P_IP 190 __be16 hh_type; /* protocol identifier, f.e ETH_P_IP
191 * NOTE: For VLANs, this will be the 191 * NOTE: For VLANs, this will be the
192 * encapuslated type. --BLG 192 * encapuslated type. --BLG
193 */ 193 */
@@ -313,8 +313,15 @@ struct net_device
313 313
314 /* Segmentation offload features */ 314 /* Segmentation offload features */
315#define NETIF_F_GSO_SHIFT 16 315#define NETIF_F_GSO_SHIFT 16
316#define NETIF_F_GSO_MASK 0xffff0000
316#define NETIF_F_TSO (SKB_GSO_TCPV4 << NETIF_F_GSO_SHIFT) 317#define NETIF_F_TSO (SKB_GSO_TCPV4 << NETIF_F_GSO_SHIFT)
317#define NETIF_F_UFO (SKB_GSO_UDPV4 << NETIF_F_GSO_SHIFT) 318#define NETIF_F_UFO (SKB_GSO_UDP << NETIF_F_GSO_SHIFT)
319#define NETIF_F_GSO_ROBUST (SKB_GSO_DODGY << NETIF_F_GSO_SHIFT)
320#define NETIF_F_TSO_ECN (SKB_GSO_TCP_ECN << NETIF_F_GSO_SHIFT)
321#define NETIF_F_TSO6 (SKB_GSO_TCPV6 << NETIF_F_GSO_SHIFT)
322
323 /* List of features with software fallbacks. */
324#define NETIF_F_GSO_SOFTWARE (NETIF_F_TSO | NETIF_F_TSO_ECN | NETIF_F_TSO6)
318 325
319#define NETIF_F_GEN_CSUM (NETIF_F_NO_CSUM | NETIF_F_HW_CSUM) 326#define NETIF_F_GEN_CSUM (NETIF_F_NO_CSUM | NETIF_F_HW_CSUM)
320#define NETIF_F_ALL_CSUM (NETIF_F_IP_CSUM | NETIF_F_GEN_CSUM) 327#define NETIF_F_ALL_CSUM (NETIF_F_IP_CSUM | NETIF_F_GEN_CSUM)
@@ -327,7 +334,6 @@ struct net_device
327 334
328 335
329 struct net_device_stats* (*get_stats)(struct net_device *dev); 336 struct net_device_stats* (*get_stats)(struct net_device *dev);
330 struct iw_statistics* (*get_wireless_stats)(struct net_device *dev);
331 337
332 /* List of functions to handle Wireless Extensions (instead of ioctl). 338 /* List of functions to handle Wireless Extensions (instead of ioctl).
333 * See <net/iw_handler.h> for details. Jean II */ 339 * See <net/iw_handler.h> for details. Jean II */
@@ -335,7 +341,7 @@ struct net_device
335 /* Instance data managed by the core of Wireless Extensions. */ 341 /* Instance data managed by the core of Wireless Extensions. */
336 struct iw_public_data * wireless_data; 342 struct iw_public_data * wireless_data;
337 343
338 struct ethtool_ops *ethtool_ops; 344 const struct ethtool_ops *ethtool_ops;
339 345
340 /* 346 /*
341 * This marks the end of the "visible" part of the structure. All 347 * This marks the end of the "visible" part of the structure. All
@@ -543,7 +549,9 @@ struct packet_type {
543 struct net_device *, 549 struct net_device *,
544 struct packet_type *, 550 struct packet_type *,
545 struct net_device *); 551 struct net_device *);
546 struct sk_buff *(*gso_segment)(struct sk_buff *skb, int sg); 552 struct sk_buff *(*gso_segment)(struct sk_buff *skb,
553 int features);
554 int (*gso_send_check)(struct sk_buff *skb);
547 void *af_packet_priv; 555 void *af_packet_priv;
548 struct list_head list; 556 struct list_head list;
549}; 557};
@@ -699,7 +707,6 @@ extern int dev_hard_start_xmit(struct sk_buff *skb,
699 707
700extern void dev_init(void); 708extern void dev_init(void);
701 709
702extern int netdev_nit;
703extern int netdev_budget; 710extern int netdev_budget;
704 711
705/* Called by rtnetlink.c:rtnl_unlock() */ 712/* Called by rtnetlink.c:rtnl_unlock() */
@@ -919,10 +926,10 @@ static inline void netif_tx_lock_bh(struct net_device *dev)
919 926
920static inline int netif_tx_trylock(struct net_device *dev) 927static inline int netif_tx_trylock(struct net_device *dev)
921{ 928{
922 int err = spin_trylock(&dev->_xmit_lock); 929 int ok = spin_trylock(&dev->_xmit_lock);
923 if (!err) 930 if (likely(ok))
924 dev->xmit_lock_owner = smp_processor_id(); 931 dev->xmit_lock_owner = smp_processor_id();
925 return err; 932 return ok;
926} 933}
927 934
928static inline void netif_tx_unlock(struct net_device *dev) 935static inline void netif_tx_unlock(struct net_device *dev)
@@ -968,8 +975,8 @@ extern void dev_mcast_init(void);
968extern int netdev_max_backlog; 975extern int netdev_max_backlog;
969extern int weight_p; 976extern int weight_p;
970extern int netdev_set_master(struct net_device *dev, struct net_device *master); 977extern int netdev_set_master(struct net_device *dev, struct net_device *master);
971extern int skb_checksum_help(struct sk_buff *skb, int inward); 978extern int skb_checksum_help(struct sk_buff *skb);
972extern struct sk_buff *skb_gso_segment(struct sk_buff *skb, int sg); 979extern struct sk_buff *skb_gso_segment(struct sk_buff *skb, int features);
973#ifdef CONFIG_BUG 980#ifdef CONFIG_BUG
974extern void netdev_rx_csum_fault(struct net_device *dev); 981extern void netdev_rx_csum_fault(struct net_device *dev);
975#else 982#else
@@ -989,11 +996,51 @@ extern void dev_seq_stop(struct seq_file *seq, void *v);
989 996
990extern void linkwatch_run_queue(void); 997extern void linkwatch_run_queue(void);
991 998
999static inline int net_gso_ok(int features, int gso_type)
1000{
1001 int feature = gso_type << NETIF_F_GSO_SHIFT;
1002 return (features & feature) == feature;
1003}
1004
1005static inline int skb_gso_ok(struct sk_buff *skb, int features)
1006{
1007 return net_gso_ok(features, skb_shinfo(skb)->gso_type);
1008}
1009
992static inline int netif_needs_gso(struct net_device *dev, struct sk_buff *skb) 1010static inline int netif_needs_gso(struct net_device *dev, struct sk_buff *skb)
993{ 1011{
994 int feature = skb_shinfo(skb)->gso_type << NETIF_F_GSO_SHIFT; 1012 return skb_is_gso(skb) &&
995 return skb_shinfo(skb)->gso_size && 1013 (!skb_gso_ok(skb, dev->features) ||
996 (dev->features & feature) != feature; 1014 unlikely(skb->ip_summed != CHECKSUM_PARTIAL));
1015}
1016
1017/* On bonding slaves other than the currently active slave, suppress
1018 * duplicates except for 802.3ad ETH_P_SLOW, alb non-mcast/bcast, and
1019 * ARP on active-backup slaves with arp_validate enabled.
1020 */
1021static inline int skb_bond_should_drop(struct sk_buff *skb)
1022{
1023 struct net_device *dev = skb->dev;
1024 struct net_device *master = dev->master;
1025
1026 if (master &&
1027 (dev->priv_flags & IFF_SLAVE_INACTIVE)) {
1028 if ((dev->priv_flags & IFF_SLAVE_NEEDARP) &&
1029 skb->protocol == __constant_htons(ETH_P_ARP))
1030 return 0;
1031
1032 if (master->priv_flags & IFF_MASTER_ALB) {
1033 if (skb->pkt_type != PACKET_BROADCAST &&
1034 skb->pkt_type != PACKET_MULTICAST)
1035 return 0;
1036 }
1037 if (master->priv_flags & IFF_MASTER_8023AD &&
1038 skb->protocol == __constant_htons(ETH_P_SLOW))
1039 return 0;
1040
1041 return 1;
1042 }
1043 return 0;
997} 1044}
998 1045
999#endif /* __KERNEL__ */ 1046#endif /* __KERNEL__ */