1 | /*
2 | * Layer Two Tunnelling Protocol Daemon
3 | * Copyright (C) 1998 Adtran, Inc.
4 | *
5 | * Mark Spencer
6 | *
7 | * This software is distributed under the terms
8 | * of the GPL, which you should have received
9 | * along with this source.
10 | *
11 | * Attribute Value Pair creating routines
12 | */
13 |
14 | #include <stdlib.h>
15 | #include <string.h>
16 | #include <netinet/in.h>
17 | #include "l2tp.h"
18 |
19 | /*
20 | * These routines should add avp's to a buffer
21 | * to be sent
22 | */
23 |
24 |
25 | /* FIXME: If SANITY is on, we should check for buffer overruns */
26 |
27 | /* FIXME: Can't this be condensed alot? */
28 |
29 | int add_message_type_avp (struct buffer *buf, _u16 type)
30 | {
31 | _u16 *raw = (_u16 *) (buf->start + buf->len);
32 | raw[0] = htons (0x8 | MBIT);
33 | raw[1] = htons (VENDOR_ID);
34 | raw[2] = 0;
35 | raw[3] = htons (type);
36 | buf->len += 8;
37 | return 0;
38 | }
39 |
40 | int add_protocol_avp (struct buffer *buf)
41 | {
42 | _u16 *raw = (_u16 *) (buf->start + buf->len);
43 | raw[0] = htons (0x8 | MBIT); /* Length and M bit */
44 | raw[1] = htons (VENDOR_ID);
45 | raw[2] = htons (0x2); /* Value of our AVP */
46 | raw[3] = htons (OUR_L2TP_VERSION);
47 | buf->len += 8;
48 | return 0;
49 | }
50 |
51 | int add_frame_caps_avp (struct buffer *buf, _u16 caps)
52 | {
53 | _u16 *raw = (_u16 *) (buf->start + buf->len);
54 | raw[0] = htons (0xA | MBIT);
55 | raw[1] = htons (VENDOR_ID);
56 | raw[2] = htons (0x3);
57 | raw[3] = 0;
58 | raw[4] = htons (caps);
59 | buf->len += 10;
60 | return 0;
61 | }
62 |
63 | int add_bearer_caps_avp (struct buffer *buf, _u16 caps)
64 | {
65 | _u16 *raw = (_u16 *) (buf->start + buf->len);
66 | raw[0] = htons (0xA | MBIT);
67 | raw[1] = htons (VENDOR_ID);
68 | raw[2] = htons (0x4);
69 | raw[3] = 0;
70 | raw[4] = htons (caps);
71 | buf->len += 10;
72 | return 0;
73 | }
74 |
75 | /* FIXME: I need to send tie breaker AVP's */
76 |
77 | int add_firmware_avp (struct buffer *buf)
78 | {
79 | _u16 *raw = (_u16 *) (buf->start + buf->len);
80 | raw[0] = htons (0x8);
81 | raw[1] = htons (VENDOR_ID);
82 | raw[2] = htons (0x6);
83 | raw[3] = htons (FIRMWARE_REV);
84 | buf->len += 8;
85 | return 0;
86 | }
87 |
88 | /*
89 | int add_hostname_avp(struct buffer *buf) {
90 | _u16 *raw = (_u16 *)(buf->start + buf->len);
91 | raw[0] = htons((0x6 + strlen(hostname)) | MBIT);
92 | raw[1] = htons(VENDOR_ID);
93 | raw[2] = htons(0x7);
94 | strcpy((char *)(&raw[3]), hostname);
95 | buf->len += 6 + strlen(hostname);
96 | return 0;
97 | }
98 | */
99 |
100 | int add_hostname_avp (struct buffer *buf)
101 | {
102 | char names[6] = "eriwan";
103 | _u16 *raw = (_u16 *) (buf->start + buf->len);
104 | raw[0] = htons (0xC | MBIT);
105 | raw[1] = htons (VENDOR_ID);
106 | raw[2] = htons (0x7);
107 | strcpy ((char *) (&raw[3]), names);
108 | buf->len += 12;
109 | return 0;
110 | }
111 |
112 | int add_vendor_avp (struct buffer *buf)
113 | {
114 | _u16 *raw = (_u16 *) (buf->start + buf->len);
115 | raw[0] = htons (0x6 + strlen (VENDOR_NAME));
116 | raw[1] = htons (VENDOR_ID);
117 | raw[2] = htons (0x8);
118 | strcpy ((char *) (&raw[3]), VENDOR_NAME);
119 | buf->len += 6 + strlen (VENDOR_NAME);
120 | return 0;
121 | }
122 |
123 | int add_tunnelid_avp (struct buffer *buf, _u16 tid)
124 | {
125 | _u16 *raw = (_u16 *) (buf->start + buf->len);
126 | raw[0] = htons (0x8 | MBIT);
127 | raw[1] = htons (VENDOR_ID);
128 | raw[2] = htons (0x9);
129 | raw[3] = htons (tid);
130 | buf->len += 8;
131 | return 0;
132 | }
133 |
134 | int add_avp_rws (struct buffer *buf, _u16 rws)
135 | {
136 | _u16 *raw = (_u16 *) (buf->start + buf->len);
137 | raw[0] = htons (0x8 | MBIT);
138 | raw[1] = htons (VENDOR_ID);
139 | raw[2] = htons (0xA);
140 | raw[3] = htons (rws);
141 | buf->len += 8;
142 | return 0;
143 | }
144 |
145 | int add_challenge_avp (struct buffer *buf, char *c, int len)
146 | {
147 | _u16 *raw = (_u16 *) (buf->start + buf->len);
148 | raw[0] = htons ((0x6 + len) | MBIT);
149 | raw[1] = htons (VENDOR_ID);
150 | raw[2] = htons (0xB);
151 | bcopy (c, (char *) (&raw[3]), len);
152 | buf->len += 6 + len;
153 | return 0;
154 | }
155 |
156 | int add_chalresp_avp (struct buffer *buf, char *c, int len)
157 | {
158 | _u16 *raw = (_u16 *) (buf->start + buf->len);
159 | raw[0] = htons ((0x6 + len) | MBIT);
160 | raw[1] = htons (VENDOR_ID);
161 | raw[2] = htons (0xD);
162 | bcopy (c, (char *) (&raw[3]), len);
163 | buf->len += 6 + len;
164 | return 0;
165 | }
166 |
167 | int add_randvect_avp (struct buffer *buf, char *c, int len)
168 | {
169 | _u16 *raw = (_u16 *) (buf->start + buf->len);
170 | raw[0] = htons ((0x6 + len) | MBIT);
171 | raw[1] = htons (VENDOR_ID);
172 | raw[2] = htons (0x24);
173 | bcopy (c, (char *) (&raw[3]), len);
174 | buf->len += 6 + len;
175 | return 0;
176 | }
177 |
178 | int add_result_code_avp (struct buffer *buf, _u16 result, _u16 error,
179 | char *msg, int len)
180 | {
181 | _u16 *raw = (_u16 *) (buf->start + buf->len);
182 | raw[0] = htons ((0xA + len) | MBIT);
183 | raw[1] = htons (VENDOR_ID);
184 | raw[2] = htons (0x1);
185 | raw[3] = htons (result);
186 | raw[4] = htons (error);
187 | bcopy (msg, (char *) &raw[5], len);
188 | buf->len += (10 + len);
189 | return 0;
190 | }
191 |
192 | #ifdef TEST_HIDDEN
193 | int add_callid_avp (struct buffer *buf, _u16 callid, struct tunnel *t)
194 | {
195 | #else
196 | int add_callid_avp (struct buffer *buf, _u16 callid)
197 | {
198 | #endif
199 | _u16 *raw = (_u16 *) (buf->start + buf->len);
200 | #ifdef TEST_HIDDEN
201 | if (t->hbit)
202 | raw++;
203 | #endif
204 | raw[0] = htons (0x8 | MBIT);
205 | raw[1] = htons (VENDOR_ID);
206 | raw[2] = htons (0xE);
207 | raw[3] = htons (callid);
208 | buf->len += 8;
209 | #ifdef TEST_HIDDEN
210 | if (t->hbit)
211 | encrypt_avp (buf, 8, t);
212 | #endif
213 | return 0;
214 | }
215 |
216 | int add_serno_avp (struct buffer *buf, unsigned int serno)
217 | {
218 | _u16 *raw = (_u16 *) (buf->start + buf->len);
219 | raw[0] = htons (0xA | MBIT);
220 | raw[1] = htons (VENDOR_ID);
221 | raw[2] = htons (0xF);
222 | raw[3] = htons ((serno >> 16) & 0xFFFF);
223 | raw[4] = htons (serno & 0xFFFF);
224 | buf->len += 10;
225 | return 0;
226 | }
227 |
228 | int add_bearer_avp (struct buffer *buf, int bearer)
229 | {
230 | _u16 *raw = (_u16 *) (buf->start + buf->len);
231 | raw[0] = htons (0xA | MBIT);
232 | raw[1] = htons (VENDOR_ID);
233 | raw[2] = htons (0x12);
234 | raw[3] = htons ((bearer >> 16) & 0xFFFF);
235 | raw[4] = htons (bearer & 0xFFFF);
236 | buf->len += 10;
237 | return 0;
238 | }
239 |
240 | int add_frame_avp (struct buffer *buf, int frame)
241 | {
242 | _u16 *raw = (_u16 *) (buf->start + buf->len);
243 | raw[0] = htons (0xA | MBIT);
244 | raw[1] = htons (VENDOR_ID);
245 | raw[2] = htons (0x13);
246 | raw[3] = htons ((frame >> 16) & 0xFFFF);
247 | raw[4] = htons (frame & 0xFFFF);
248 | buf->len += 10;
249 | return 0;
250 | }
251 |
252 | int add_txspeed_avp (struct buffer *buf, int speed)
253 | {
254 | _u16 *raw = (_u16 *) (buf->start + buf->len);
255 | raw[0] = htons (0xA | MBIT);
256 | raw[1] = htons (VENDOR_ID);
257 | raw[2] = htons (0x18);
258 | raw[3] = htons ((speed >> 16) & 0xFFFF);
259 | raw[4] = htons (speed & 0xFFFF);
260 | buf->len += 10;
261 | return 0;
262 | }
263 |
264 | int add_rxspeed_avp (struct buffer *buf, int speed)
265 | {
266 | _u16 *raw = (_u16 *) (buf->start + buf->len);
267 | raw[0] = htons (0xA | MBIT);
268 | raw[1] = htons (VENDOR_ID);
269 | raw[2] = htons (0x26);
270 | raw[3] = htons ((speed >> 16) & 0xFFFF);
271 | raw[4] = htons (speed & 0xFFFF);
272 | buf->len += 10;
273 | return 0;
274 | }
275 |
276 | int add_physchan_avp (struct buffer *buf, unsigned int physchan)
277 | {
278 | _u16 *raw = (_u16 *) (buf->start + buf->len);
279 | raw[0] = htons (0x8 | MBIT);
280 | raw[1] = htons (VENDOR_ID);
281 | raw[2] = htons (0x19);
282 | raw[3] = htons ((physchan >> 16) & 0xFFFF);
283 | raw[4] = htons (physchan & 0xFFFF);
284 | buf->len += 10;
285 | return 0;
286 | }
287 |
288 | int add_ppd_avp (struct buffer *buf, _u16 ppd)
289 | {
290 | _u16 *raw = (_u16 *) (buf->start + buf->len);
291 | raw[0] = htons (0x8 | MBIT);
292 | raw[1] = htons (VENDOR_ID);
293 | raw[2] = htons (0x14);
294 | raw[3] = htons (ppd);
295 | buf->len += 8;
296 | return 0;
297 | }
298 |
299 | int add_seqreqd_avp (struct buffer *buf)
300 | {
301 | _u16 *raw = (_u16 *) (buf->start + buf->len);
302 | raw[0] = htons (0x6 | MBIT);
303 | raw[1] = htons (VENDOR_ID);
304 | raw[2] = htons (0x27);
305 | buf->len += 6;
306 | return 0;
307 | }
308 |
309 | /* jz: options dor the outgoing call */
310 |
311 | /* jz: Minimum BPS - 16 */
312 | int add_minbps_avp (struct buffer *buf, int speed)
313 | {
314 | _u16 *raw = (_u16 *) (buf->start + buf->len);
315 | raw[0] = htons (0xA | MBIT);
316 | raw[1] = htons (VENDOR_ID);
317 | raw[2] = htons (0x10);
318 | raw[3] = htons ((speed >> 16) & 0xFFFF);
319 | raw[4] = htons (speed & 0xFFFF);
320 | buf->len += 10;
321 | return 0;
322 | }
323 |
324 | /* jz: Maximum BPS - 17 */
325 | int add_maxbps_avp (struct buffer *buf, int speed)
326 | {
327 | _u16 *raw = (_u16 *) (buf->start + buf->len);
328 | raw[0] = htons (0xA | MBIT);
329 | raw[1] = htons (VENDOR_ID);
330 | raw[2] = htons (0x11);
331 | raw[3] = htons ((speed >> 16) & 0xFFFF);
332 | raw[4] = htons (speed & 0xFFFF);
333 | buf->len += 10;
334 | return 0;
335 | }
336 |
337 | /* jz: Dialed Number 21 */
338 | int add_number_avp (struct buffer *buf, char *no)
339 | {
340 | _u16 *raw = (_u16 *) (buf->start + buf->len);
341 | raw[0] = htons ((0x6 + strlen (no)) | MBIT);
342 | raw[1] = htons (VENDOR_ID);
343 | raw[2] = htons (0x15);
344 | strncpy ((char *) (&(raw[3])), no, strlen (no));
345 | buf->len += 6 + strlen (no);
346 | return 0;
347 | }