|  | /* | 
|  | * INET		An implementation of the TCP/IP protocol suite for the LINUX | 
|  | *		operating system.  INET is implemented using the  BSD Socket | 
|  | *		interface as the means of communication with the user level. | 
|  | * | 
|  | *		Definitions for the Interfaces handler. | 
|  | * | 
|  | * Version:	@(#)dev.h	1.0.10	08/12/93 | 
|  | * | 
|  | * Authors:	Ross Biro, <bir7@leland.Stanford.Edu> | 
|  | *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG> | 
|  | *		Corey Minyard <wf-rch!minyard@relay.EU.net> | 
|  | *		Donald J. Becker, <becker@super.org> | 
|  | *		Alan Cox, <A.Cox@swansea.ac.uk> | 
|  | *		Bjorn Ekwall. <bj0rn@blox.se> | 
|  | * | 
|  | *		This program is free software; you can redistribute it and/or | 
|  | *		modify it under the terms of the GNU General Public License | 
|  | *		as published by the Free Software Foundation; either version | 
|  | *		2 of the License, or (at your option) any later version. | 
|  | * | 
|  | *		Moved to /usr/include/linux for NET3 | 
|  | */ | 
|  | /* for future expansion when we will have different priorities. */ | 
|  | #define DEV_NUMBUFFS	3 | 
|  | #define MAX_ADDR_LEN	7 | 
|  | #ifndef CONFIG_AX25 | 
|  | #ifndef CONFIG_TR | 
|  | #ifndef CONFIG_NET_IPIP | 
|  | #define MAX_HEADER	32		/* We really need about 18 worst case .. so 32 is aligned */ | 
|  | #else | 
|  | #define MAX_HEADER	80		/* We need to allow for having tunnel headers */ | 
|  | #endif  /* IPIP */ | 
|  | #else | 
|  | #define MAX_HEADER	48		/* Token Ring header needs 40 bytes ... 48 is aligned */ | 
|  | #endif /* TR */ | 
|  | #else | 
|  | #define MAX_HEADER	96		/* AX.25 + NetROM */ | 
|  | #endif /* AX25 */ | 
|  |  | 
|  | #define IS_MYADDR	1		/* address is (one of) our own	*/ | 
|  | #define IS_LOOPBACK	2		/* address is for LOOPBACK	*/ | 
|  | #define IS_BROADCAST	3		/* address is a valid broadcast	*/ | 
|  | #define IS_INVBCAST	4		/* Wrong netmask bcast not for us (unused)*/ | 
|  | #define IS_MULTICAST	5		/* Multicast IP address */ | 
|  |  | 
|  | /* | 
|  | * The DEVICE structure. | 
|  | * Actually, this whole structure is a big mistake.  It mixes I/O | 
|  | * data with strictly "high-level" data, and it has to know about | 
|  | * almost every data structure used in the INET module. | 
|  | */ | 
|  | struct device | 
|  | { | 
|  |  | 
|  | /* | 
|  | * This is the first field of the "visible" part of this structure | 
|  | * (i.e. as seen by users in the "Space.c" file).  It is the name | 
|  | * the interface. | 
|  | */ | 
|  | char			  *name; | 
|  |  | 
|  | /* I/O specific fields - FIXME: Merge these and struct ifmap into one */ | 
|  | unsigned long		  rmem_end;		/* shmem "recv" end	*/ | 
|  | unsigned long		  rmem_start;		/* shmem "recv" start	*/ | 
|  | unsigned long		  mem_end;		/* shared mem end	*/ | 
|  | unsigned long		  mem_start;		/* shared mem start	*/ | 
|  | unsigned long		  base_addr;		/* device I/O address	*/ | 
|  | unsigned char		  irq;			/* device IRQ number	*/ | 
|  |  | 
|  | /* Low-level status flags. */ | 
|  | volatile unsigned char  start,		/* start an operation	*/ | 
|  | interrupt;		/* interrupt arrived	*/ | 
|  | unsigned long		  tbusy;		/* transmitter busy must be long for bitops */ | 
|  |  | 
|  | struct device		  *next; | 
|  |  | 
|  | /* The device initialization function. Called only once. */ | 
|  | int			  (*init)(struct device *dev); | 
|  |  | 
|  | /* Some hardware also needs these fields, but they are not part of the | 
|  | usual set specified in Space.c. */ | 
|  | unsigned char		  if_port;		/* Selectable AUI, TP,..*/ | 
|  | unsigned char		  dma;			/* DMA channel		*/ | 
|  |  | 
|  | /*   struct enet_statistics* (*get_stats)(struct device *dev); */ | 
|  |  | 
|  | /* | 
|  | * This marks the end of the "visible" part of the structure. All | 
|  | * fields hereafter are internal to the system, and may change at | 
|  | * will (read: may be cleaned up at will). | 
|  | */ | 
|  |  | 
|  | /* These may be needed for future network-power-down code. */ | 
|  | unsigned long		  trans_start;	/* Time (in jiffies) of last Tx	*/ | 
|  | unsigned long		  last_rx;	/* Time of last Rx		*/ | 
|  |  | 
|  | unsigned short	  flags;	/* interface flags (a la BSD)	*/ | 
|  | unsigned short	  family;	/* address family ID (AF_INET)	*/ | 
|  | unsigned short	  metric;	/* routing metric (not used)	*/ | 
|  | unsigned short	  mtu;		/* interface MTU value		*/ | 
|  | unsigned short	  type;		/* interface hardware type	*/ | 
|  | unsigned short	  hard_header_len;	/* hardware hdr length	*/ | 
|  | void			  *priv;	/* pointer to private data	*/ | 
|  |  | 
|  | /* Interface address info. */ | 
|  | unsigned char		  broadcast[MAX_ADDR_LEN];	/* hw bcast add	*/ | 
|  | unsigned char		  pad;				/* make dev_addr aligned to 8 bytes */ | 
|  | unsigned char		  dev_addr[MAX_ADDR_LEN];	/* hw address	*/ | 
|  | unsigned char		  addr_len;	/* hardware address length	*/ | 
|  | unsigned long		  pa_addr;	/* protocol address		*/ | 
|  | unsigned long		  pa_brdaddr;	/* protocol broadcast addr	*/ | 
|  | unsigned long		  pa_dstaddr;	/* protocol P-P other side addr	*/ | 
|  | unsigned long		  pa_mask;	/* protocol netmask		*/ | 
|  | unsigned short	  pa_alen;	/* protocol address length	*/ | 
|  |  | 
|  | #if 0 | 
|  | struct dev_mc_list	 *mc_list;	/* Multicast mac addresses	*/ | 
|  | #endif | 
|  | int			 mc_count;	/* Number of installed mcasts	*/ | 
|  |  | 
|  | #if 0 | 
|  | struct ip_mc_list	 *ip_mc_list;	/* IP multicast filter chain    */ | 
|  | #endif | 
|  | unsigned int 		tx_queue_len;	/* Max frames per queue allowed */ | 
|  |  | 
|  | /* For load balancing driver pair support */ | 
|  |  | 
|  | unsigned long		   pkt_queue;	/* Packets queued */ | 
|  | #if 0 | 
|  | struct device		  *slave;	/* Slave device */ | 
|  |  | 
|  | struct net_alias_info		*alias_info;	/* main dev alias info */ | 
|  | struct net_alias		*my_alias;	/* alias devs */ | 
|  | /* Pointer to the interface buffers. */ | 
|  | struct sk_buff_head	  buffs[DEV_NUMBUFFS]; | 
|  | #endif | 
|  |  | 
|  | int			  (*change_mtu)(struct device *dev, int new_mtu); | 
|  | }; | 
|  |  | 
|  | #if 0 | 
|  | struct packet_type { | 
|  | unsigned short	type;	/* This is really htons(ether_type). */ | 
|  | struct device *	dev; | 
|  | int			(*func) (struct sk_buff *, struct device *, | 
|  | struct packet_type *); | 
|  | void			*data; | 
|  | struct packet_type	*next; | 
|  | }; | 
|  |  | 
|  |  | 
|  | /* Used by dev_rint */ | 
|  | #define IN_SKBUFF	1 | 
|  |  | 
|  | extern int		dev_lockct; | 
|  |  | 
|  | /* | 
|  | *	These two don't currently need to be interrupt-safe | 
|  | *	but they may do soon. Do it properly anyway. | 
|  | */ | 
|  |  | 
|  | extern __inline__ void  dev_lock_list(void) | 
|  | { | 
|  | unsigned long flags; | 
|  | save_flags(flags); | 
|  | cli(); | 
|  | dev_lockct++; | 
|  | restore_flags(flags); | 
|  | } | 
|  |  | 
|  | extern __inline__ void  dev_unlock_list(void) | 
|  | { | 
|  | unsigned long flags; | 
|  | save_flags(flags); | 
|  | cli(); | 
|  | dev_lockct--; | 
|  | restore_flags(flags); | 
|  | } | 
|  |  | 
|  | /* | 
|  | *	This almost never occurs, isn't in performance critical paths | 
|  | *	and we can thus be relaxed about it | 
|  | */ | 
|  |  | 
|  | extern __inline__ void dev_lock_wait(void) | 
|  | { | 
|  | while(dev_lockct) | 
|  | schedule(); | 
|  | } | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  | #endif	/* _LINUX_DEV_H */ |