www.pudn.com > ucos+net.zip > ETHER.H


/*  
 * $Id: ETHER.H,v 1.3 2002/02/07 10:25:41 linfusheng Exp $ 
 */ 
 
#ifndef ETHER_H 
#define ETHER_H 
 
/* Standard interface flags (netdevice->flags). */ 
#define	IFF_UP		0x1		/* interface is up		*/ 
#define	IFF_BROADCAST	0x2		/* broadcast address valid	*/ 
#define	IFF_DEBUG	0x4		/* turn on debugging		*/ 
#define	IFF_LOOPBACK	0x8		/* is a loopback net		*/ 
#define	IFF_POINTOPOINT	0x10		/* interface is has p-p link	*/ 
#define	IFF_NOTRAILERS	0x20		/* avoid use of trailers	*/ 
#define	IFF_RUNNING	0x40		/* resources allocated		*/ 
#define	IFF_NOARP	0x80		/* no ARP protocol		*/ 
#define	IFF_PROMISC	0x100		/* receive all packets		*/ 
#define	IFF_ALLMULTI	0x200		/* receive all multicast packets*/ 
 
#define IFF_MASTER	0x400		/* master of a load balancer 	*/ 
#define IFF_SLAVE	0x800		/* slave of a load balancer	*/ 
 
#define IFF_MULTICAST	0x1000		/* Supports multicast		*/ 
 
#define IFF_VOLATILE	(IFF_LOOPBACK|IFF_POINTOPOINT|IFF_BROADCAST|IFF_MASTER|IFF_SLAVE|IFF_RUNNING) 
 
#define IFF_PORTSEL	0x2000          /* can set media type		*/ 
#define IFF_AUTOMEDIA	0x4000		/* auto media select active	*/ 
#define IFF_DYNAMIC	0x8000		/* dialup device with changing addresses*/ 
 
/* Private (from user) interface flags (netdevice->priv_flags). */ 
#define IFF_802_1Q_VLAN 0x1             /* 802.1Q VLAN device.          */ 
 
 
 
 
/* ARP protocol opcodes. */ 
#define	ARPOP_REQUEST	1		/* ARP request.  */ 
#define	ARPOP_REPLY	2		/* ARP reply.  */ 
#define	ARPOP_RREQUEST	3		/* RARP request.  */ 
#define	ARPOP_RREPLY	4		/* RARP reply.  */ 
#define	ARPOP_InREQUEST	8		/* InARP request.  */ 
#define	ARPOP_InREPLY	9		/* InARP reply.  */ 
#define	ARPOP_NAK	10		/* (ATM)ARP NAK.  */ 
 
 
 
/* ARP protocol HARDWARE identifiers. */ 
#define ARPHRD_NETROM	0		/* From KA9Q: NET/ROM pseudo. */ 
#define ARPHRD_ETHER 	1		/* Ethernet 10/100Mbps.  */ 
#define	ARPHRD_EETHER	2		/* Experimental Ethernet.  */ 
#define	ARPHRD_AX25	3		/* AX.25 Level 2.  */ 
#define	ARPHRD_PRONET	4		/* PROnet token ring.  */ 
#define	ARPHRD_CHAOS	5		/* Chaosnet.  */ 
#define	ARPHRD_IEEE802	6		/* IEEE 802.2 Ethernet/TR/TB.  */ 
#define	ARPHRD_ARCNET	7		/* ARCnet.  */ 
#define	ARPHRD_APPLETLK	8		/* APPLEtalk.  */ 
#define	ARPHRD_DLCI	15		/* Frame Relay DLCI.  */ 
#define	ARPHRD_ATM	19		/* ATM.  */ 
#define	ARPHRD_METRICOM	23		/* Metricom STRIP (new IANA id).  */ 
 
 
 
/* Ethernet protocol ID's */ 
#define	ETHERTYPE_PUP		0x0200          /* Xerox PUP */ 
#define	ETHERTYPE_IP		0x0800		/* IP */ 
#define	ETHERTYPE_ARP		0x0806		/* Address resolution */ 
#define	ETHERTYPE_REVARP	0x8035		/* Reverse ARP */ 
 
 
/* Standard well-defined IP protocols.  */ 
enum { 
  IPPROTO_IP = 0,		/* Dummy protocol for TCP		*/ 
  IPPROTO_ICMP = 1,		/* Internet Control Message Protocol	*/ 
  IPPROTO_IGMP = 2,		/* Internet Group Management Protocol	*/ 
  IPPROTO_IPIP = 4,		/* IPIP tunnels (older KA9Q tunnels use 94) */ 
  IPPROTO_TCP = 6,		/* Transmission Control Protocol	*/ 
  IPPROTO_EGP = 8,		/* Exterior Gateway Protocol		*/ 
  IPPROTO_PUP = 12,		/* PUP protocol				*/ 
  IPPROTO_UDP = 17,		/* User Datagram Protocol		*/ 
  IPPROTO_IDP = 22,		/* XNS IDP protocol			*/ 
  IPPROTO_RSVP = 46,		/* RSVP protocol			*/ 
  IPPROTO_GRE = 47,		/* Cisco GRE tunnels (rfc 1701,1702)	*/ 
 
  IPPROTO_IPV6	 = 41,		/* IPv6-in-IPv4 tunnelling		*/ 
 
