/*
 *      Network device statistics. Akin to the 2.0 ether stats but
 *      with byte counters.
 */

struct net_device_stats
{
        unsigned long   rx_packets;             /* total packets received       */
        unsigned long   tx_packets;             /* total packets transmitted    */
        unsigned long   rx_bytes;               /* total bytes received         */
        unsigned long   tx_bytes;               /* total bytes transmitted      */
        unsigned long   rx_errors;              /* bad packets received         */
        unsigned long   tx_errors;              /* packet transmit problems     */
        unsigned long   rx_dropped;             /* no space in linux buffers    */
        unsigned long   tx_dropped;             /* no space available in linux  */
        unsigned long   multicast;              /* multicast packets received   */
        unsigned long   collisions;

        /* detailed rx_errors: */
        unsigned long   rx_length_errors;
        unsigned long   rx_over_errors;         /* receiver ring buff overflow  */
        unsigned long   rx_crc_errors;          /* recved pkt with crc error    */
        unsigned long   rx_frame_errors;        /* recv'd frame alignment error */
        unsigned long   rx_fifo_errors;         /* recv'r fifo overrun          */
        unsigned long   rx_missed_errors;       /* receiver missed packet       */

        /* detailed tx_errors */
        unsigned long   tx_aborted_errors;
        unsigned long   tx_carrier_errors;
        unsigned long   tx_fifo_errors;
        unsigned long   tx_heartbeat_errors;
        unsigned long   tx_window_errors;

        /* for cslip etc */
        unsigned long   rx_compressed;
        unsigned long   tx_compressed;
};




/*
 * This structure defines the management hooks for network devices.
 * The following hooks can be defined; unless noted otherwise, they are
 * optional and can be filled with a null pointer.
 *
 * int (*ndo_init)(struct net_device *dev);
 *     This function is called once when network device is registered.
 *     The network device can use this to any late stage initializaton
 *     or semantic validattion. It can fail with an error code which will
 *     be propogated back to register_netdev
 *
 * void (*ndo_uninit)(struct net_device *dev);
 *     This function is called when device is unregistered or when registration
 *     fails. It is not called if init fails.
 *
 * int (*ndo_open)(struct net_device *dev);
 *     This function is called when network device transistions to the up
 *     state.
 *
 * int (*ndo_stop)(struct net_device *dev);
 *     This function is called when network device transistions to the down
 *     state.
 *
 * int (*ndo_hard_start_xmit)(struct sk_buff *skb, struct net_device *dev);
 *      Called when a packet needs to be transmitted.
 *      Must return NETDEV_TX_OK , NETDEV_TX_BUSY, or NETDEV_TX_LOCKED,
 *      Required can not be NULL.
 *
 * u16 (*ndo_select_queue)(struct net_device *dev, struct sk_buff *skb);
 *      Called to decide which queue to when device supports multiple
 *      transmit queues.
 *
 * void (*ndo_change_rx_flags)(struct net_device *dev, int flags);
 *      This function is called to allow device receiver to make
 *      changes to configuration when multicast or promiscious is enabled.
 *
 * void (*ndo_set_rx_mode)(struct net_device *dev);
 *      This function is called device changes address list filtering.
 *
 * void (*ndo_set_multicast_list)(struct net_device *dev);
 *      This function is called when the multicast address list changes.
 *
 * int (*ndo_set_mac_address)(struct net_device *dev, void *addr);
 *      This function  is called when the Media Access Control address
 *      needs to be changed. If not this interface is not defined, the
 *      mac address can not be changed.
 *
 * int (*ndo_validate_addr)(struct net_device *dev);
 *      Test if Media Access Control address is valid for the device.
 *
 * int (*ndo_do_ioctl)(struct net_device *dev, struct ifreq *ifr, int cmd);
 *      Called when a user request an ioctl which can't be handled by
 *      the generic interface code. If not defined ioctl's return
 *      not supported error code.
 *
 * int (*ndo_set_config)(struct net_device *dev, struct ifmap *map);
 *      Used to set network devices bus interface parameters. This interface
 *      is retained for legacy reason, new devices should use the bus
 *      interface (PCI) for low level management.
 *
 *
 * int (*ndo_change_mtu)(struct net_device *dev, int new_mtu);
 *      Called when a user wants to change the Maximum Transfer Unit
 *      of a device. If not defined, any request to change MTU will
 *      will return an error.
 *
 * void (*ndo_tx_timeout)(struct net_device *dev);
 *      Callback uses when the transmitter has not made any progress
 *      for dev->watchdog ticks.
 *
 * struct net_device_stats* (*get_stats)(struct net_device *dev);
 *      Called when a user wants to get the network device usage
 *      statistics. If not defined, the counters in dev->stats will
 *      be used.
 *
 * void (*ndo_vlan_rx_register)(struct net_device *dev, struct vlan_group *grp);
 *      If device support VLAN receive accleration
 *      (ie. dev->features & NETIF_F_HW_VLAN_RX), then this function is called
 *      when vlan groups for the device changes.  Note: grp is NULL
 *      if no vlan's groups are being used.
 *
 * void (*ndo_vlan_rx_add_vid)(struct net_device *dev, unsigned short vid);
 *      If device support VLAN filtering (dev->features & NETIF_F_HW_VLAN_FILTER)
 *      this function is called when a VLAN id is registered.
 *
 * void (*ndo_vlan_rx_kill_vid)(struct net_device *dev, unsigned short vid);
 *      If device support VLAN filtering (dev->features & NETIF_F_HW_VLAN_FILTER)
 *      this function is called when a VLAN id is unregistered.
 *
 * void (*ndo_poll_controller)(struct net_device *dev);
 */


