Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/rzhang/linux
[cascardo/linux.git] / include / linux / netdevice.h
index daafd95..7ed3a3a 100644 (file)
@@ -63,13 +63,6 @@ struct wireless_dev;
 void netdev_set_default_ethtool_ops(struct net_device *dev,
                                    const struct ethtool_ops *ops);
 
-/* hardware address assignment types */
-#define NET_ADDR_PERM          0       /* address is permanent (default) */
-#define NET_ADDR_RANDOM                1       /* address is generated randomly */
-#define NET_ADDR_STOLEN                2       /* address is stolen from other device */
-#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 */
@@ -526,11 +519,18 @@ enum netdev_queue_state_t {
        __QUEUE_STATE_DRV_XOFF,
        __QUEUE_STATE_STACK_XOFF,
        __QUEUE_STATE_FROZEN,
-#define QUEUE_STATE_ANY_XOFF ((1 << __QUEUE_STATE_DRV_XOFF)            | \
-                             (1 << __QUEUE_STATE_STACK_XOFF))
-#define QUEUE_STATE_ANY_XOFF_OR_FROZEN (QUEUE_STATE_ANY_XOFF           | \
-                                       (1 << __QUEUE_STATE_FROZEN))
 };
+
+#define QUEUE_STATE_DRV_XOFF   (1 << __QUEUE_STATE_DRV_XOFF)
+#define QUEUE_STATE_STACK_XOFF (1 << __QUEUE_STATE_STACK_XOFF)
+#define QUEUE_STATE_FROZEN     (1 << __QUEUE_STATE_FROZEN)
+
+#define QUEUE_STATE_ANY_XOFF   (QUEUE_STATE_DRV_XOFF | QUEUE_STATE_STACK_XOFF)
+#define QUEUE_STATE_ANY_XOFF_OR_FROZEN (QUEUE_STATE_ANY_XOFF | \
+                                       QUEUE_STATE_FROZEN)
+#define QUEUE_STATE_DRV_XOFF_OR_FROZEN (QUEUE_STATE_DRV_XOFF | \
+                                       QUEUE_STATE_FROZEN)
+
 /*
  * __QUEUE_STATE_DRV_XOFF is used by drivers to stop the transmit queue.  The
  * netif_tx_* functions below are used to manipulate this flag.  The
@@ -1037,8 +1037,7 @@ struct net_device_ops {
 #ifdef CONFIG_NET_POLL_CONTROLLER
        void                    (*ndo_poll_controller)(struct net_device *dev);
        int                     (*ndo_netpoll_setup)(struct net_device *dev,
-                                                    struct netpoll_info *info,
-                                                    gfp_t gfp);
+                                                    struct netpoll_info *info);
        void                    (*ndo_netpoll_cleanup)(struct net_device *dev);
 #endif
 #ifdef CONFIG_NET_RX_BUSY_POLL
@@ -1147,6 +1146,89 @@ struct net_device_ops {
                                                        void *priv);
 };
 
+/**
+ * enum net_device_priv_flags - &struct net_device priv_flags
+ *
+ * These are the &struct net_device, they are only set internally
+ * by drivers and used in the kernel. These flags are invisible to
+ * userspace, this means that the order of these flags can change
+ * during any kernel release.
+ *
+ * You should have a pretty good reason to be extending these flags.
+ *
+ * @IFF_802_1Q_VLAN: 802.1Q VLAN device
+ * @IFF_EBRIDGE: Ethernet bridging device
+ * @IFF_SLAVE_INACTIVE: bonding slave not the curr. active
+ * @IFF_MASTER_8023AD: bonding master, 802.3ad
+ * @IFF_MASTER_ALB: bonding master, balance-alb
+ * @IFF_BONDING: bonding master or slave
+ * @IFF_SLAVE_NEEDARP: need ARPs for validation
+ * @IFF_ISATAP: ISATAP interface (RFC4214)
+ * @IFF_MASTER_ARPMON: bonding master, ARP mon in use
+ * @IFF_WAN_HDLC: WAN HDLC device
+ * @IFF_XMIT_DST_RELEASE: dev_hard_start_xmit() is allowed to
+ *     release skb->dst
+ * @IFF_DONT_BRIDGE: disallow bridging this ether dev
+ * @IFF_DISABLE_NETPOLL: disable netpoll at run-time
+ * @IFF_MACVLAN_PORT: device used as macvlan port
+ * @IFF_BRIDGE_PORT: device used as bridge port
+ * @IFF_OVS_DATAPATH: device used as Open vSwitch datapath port
+ * @IFF_TX_SKB_SHARING: The interface supports sharing skbs on transmit
+ * @IFF_UNICAST_FLT: Supports unicast filtering
+ * @IFF_TEAM_PORT: device used as team port
+ * @IFF_SUPP_NOFCS: device supports sending custom FCS
+ * @IFF_LIVE_ADDR_CHANGE: device supports hardware address
+ *     change when it's running
+ * @IFF_MACVLAN: Macvlan device
+ */
+enum netdev_priv_flags {
+       IFF_802_1Q_VLAN                 = 1<<0,
+       IFF_EBRIDGE                     = 1<<1,
+       IFF_SLAVE_INACTIVE              = 1<<2,
+       IFF_MASTER_8023AD               = 1<<3,
+       IFF_MASTER_ALB                  = 1<<4,
+       IFF_BONDING                     = 1<<5,
+       IFF_SLAVE_NEEDARP               = 1<<6,
+       IFF_ISATAP                      = 1<<7,
+       IFF_MASTER_ARPMON               = 1<<8,
+       IFF_WAN_HDLC                    = 1<<9,
+       IFF_XMIT_DST_RELEASE            = 1<<10,
+       IFF_DONT_BRIDGE                 = 1<<11,
+       IFF_DISABLE_NETPOLL             = 1<<12,
+       IFF_MACVLAN_PORT                = 1<<13,
+       IFF_BRIDGE_PORT                 = 1<<14,
+       IFF_OVS_DATAPATH                = 1<<15,
+       IFF_TX_SKB_SHARING              = 1<<16,
+       IFF_UNICAST_FLT                 = 1<<17,
+       IFF_TEAM_PORT                   = 1<<18,
+       IFF_SUPP_NOFCS                  = 1<<19,
+       IFF_LIVE_ADDR_CHANGE            = 1<<20,
+       IFF_MACVLAN                     = 1<<21,
+};
+
+#define IFF_802_1Q_VLAN                        IFF_802_1Q_VLAN
+#define IFF_EBRIDGE                    IFF_EBRIDGE
+#define IFF_SLAVE_INACTIVE             IFF_SLAVE_INACTIVE
+#define IFF_MASTER_8023AD              IFF_MASTER_8023AD
+#define IFF_MASTER_ALB                 IFF_MASTER_ALB
+#define IFF_BONDING                    IFF_BONDING
+#define IFF_SLAVE_NEEDARP              IFF_SLAVE_NEEDARP
+#define IFF_ISATAP                     IFF_ISATAP
+#define IFF_MASTER_ARPMON              IFF_MASTER_ARPMON
+#define IFF_WAN_HDLC                   IFF_WAN_HDLC
+#define IFF_XMIT_DST_RELEASE           IFF_XMIT_DST_RELEASE
+#define IFF_DONT_BRIDGE                        IFF_DONT_BRIDGE
+#define IFF_DISABLE_NETPOLL            IFF_DISABLE_NETPOLL
+#define IFF_MACVLAN_PORT               IFF_MACVLAN_PORT
+#define IFF_BRIDGE_PORT                        IFF_BRIDGE_PORT
+#define IFF_OVS_DATAPATH               IFF_OVS_DATAPATH
+#define IFF_TX_SKB_SHARING             IFF_TX_SKB_SHARING
+#define IFF_UNICAST_FLT                        IFF_UNICAST_FLT
+#define IFF_TEAM_PORT                  IFF_TEAM_PORT
+#define IFF_SUPP_NOFCS                 IFF_SUPP_NOFCS
+#define IFF_LIVE_ADDR_CHANGE           IFF_LIVE_ADDR_CHANGE
+#define IFF_MACVLAN                    IFF_MACVLAN
+
 /*
  *     The DEVICE structure.
  *     Actually, this whole structure is a big mistake.  It mixes I/O
@@ -1228,9 +1310,13 @@ struct net_device {
        int                     iflink;
 
        struct net_device_stats stats;
-       atomic_long_t           rx_dropped; /* dropped packets by core network
-                                            * Do not use this in drivers.
-                                            */
+
+       /* dropped packets by core network, Do not use this in drivers */
+       atomic_long_t           rx_dropped;
+       atomic_long_t           tx_dropped;
+
+       /* Stats to monitor carrier on<->off transitions */
+       atomic_t                carrier_changes;
 
 #ifdef CONFIG_WIRELESS_EXT
        /* List of functions to handle Wireless Extensions (instead of ioctl).
@@ -1279,6 +1365,10 @@ struct net_device {
                                                 * that share the same link
                                                 * layer address
                                                 */
