Blame


1 87a52e04 2005-12-26 devnull #include <u.h>
2 87a52e04 2005-12-26 devnull #include <libc.h>
3 87a52e04 2005-12-26 devnull #include <ip.h>
4 87a52e04 2005-12-26 devnull #include "dat.h"
5 87a52e04 2005-12-26 devnull #include "protos.h"
6 87a52e04 2005-12-26 devnull
7 87a52e04 2005-12-26 devnull enum
8 87a52e04 2005-12-26 devnull {
9 87a52e04 2005-12-26 devnull OfferTimeout= 60, /* when an offer times out */
10 87a52e04 2005-12-26 devnull MaxLease= 60*60, /* longest lease for dynamic binding */
11 87a52e04 2005-12-26 devnull MinLease= 15*60, /* shortest lease for dynamic binding */
12 87a52e04 2005-12-26 devnull StaticLease= 30*60, /* lease for static binding */
13 87a52e04 2005-12-26 devnull
14 87a52e04 2005-12-26 devnull IPUDPHDRSIZE= 28, /* size of an IP plus UDP header */
15 87a52e04 2005-12-26 devnull MINSUPPORTED= 576, /* biggest IP message the client must support */
16 87a52e04 2005-12-26 devnull
17 87a52e04 2005-12-26 devnull /* lengths of some bootp fields */
18 87a52e04 2005-12-26 devnull Maxhwlen= 16,
19 87a52e04 2005-12-26 devnull Maxfilelen= 128,
20 87a52e04 2005-12-26 devnull Maxoptlen= 312-4,
21 87a52e04 2005-12-26 devnull
22 87a52e04 2005-12-26 devnull /* bootp types */
23 87a52e04 2005-12-26 devnull Bootrequest= 1,
24 87a52e04 2005-12-26 devnull Bootreply= 2,
25 87a52e04 2005-12-26 devnull
26 87a52e04 2005-12-26 devnull /* bootp flags */
27 87a52e04 2005-12-26 devnull Fbroadcast= 1<<15,
28 87a52e04 2005-12-26 devnull };
29 87a52e04 2005-12-26 devnull
30 87a52e04 2005-12-26 devnull typedef struct Hdr Hdr;
31 87a52e04 2005-12-26 devnull struct Hdr
32 87a52e04 2005-12-26 devnull {
33 87a52e04 2005-12-26 devnull uchar op; /* opcode */
34 87a52e04 2005-12-26 devnull uchar htype; /* hardware type */
35 87a52e04 2005-12-26 devnull uchar hlen; /* hardware address len */
36 87a52e04 2005-12-26 devnull uchar hops; /* hops */
37 87a52e04 2005-12-26 devnull uchar xid[4]; /* a random number */
38 87a52e04 2005-12-26 devnull uchar secs[2]; /* elapsed since client started booting */
39 87a52e04 2005-12-26 devnull uchar flags[2];
40 87a52e04 2005-12-26 devnull uchar ciaddr[IPv4addrlen]; /* client IP address (client tells server) */
41 87a52e04 2005-12-26 devnull uchar yiaddr[IPv4addrlen]; /* client IP address (server tells client) */
42 87a52e04 2005-12-26 devnull uchar siaddr[IPv4addrlen]; /* server IP address */
43 87a52e04 2005-12-26 devnull uchar giaddr[IPv4addrlen]; /* gateway IP address */
44 87a52e04 2005-12-26 devnull uchar chaddr[Maxhwlen]; /* client hardware address */
45 87a52e04 2005-12-26 devnull char sname[64]; /* server host name (optional) */
46 87a52e04 2005-12-26 devnull char file[Maxfilelen]; /* boot file name */
47 87a52e04 2005-12-26 devnull uchar optmagic[4];
48 87a52e04 2005-12-26 devnull uchar optdata[Maxoptlen];
49 87a52e04 2005-12-26 devnull };
50 87a52e04 2005-12-26 devnull
51 87a52e04 2005-12-26 devnull enum
52 87a52e04 2005-12-26 devnull {
53 87a52e04 2005-12-26 devnull Oca,
54 87a52e04 2005-12-26 devnull Osa,
55 87a52e04 2005-12-26 devnull Ot,
56 87a52e04 2005-12-26 devnull };
57 87a52e04 2005-12-26 devnull
58 87a52e04 2005-12-26 devnull static Field p_fields[] =
59 87a52e04 2005-12-26 devnull {
60 87a52e04 2005-12-26 devnull {"ca", Fv4ip, Oca, "client IP addr", } ,
61 87a52e04 2005-12-26 devnull {"sa", Fv4ip, Osa, "server IP addr", } ,
62 87a52e04 2005-12-26 devnull {0}
63 87a52e04 2005-12-26 devnull };
64 87a52e04 2005-12-26 devnull
65 87a52e04 2005-12-26 devnull #define plan9opt ((ulong)(('p'<<24) | ('9'<<16) | (' '<<8) | ' '))
66 87a52e04 2005-12-26 devnull #define genericopt (0x63825363UL)
67 87a52e04 2005-12-26 devnull
68 87a52e04 2005-12-26 devnull static Mux p_mux[] =
69 87a52e04 2005-12-26 devnull {
70 87a52e04 2005-12-26 devnull {"dhcp", genericopt,},
71 87a52e04 2005-12-26 devnull {"plan9bootp", plan9opt,},
72 87a52e04 2005-12-26 devnull {"dump", 0,},
73 87a52e04 2005-12-26 devnull {0}
74 87a52e04 2005-12-26 devnull };
75 87a52e04 2005-12-26 devnull
76 87a52e04 2005-12-26 devnull static void
77 87a52e04 2005-12-26 devnull p_compile(Filter *f)
78 87a52e04 2005-12-26 devnull {
79 87a52e04 2005-12-26 devnull Mux *m;
80 87a52e04 2005-12-26 devnull
81 87a52e04 2005-12-26 devnull if(f->op == '='){
82 87a52e04 2005-12-26 devnull compile_cmp(arp.name, f, p_fields);
83 87a52e04 2005-12-26 devnull return;
84 87a52e04 2005-12-26 devnull }
85 87a52e04 2005-12-26 devnull for(m = p_mux; m->name != nil; m++)
86 87a52e04 2005-12-26 devnull if(strcmp(f->s, m->name) == 0){
87 87a52e04 2005-12-26 devnull f->pr = m->pr;
88 87a52e04 2005-12-26 devnull f->ulv = m->val;
89 87a52e04 2005-12-26 devnull f->subop = Ot;
90 87a52e04 2005-12-26 devnull return;
91 87a52e04 2005-12-26 devnull }
92 87a52e04 2005-12-26 devnull sysfatal("unknown bootp field: %s", f->s);
93 87a52e04 2005-12-26 devnull }
94 87a52e04 2005-12-26 devnull
95 87a52e04 2005-12-26 devnull static int
96 87a52e04 2005-12-26 devnull p_filter(Filter *f, Msg *m)
97 87a52e04 2005-12-26 devnull {
98 87a52e04 2005-12-26 devnull Hdr *h;
99 87a52e04 2005-12-26 devnull
100 87a52e04 2005-12-26 devnull h = (Hdr*)m->ps;
101 87a52e04 2005-12-26 devnull
102 87a52e04 2005-12-26 devnull if(m->pe < (uchar*)h->sname)
103 87a52e04 2005-12-26 devnull return 0;
104 87a52e04 2005-12-26 devnull m->ps = h->optdata;
105 87a52e04 2005-12-26 devnull
106 87a52e04 2005-12-26 devnull switch(f->subop){
107 87a52e04 2005-12-26 devnull case Oca:
108 87a52e04 2005-12-26 devnull return NetL(h->ciaddr) == f->ulv || NetL(h->yiaddr) == f->ulv;
109 87a52e04 2005-12-26 devnull case Osa:
110 87a52e04 2005-12-26 devnull return NetL(h->siaddr) == f->ulv;
111 87a52e04 2005-12-26 devnull case Ot:
112 87a52e04 2005-12-26 devnull return NetL(h->optmagic) == f->ulv;
113 87a52e04 2005-12-26 devnull }
114 87a52e04 2005-12-26 devnull return 0;
115 87a52e04 2005-12-26 devnull }
116 87a52e04 2005-12-26 devnull
117 87a52e04 2005-12-26 devnull static char*
118 87a52e04 2005-12-26 devnull op(int i)
119 87a52e04 2005-12-26 devnull {
120 87a52e04 2005-12-26 devnull static char x[20];
121 87a52e04 2005-12-26 devnull
122 87a52e04 2005-12-26 devnull switch(i){
123 87a52e04 2005-12-26 devnull case Bootrequest:
124 87a52e04 2005-12-26 devnull return "Req";
125 87a52e04 2005-12-26 devnull case Bootreply:
126 87a52e04 2005-12-26 devnull return "Rep";
127 87a52e04 2005-12-26 devnull default:
128 87a52e04 2005-12-26 devnull sprint(x, "%d", i);
129 87a52e04 2005-12-26 devnull return x;
130 87a52e04 2005-12-26 devnull }
131 87a52e04 2005-12-26 devnull }
132 87a52e04 2005-12-26 devnull
133 87a52e04 2005-12-26 devnull
134 87a52e04 2005-12-26 devnull static int
135 87a52e04 2005-12-26 devnull p_seprint(Msg *m)
136 87a52e04 2005-12-26 devnull {
137 87a52e04 2005-12-26 devnull Hdr *h;
138 87a52e04 2005-12-26 devnull ulong x;
139 87a52e04 2005-12-26 devnull
140 87a52e04 2005-12-26 devnull h = (Hdr*)m->ps;
141 87a52e04 2005-12-26 devnull
142 87a52e04 2005-12-26 devnull if(m->pe < (uchar*)h->sname)
143 87a52e04 2005-12-26 devnull return -1;
144 87a52e04 2005-12-26 devnull
145 87a52e04 2005-12-26 devnull /* point past data */
146 87a52e04 2005-12-26 devnull m->ps = h->optdata;
147 87a52e04 2005-12-26 devnull
148 87a52e04 2005-12-26 devnull /* next protocol */
149 87a52e04 2005-12-26 devnull m->pr = nil;
150 87a52e04 2005-12-26 devnull if(m->pe >= (uchar*)h->optdata){
151 87a52e04 2005-12-26 devnull x = NetL(h->optmagic);
152 87a52e04 2005-12-26 devnull demux(p_mux, x, x, m, &dump);
153 87a52e04 2005-12-26 devnull }
154 87a52e04 2005-12-26 devnull
155 87a52e04 2005-12-26 devnull m->p = seprint(m->p, m->e, "t=%s ht=%d hl=%d hp=%d xid=%ux sec=%d fl=%4.4ux ca=%V ya=%V sa=%V ga=%V cha=%E magic=%lux",
156 87a52e04 2005-12-26 devnull op(h->op), h->htype, h->hlen, h->hops,
157 87a52e04 2005-12-26 devnull NetL(h->xid), NetS(h->secs), NetS(h->flags),
158 87a52e04 2005-12-26 devnull h->ciaddr, h->yiaddr, h->siaddr, h->giaddr, h->chaddr,
159 87a52e04 2005-12-26 devnull (ulong)NetL(h->optmagic));
160 87a52e04 2005-12-26 devnull if(m->pe > (uchar*)h->sname && *h->sname)
161 87a52e04 2005-12-26 devnull m->p = seprint(m->p, m->e, " snam=%s", h->sname);
162 87a52e04 2005-12-26 devnull if(m->pe > (uchar*)h->file && *h->file)
163 87a52e04 2005-12-26 devnull m->p = seprint(m->p, m->e, " file=%s", h->file);
164 87a52e04 2005-12-26 devnull return 0;
165 87a52e04 2005-12-26 devnull }
166 87a52e04 2005-12-26 devnull
167 87a52e04 2005-12-26 devnull Proto bootp =
168 87a52e04 2005-12-26 devnull {
169 87a52e04 2005-12-26 devnull "bootp",
170 87a52e04 2005-12-26 devnull p_compile,
171 87a52e04 2005-12-26 devnull p_filter,
172 87a52e04 2005-12-26 devnull p_seprint,
173 87a52e04 2005-12-26 devnull p_mux,
174 a38a1836 2006-02-14 devnull "%#.8lux",
175 87a52e04 2005-12-26 devnull p_fields,
176 87a52e04 2005-12-26 devnull defaultframer,
177 87a52e04 2005-12-26 devnull };