1*368c31abSDavid du Colombier #include <u.h>
2*368c31abSDavid du Colombier #include <libc.h>
3*368c31abSDavid du Colombier #include <venti.h>
4*368c31abSDavid du Colombier #include <libsec.h>
5*368c31abSDavid du Colombier
6*368c31abSDavid du Colombier #define MAGIC 0x54798314
7*368c31abSDavid du Colombier #define NOTFREE(p) assert((p)->magic == MAGIC)
8*368c31abSDavid du Colombier
9*368c31abSDavid du Colombier struct Packet
10*368c31abSDavid du Colombier {
11*368c31abSDavid du Colombier char *data;
12*368c31abSDavid du Colombier int len;
13*368c31abSDavid du Colombier void (*free)(void*);
14*368c31abSDavid du Colombier void *arg;
15*368c31abSDavid du Colombier int magic;
16*368c31abSDavid du Colombier };
17*368c31abSDavid du Colombier
18*368c31abSDavid du Colombier Packet*
packetalloc(void)19*368c31abSDavid du Colombier packetalloc(void)
20*368c31abSDavid du Colombier {
21*368c31abSDavid du Colombier Packet *p;
22*368c31abSDavid du Colombier
23*368c31abSDavid du Colombier p = vtmallocz(sizeof *p);
24*368c31abSDavid du Colombier p->free = vtfree;
25*368c31abSDavid du Colombier p->arg = nil;
26*368c31abSDavid du Colombier p->magic = MAGIC;
27*368c31abSDavid du Colombier return p;
28*368c31abSDavid du Colombier }
29*368c31abSDavid du Colombier
30*368c31abSDavid du Colombier void
packetappend(Packet * p,uchar * buf,int n)31*368c31abSDavid du Colombier packetappend(Packet *p, uchar *buf, int n)
32*368c31abSDavid du Colombier {
33*368c31abSDavid du Colombier NOTFREE(p);
34*368c31abSDavid du Colombier if(n < 0)
35*368c31abSDavid du Colombier abort();
36*368c31abSDavid du Colombier if(p->free != vtfree)
37*368c31abSDavid du Colombier sysfatal("packetappend");
38*368c31abSDavid du Colombier p->data = vtrealloc(p->data, p->len+n);
39*368c31abSDavid du Colombier p->arg = p->data;
40*368c31abSDavid du Colombier memmove(p->data+p->len, buf, n);
41*368c31abSDavid du Colombier p->len += n;
42*368c31abSDavid du Colombier }
43*368c31abSDavid du Colombier
44*368c31abSDavid du Colombier uint
packetasize(Packet * p)45*368c31abSDavid du Colombier packetasize(Packet *p)
46*368c31abSDavid du Colombier {
47*368c31abSDavid du Colombier NOTFREE(p);
48*368c31abSDavid du Colombier return p->len;
49*368c31abSDavid du Colombier }
50*368c31abSDavid du Colombier
51*368c31abSDavid du Colombier int
packetcmp(Packet * p,Packet * q)52*368c31abSDavid du Colombier packetcmp(Packet *p, Packet *q)
53*368c31abSDavid du Colombier {
54*368c31abSDavid du Colombier int i, len;
55*368c31abSDavid du Colombier
56*368c31abSDavid du Colombier NOTFREE(p);
57*368c31abSDavid du Colombier NOTFREE(q);
58*368c31abSDavid du Colombier len = p->len;
59*368c31abSDavid du Colombier if(len > q->len)
60*368c31abSDavid du Colombier len = q->len;
61*368c31abSDavid du Colombier if(len && (i=memcmp(p->data, q->data, len)) != 0)
62*368c31abSDavid du Colombier return i;
63*368c31abSDavid du Colombier if(p->len > len)
64*368c31abSDavid du Colombier return 1;
65*368c31abSDavid du Colombier if(q->len > len)
66*368c31abSDavid du Colombier return -1;
67*368c31abSDavid du Colombier return 0;
68*368c31abSDavid du Colombier }
69*368c31abSDavid du Colombier
70*368c31abSDavid du Colombier void
packetconcat(Packet * p,Packet * q)71*368c31abSDavid du Colombier packetconcat(Packet *p, Packet *q)
72*368c31abSDavid du Colombier {
73*368c31abSDavid du Colombier NOTFREE(p);
74*368c31abSDavid du Colombier NOTFREE(q);
75*368c31abSDavid du Colombier packetappend(p, q->data, q->len);
76*368c31abSDavid du Colombier if(q->free == vtfree)
77*368c31abSDavid du Colombier memset(q->data, 0xFE, q->len);
78*368c31abSDavid du Colombier q->free(q->arg);
79*368c31abSDavid du Colombier q->data = nil;
80*368c31abSDavid du Colombier q->len = 0;
81*368c31abSDavid du Colombier }
82*368c31abSDavid du Colombier
83*368c31abSDavid du Colombier int
packetconsume(Packet * p,uchar * buf,int n)84*368c31abSDavid du Colombier packetconsume(Packet *p, uchar *buf, int n)
85*368c31abSDavid du Colombier {
86*368c31abSDavid du Colombier NOTFREE(p);
87*368c31abSDavid du Colombier if(n < 0)
88*368c31abSDavid du Colombier abort();
89*368c31abSDavid du Colombier if(p->len < n)
90*368c31abSDavid du Colombier abort();
91*368c31abSDavid du Colombier memmove(buf, p->data, n);
92*368c31abSDavid du Colombier p->len -= n;
93*368c31abSDavid du Colombier memmove(p->data, p->data+n, p->len);
94*368c31abSDavid du Colombier return 0;
95*368c31abSDavid du Colombier }
96*368c31abSDavid du Colombier
97*368c31abSDavid du Colombier int
packetcopy(Packet * p,uchar * buf,int offset,int n)98*368c31abSDavid du Colombier packetcopy(Packet *p, uchar *buf, int offset, int n)
99*368c31abSDavid du Colombier {
100*368c31abSDavid du Colombier NOTFREE(p);
101*368c31abSDavid du Colombier if(offset < 0 || n < 0)
102*368c31abSDavid du Colombier abort();
103*368c31abSDavid du Colombier if(offset > p->len)
104*368c31abSDavid du Colombier abort();
105*368c31abSDavid du Colombier if(offset+n > p->len)
106*368c31abSDavid du Colombier n = p->len - offset;
107*368c31abSDavid du Colombier memmove(buf, p->data+offset, n);
108*368c31abSDavid du Colombier return 0;
109*368c31abSDavid du Colombier }
110*368c31abSDavid du Colombier
111*368c31abSDavid du Colombier Packet*
packetdup(Packet * p,int offset,int n)112*368c31abSDavid du Colombier packetdup(Packet *p, int offset, int n)
113*368c31abSDavid du Colombier {
114*368c31abSDavid du Colombier Packet *q;
115*368c31abSDavid du Colombier
116*368c31abSDavid du Colombier NOTFREE(p);
117*368c31abSDavid du Colombier if(offset < 0 || n < 0)
118*368c31abSDavid du Colombier abort();
119*368c31abSDavid du Colombier if(offset > p->len)
120*368c31abSDavid du Colombier abort();
121*368c31abSDavid du Colombier if(offset+n > p->len)
122*368c31abSDavid du Colombier n = p->len - offset;
123*368c31abSDavid du Colombier q = packetalloc();
124*368c31abSDavid du Colombier packetappend(q, p->data+offset, n);
125*368c31abSDavid du Colombier return q;
126*368c31abSDavid du Colombier }
127*368c31abSDavid du Colombier
128*368c31abSDavid du Colombier Packet*
packetforeign(uchar * buf,int n,void (* free)(void *),void * a)129*368c31abSDavid du Colombier packetforeign(uchar *buf, int n, void (*free)(void*), void *a)
130*368c31abSDavid du Colombier {
131*368c31abSDavid du Colombier Packet *p;
132*368c31abSDavid du Colombier
133*368c31abSDavid du Colombier if(n < 0)
134*368c31abSDavid du Colombier abort();
135*368c31abSDavid du Colombier p = packetalloc();
136*368c31abSDavid du Colombier p->data = (char*)buf;
137*368c31abSDavid du Colombier p->len = n;
138*368c31abSDavid du Colombier p->free = free;
139*368c31abSDavid du Colombier p->arg = a;
140*368c31abSDavid du Colombier return p;
141*368c31abSDavid du Colombier }
142*368c31abSDavid du Colombier
143*368c31abSDavid du Colombier int
packetfragments(Packet * p,IOchunk * io,int nio,int offset)144*368c31abSDavid du Colombier packetfragments(Packet *p, IOchunk *io, int nio, int offset)
145*368c31abSDavid du Colombier {
146*368c31abSDavid du Colombier NOTFREE(p);
147*368c31abSDavid du Colombier if(offset < 0)
148*368c31abSDavid du Colombier abort();
149*368c31abSDavid du Colombier if(nio == 0)
150*368c31abSDavid du Colombier return 0;
151*368c31abSDavid du Colombier memset(io, 0, sizeof(io[0])*nio);
152*368c31abSDavid du Colombier if(offset >= p->len)
153*368c31abSDavid du Colombier return 0;
154*368c31abSDavid du Colombier io[0].addr = p->data + offset;
155*368c31abSDavid du Colombier io[0].len = p->len - offset;
156*368c31abSDavid du Colombier return p->len;
157*368c31abSDavid du Colombier }
158*368c31abSDavid du Colombier
159*368c31abSDavid du Colombier void
packetfree(Packet * p)160*368c31abSDavid du Colombier packetfree(Packet *p)
161*368c31abSDavid du Colombier {
162*368c31abSDavid du Colombier NOTFREE(p);
163*368c31abSDavid du Colombier if(p->free == free)
164*368c31abSDavid du Colombier memset(p->data, 0xFE, p->len);
165*368c31abSDavid du Colombier p->free(p->arg);
166*368c31abSDavid du Colombier p->data = nil;
167*368c31abSDavid du Colombier p->len = 0;
168*368c31abSDavid du Colombier memset(p, 0xFB, sizeof *p);
169*368c31abSDavid du Colombier free(p);
170*368c31abSDavid du Colombier }
171*368c31abSDavid du Colombier
172*368c31abSDavid du Colombier uchar*
packetheader(Packet * p,int n)173*368c31abSDavid du Colombier packetheader(Packet *p, int n)
174*368c31abSDavid du Colombier {
175*368c31abSDavid du Colombier NOTFREE(p);
176*368c31abSDavid du Colombier if(n < 0)
177*368c31abSDavid du Colombier abort();
178*368c31abSDavid du Colombier if(n > p->len)
179*368c31abSDavid du Colombier abort();
180*368c31abSDavid du Colombier return p->data;
181*368c31abSDavid du Colombier }
182*368c31abSDavid du Colombier
183*368c31abSDavid du Colombier uchar*
packetpeek(Packet * p,uchar * buf,int offset,int n)184*368c31abSDavid du Colombier packetpeek(Packet *p, uchar *buf, int offset, int n)
185*368c31abSDavid du Colombier {
186*368c31abSDavid du Colombier NOTFREE(p);
187*368c31abSDavid du Colombier if(offset < 0 || n < 0)
188*368c31abSDavid du Colombier abort();
189*368c31abSDavid du Colombier if(offset+n > p->len)
190*368c31abSDavid du Colombier abort();
191*368c31abSDavid du Colombier return p->data+offset;
192*368c31abSDavid du Colombier }
193*368c31abSDavid du Colombier
194*368c31abSDavid du Colombier void
packetprefix(Packet * p,uchar * buf,int n)195*368c31abSDavid du Colombier packetprefix(Packet *p, uchar *buf, int n)
196*368c31abSDavid du Colombier {
197*368c31abSDavid du Colombier NOTFREE(p);
198*368c31abSDavid du Colombier if(n < 0)
199*368c31abSDavid du Colombier abort();
200*368c31abSDavid du Colombier if(p->free != free)
201*368c31abSDavid du Colombier sysfatal("packetappend");
202*368c31abSDavid du Colombier p->data = vtrealloc(p->data, p->len+n);
203*368c31abSDavid du Colombier p->arg = p->data;
204*368c31abSDavid du Colombier memmove(p->data+n, p->data, p->len);
205*368c31abSDavid du Colombier memmove(p->data, buf, n);
206*368c31abSDavid du Colombier p->len += n;
207*368c31abSDavid du Colombier }
208*368c31abSDavid du Colombier
209*368c31abSDavid du Colombier void
packetsha1(Packet * p,uchar d[20])210*368c31abSDavid du Colombier packetsha1(Packet *p, uchar d[20])
211*368c31abSDavid du Colombier {
212*368c31abSDavid du Colombier NOTFREE(p);
213*368c31abSDavid du Colombier sha1((uchar*)p->data, p->len, d, nil);
214*368c31abSDavid du Colombier }
215*368c31abSDavid du Colombier
216*368c31abSDavid du Colombier uint
packetsize(Packet * p)217*368c31abSDavid du Colombier packetsize(Packet *p)
218*368c31abSDavid du Colombier {
219*368c31abSDavid du Colombier NOTFREE(p);
220*368c31abSDavid du Colombier return p->len;
221*368c31abSDavid du Colombier }
222*368c31abSDavid du Colombier
223*368c31abSDavid du Colombier Packet*
packetsplit(Packet * p,int n)224*368c31abSDavid du Colombier packetsplit(Packet *p, int n)
225*368c31abSDavid du Colombier {
226*368c31abSDavid du Colombier Packet *q;
227*368c31abSDavid du Colombier
228*368c31abSDavid du Colombier NOTFREE(p);
229*368c31abSDavid du Colombier q = packetalloc();
230*368c31abSDavid du Colombier q->data = vtmalloc(n);
231*368c31abSDavid du Colombier q->arg = q->data;
232*368c31abSDavid du Colombier q->free = vtfree;
233*368c31abSDavid du Colombier packetconsume(p, q->data, n);
234*368c31abSDavid du Colombier return q;
235*368c31abSDavid du Colombier }
236*368c31abSDavid du Colombier
237*368c31abSDavid du Colombier void
packetstats(void)238*368c31abSDavid du Colombier packetstats(void)
239*368c31abSDavid du Colombier {
240*368c31abSDavid du Colombier }
241*368c31abSDavid du Colombier
242*368c31abSDavid du Colombier uchar*
packettrailer(Packet * p,int n)243*368c31abSDavid du Colombier packettrailer(Packet *p, int n)
244*368c31abSDavid du Colombier {
245*368c31abSDavid du Colombier NOTFREE(p);
246*368c31abSDavid du Colombier if(n < 0)
247*368c31abSDavid du Colombier abort();
248*368c31abSDavid du Colombier if(n > p->len)
249*368c31abSDavid du Colombier abort();
250*368c31abSDavid du Colombier return p->data + p->len - n;
251*368c31abSDavid du Colombier }
252*368c31abSDavid du Colombier
253*368c31abSDavid du Colombier int
packettrim(Packet * p,int offset,int n)254*368c31abSDavid du Colombier packettrim(Packet *p, int offset, int n)
255*368c31abSDavid du Colombier {
256*368c31abSDavid du Colombier NOTFREE(p);
257*368c31abSDavid du Colombier if(offset < 0 || n < 0)
258*368c31abSDavid du Colombier abort();
259*368c31abSDavid du Colombier if(offset+n > p->len)
260*368c31abSDavid du Colombier abort();
261*368c31abSDavid du Colombier memmove(p->data+offset, p->data+offset+n, p->len-offset-n);
262*368c31abSDavid du Colombier p->len -= n;
263*368c31abSDavid du Colombier return 0;
264*368c31abSDavid du Colombier }
265*368c31abSDavid du Colombier
266