1c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 2c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * INET An implementation of the TCP/IP protocol suite for the LINUX 3c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * operating system. INET is implemented using the BSD Socket 4c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * interface as the means of communication with the user level. 5c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 6c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Definitions for the Interfaces handler. 7c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 8c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Version: @(#)dev.h 1.0.10 08/12/93 9c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 10c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Authors: Ross Biro 11c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG> 12c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Corey Minyard <wf-rch!minyard@relay.EU.net> 13c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Donald J. Becker, <becker@cesdis.gsfc.nasa.gov> 14c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Alan Cox, <Alan.Cox@linux.org> 15c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Bjorn Ekwall. <bj0rn@blox.se> 16c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Pekka Riikonen <priikone@poseidon.pspt.fi> 17c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 18c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * This program is free software; you can redistribute it and/or 19c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * modify it under the terms of the GNU General Public License 20c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * as published by the Free Software Foundation; either version 21c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 2 of the License, or (at your option) any later version. 22c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 23c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Moved to /usr/include/linux for NET3 24c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 25c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef _LINUX_NETDEVICE_H 26c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define _LINUX_NETDEVICE_H 27c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 28c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/if.h> 29c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/if_ether.h> 30c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/if_packet.h> 31c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 32c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef __KERNEL__ 33c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/atomic.h> 34c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/cache.h> 35c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/byteorder.h> 36c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 37c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/device.h> 38c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/percpu.h> 39c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/dmaengine.h> 40c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 41c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct divert_blk; 42c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct vlan_group; 43c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct ethtool_ops; 44c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct netpoll_info; 45c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* source back-compat hooks */ 46c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SET_ETHTOOL_OPS(netdev,ops) \ 47c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ( (netdev)->ethtool_ops = (ops) ) 48c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 49c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define HAVE_ALLOC_NETDEV /* feature macro: alloc_xxxdev 50c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru functions are available. */ 51c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define HAVE_FREE_NETDEV /* free_netdev() */ 52c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define HAVE_NETDEV_PRIV /* netdev_priv() */ 53c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 54c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define NET_XMIT_SUCCESS 0 55c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define NET_XMIT_DROP 1 /* skb dropped */ 56c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define NET_XMIT_CN 2 /* congestion notification */ 57c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define NET_XMIT_POLICED 3 /* skb is shot by police */ 58c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define NET_XMIT_BYPASS 4 /* packet does not leave via dequeue; 59c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru (TC use only - dev_queue_xmit 60c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru returns this as NET_XMIT_SUCCESS) */ 61c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 62c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Backlog congestion levels */ 63c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define NET_RX_SUCCESS 0 /* keep 'em coming, baby */ 64c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define NET_RX_DROP 1 /* packet dropped */ 65c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define NET_RX_CN_LOW 2 /* storm alert, just in case */ 66c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define NET_RX_CN_MOD 3 /* Storm on its way! */ 67c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define NET_RX_CN_HIGH 4 /* The storm is here */ 68c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define NET_RX_BAD 5 /* packet dropped due to kernel error */ 69c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 70c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define net_xmit_errno(e) ((e) != NET_XMIT_CN ? -ENOBUFS : 0) 71c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 72c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 73c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 74c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define MAX_ADDR_LEN 32 /* Largest hardware address length */ 75c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 76c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Driver transmit return codes */ 77c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define NETDEV_TX_OK 0 /* driver took care of packet */ 78c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define NETDEV_TX_BUSY 1 /* driver tx path was busy*/ 79c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define NETDEV_TX_LOCKED -1 /* driver tx lock was already taken */ 80c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 81c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 82c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Compute the worst case header length according to the protocols 83c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * used. 84c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 85c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 86c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#if !defined(CONFIG_AX25) && !defined(CONFIG_AX25_MODULE) && !defined(CONFIG_TR) 87c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define LL_MAX_HEADER 32 88c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else 89c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE) 90c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define LL_MAX_HEADER 96 91c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else 92c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define LL_MAX_HEADER 48 93c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 94c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 95c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 96c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#if !defined(CONFIG_NET_IPIP) && \ 97c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE) 98c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define MAX_HEADER LL_MAX_HEADER 99c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else 100c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define MAX_HEADER (LL_MAX_HEADER + 48) 101c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 102c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 103c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 104c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Network device statistics. Akin to the 2.0 ether stats but 105c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * with byte counters. 106c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 107c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 108c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct net_device_stats 109c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 110c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long rx_packets; /* total packets received */ 111c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long tx_packets; /* total packets transmitted */ 112c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long rx_bytes; /* total bytes received */ 113c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long tx_bytes; /* total bytes transmitted */ 114c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long rx_errors; /* bad packets received */ 115c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long tx_errors; /* packet transmit problems */ 116c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long rx_dropped; /* no space in linux buffers */ 117c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long tx_dropped; /* no space available in linux */ 118c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long multicast; /* multicast packets received */ 119c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long collisions; 120c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 121c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* detailed rx_errors: */ 122c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long rx_length_errors; 123c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long rx_over_errors; /* receiver ring buff overflow */ 124c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long rx_crc_errors; /* recved pkt with crc error */ 125c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long rx_frame_errors; /* recv'd frame alignment error */ 126c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long rx_fifo_errors; /* recv'r fifo overrun */ 127c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long rx_missed_errors; /* receiver missed packet */ 128c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 129c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* detailed tx_errors */ 130c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long tx_aborted_errors; 131c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long tx_carrier_errors; 132c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long tx_fifo_errors; 133c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long tx_heartbeat_errors; 134c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long tx_window_errors; 135c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 136c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* for cslip etc */ 137c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long rx_compressed; 138c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long tx_compressed; 139c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 140c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 141c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 142c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Media selection options. */ 143c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruenum { 144c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru IF_PORT_UNKNOWN = 0, 145c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru IF_PORT_10BASE2, 146c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru IF_PORT_10BASET, 147c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru IF_PORT_AUI, 148c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru IF_PORT_100BASET, 149c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru IF_PORT_100BASETX, 150c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru IF_PORT_100BASEFX 151c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 152c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 153c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef __KERNEL__ 154c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 155c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/cache.h> 156c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/skbuff.h> 157c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 158c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct neighbour; 159c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct neigh_parms; 160c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct sk_buff; 161c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 162c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct netif_rx_stats 163c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 164c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned total; 165c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned dropped; 166c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned time_squeeze; 167c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned cpu_collision; 168c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 169c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 170c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste QueruDECLARE_PER_CPU(struct netif_rx_stats, netdev_rx_stat); 171c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 172c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 173c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 174c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * We tag multicasts with these structures. 175c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 176c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 177c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct dev_mc_list 178c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 179c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct dev_mc_list *next; 180c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u8 dmi_addr[MAX_ADDR_LEN]; 181c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char dmi_addrlen; 182c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int dmi_users; 183c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int dmi_gusers; 184c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 185c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 186c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct hh_cache 187c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 188c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct hh_cache *hh_next; /* Next entry */ 189c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru atomic_t hh_refcnt; /* number of users */ 190c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned short hh_type; /* protocol identifier, f.e ETH_P_IP 191c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * NOTE: For VLANs, this will be the 192c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * encapuslated type. --BLG 193c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 194c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int hh_len; /* length of header */ 195c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*hh_output)(struct sk_buff *skb); 196c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru rwlock_t hh_lock; 197c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 198c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* cached hardware header; allow for machine alignment needs. */ 199c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define HH_DATA_MOD 16 200c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define HH_DATA_OFF(__len) \ 201c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru (HH_DATA_MOD - (((__len - 1) & (HH_DATA_MOD - 1)) + 1)) 202c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define HH_DATA_ALIGN(__len) \ 203c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru (((__len)+(HH_DATA_MOD-1))&~(HH_DATA_MOD - 1)) 204c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long hh_data[HH_DATA_ALIGN(LL_MAX_HEADER) / sizeof(long)]; 205c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 206c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 207c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Reserve HH_DATA_MOD byte aligned hard_header_len, but at least that much. 208c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Alternative is: 209c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * dev->hard_header_len ? (dev->hard_header_len + 210c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * (HH_DATA_MOD - 1)) & ~(HH_DATA_MOD - 1) : 0 211c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 212c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * We could use other alignment values, but we must maintain the 213c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * relationship HH alignment <= LL alignment. 214c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 215c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define LL_RESERVED_SPACE(dev) \ 216c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru (((dev)->hard_header_len&~(HH_DATA_MOD - 1)) + HH_DATA_MOD) 217c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define LL_RESERVED_SPACE_EXTRA(dev,extra) \ 218c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ((((dev)->hard_header_len+extra)&~(HH_DATA_MOD - 1)) + HH_DATA_MOD) 219c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 220c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* These flag bits are private to the generic network queueing 221c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * layer, they may not be explicitly referenced by any other 222c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * code. 223c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 224c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 225c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruenum netdev_state_t 226c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 227c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __LINK_STATE_XOFF=0, 228c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __LINK_STATE_START, 229c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __LINK_STATE_PRESENT, 230c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __LINK_STATE_SCHED, 231c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __LINK_STATE_NOCARRIER, 232c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __LINK_STATE_RX_SCHED, 233c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __LINK_STATE_LINKWATCH_PENDING, 234c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __LINK_STATE_DORMANT, 235c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __LINK_STATE_QDISC_RUNNING, 236c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 237c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 238c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 239c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 240c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * This structure holds at boot time configured netdevice settings. They 241c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * are then used in the device probing. 242c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 243c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct netdev_boot_setup { 244c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru char name[IFNAMSIZ]; 245c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct ifmap map; 246c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 247c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define NETDEV_BOOT_SETUP_MAX 8 248c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 249c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int __init netdev_boot_setup(char *str); 250c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 251c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 252c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * The DEVICE structure. 253c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Actually, this whole structure is a big mistake. It mixes I/O 254c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * data with strictly "high-level" data, and it has to know about 255c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * almost every data structure used in the INET module. 256c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 257c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * FIXME: cleanup struct net_device such that network protocol info 258c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * moves out. 259c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 260c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 261c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct net_device 262c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 263c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 264c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 265c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * This is the first field of the "visible" part of this structure 266c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * (i.e. as seen by users in the "Space.c" file). It is the name 267c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * the interface. 268c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 269c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru char name[IFNAMSIZ]; 270c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* device name hash chain */ 271c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct hlist_node name_hlist; 272c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 273c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 274c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * I/O specific fields 275c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * FIXME: Merge these and struct ifmap into one 276c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 277c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long mem_end; /* shared mem end */ 278c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long mem_start; /* shared mem start */ 279c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long base_addr; /* device I/O address */ 280c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int irq; /* device IRQ number */ 281c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 282c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 283c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Some hardware also needs these fields, but they are not 284c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * part of the usual set specified in Space.c. 285c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 286c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 287c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char if_port; /* Selectable AUI, TP,..*/ 288c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char dma; /* DMA channel */ 289c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 290c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long state; 291c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 292c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct net_device *next; 293c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 294c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* The device initialization function. Called only once. */ 295c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*init)(struct net_device *dev); 296c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 297c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* ------- Fields preinitialized in Space.c finish here ------- */ 298c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 299c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* Net device features */ 300c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long features; 301c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define NETIF_F_SG 1 /* Scatter/gather IO. */ 302c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define NETIF_F_IP_CSUM 2 /* Can checksum only TCP/UDP over IPv4. */ 303c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define NETIF_F_NO_CSUM 4 /* Does not require checksum. F.e. loopack. */ 304c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define NETIF_F_HW_CSUM 8 /* Can checksum all the packets. */ 305c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define NETIF_F_HIGHDMA 32 /* Can DMA to high memory. */ 306c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define NETIF_F_FRAGLIST 64 /* Scatter/gather IO. */ 307c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define NETIF_F_HW_VLAN_TX 128 /* Transmit VLAN hw acceleration */ 308c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define NETIF_F_HW_VLAN_RX 256 /* Receive VLAN hw acceleration */ 309c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define NETIF_F_HW_VLAN_FILTER 512 /* Receive filtering on VLAN */ 310c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define NETIF_F_VLAN_CHALLENGED 1024 /* Device cannot handle VLAN packets */ 311c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define NETIF_F_GSO 2048 /* Enable software GSO. */ 312c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define NETIF_F_LLTX 4096 /* LockLess TX */ 313c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 314c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* Segmentation offload features */ 315c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define NETIF_F_GSO_SHIFT 16 316c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define NETIF_F_GSO_MASK 0xffff0000 317c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define NETIF_F_TSO (SKB_GSO_TCPV4 << NETIF_F_GSO_SHIFT) 318c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define NETIF_F_UFO (SKB_GSO_UDP << NETIF_F_GSO_SHIFT) 319c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define NETIF_F_GSO_ROBUST (SKB_GSO_DODGY << NETIF_F_GSO_SHIFT) 320c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define NETIF_F_TSO_ECN (SKB_GSO_TCP_ECN << NETIF_F_GSO_SHIFT) 321c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define NETIF_F_TSO6 (SKB_GSO_TCPV6 << NETIF_F_GSO_SHIFT) 322c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 323c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* List of features with software fallbacks. */ 324c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define NETIF_F_GSO_SOFTWARE (NETIF_F_TSO | NETIF_F_TSO_ECN | NETIF_F_TSO6) 325c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 326c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define NETIF_F_GEN_CSUM (NETIF_F_NO_CSUM | NETIF_F_HW_CSUM) 327c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define NETIF_F_ALL_CSUM (NETIF_F_IP_CSUM | NETIF_F_GEN_CSUM) 328c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 329c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct net_device *next_sched; 330c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 331c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* Interface index. Unique device identifier */ 332c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int ifindex; 333c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int iflink; 334c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 335c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 336c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct net_device_stats* (*get_stats)(struct net_device *dev); 337c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct iw_statistics* (*get_wireless_stats)(struct net_device *dev); 338c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 339c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* List of functions to handle Wireless Extensions (instead of ioctl). 340c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * See <net/iw_handler.h> for details. Jean II */ 341c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru const struct iw_handler_def * wireless_handlers; 342c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* Instance data managed by the core of Wireless Extensions. */ 343c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct iw_public_data * wireless_data; 344c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 345c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct ethtool_ops *ethtool_ops; 346c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 347c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 348c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * This marks the end of the "visible" part of the structure. All 349c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * fields hereafter are internal to the system, and may change at 350c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * will (read: may be cleaned up at will). 351c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 352c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 353c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 354c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int flags; /* interface flags (a la BSD) */ 355c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned short gflags; 356c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned short priv_flags; /* Like 'flags' but invisible to userspace. */ 357c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned short padded; /* How much padding added by alloc_netdev() */ 358c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 359c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char operstate; /* RFC2863 operstate */ 360c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char link_mode; /* mapping policy to operstate */ 361c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 362c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned mtu; /* interface MTU value */ 363c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned short type; /* interface hardware type */ 364c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned short hard_header_len; /* hardware hdr length */ 365c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 366c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct net_device *master; /* Pointer to master device of a group, 367c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * which this device is member of. 368c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 369c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 370c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* Interface address info. */ 371c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char perm_addr[MAX_ADDR_LEN]; /* permanent hw address */ 372c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char addr_len; /* hardware address length */ 373c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned short dev_id; /* for shared network cards */ 374c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 375c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct dev_mc_list *mc_list; /* Multicast mac addresses */ 376c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int mc_count; /* Number of installed mcasts */ 377c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int promiscuity; 378c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int allmulti; 379c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 380c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 381c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* Protocol specific pointers */ 382c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 383c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void *atalk_ptr; /* AppleTalk link */ 384c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void *ip_ptr; /* IPv4 specific data */ 385c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void *dn_ptr; /* DECnet specific data */ 386c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void *ip6_ptr; /* IPv6 specific data */ 387c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void *ec_ptr; /* Econet specific data */ 388c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void *ax25_ptr; /* AX.25 specific data */ 389c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 390c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 391c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Cache line mostly used on receive path (including eth_type_trans()) 392c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 393c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct list_head poll_list ____cacheline_aligned_in_smp; 394c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* Link to poll list */ 395c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 396c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*poll) (struct net_device *dev, int *quota); 397c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int quota; 398c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int weight; 399c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long last_rx; /* Time of last Rx */ 400c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* Interface address info used in eth_type_trans() */ 401c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char dev_addr[MAX_ADDR_LEN]; /* hw address, (before bcast 402c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru because most packets are unicast) */ 403c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 404c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char broadcast[MAX_ADDR_LEN]; /* hw bcast add */ 405c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 406c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 407c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Cache line mostly used on queue transmit path (qdisc) 408c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 409c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* device queue lock */ 410c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru spinlock_t queue_lock ____cacheline_aligned_in_smp; 411c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct Qdisc *qdisc; 412c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct Qdisc *qdisc_sleeping; 413c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct list_head qdisc_list; 414c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long tx_queue_len; /* Max frames per queue allowed */ 415c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 416c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* Partially transmitted GSO packet. */ 417c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct sk_buff *gso_skb; 418c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 419c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* ingress path synchronizer */ 420c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru spinlock_t ingress_lock; 421c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct Qdisc *qdisc_ingress; 422c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 423c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 424c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * One part is mostly used on xmit path (device) 425c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 426c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* hard_start_xmit synchronizer */ 427c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru spinlock_t _xmit_lock ____cacheline_aligned_in_smp; 428c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* cpu id of processor entered to hard_start_xmit or -1, 429c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if nobody entered there. 430c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 431c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int xmit_lock_owner; 432c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void *priv; /* pointer to private data */ 433c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*hard_start_xmit) (struct sk_buff *skb, 434c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct net_device *dev); 435c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* These may be needed for future network-power-down code. */ 436c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long trans_start; /* Time (in jiffies) of last Tx */ 437c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 438c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int watchdog_timeo; /* used by dev_watchdog() */ 439c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct timer_list watchdog_timer; 440c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 441c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 442c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * refcnt is a very hot point, so align it on SMP 443c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 444c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* Number of references to this device */ 445c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru atomic_t refcnt ____cacheline_aligned_in_smp; 446c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 447c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* delayed register/unregister */ 448c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct list_head todo_list; 449c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* device index hash chain */ 450c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct hlist_node index_hlist; 451c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 452c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* register/unregister state machine */ 453c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru enum { NETREG_UNINITIALIZED=0, 454c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru NETREG_REGISTERED, /* completed register_netdevice */ 455c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru NETREG_UNREGISTERING, /* called unregister_netdevice */ 456c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru NETREG_UNREGISTERED, /* completed unregister todo */ 457c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru NETREG_RELEASED, /* called free_netdev */ 458c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } reg_state; 459c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 460c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* Called after device is detached from network. */ 461c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void (*uninit)(struct net_device *dev); 462c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* Called after last user reference disappears. */ 463c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void (*destructor)(struct net_device *dev); 464c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 465c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* Pointers to interface service routines. */ 466c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*open)(struct net_device *dev); 467c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*stop)(struct net_device *dev); 468c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define HAVE_NETDEV_POLL 469c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*hard_header) (struct sk_buff *skb, 470c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct net_device *dev, 471c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned short type, 472c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void *daddr, 473c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void *saddr, 474c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned len); 475c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*rebuild_header)(struct sk_buff *skb); 476c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define HAVE_MULTICAST 477c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void (*set_multicast_list)(struct net_device *dev); 478c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define HAVE_SET_MAC_ADDR 479c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*set_mac_address)(struct net_device *dev, 480c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void *addr); 481c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define HAVE_PRIVATE_IOCTL 482c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*do_ioctl)(struct net_device *dev, 483c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct ifreq *ifr, int cmd); 484c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define HAVE_SET_CONFIG 485c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*set_config)(struct net_device *dev, 486c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct ifmap *map); 487c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define HAVE_HEADER_CACHE 488c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*hard_header_cache)(struct neighbour *neigh, 489c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct hh_cache *hh); 490c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void (*header_cache_update)(struct hh_cache *hh, 491c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct net_device *dev, 492c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char * haddr); 493c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define HAVE_CHANGE_MTU 494c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*change_mtu)(struct net_device *dev, int new_mtu); 495c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 496c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define HAVE_TX_TIMEOUT 497c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void (*tx_timeout) (struct net_device *dev); 498c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 499c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void (*vlan_rx_register)(struct net_device *dev, 500c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct vlan_group *grp); 501c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void (*vlan_rx_add_vid)(struct net_device *dev, 502c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned short vid); 503c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void (*vlan_rx_kill_vid)(struct net_device *dev, 504c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned short vid); 505c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 506c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*hard_header_parse)(struct sk_buff *skb, 507c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char *haddr); 508c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*neigh_setup)(struct net_device *dev, struct neigh_parms *); 509c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_NETPOLL 510c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct netpoll_info *npinfo; 511c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 512c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_NET_POLL_CONTROLLER 513c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void (*poll_controller)(struct net_device *dev); 514c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 515c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 516c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* bridge stuff */ 517c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct net_bridge_port *br_port; 518c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 519c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_NET_DIVERT 520c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* this will get initialized at each interface type init routine */ 521c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct divert_blk *divert; 522c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* CONFIG_NET_DIVERT */ 523c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 524c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* class/net/name entry */ 525c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct class_device class_dev; 526c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* space for optional statistics and wireless sysfs groups */ 527c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct attribute_group *sysfs_groups[3]; 528c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 529c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 530c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define NETDEV_ALIGN 32 531c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define NETDEV_ALIGN_CONST (NETDEV_ALIGN - 1) 532c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 533c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void *netdev_priv(struct net_device *dev) 534c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 535c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return (char *)dev + ((sizeof(struct net_device) 536c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru + NETDEV_ALIGN_CONST) 537c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru & ~NETDEV_ALIGN_CONST); 538c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 539c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 540c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SET_MODULE_OWNER(dev) do { } while (0) 541c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Set the sysfs physical device reference for the network logical device 542c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * if set prior to registration will cause a symlink during initialization. 543c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 544c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SET_NETDEV_DEV(net, pdev) ((net)->class_dev.dev = (pdev)) 545c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 546c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct packet_type { 547c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __be16 type; /* This is really htons(ether_type). */ 548c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct net_device *dev; /* NULL is wildcarded here */ 549c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*func) (struct sk_buff *, 550c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct net_device *, 551c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct packet_type *, 552c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct net_device *); 553c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct sk_buff *(*gso_segment)(struct sk_buff *skb, 554c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int features); 555c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*gso_send_check)(struct sk_buff *skb); 556c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void *af_packet_priv; 557c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct list_head list; 558c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 559c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 560c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/interrupt.h> 561c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/notifier.h> 562c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 563c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct net_device loopback_dev; /* The loopback */ 564c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct net_device *dev_base; /* All devices */ 565c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern rwlock_t dev_base_lock; /* Device list lock */ 566c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 567c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int netdev_boot_setup_check(struct net_device *dev); 568c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern unsigned long netdev_boot_base(const char *prefix, int unit); 569c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct net_device *dev_getbyhwaddr(unsigned short type, char *hwaddr); 570c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct net_device *dev_getfirstbyhwtype(unsigned short type); 571c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void dev_add_pack(struct packet_type *pt); 572c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void dev_remove_pack(struct packet_type *pt); 573c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void __dev_remove_pack(struct packet_type *pt); 574c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 575c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct net_device *dev_get_by_flags(unsigned short flags, 576c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned short mask); 577c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct net_device *dev_get_by_name(const char *name); 578c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct net_device *__dev_get_by_name(const char *name); 579c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int dev_alloc_name(struct net_device *dev, const char *name); 580c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int dev_open(struct net_device *dev); 581c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int dev_close(struct net_device *dev); 582c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int dev_queue_xmit(struct sk_buff *skb); 583c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int register_netdevice(struct net_device *dev); 584c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int unregister_netdevice(struct net_device *dev); 585c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void free_netdev(struct net_device *dev); 586c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void synchronize_net(void); 587c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int register_netdevice_notifier(struct notifier_block *nb); 588c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int unregister_netdevice_notifier(struct notifier_block *nb); 589c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int call_netdevice_notifiers(unsigned long val, void *v); 590c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct net_device *dev_get_by_index(int ifindex); 591c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct net_device *__dev_get_by_index(int ifindex); 592c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int dev_restart(struct net_device *dev); 593c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_NETPOLL_TRAP 594c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int netpoll_trap(void); 595c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 596c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 597c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef int gifconf_func_t(struct net_device * dev, char __user * bufptr, int len); 598c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int register_gifconf(unsigned int family, gifconf_func_t * gifconf); 599c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int unregister_gifconf(unsigned int family) 600c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 601c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return register_gifconf(family, NULL); 602c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 603c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 604c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 605c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Incoming packets are placed on per-cpu queues so that 606c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * no locking is needed. 607c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 608c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 609c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct softnet_data 610c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 611c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct net_device *output_queue; 612c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct sk_buff_head input_pkt_queue; 613c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct list_head poll_list; 614c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct sk_buff *completion_queue; 615c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 616c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct net_device backlog_dev; /* Sorry. 8) */ 617c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_NET_DMA 618c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct dma_chan *net_dma; 619c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 620c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 621c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 622c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste QueruDECLARE_PER_CPU(struct softnet_data,softnet_data); 623c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 624c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define HAVE_NETIF_QUEUE 625c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 626c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void __netif_schedule(struct net_device *dev); 627c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 628c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void netif_schedule(struct net_device *dev) 629c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 630c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (!test_bit(__LINK_STATE_XOFF, &dev->state)) 631c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __netif_schedule(dev); 632c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 633c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 634c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void netif_start_queue(struct net_device *dev) 635c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 636c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru clear_bit(__LINK_STATE_XOFF, &dev->state); 637c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 638c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 639c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void netif_wake_queue(struct net_device *dev) 640c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 641c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_NETPOLL_TRAP 642c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (netpoll_trap()) 643c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return; 644c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 645c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (test_and_clear_bit(__LINK_STATE_XOFF, &dev->state)) 646c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __netif_schedule(dev); 647c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 648c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 649c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void netif_stop_queue(struct net_device *dev) 650c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 651c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_NETPOLL_TRAP 652c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (netpoll_trap()) 653c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return; 654c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 655c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru set_bit(__LINK_STATE_XOFF, &dev->state); 656c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 657c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 658c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int netif_queue_stopped(const struct net_device *dev) 659c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 660c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return test_bit(__LINK_STATE_XOFF, &dev->state); 661c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 662c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 663c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int netif_running(const struct net_device *dev) 664c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 665c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return test_bit(__LINK_STATE_START, &dev->state); 666c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 667c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 668c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 669c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Use this variant when it is known for sure that it 670c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * is executing from interrupt context. 671c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 672c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void dev_kfree_skb_irq(struct sk_buff *skb) 673c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 674c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (atomic_dec_and_test(&skb->users)) { 675c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct softnet_data *sd; 676c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long flags; 677c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 678c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru local_irq_save(flags); 679c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru sd = &__get_cpu_var(softnet_data); 680c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru skb->next = sd->completion_queue; 681c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru sd->completion_queue = skb; 682c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru raise_softirq_irqoff(NET_TX_SOFTIRQ); 683c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru local_irq_restore(flags); 684c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } 685c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 686c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 687c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Use this variant in places where it could be invoked 688c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * either from interrupt or non-interrupt context. 689c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 690c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void dev_kfree_skb_any(struct sk_buff *skb); 691c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 692c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define HAVE_NETIF_RX 1 693c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int netif_rx(struct sk_buff *skb); 694c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int netif_rx_ni(struct sk_buff *skb); 695c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define HAVE_NETIF_RECEIVE_SKB 1 696c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int netif_receive_skb(struct sk_buff *skb); 697c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int dev_valid_name(const char *name); 698c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int dev_ioctl(unsigned int cmd, void __user *); 699c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int dev_ethtool(struct ifreq *); 700c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern unsigned dev_get_flags(const struct net_device *); 701c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int dev_change_flags(struct net_device *, unsigned); 702c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int dev_change_name(struct net_device *, char *); 703c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int dev_set_mtu(struct net_device *, int); 704c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int dev_set_mac_address(struct net_device *, 705c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct sockaddr *); 706c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int dev_hard_start_xmit(struct sk_buff *skb, 707c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct net_device *dev); 708c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 709c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void dev_init(void); 710c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 711c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int netdev_budget; 712c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 713c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Called by rtnetlink.c:rtnl_unlock() */ 714c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void netdev_run_todo(void); 715c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 716c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void dev_put(struct net_device *dev) 717c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 718c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru atomic_dec(&dev->refcnt); 719c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 720c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 721c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void dev_hold(struct net_device *dev) 722c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 723c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru atomic_inc(&dev->refcnt); 724c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 725c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 726c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Carrier loss detection, dial on demand. The functions netif_carrier_on 727c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * and _off may be called from IRQ context, but it is caller 728c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * who is responsible for serialization of these calls. 729c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 730c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * The name carrier is inappropriate, these functions should really be 731c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * called netif_lowerlayer_*() because they represent the state of any 732c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * kind of lower layer not just hardware media. 733c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 734c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 735c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void linkwatch_fire_event(struct net_device *dev); 736c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 737c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int netif_carrier_ok(const struct net_device *dev) 738c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 739c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return !test_bit(__LINK_STATE_NOCARRIER, &dev->state); 740c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 741c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 742c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void __netdev_watchdog_up(struct net_device *dev); 743c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 744c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void netif_carrier_on(struct net_device *dev); 745c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 746c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void netif_carrier_off(struct net_device *dev); 747c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 748c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void netif_dormant_on(struct net_device *dev) 749c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 750c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (!test_and_set_bit(__LINK_STATE_DORMANT, &dev->state)) 751c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru linkwatch_fire_event(dev); 752c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 753c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 754c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void netif_dormant_off(struct net_device *dev) 755c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 756c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (test_and_clear_bit(__LINK_STATE_DORMANT, &dev->state)) 757c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru linkwatch_fire_event(dev); 758c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 759c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 760c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int netif_dormant(const struct net_device *dev) 761c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 762c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return test_bit(__LINK_STATE_DORMANT, &dev->state); 763c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 764c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 765c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 766c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int netif_oper_up(const struct net_device *dev) { 767c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return (dev->operstate == IF_OPER_UP || 768c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru dev->operstate == IF_OPER_UNKNOWN /* backward compat */); 769c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 770c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 771c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Hot-plugging. */ 772c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int netif_device_present(struct net_device *dev) 773c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 774c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return test_bit(__LINK_STATE_PRESENT, &dev->state); 775c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 776c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 777c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void netif_device_detach(struct net_device *dev); 778c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 779c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void netif_device_attach(struct net_device *dev); 780c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 781c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 782c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Network interface message level settings 783c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 784c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define HAVE_NETIF_MSG 1 785c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 786c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruenum { 787c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru NETIF_MSG_DRV = 0x0001, 788c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru NETIF_MSG_PROBE = 0x0002, 789c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru NETIF_MSG_LINK = 0x0004, 790c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru NETIF_MSG_TIMER = 0x0008, 791c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru NETIF_MSG_IFDOWN = 0x0010, 792c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru NETIF_MSG_IFUP = 0x0020, 793c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru NETIF_MSG_RX_ERR = 0x0040, 794c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru NETIF_MSG_TX_ERR = 0x0080, 795c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru NETIF_MSG_TX_QUEUED = 0x0100, 796c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru NETIF_MSG_INTR = 0x0200, 797c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru NETIF_MSG_TX_DONE = 0x0400, 798c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru NETIF_MSG_RX_STATUS = 0x0800, 799c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru NETIF_MSG_PKTDATA = 0x1000, 800c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru NETIF_MSG_HW = 0x2000, 801c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru NETIF_MSG_WOL = 0x4000, 802c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 803c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 804c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define netif_msg_drv(p) ((p)->msg_enable & NETIF_MSG_DRV) 805c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define netif_msg_probe(p) ((p)->msg_enable & NETIF_MSG_PROBE) 806c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define netif_msg_link(p) ((p)->msg_enable & NETIF_MSG_LINK) 807c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define netif_msg_timer(p) ((p)->msg_enable & NETIF_MSG_TIMER) 808c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define netif_msg_ifdown(p) ((p)->msg_enable & NETIF_MSG_IFDOWN) 809c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define netif_msg_ifup(p) ((p)->msg_enable & NETIF_MSG_IFUP) 810c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define netif_msg_rx_err(p) ((p)->msg_enable & NETIF_MSG_RX_ERR) 811c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define netif_msg_tx_err(p) ((p)->msg_enable & NETIF_MSG_TX_ERR) 812c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define netif_msg_tx_queued(p) ((p)->msg_enable & NETIF_MSG_TX_QUEUED) 813c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define netif_msg_intr(p) ((p)->msg_enable & NETIF_MSG_INTR) 814c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define netif_msg_tx_done(p) ((p)->msg_enable & NETIF_MSG_TX_DONE) 815c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define netif_msg_rx_status(p) ((p)->msg_enable & NETIF_MSG_RX_STATUS) 816c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define netif_msg_pktdata(p) ((p)->msg_enable & NETIF_MSG_PKTDATA) 817c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define netif_msg_hw(p) ((p)->msg_enable & NETIF_MSG_HW) 818c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define netif_msg_wol(p) ((p)->msg_enable & NETIF_MSG_WOL) 819c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 820c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline u32 netif_msg_init(int debug_value, int default_msg_enable_bits) 821c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 822c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* use default */ 823c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (debug_value < 0 || debug_value >= (sizeof(u32) * 8)) 824c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return default_msg_enable_bits; 825c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (debug_value == 0) /* no output */ 826c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return 0; 827c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* set low N bits */ 828c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return (1 << debug_value) - 1; 829c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 830c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 831c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Test if receive needs to be scheduled */ 832c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int __netif_rx_schedule_prep(struct net_device *dev) 833c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 834c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return !test_and_set_bit(__LINK_STATE_RX_SCHED, &dev->state); 835c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 836c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 837c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Test if receive needs to be scheduled but only if up */ 838c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int netif_rx_schedule_prep(struct net_device *dev) 839c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 840c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return netif_running(dev) && __netif_rx_schedule_prep(dev); 841c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 842c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 843c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Add interface to tail of rx poll list. This assumes that _prep has 844c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * already been called and returned 1. 845c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 846c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 847c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void __netif_rx_schedule(struct net_device *dev); 848c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 849c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Try to reschedule poll. Called by irq handler. */ 850c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 851c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void netif_rx_schedule(struct net_device *dev) 852c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 853c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (netif_rx_schedule_prep(dev)) 854c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __netif_rx_schedule(dev); 855c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 856c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 857c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Try to reschedule poll. Called by dev->poll() after netif_rx_complete(). 858c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Do not inline this? 859c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 860c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int netif_rx_reschedule(struct net_device *dev, int undo) 861c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 862c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (netif_rx_schedule_prep(dev)) { 863c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long flags; 864c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 865c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru dev->quota += undo; 866c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 867c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru local_irq_save(flags); 868c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru list_add_tail(&dev->poll_list, &__get_cpu_var(softnet_data).poll_list); 869c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __raise_softirq_irqoff(NET_RX_SOFTIRQ); 870c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru local_irq_restore(flags); 871c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return 1; 872c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } 873c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return 0; 874c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 875c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 876c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Remove interface from poll list: it must be in the poll list 877c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * on current cpu. This primitive is called by dev->poll(), when 878c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * it completes the work. The device cannot be out of poll list at this 879c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * moment, it is BUG(). 880c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 881c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void netif_rx_complete(struct net_device *dev) 882c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 883c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long flags; 884c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 885c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru local_irq_save(flags); 886c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru BUG_ON(!test_bit(__LINK_STATE_RX_SCHED, &dev->state)); 887c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru list_del(&dev->poll_list); 888c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru smp_mb__before_clear_bit(); 889c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru clear_bit(__LINK_STATE_RX_SCHED, &dev->state); 890c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru local_irq_restore(flags); 891c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 892c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 893c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void netif_poll_disable(struct net_device *dev) 894c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 895c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru while (test_and_set_bit(__LINK_STATE_RX_SCHED, &dev->state)) 896c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* No hurry. */ 897c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru schedule_timeout_interruptible(1); 898c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 899c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 900c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void netif_poll_enable(struct net_device *dev) 901c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 902c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru clear_bit(__LINK_STATE_RX_SCHED, &dev->state); 903c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 904c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 905c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* same as netif_rx_complete, except that local_irq_save(flags) 906c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * has already been issued 907c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 908c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void __netif_rx_complete(struct net_device *dev) 909c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 910c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru BUG_ON(!test_bit(__LINK_STATE_RX_SCHED, &dev->state)); 911c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru list_del(&dev->poll_list); 912c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru smp_mb__before_clear_bit(); 913c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru clear_bit(__LINK_STATE_RX_SCHED, &dev->state); 914c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 915c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 916c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void netif_tx_lock(struct net_device *dev) 917c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 918c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru spin_lock(&dev->_xmit_lock); 919c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru dev->xmit_lock_owner = smp_processor_id(); 920c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 921c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 922c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void netif_tx_lock_bh(struct net_device *dev) 923c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 924c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru spin_lock_bh(&dev->_xmit_lock); 925c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru dev->xmit_lock_owner = smp_processor_id(); 926c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 927c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 928c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int netif_tx_trylock(struct net_device *dev) 929c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 930c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int ok = spin_trylock(&dev->_xmit_lock); 931c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (likely(ok)) 932c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru dev->xmit_lock_owner = smp_processor_id(); 933c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return ok; 934c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 935c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 936c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void netif_tx_unlock(struct net_device *dev) 937c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 938c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru dev->xmit_lock_owner = -1; 939c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru spin_unlock(&dev->_xmit_lock); 940c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 941c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 942c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void netif_tx_unlock_bh(struct net_device *dev) 943c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 944c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru dev->xmit_lock_owner = -1; 945c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru spin_unlock_bh(&dev->_xmit_lock); 946c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 947c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 948c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void netif_tx_disable(struct net_device *dev) 949c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 950c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru netif_tx_lock_bh(dev); 951c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru netif_stop_queue(dev); 952c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru netif_tx_unlock_bh(dev); 953c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 954c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 955c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* These functions live elsewhere (drivers/net/net_init.c, but related) */ 956c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 957c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void ether_setup(struct net_device *dev); 958c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 959c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Support for loadable net-drivers */ 960c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct net_device *alloc_netdev(int sizeof_priv, const char *name, 961c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void (*setup)(struct net_device *)); 962c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int register_netdev(struct net_device *dev); 963c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void unregister_netdev(struct net_device *dev); 964c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Functions used for multicast support */ 965c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void dev_mc_upload(struct net_device *dev); 966c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int dev_mc_delete(struct net_device *dev, void *addr, int alen, int all); 967c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int dev_mc_add(struct net_device *dev, void *addr, int alen, int newonly); 968c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void dev_mc_discard(struct net_device *dev); 969c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void dev_set_promiscuity(struct net_device *dev, int inc); 970c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void dev_set_allmulti(struct net_device *dev, int inc); 971c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void netdev_state_change(struct net_device *dev); 972c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void netdev_features_change(struct net_device *dev); 973c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Load a device via the kmod */ 974c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void dev_load(const char *name); 975c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void dev_mcast_init(void); 976c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int netdev_max_backlog; 977c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int weight_p; 978c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int netdev_set_master(struct net_device *dev, struct net_device *master); 979c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int skb_checksum_help(struct sk_buff *skb, int inward); 980c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct sk_buff *skb_gso_segment(struct sk_buff *skb, int features); 981c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_BUG 982c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void netdev_rx_csum_fault(struct net_device *dev); 983c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else 984c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void netdev_rx_csum_fault(struct net_device *dev) 985c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 986c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 987c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 988c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* rx skb timestamps */ 989c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void net_enable_timestamp(void); 990c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void net_disable_timestamp(void); 991c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 992c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_PROC_FS 993c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void *dev_seq_start(struct seq_file *seq, loff_t *pos); 994c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void *dev_seq_next(struct seq_file *seq, void *v, loff_t *pos); 995c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void dev_seq_stop(struct seq_file *seq, void *v); 996c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 997c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 998c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void linkwatch_run_queue(void); 999c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 1000c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int net_gso_ok(int features, int gso_type) 1001c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 1002c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int feature = gso_type << NETIF_F_GSO_SHIFT; 1003c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return (features & feature) == feature; 1004c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 1005c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 1006c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int skb_gso_ok(struct sk_buff *skb, int features) 1007c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 1008c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return net_gso_ok(features, skb_shinfo(skb)->gso_type); 1009c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 1010c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 1011c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int netif_needs_gso(struct net_device *dev, struct sk_buff *skb) 1012c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 1013c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return skb_is_gso(skb) && 1014c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru (!skb_gso_ok(skb, dev->features) || 1015c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unlikely(skb->ip_summed != CHECKSUM_HW)); 1016c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 1017c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 1018c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* On bonding slaves other than the currently active slave, suppress 1019c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * duplicates except for 802.3ad ETH_P_SLOW and alb non-mcast/bcast. 1020c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 1021c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int skb_bond_should_drop(struct sk_buff *skb) 1022c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 1023c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct net_device *dev = skb->dev; 1024c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct net_device *master = dev->master; 1025c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 1026c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (master && 1027c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru (dev->priv_flags & IFF_SLAVE_INACTIVE)) { 1028c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (master->priv_flags & IFF_MASTER_ALB) { 1029c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (skb->pkt_type != PACKET_BROADCAST && 1030c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru skb->pkt_type != PACKET_MULTICAST) 1031c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return 0; 1032c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } 1033c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (master->priv_flags & IFF_MASTER_8023AD && 1034c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru skb->protocol == __constant_htons(ETH_P_SLOW)) 1035c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return 0; 1036c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 1037c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return 1; 1038c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } 1039c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return 0; 1040c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 1041c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 1042c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* __KERNEL__ */ 1043c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 1044c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* _LINUX_DEV_H */ 1045