root/include/linux/netdevice.h

/* [previous][next][first][last][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. dev_lock_list
  2. dev_unlock_list
  3. dev_lock_wait

   1 /*
   2  * INET         An implementation of the TCP/IP protocol suite for the LINUX
   3  *              operating system.  INET is implemented using the  BSD Socket
   4  *              interface as the means of communication with the user level.
   5  *
   6  *              Definitions for the Interfaces handler.
   7  *
   8  * Version:     @(#)dev.h       1.0.10  08/12/93
   9  *
  10  * Authors:     Ross Biro, <bir7@leland.Stanford.Edu>
  11  *              Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
  12  *              Corey Minyard <wf-rch!minyard@relay.EU.net>
  13  *              Donald J. Becker, <becker@super.org>
  14  *              Alan Cox, <A.Cox@swansea.ac.uk>
  15  *              Bjorn Ekwall. <bj0rn@blox.se>
  16  *
  17  *              This program is free software; you can redistribute it and/or
  18  *              modify it under the terms of the GNU General Public License
  19  *              as published by the Free Software Foundation; either version
  20  *              2 of the License, or (at your option) any later version.
  21  *
  22  *              Moved to /usr/include/linux for NET3
  23  */
  24 #ifndef _LINUX_NETDEVICE_H
  25 #define _LINUX_NETDEVICE_H
  26 
  27 #include <linux/config.h>
  28 #include <linux/if.h>
  29 #include <linux/if_ether.h>
  30 #include <linux/skbuff.h>
  31 
  32 /* for future expansion when we will have different priorities. */
  33 #define DEV_NUMBUFFS    3
  34 #define MAX_ADDR_LEN    7
  35 #ifndef CONFIG_AX25
  36 #ifndef CONFIG_TR
  37 #ifndef CONFIG_NET_IPIP
  38 #define MAX_HEADER      32              /* We really need about 18 worst case .. so 32 is aligned */
  39 #else
  40 #define MAX_HEADER      80              /* We need to allow for having tunnel headers */
  41 #endif  /* IPIP */
  42 #else
  43 #define MAX_HEADER      48              /* Token Ring header needs 40 bytes ... 48 is aligned */ 
  44 #endif /* TR */
  45 #else
  46 #define MAX_HEADER      96              /* AX.25 + NetROM */
  47 #endif /* AX25 */
  48 
  49 #define IS_MYADDR       1               /* address is (one of) our own  */
  50 #define IS_LOOPBACK     2               /* address is for LOOPBACK      */
  51 #define IS_BROADCAST    3               /* address is a valid broadcast */
  52 #define IS_INVBCAST     4               /* Wrong netmask bcast not for us (unused)*/
  53 #define IS_MULTICAST    5               /* Multicast IP address */
  54 
  55 /*
  56  *      We tag multicasts with these structures.
  57  */
  58  
  59 struct dev_mc_list
  60 {       
  61         struct dev_mc_list *next;
  62         char dmi_addr[MAX_ADDR_LEN];
  63         unsigned short dmi_addrlen;
  64         unsigned short dmi_users;
  65 };
  66 
  67 struct hh_cache
  68 {
  69         struct hh_cache *hh_next;
  70         void            *hh_arp;        /* Opaque pointer, used by
  71                                          * any address resolution module,
  72                                          * not only ARP.
  73                                          */
  74         unsigned int    hh_refcnt;      /* number of users */
  75         unsigned short  hh_type;        /* protocol identifier, f.e ETH_P_IP */
  76         char            hh_uptodate;    /* hh_data is valid */
  77         char            hh_data[16];    /* cached hardware header */
  78 };
  79 
  80 /*
  81  * The DEVICE structure.
  82  * Actually, this whole structure is a big mistake.  It mixes I/O
  83  * data with strictly "high-level" data, and it has to know about
  84  * almost every data structure used in the INET module.  
  85  */
  86 struct device 
  87 {
  88 
  89   /*
  90    * This is the first field of the "visible" part of this structure
  91    * (i.e. as seen by users in the "Space.c" file).  It is the name
  92    * the interface.
  93    */
  94   char                    *name;
  95 
  96   /* I/O specific fields - FIXME: Merge these and struct ifmap into one */
  97   unsigned long           rmem_end;             /* shmem "recv" end     */
  98   unsigned long           rmem_start;           /* shmem "recv" start   */
  99   unsigned long           mem_end;              /* shared mem end       */
 100   unsigned long           mem_start;            /* shared mem start     */
 101   unsigned long           base_addr;            /* device I/O address   */
 102   unsigned char           irq;                  /* device IRQ number    */
 103 
 104   /* Low-level status flags. */
 105   volatile unsigned char  start,                /* start an operation   */
 106                           interrupt;            /* interrupt arrived    */
 107   unsigned long           tbusy;                /* transmitter busy must be long for bitops */
 108 
 109   struct device           *next;
 110 
 111   /* The device initialization function. Called only once. */
 112   int                     (*init)(struct device *dev);
 113 
 114   /* Some hardware also needs these fields, but they are not part of the
 115      usual set specified in Space.c. */
 116   unsigned char           if_port;              /* Selectable AUI, TP,..*/
 117   unsigned char           dma;                  /* DMA channel          */
 118 
 119   struct enet_statistics* (*get_stats)(struct device *dev);
 120 
 121   /*
 122    * This marks the end of the "visible" part of the structure. All
 123    * fields hereafter are internal to the system, and may change at
 124    * will (read: may be cleaned up at will).
 125    */
 126 
 127   /* These may be needed for future network-power-down code. */
 128   unsigned long           trans_start;  /* Time (in jiffies) of last Tx */
 129   unsigned long           last_rx;      /* Time of last Rx              */
 130 
 131   unsigned short          flags;        /* interface flags (a la BSD)   */
 132   unsigned short          family;       /* address family ID (AF_INET)  */
 133   unsigned short          metric;       /* routing metric (not used)    */
 134   unsigned short          mtu;          /* interface MTU value          */
 135   unsigned short          type;         /* interface hardware type      */
 136   unsigned short          hard_header_len;      /* hardware hdr length  */
 137   void                    *priv;        /* pointer to private data      */
 138 
 139   /* Interface address info. */
 140   unsigned char           broadcast[MAX_ADDR_LEN];      /* hw bcast add */
 141   unsigned char           pad;                          /* make dev_addr aligned to 8 bytes */
 142   unsigned char           dev_addr[MAX_ADDR_LEN];       /* hw address   */
 143   unsigned char           addr_len;     /* hardware address length      */
 144   unsigned long           pa_addr;      /* protocol address             */
 145   unsigned long           pa_brdaddr;   /* protocol broadcast addr      */
 146   unsigned long           pa_dstaddr;   /* protocol P-P other side addr */
 147   unsigned long           pa_mask;      /* protocol netmask             */
 148   unsigned short          pa_alen;      /* protocol address length      */
 149 
 150   struct dev_mc_list     *mc_list;      /* Multicast mac addresses      */
 151   int                    mc_count;      /* Number of installed mcasts   */
 152   
 153   struct ip_mc_list      *ip_mc_list;   /* IP multicast filter chain    */
 154   __u32                 tx_queue_len;   /* Max frames per queue allowed */
 155     
 156   /* For load balancing driver pair support */
 157   
 158   unsigned long            pkt_queue;   /* Packets queued */
 159   struct device           *slave;       /* Slave device */
 160   struct net_alias_info         *alias_info;    /* main dev alias info */
 161   struct net_alias              *my_alias;      /* alias devs */
 162   
 163   /* Pointer to the interface buffers. */
 164   struct sk_buff_head     buffs[DEV_NUMBUFFS];
 165 
 166   /* Pointers to interface service routines. */
 167   int                     (*open)(struct device *dev);
 168   int                     (*stop)(struct device *dev);
 169   int                     (*hard_start_xmit) (struct sk_buff *skb,
 170                                               struct device *dev);
 171   int                     (*hard_header) (struct sk_buff *skb,
 172                                           struct device *dev,
 173                                           unsigned short type,
 174                                           void *daddr,
 175                                           void *saddr,
 176                                           unsigned len);
 177   int                     (*rebuild_header)(void *eth, struct device *dev,
 178                                 unsigned long raddr, struct sk_buff *skb);
 179 #define HAVE_MULTICAST                   
 180   void                    (*set_multicast_list)(struct device *dev);
 181 #define HAVE_SET_MAC_ADDR                
 182   int                     (*set_mac_address)(struct device *dev, void *addr);
 183 #define HAVE_PRIVATE_IOCTL
 184   int                     (*do_ioctl)(struct device *dev, struct ifreq *ifr, int cmd);
 185 #define HAVE_SET_CONFIG
 186   int                     (*set_config)(struct device *dev, struct ifmap *map);
 187 #define HAVE_HEADER_CACHE
 188   void                    (*header_cache_bind)(struct hh_cache **hhp, struct device *dev, unsigned short htype, __u32 daddr);
 189   void                    (*header_cache_update)(struct hh_cache *hh, struct device *dev, unsigned char *  haddr);
 190 #define HAVE_CHANGE_MTU
 191   int                     (*change_mtu)(struct device *dev, int new_mtu);            
 192 };
 193 
 194 
 195 struct packet_type {
 196   unsigned short        type;   /* This is really htons(ether_type). */
 197   struct device *       dev;
 198   int                   (*func) (struct sk_buff *, struct device *,
 199                                  struct packet_type *);
 200   void                  *data;
 201   struct packet_type    *next;
 202 };
 203 
 204 
 205 #ifdef __KERNEL__
 206 
 207 #include <linux/notifier.h>
 208 
 209 /* Used by dev_rint */
 210 #define IN_SKBUFF       1
 211 
 212 extern volatile unsigned long in_bh;
 213 
 214 extern struct device    loopback_dev;
 215 extern struct device    *dev_base;
 216 extern struct packet_type *ptype_base[16];
 217 
 218 
 219 extern int              ip_addr_match(unsigned long addr1, unsigned long addr2);
 220 extern int              ip_chk_addr(unsigned long addr);
 221 extern struct device    *ip_dev_check(unsigned long daddr);
 222 extern unsigned long    ip_my_addr(void);
 223 extern unsigned long    ip_get_mask(unsigned long addr);
 224 extern struct device    *ip_dev_find(unsigned long addr);
 225 extern struct device    *dev_getbytype(unsigned short type);
 226 
 227 extern void             dev_add_pack(struct packet_type *pt);
 228 extern void             dev_remove_pack(struct packet_type *pt);
 229 extern struct device    *dev_get(const char *name);
 230 extern int              dev_open(struct device *dev);
 231 extern int              dev_close(struct device *dev);
 232 extern void             dev_queue_xmit(struct sk_buff *skb, struct device *dev,
 233                                        int pri);
 234 #define HAVE_NETIF_RX 1
 235 extern void             netif_rx(struct sk_buff *skb);
 236 extern void             dev_transmit(void);
 237 extern void             net_bh(void);
 238 extern void             dev_tint(struct device *dev);
 239 extern int              dev_get_info(char *buffer, char **start, off_t offset, int length, int dummy);
 240 extern int              dev_ioctl(unsigned int cmd, void *);
 241 
 242 extern void             dev_init(void);
 243 
 244 /* Locking protection for page faults during outputs to devices unloaded during the fault */
 245 
 246 extern int              dev_lockct;
 247 
 248 /*
 249  *      These two dont currently need to be interrupt safe
 250  *      but they may do soon. Do it properly anyway.
 251  */
 252 
 253 extern __inline__ void  dev_lock_list(void)
     /* [previous][next][first][last][top][bottom][index][help] */
 254 {
 255         unsigned long flags;
 256         save_flags(flags);
 257         cli();
 258         dev_lockct++;
 259         restore_flags(flags);
 260 }
 261 
 262 extern __inline__ void  dev_unlock_list(void)
     /* [previous][next][first][last][top][bottom][index][help] */
 263 {
 264         unsigned long flags;
 265         save_flags(flags);
 266         cli();
 267         dev_lockct--;
 268         restore_flags(flags);
 269 }
 270 
 271 /*
 272  *      This almost never occurs, isn't in performance critical paths
 273  *      and we can thus be relaxed about it
 274  */
 275  
 276 extern __inline__ void dev_lock_wait(void)
     /* [previous][next][first][last][top][bottom][index][help] */
 277 {
 278         while(dev_lockct)
 279                 schedule();
 280 }
 281 
 282 
 283 /* These functions live elsewhere (drivers/net/net_init.c, but related) */
 284 
 285 extern void             ether_setup(struct device *dev);
 286 extern void             tr_setup(struct device *dev);
 287 extern int              ether_config(struct device *dev, struct ifmap *map);
 288 /* Support for loadable net-drivers */
 289 extern int              register_netdev(struct device *dev);
 290 extern void             unregister_netdev(struct device *dev);
 291 extern int              register_netdevice_notifier(struct notifier_block *nb);
 292 extern int              unregister_netdevice_notifier(struct notifier_block *nb);
 293 /* Functions used for multicast support */
 294 extern void             dev_mc_upload(struct device *dev);
 295 extern void             dev_mc_delete(struct device *dev, void *addr, int alen, int all);
 296 extern void             dev_mc_add(struct device *dev, void *addr, int alen, int newonly);
 297 extern void             dev_mc_discard(struct device *dev);
 298 /* This is the wrong place but it'll do for the moment */
 299 extern void             ip_mc_allhost(struct device *dev);
 300 #endif /* __KERNEL__ */
 301 
 302 #endif  /* _LINUX_DEV_H */

/* [previous][next][first][last][top][bottom][index][help] */