/*
 *      The DEVICE structure.
 *      Actually, this whole structure is a big mistake.  It mixes I/O
 *      data with strictly "high-level" data, and it has to know about
 *      almost every data structure used in the INET module.
 *
 *      FIXME: cleanup struct net_device such that network protocol info
 *      moves out.
 */

struct net_device
{

        /*
         * This is the first field of the "visible" part of this structure
         * (i.e. as seen by users in the "Space.c" file).  It is the name
         * the interface.
         */
        char                    name[IFNAMSIZ];
        /* device name hash chain */
        struct hlist_node       name_hlist;
        /* snmp alias */
        char                    *ifalias;

        /*
         *      I/O specific fields
         *      FIXME: Merge these and struct ifmap into one
         */
        unsigned long           mem_end;        /* shared mem end       */
        unsigned long           mem_start;      /* shared mem start     */
        unsigned long           base_addr;      /* device I/O address   */
        unsigned int            irq;            /* device IRQ number    */

        /*
         *      Some hardware also needs these fields, but they are not
         *      part of the usual set specified in Space.c.
         */

        unsigned char           if_port;        /* Selectable AUI, TP,..*/
        unsigned char           dma;            /* DMA channel          */

        unsigned long           state;

        struct list_head        dev_list;
        struct list_head        napi_list;

        /* Net device features */
        unsigned long           features;
#define NETIF_F_SG              1       /* Scatter/gather IO. */
#define NETIF_F_IP_CSUM         2       /* Can checksum TCP/UDP over IPv4. */
#define NETIF_F_NO_CSUM         4       /* Does not require checksum. F.e. loopack. */
#define NETIF_F_HW_CSUM         8       /* Can checksum all the packets. */
#define NETIF_F_IPV6_CSUM       16      /* Can checksum TCP/UDP over IPV6 */
#define NETIF_F_HIGHDMA         32      /* Can DMA to high memory. */
#define NETIF_F_FRAGLIST        64      /* Scatter/gather IO. */
#define NETIF_F_HW_VLAN_TX      128     /* Transmit VLAN hw acceleration */
#define NETIF_F_HW_VLAN_RX      256     /* Receive VLAN hw acceleration */
#define NETIF_F_HW_VLAN_FILTER  512     /* Receive filtering on VLAN */
#define NETIF_F_VLAN_CHALLENGED 1024    /* Device cannot handle VLAN packets */
#define NETIF_F_GSO             2048    /* Enable software GSO. */
#define NETIF_F_LLTX            4096    /* LockLess TX - deprecated. Please */
                                        /* do not use LLTX in new drivers */
#define NETIF_F_NETNS_LOCAL     8192    /* Does not change network namespaces */
#define NETIF_F_GRO             16384   /* Generic receive offload */
#define NETIF_F_LRO             32768   /* large receive offload */