+       unsigned short          dev_port;       /* Used to differentiate
+                                                * devices that share the same
+                                                * function
+                                                */
        spinlock_t              addr_list_lock;
        struct netdev_hw_addr_list      uc;     /* Unicast mac addresses */
        struct netdev_hw_addr_list      mc;     /* Multicast mac addresses */
@@ -1316,13 +1406,7 @@ struct net_device {
 /*
  * Cache lines mostly used on receive path (including eth_type_trans())
  */
-       unsigned long           last_rx;        /* Time of last Rx
-                                                * This should not be set in
-                                                * drivers, unless really needed,
-                                                * because network stack (bonding)
-                                                * use it if/when necessary, to
-                                                * avoid dirtying this cache line.
-                                                */
+       unsigned long           last_rx;        /* Time of last Rx */
 
        /* Interface address info used in eth_type_trans() */
        unsigned char           *dev_addr;      /* hw address, (before bcast
@@ -1729,6 +1813,20 @@ struct pcpu_sw_netstats {
        struct u64_stats_sync   syncp;
 };
 
+#define netdev_alloc_pcpu_stats(type)                          \
+({                                                             \
+       typeof(type) __percpu *pcpu_stats = alloc_percpu(type); \
+       if (pcpu_stats) {                                       \
+               int i;                                          \
+               for_each_possible_cpu(i) {                      \
+                       typeof(type) *stat;                     \
+                       stat = per_cpu_ptr(pcpu_stats, i);      \
+                       u64_stats_init(&stat->syncp);           \
+               }                                               \
+       }                                                       \
+       pcpu_stats;                                             \
+})
+
 #include <linux/notifier.h>
 
 /* netdevice notifier chain. Please remember to update the rtnetlink
@@ -1884,9 +1982,6 @@ struct net_device *__dev_get_by_index(struct net *net, int ifindex);
 struct net_device *dev_get_by_index_rcu(struct net *net, int ifindex);
 int netdev_get_name(struct net *net, char *name, int ifindex);
 int dev_restart(struct net_device *dev);
-#ifdef CONFIG_NETPOLL_TRAP
-int netpoll_trap(void);
-#endif
 int skb_gro_receive(struct sk_buff **head, struct sk_buff *skb);
 
 static inline unsigned int skb_gro_offset(const struct sk_buff *skb)
@@ -1926,11 +2021,6 @@ static inline void *skb_gro_header_slow(struct sk_buff *skb, unsigned int hlen,
        return skb->data + offset;
 }
 
-static inline void *skb_gro_mac_header(struct sk_buff *skb)
-{
-       return NAPI_GRO_CB(skb)->frag0 ?: skb_mac_header(skb);
-}
-
 static inline void *skb_gro_network_header(struct sk_buff *skb)
 {
        return (NAPI_GRO_CB(skb)->frag0 ?: skb->data) +
@@ -2091,12 +2181,6 @@ static inline void netif_tx_start_all_queues(struct net_device *dev)
 
 static inline void netif_tx_wake_queue(struct netdev_queue *dev_queue)
 {
-#ifdef CONFIG_NETPOLL_TRAP
-       if (netpoll_trap()) {
-               netif_tx_start_queue(dev_queue);
-               return;
-       }
-#endif
        if (test_and_clear_bit(__QUEUE_STATE_DRV_XOFF, &dev_queue->state))
                __netif_schedule(dev_queue->qdisc);
 }
@@ -2175,11 +2259,18 @@ static inline bool netif_xmit_stopped(const struct netdev_queue *dev_queue)
        return dev_queue->state & QUEUE_STATE_ANY_XOFF;
 }
 
-static inline bool netif_xmit_frozen_or_stopped(const struct netdev_queue *dev_queue)
+static inline bool
+netif_xmit_frozen_or_stopped(const struct netdev_queue *dev_queue)
 {
        return dev_queue->state & QUEUE_STATE_ANY_XOFF_OR_FROZEN;
 }
 
+static inline bool
+netif_xmit_frozen_or_drv_stopped(const struct netdev_queue *dev_queue)
+{
+       return dev_queue->state & QUEUE_STATE_DRV_XOFF_OR_FROZEN;
+}
+
 static inline void netdev_tx_sent_queue(struct netdev_queue *dev_queue,
                                        unsigned int bytes)
 {
@@ -2340,10 +2431,6 @@ static inline void netif_start_subqueue(struct net_device *dev, u16 queue_index)
 static inline void netif_stop_subqueue(struct net_device *dev, u16 queue_index)
 {
        struct netdev_queue *txq = netdev_get_tx_queue(dev, queue_index);
-#ifdef CONFIG_NETPOLL_TRAP
-       if (netpoll_trap())
-               return;
-#endif
        netif_tx_stop_queue(txq);
 }
 
@@ -2378,10 +2465,6 @@ static inline bool netif_subqueue_stopped(const struct net_device *dev,
 static inline void netif_wake_subqueue(struct net_device *dev, u16 queue_index)
 {
        struct netdev_queue *txq = netdev_get_tx_queue(dev, queue_index);
-#ifdef CONFIG_NETPOLL_TRAP
-       if (netpoll_trap())
-               return;
-#endif
        if (test_and_clear_bit(__QUEUE_STATE_DRV_XOFF, &txq->state))
                __netif_schedule(txq->qdisc);
 }
@@ -2551,6 +2634,7 @@ int dev_get_phys_port_id(struct net_device *dev,
 int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev,
                        struct netdev_queue *txq);
 int dev_forward_skb(struct net_device *dev, struct sk_buff *skb);
+bool is_skb_forwardable(struct net_device *dev, struct sk_buff *skb);
 
 extern int             netdev_budget;
 
@@ -2831,6 +2915,11 @@ static inline void netif_tx_unlock_bh(struct net_device *dev)
        }                                               \
 }
 
+#define HARD_TX_TRYLOCK(dev, txq)                      \
+       (((dev->features & NETIF_F_LLTX) == 0) ?        \
+               __netif_tx_trylock(txq) :               \
+               true )
+
 #define HARD_TX_UNLOCK(dev, txq) {                     \
        if ((dev->features & NETIF_F_LLTX) == 0) {      \
                __netif_tx_unlock(txq);                 \