Blame


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