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