        /* Segmentation offload features */
#define NETIF_F_GSO_SHIFT       16
#define NETIF_F_GSO_MASK        0xffff0000
#define NETIF_F_TSO             (SKB_GSO_TCPV4 << NETIF_F_GSO_SHIFT)
#define NETIF_F_UFO             (SKB_GSO_UDP << NETIF_F_GSO_SHIFT)
#define NETIF_F_GSO_ROBUST      (SKB_GSO_DODGY << NETIF_F_GSO_SHIFT)
#define NETIF_F_TSO_ECN         (SKB_GSO_TCP_ECN << NETIF_F_GSO_SHIFT)
#define NETIF_F_TSO6            (SKB_GSO_TCPV6 << NETIF_F_GSO_SHIFT)

        /* List of features with software fallbacks. */
#define NETIF_F_GSO_SOFTWARE    (NETIF_F_TSO | NETIF_F_TSO_ECN | NETIF_F_TSO6)


#define NETIF_F_GEN_CSUM        (NETIF_F_NO_CSUM | NETIF_F_HW_CSUM)
#define NETIF_F_V4_CSUM         (NETIF_F_GEN_CSUM | NETIF_F_IP_CSUM)
#define NETIF_F_V6_CSUM         (NETIF_F_GEN_CSUM | NETIF_F_IPV6_CSUM)
#define NETIF_F_ALL_CSUM        (NETIF_F_V4_CSUM | NETIF_F_V6_CSUM)

        /*
         * If one device supports one of these features, then enable them
         * for all in netdev_increment_features.
         */
#define NETIF_F_ONE_FOR_ALL     (NETIF_F_GSO_SOFTWARE | NETIF_F_GSO_ROBUST | \
                                 NETIF_F_SG | NETIF_F_HIGHDMA |         \
                                 NETIF_F_FRAGLIST)

        /* Interface index. Unique device identifier    */
        int                     ifindex;
        int                     iflink;

        struct net_device_stats stats;

#ifdef CONFIG_WIRELESS_EXT
        /* List of functions to handle Wireless Extensions (instead of ioctl).
         * See <net/iw_handler.h> for details. Jean II */
        const struct iw_handler_def *   wireless_handlers;
        /* Instance data managed by the core of Wireless Extensions. */
        struct iw_public_data * wireless_data;
#endif
        /* Management operations */
        const struct net_device_ops *netdev_ops;
        const struct ethtool_ops *ethtool_ops;

        /* Hardware header description */
        const struct header_ops *header_ops;

        unsigned int            flags;  /* interface flags (a la BSD)   */
        unsigned short          gflags;
        unsigned short          priv_flags; /* Like 'flags' but invisible to userspace. */
        unsigned short          padded; /* How much padding added by alloc_netdev() */

        unsigned char           operstate; /* RFC2863 operstate */
        unsigned char           link_mode; /* mapping policy to operstate */

        unsigned                mtu;    /* interface MTU value          */
        unsigned short          type;   /* interface hardware type      */
        unsigned short          hard_header_len;        /* hardware hdr length  */

        /* extra head- and tailroom the hardware may need, but not in all cases
         * can this be guaranteed, especially tailroom. Some cases also use
         * LL_MAX_HEADER instead to allocate the skb.
         */
        unsigned short          needed_headroom;
        unsigned short          needed_tailroom;

        struct net_device       *master; /* Pointer to master device of a group,
                                          * which this device is member of.

                                         */

        /* Interface address info. */
        unsigned char           perm_addr[MAX_ADDR_LEN]; /* permanent hw address */
        unsigned char           addr_len;       /* hardware address length      */
        unsigned short          dev_id;         /* for shared network cards */

        spinlock_t              addr_list_lock;
        struct dev_addr_list    *uc_list;       /* Secondary unicast mac addresses */
        int                     uc_count;       /* Number of installed ucasts   */
        int                     uc_promisc;
        struct dev_addr_list    *mc_list;       /* Multicast mac addresses      */
        int                     mc_count;       /* Number of installed mcasts   */
        unsigned int            promiscuity;
        unsigned int            allmulti;


        /* Protocol specific pointers */