  IPPROTO_PIM    = 103,		/* Protocol Independent Multicast	*/ 
 
  IPPROTO_ESP = 50,            /* Encapsulation Security Payload protocol */ 
  IPPROTO_AH = 51,             /* Authentication Header protocol       */ 
  IPPROTO_COMP   = 108,                /* Compression Header protocol */ 
 
  IPPROTO_RAW	 = 255,		/* Raw IP packets			*/ 
  IPPROTO_MAX 
}; 
 
 
 
 
 
/* 
   I'm moving towards the defined names in linux/if_ether.h for clarity. 
   The confusion between 60/64 and 1514/1518 arose because the NS8390 
   counts the 4 byte frame checksum in the incoming packet, but not 
   in the outgoing packet. 60/1514 are the correct numbers for most 
   if not all of the other NIC controllers. I will be retiring the 
   64/1518 defines in the lead-up to 5.0. 
*/ 
 
 
 
 
#define ETH_ALEN		6	/* Size of Ethernet address */ 
#define ETH_HLEN		14	/* Size of ethernet header */ 
#define	ETH_ZLEN		60	/* Minimum packet */ 
/*#define ETH_MIN_PACKET		64*/ 
#define	ETH_FRAME_LEN		1514	/* Maximum packet */ 
/* max supported ethernet frame size -- must be at least (dev->mtu+14+4).*/ 
#define MAX_ETH_FRAME_SIZE	1536 
 
 
/* Same after going through htonl */ 
#define IP_BROADCAST	0xFFFFFFFF 
 
#define BA { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } 
 
 
 
 
struct in_addr{ 
	unsigned long	s_addr; 
}; 
 
struct arptable_t { 
	struct in_addr ipaddr; 
	unsigned char node[6]; 
}; 
 
 
 
/* 10Mb/s ethernet header */ 
struct ethhdr 
{ 
  unsigned char ether_dhost[ETH_ALEN];	/* destination eth addr	*/ 
  unsigned char ether_shost[ETH_ALEN];	/* source ether addr	*/ 
  unsigned short ether_type;		        /* packet type ID field	*/ 
}; 
 
struct arphdr 
{ 
    unsigned short ar_hrd;		/* Format of hardware address.  */ 
    unsigned short ar_pro;		/* Format of protocol address.  */ 
    unsigned char ar_hln;		/* Length of hardware address.  */ 
    unsigned char ar_pln;		/* Length of protocol address.  */ 
    unsigned short ar_op;		/* ARP opcode (command).  */ 
 
}; 
 
 
/* 
 * Ethernet Address Resolution Protocol. 
 * 
 * See RFC 826 for protocol description.  Structure below is adapted 
 * to resolving internet addresses.  Field names used correspond to 
 * RFC 826. 
 */ 
struct	ether_arp { 
	struct	arphdr ea_hdr;		/* fixed-size header */ 
	unsigned char arp_sha[ETH_ALEN];	/* sender hardware address */ 
	unsigned char arp_spa[4];		/* sender protocol address */ 
	unsigned char arp_tha[ETH_ALEN];	/* target hardware address */ 
	unsigned char arp_tpa[4];		/* target protocol address */ 
}; 
 
#define	arp_hrd	ea_hdr.ar_hrd 
#define	arp_pro	ea_hdr.ar_pro 
#define	arp_hln	ea_hdr.ar_hln 
#define	arp_pln	ea_hdr.ar_pln 
#define	arp_op	ea_hdr.ar_op 
 
 
/* 
 * A pity sipaddr and tipaddr are not longword aligned or we could use 
 * in_addr. No, I don't want to use #pragma packed. 
 */ 
struct arprequest { 
	unsigned short hwtype; 
	unsigned short protocol; 
	unsigned char hwlen; 
	unsigned char protolen; 
	unsigned short opcode; 
	unsigned char shwaddr[6]; 
	unsigned char sipaddr[4]; 
	unsigned char thwaddr[6]; 
	unsigned char tipaddr[4]; 
}; 
 
struct iphdr { 
//	unsigned char verhdrlen :4; 
	unsigned char ihl:4; 
	unsigned char version:4; 
 
	unsigned char tos; 
	unsigned short tot_len; 
	unsigned short id; 
	unsigned short frag_off; 
	unsigned char ttl; 
	unsigned char protocol; 
	unsigned short check; 
	struct in_addr src; 
	struct in_addr dest; 
}; 
 
struct udphdr { 
	unsigned short src; 
	unsigned short dest; 
	unsigned short len; 
	unsigned short chksum; 
}; 
 
struct icmphdr { 
	u_char		type; 
	u_char		code; 
	u_short		checksum; 
	union { 
		struct { 
			u_short	id; 
			u_short	sequence; 
		} echo; 
		u_long	gateway; 
		struct { 
			u_short	__unused; 
			u_short	mtu; 
		} frag; 
	} un; 
}; 
 
 
 
extern int arprecv(struct nbuf *nbuf); 
extern int iprecv(struct nbuf *nbuf); 
extern int icmprecv(struct nbuf *nbuf); 
#endif 
 
/* $Log: ETHER.H,v $ 
/* Revision 1.3  2002/02/07 10:25:41  linfusheng 
/* update 
/* 
/* Revision 1.2  2002/01/28 00:46:25  linfusheng 
/* update 
/* 
 */