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