xref: /inferno-os/os/boot/mpc/ip.h (revision 74a4d8c26dd3c1e9febcb717cfd6cb6512991a7a)
1*74a4d8c2SCharles.Forsyth typedef struct Udphdr Udphdr;
2*74a4d8c2SCharles.Forsyth struct Udphdr
3*74a4d8c2SCharles.Forsyth {
4*74a4d8c2SCharles.Forsyth 	uchar	d[6];		/* Ethernet destination */
5*74a4d8c2SCharles.Forsyth 	uchar	s[6];		/* Ethernet source */
6*74a4d8c2SCharles.Forsyth 	uchar	type[2];	/* Ethernet packet type */
7*74a4d8c2SCharles.Forsyth 
8*74a4d8c2SCharles.Forsyth 	uchar	vihl;		/* Version and header length */
9*74a4d8c2SCharles.Forsyth 	uchar	tos;		/* Type of service */
10*74a4d8c2SCharles.Forsyth 	uchar	length[2];	/* packet length */
11*74a4d8c2SCharles.Forsyth 	uchar	id[2];		/* Identification */
12*74a4d8c2SCharles.Forsyth 	uchar	frag[2];	/* Fragment information */
13*74a4d8c2SCharles.Forsyth 
14*74a4d8c2SCharles.Forsyth 	/* Udp pseudo ip really starts here */
15*74a4d8c2SCharles.Forsyth 	uchar	ttl;
16*74a4d8c2SCharles.Forsyth 	uchar	udpproto;	/* Protocol */
17*74a4d8c2SCharles.Forsyth 	uchar	udpplen[2];	/* Header plus data length */
18*74a4d8c2SCharles.Forsyth 	uchar	udpsrc[4];	/* Ip source */
19*74a4d8c2SCharles.Forsyth 	uchar	udpdst[4];	/* Ip destination */
20*74a4d8c2SCharles.Forsyth 	uchar	udpsport[2];	/* Source port */
21*74a4d8c2SCharles.Forsyth 	uchar	udpdport[2];	/* Destination port */
22*74a4d8c2SCharles.Forsyth 	uchar	udplen[2];	/* data length */
23*74a4d8c2SCharles.Forsyth 	uchar	udpcksum[2];	/* Checksum */
24*74a4d8c2SCharles.Forsyth };
25*74a4d8c2SCharles.Forsyth 
26*74a4d8c2SCharles.Forsyth typedef struct Etherhdr Etherhdr;
27*74a4d8c2SCharles.Forsyth struct Etherhdr
28*74a4d8c2SCharles.Forsyth {
29*74a4d8c2SCharles.Forsyth 	uchar	d[6];
30*74a4d8c2SCharles.Forsyth 	uchar	s[6];
31*74a4d8c2SCharles.Forsyth 	uchar	type[2];
32*74a4d8c2SCharles.Forsyth 
33*74a4d8c2SCharles.Forsyth 	/* Now we have the ip fields */
34*74a4d8c2SCharles.Forsyth 	uchar	vihl;		/* Version and header length */
35*74a4d8c2SCharles.Forsyth 	uchar	tos;		/* Type of service */
36*74a4d8c2SCharles.Forsyth 	uchar	length[2];	/* packet length */
37*74a4d8c2SCharles.Forsyth 	uchar	id[2];		/* Identification */
38*74a4d8c2SCharles.Forsyth 	uchar	frag[2];	/* Fragment information */
39*74a4d8c2SCharles.Forsyth 	uchar	ttl;		/* Time to live */
40*74a4d8c2SCharles.Forsyth 	uchar	proto;		/* Protocol */
41*74a4d8c2SCharles.Forsyth 	uchar	cksum[2];	/* Header checksum */
42*74a4d8c2SCharles.Forsyth 	uchar	src[4];		/* Ip source */
43*74a4d8c2SCharles.Forsyth 	uchar	dst[4];		/* Ip destination */
44*74a4d8c2SCharles.Forsyth };
45*74a4d8c2SCharles.Forsyth 
46*74a4d8c2SCharles.Forsyth enum
47*74a4d8c2SCharles.Forsyth {
48*74a4d8c2SCharles.Forsyth 	IP_VER		= 0x40,
49*74a4d8c2SCharles.Forsyth 	IP_HLEN		= 0x05,
50*74a4d8c2SCharles.Forsyth  	UDP_EHSIZE	= 22,
51*74a4d8c2SCharles.Forsyth 	UDP_PHDRSIZE	= 12,
52*74a4d8c2SCharles.Forsyth 	UDP_HDRSIZE	= 20,
53*74a4d8c2SCharles.Forsyth 	ETHER_HDR	= 14,
54*74a4d8c2SCharles.Forsyth 	IP_UDPPROTO	= 17,
55*74a4d8c2SCharles.Forsyth 	ET_IP		= 0x800,
56*74a4d8c2SCharles.Forsyth 	Bcastip		= 0xffffffff,
57*74a4d8c2SCharles.Forsyth 	BPportsrc	= 68,
58*74a4d8c2SCharles.Forsyth 	BPportdst	= 67,
59*74a4d8c2SCharles.Forsyth 	TFTPport	= 69,
60*74a4d8c2SCharles.Forsyth 	Timeout		= 5000,	/* milliseconds */
61*74a4d8c2SCharles.Forsyth 	Bootrequest 	= 1,
62*74a4d8c2SCharles.Forsyth 	Bootreply   	= 2,
63*74a4d8c2SCharles.Forsyth 	Tftp_READ	= 1,
64*74a4d8c2SCharles.Forsyth 	Tftp_WRITE	= 2,
65*74a4d8c2SCharles.Forsyth 	Tftp_DATA	= 3,
66*74a4d8c2SCharles.Forsyth 	Tftp_ACK	= 4,
67*74a4d8c2SCharles.Forsyth 	Tftp_ERROR	= 5,
68*74a4d8c2SCharles.Forsyth 	Segsize		= 512,
69*74a4d8c2SCharles.Forsyth 	TFTPSZ		= Segsize+10,
70*74a4d8c2SCharles.Forsyth };
71*74a4d8c2SCharles.Forsyth 
72*74a4d8c2SCharles.Forsyth typedef struct Bootp Bootp;
73*74a4d8c2SCharles.Forsyth struct Bootp
74*74a4d8c2SCharles.Forsyth {
75*74a4d8c2SCharles.Forsyth 	uchar	op;		/* opcode */
76*74a4d8c2SCharles.Forsyth 	uchar	htype;		/* hardware type */
77*74a4d8c2SCharles.Forsyth 	uchar	hlen;		/* hardware address len */
78*74a4d8c2SCharles.Forsyth 	uchar	hops;		/* hops */
79*74a4d8c2SCharles.Forsyth 	uchar	xid[4];		/* a random number */
80*74a4d8c2SCharles.Forsyth 	uchar	secs[2];	/* elapsed snce client started booting */
81*74a4d8c2SCharles.Forsyth 	uchar	pad[2];
82*74a4d8c2SCharles.Forsyth 	uchar	ciaddr[4];	/* client IP address (client tells server) */
83*74a4d8c2SCharles.Forsyth 	uchar	yiaddr[4];	/* client IP address (server tells client) */
84*74a4d8c2SCharles.Forsyth 	uchar	siaddr[4];	/* server IP address */
85*74a4d8c2SCharles.Forsyth 	uchar	giaddr[4];	/* gateway IP address */
86*74a4d8c2SCharles.Forsyth 	uchar	chaddr[16];	/* client hardware address */
87*74a4d8c2SCharles.Forsyth 	char	sname[64];	/* server host name (optional) */
88*74a4d8c2SCharles.Forsyth 	char	file[128];	/* boot file name */
89*74a4d8c2SCharles.Forsyth 	char	vend[128];	/* vendor-specific goo */
90*74a4d8c2SCharles.Forsyth };
91*74a4d8c2SCharles.Forsyth 
92*74a4d8c2SCharles.Forsyth typedef struct Netaddr Netaddr;
93*74a4d8c2SCharles.Forsyth struct Netaddr
94*74a4d8c2SCharles.Forsyth {
95*74a4d8c2SCharles.Forsyth 	ulong	ip;
96*74a4d8c2SCharles.Forsyth 	ushort	port;
97*74a4d8c2SCharles.Forsyth 	char	ea[Eaddrlen];
98*74a4d8c2SCharles.Forsyth };
99