#ifdef CONFIG_NET_DSA
        void                    *dsa_ptr;       /* dsa specific data */
#endif
        void                    *atalk_ptr;     /* AppleTalk link       */
        void                    *ip_ptr;        /* IPv4 specific data   */
        void                    *dn_ptr;        /* DECnet specific data */
        void                    *ip6_ptr;       /* IPv6 specific data */
        void                    *ec_ptr;        /* Econet specific data */
        void                    *ax25_ptr;      /* AX.25 specific data */
        struct wireless_dev     *ieee80211_ptr; /* IEEE 802.11 specific data,
                                                   assign before registering */

/*
 * Cache line mostly used on receive path (including eth_type_trans())
 */
        unsigned long           last_rx;        /* Time of last Rx      */
        /* Interface address info used in eth_type_trans() */
        unsigned char           dev_addr[MAX_ADDR_LEN]; /* hw address, (before bcast
                                                           because most packets are unicast) */

        unsigned char           broadcast[MAX_ADDR_LEN];        /* hw bcast add */

        struct netdev_queue     rx_queue;

        struct netdev_queue     *_tx ____cacheline_aligned_in_smp;

        /* Number of TX queues allocated at alloc_netdev_mq() time  */
        unsigned int            num_tx_queues;

        /* Number of TX queues currently active in device  */
        unsigned int            real_num_tx_queues;

        unsigned long           tx_queue_len;   /* Max frames per queue allowed */
        spinlock_t              tx_global_lock;
/*
 * One part is mostly used on xmit path (device)
 */
        /* These may be needed for future network-power-down code. */
        unsigned long           trans_start;    /* Time (in jiffies) of last Tx */

        int                     watchdog_timeo; /* used by dev_watchdog() */
        struct timer_list       watchdog_timer;

        /* Number of references to this device */
        atomic_t                refcnt ____cacheline_aligned_in_smp;

        /* delayed register/unregister */
        struct list_head        todo_list;
        /* device index hash chain */
        struct hlist_node       index_hlist;

        struct net_device       *link_watch_next;

        /* register/unregister state machine */
        enum { NETREG_UNINITIALIZED=0,
               NETREG_REGISTERED,       /* completed register_netdevice */
               NETREG_UNREGISTERING,    /* called unregister_netdevice */
               NETREG_UNREGISTERED,     /* completed unregister todo */
               NETREG_RELEASED,         /* called free_netdev */
        } reg_state;

        /* Called from unregister, can be used to call free_netdev */
        void (*destructor)(struct net_device *dev);

#ifdef CONFIG_NETPOLL
        struct netpoll_info     *npinfo;
#endif

#ifdef CONFIG_NET_NS
        /* Network namespace this network device is inside */
        struct net              *nd_net;
#endif

        /* mid-layer private */
        void                    *ml_priv;

        /* bridge stuff */
        struct net_bridge_port  *br_port;
        /* macvlan */
        struct macvlan_port     *macvlan_port;
        /* GARP */
        struct garp_port        *garp_port;

        /* class/net/name entry */
        struct device           dev;   
        /* space for optional statistics and wireless sysfs groups */
        struct attribute_group  *sysfs_groups[3];

        /* rtnetlink link ops */
        const struct rtnl_link_ops *rtnl_link_ops;

        /* VLAN feature mask */
        unsigned long vlan_features;

        /* for setting kernel sock attribute on TCP connection setup */
#define GSO_MAX_SIZE            65536  
        unsigned int            gso_max_size;

#ifdef CONFIG_DCB
        /* Data Center Bridging netlink ops */
        struct dcbnl_rtnl_ops *dcbnl_ops;
#endif

