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