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