#ifdef CONFIG_COMPAT_NET_DEV_OPS
        struct {
                int                     (*init)(struct net_device *dev);
                void                    (*uninit)(struct net_device *dev);
                int                     (*open)(struct net_device *dev);
                int                     (*stop)(struct net_device *dev);
                int                     (*hard_start_xmit) (struct sk_buff *skb,
                                                            struct net_device *dev);
                u16                     (*select_queue)(struct net_device *dev,
                                                        struct sk_buff *skb);
                void                    (*change_rx_flags)(struct net_device *dev,
                                                           int flags);
                void                    (*set_rx_mode)(struct net_device *dev);
                void                    (*set_multicast_list)(struct net_device *dev);
                int                     (*set_mac_address)(struct net_device *dev,
                                                           void *addr);
                int                     (*validate_addr)(struct net_device *dev);
                int                     (*do_ioctl)(struct net_device *dev,
                                                    struct ifreq *ifr, int cmd);
                int                     (*set_config)(struct net_device *dev,
                                                      struct ifmap *map);
                int                     (*change_mtu)(struct net_device *dev, int new_mtu);
                int                     (*neigh_setup)(struct net_device *dev,
                                                       struct neigh_parms *);
                void                    (*tx_timeout) (struct net_device *dev);
                struct net_device_stats* (*get_stats)(struct net_device *dev);
                void                    (*vlan_rx_register)(struct net_device *dev,
                                                            struct vlan_group *grp);
                void                    (*vlan_rx_add_vid)(struct net_device *dev,
                                                           unsigned short vid);
                void                    (*vlan_rx_kill_vid)(struct net_device *dev,
                                                            unsigned short vid);
#ifdef CONFIG_NET_POLL_CONTROLLER
                void                    (*poll_controller)(struct net_device *dev);
#endif
        };
#endif
};


/* These functions live elsewhere (drivers/net/net_init.c, but related) */

extern void             ether_setup(struct net_device *dev);

/* Support for loadable net-drivers */
extern struct net_device *alloc_netdev_mq(int sizeof_priv, const char *name,
                                       void (*setup)(struct net_device *),
                                       unsigned int queue_count);
#define alloc_netdev(sizeof_priv, name, setup) \
        alloc_netdev_mq(sizeof_priv, name, setup, 1)
extern int              register_netdev(struct net_device *dev);
extern void             unregister_netdev(struct net_device *dev);
/* Functions used for secondary unicast and multicast support */
extern void             dev_set_rx_mode(struct net_device *dev);
extern void             __dev_set_rx_mode(struct net_device *dev);
extern int              dev_unicast_delete(struct net_device *dev, void *addr, int alen);
extern int              dev_unicast_add(struct net_device *dev, void *addr, int alen);
extern int              dev_unicast_sync(struct net_device *to, struct net_device *from);
extern void             dev_unicast_unsync(struct net_device *to, struct net_device *from);
extern int              dev_mc_delete(struct net_device *dev, void *addr, int alen, int all);
extern int              dev_mc_add(struct net_device *dev, void *addr, int alen, int newonly);
extern int              dev_mc_sync(struct net_device *to, struct net_device *from);
extern void             dev_mc_unsync(struct net_device *to, struct net_device *from);
extern int              __dev_addr_delete(struct dev_addr_list **list, int *count, void *addr, int alen, int all);
extern int              __dev_addr_add(struct dev_addr_list **list, int *count, void *addr, int alen, int newonly);
extern int              __dev_addr_sync(struct dev_addr_list **to, int *to_count, struct dev_addr_list **from, int *from_count);
extern void             __dev_addr_unsync(struct dev_addr_list **to, int *to_count, struct dev_addr_list **from, int *from_count);
extern int              dev_set_promiscuity(struct net_device *dev, int inc);
extern int              dev_set_allmulti(struct net_device *dev, int inc);
extern void             netdev_state_change(struct net_device *dev);
extern void             netdev_bonding_change(struct net_device *dev);
extern void             netdev_features_change(struct net_device *dev);
/* Load a device via the kmod */
extern void             dev_load(struct net *net, const char *name);
extern void             dev_mcast_init(void);
extern const struct net_device_stats *dev_get_stats(struct net_device *dev);

extern int              netdev_max_backlog;
extern int              weight_p;
extern int              netdev_set_master(struct net_device *dev, struct net_device *master);
extern int skb_checksum_help(struct sk_buff *skb);
extern struct sk_buff *skb_gso_segment(struct sk_buff *skb, int features);
#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)





Reply via email to