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  | }