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 handler routines 12 | */ 13 | #include <stdlib.h> 14 | #include <string.h> 15 | #include <stdio.h> 16 | #include <errno.h> 17 | #include <netinet/in.h> 18 | #include "l2tp.h" 19 | 20 | #define AVP_MAX 39 21 | 22 | struct avp avps[] = { 23 | 24 | {0, 1, &message_type_avp, "Message Type"}, 25 | {1, 1, &result_code_avp, "Result Code"}, 26 | {2, 1, &protocol_version_avp, "Protocol Version"}, 27 | {3, 1, &framing_caps_avp, "Framing Capabilities"}, 28 | {4, 1, &bearer_caps_avp, "Bearer Capabilities"}, 29 | {5, 0, NULL, "Tie Breaker"}, 30 | {6, 0, &firmware_rev_avp, "Firmware Revision"}, 31 | {7, 0, &hostname_avp, "Host Name"}, 32 | {8, 1, &vendor_avp, "Vendor Name"}, 33 | {9, 1, &assigned_tunnel_avp, "Assigned Tunnel ID"}, 34 | {10, 1, &receive_window_size_avp, "Receive Window Size"}, 35 | {11, 1, &challenge_avp, "Challenge"}, 36 | {12, 0, NULL, "Q.931 Cause Code"}, 37 | {13, 1, &chalresp_avp, "Challenge Response"}, 38 | {14, 1, &assigned_call_avp, "Assigned Call ID"}, 39 | {15, 1, &call_serno_avp, "Call Serial Number"}, 40 | {16, 1, NULL, "Minimum BPS"}, 41 | {17, 1, NULL, "Maximum BPS"}, 42 | {18, 1, &bearer_type_avp, "Bearer Type"}, 43 | {19, 1, &frame_type_avp, "Framing Type"}, 44 | {20, 1, &packet_delay_avp, "Packet Processing Delay"}, 45 | {21, 1, &dialed_number_avp, "Dialed Number"}, 46 | {22, 1, &dialing_number_avp, "Dialing Number"}, 47 | {23, 1, &sub_address_avp, "Sub-Address"}, 48 | {24, 1, &tx_speed_avp, "Transmit Connect Speed"}, 49 | {25, 1, &call_physchan_avp, "Physical channel ID"}, 50 | {26, 0, NULL, "Initial Received LCP Confreq"}, 51 | {27, 0, NULL, "Last Sent LCP Confreq"}, 52 | {28, 0, NULL, "Last Received LCP Confreq"}, 53 | {29, 1, &ignore_avp, "Proxy Authen Type"}, 54 | {30, 0, &ignore_avp, "Proxy Authen Name"}, 55 | {31, 0, &ignore_avp, "Proxy Authen Challenge"}, 56 | {32, 0, &ignore_avp, "Proxy Authen ID"}, 57 | {33, 1, &ignore_avp, "Proxy Authen Response"}, 58 | {34, 1, NULL, "Call Errors"}, 59 | {35, 1, &ignore_avp, "ACCM"}, 60 | {36, 1, &rand_vector_avp, "Random Vector"}, 61 | {37, 1, NULL, "Private Group ID"}, 62 | {38, 0, &rx_speed_avp, "Receive Connect Speed"}, 63 | {39, 1, &seq_reqd_avp, "Sequencing Required"} 64 | }; 65 | 66 | char *msgtypes[] = { 67 | NULL, 68 | "Start-Control-Connection-Request", 69 | "Start-Control-Connection-Reply", 70 | "Start-Control-Connection-Connected", 71 | "Stop-Control-Connection-Notification", 72 | NULL, 73 | "Hello", 74 | "Outgoing-Call-Request", 75 | "Outgoing-Call-Reply", 76 | "Outgoing-Call-Connected", 77 | "Incoming-Call-Request", 78 | "Incoming-Call-Reply", 79 | "Incoming-Call-Connected", 80 | NULL, 81 | "Call-Disconnect-Notify", 82 | "WAN-Error-Notify", 83 | "Set-Link-Info" 84 | }; 85 | 86 | char *stopccn_result_codes[] = { 87 | "Reserved", 88 | "General request to clear control connection", 89 | "General error--Error Code indicates the problem", 90 | "Control channel already exists", 91 | "Requester is not authorized to establish a control channel", 92 | "The protocol version of the requester is not supported--Error Code indicates the highest version supported", 93 | "Requester is being shut down", 94 | "Finite State Machine error" 95 | }; 96 | 97 | char *cdn_result_codes[] = { 98 | "Reserved", 99 | "Call disconnected due to loss of carrier", 100 | "Call disconnected for the reason indicated in error code", 101 | "Call disconnected for administrative reasons", 102 | "Call failed due to lack of appropriate facilities being available (temporary condition)", 103 | "Call failed due to lack of appropriate facilities being available (permanent condition)", 104 | "Invalid destination", 105 | "Call failed due to no carrier detected", 106 | "Call failed due to lack of a dial tone", 107 | "Call was no established within time allotted by LAC", 108 | "Call was connected but no appropriate framing was detect" 109 | }; 110 | 111 | void wrong_length (struct call *c, char *field, int expected, int found, 112 | int min) 113 | { 114 | if (min) 115 | snprintf (c->errormsg, sizeof (c->errormsg), 116 | "%s: expected at least %d, got %d", field, expected, found); 117 | else 118 | snprintf (c->errormsg, sizeof (c->errormsg), 119 | "%s: expected %d, got %d", field, expected, found); 120 | 121 | c->error = ERROR_LENGTH; 122 | c->result = RESULT_ERROR; 123 | c->needclose = -1; 124 | } 125 | 126 | /* 127 | * t, c, data, and datalen may be assumed to be defined for all avp's 128 | */ 129 | 130 | int message_type_avp (struct tunnel *t, struct call *c, void *data, 131 | int datalen) 132 | { 133 | /* 134 | * This will be with every control message. It is critical that this 135 | * procedure check for the validity of sending this kind of a message 136 | * (assuming sanity check) 137 | */ 138 | 139 | _u16 *raw = data; 140 | c->msgtype = ntohs (raw[3]); 141 | if (datalen != 8) 142 | { 143 | if (DEBUG) 144 | log (LOG_DEBUG, "%s: wrong size (%d != 8)\n", __FUNCTION__, 145 | datalen); 146 | wrong_length (c, "Message Type", 8, datalen, 0); 147 | return -EINVAL; 148 | } 149 | if ((c->msgtype > MAX_MSG) || (!msgtypes[c->msgtype])) 150 | { 151 | if (DEBUG) 152 | log (LOG_DEBUG, "%s: unknown message type %d\n", __FUNCTION__, 153 | c->msgtype); 154 | return -EINVAL; 155 | } 156 | if (debug_avp) 157 | if (DEBUG) 158 | log (LOG_DEBUG, "%s: message type %d (%s)\n", __FUNCTION__, 159 | c->msgtype, msgtypes[c->msgtype]); 160 | #ifdef SANITY 161 | if (t->sanity) 162 | { 163 | /* 164 | * Look ou our state for each message and make sure everything 165 | * make sense... 166 | */ 167 | if ((c != t->self) && (c->msgtype < Hello)) 168 | { 169 | if (DEBUG) 170 | log (LOG_DEBUG, 171 | "%s: attempting to negotiate tunnel inside a call!\n", 172 | __FUNCTION__); 173 | return -EINVAL; 174 | } 175 | 176 | switch (c->msgtype) 177 | { 178 | case SCCRQ: 179 | if ((t->state != 0) && (t->state != SCCRQ)) 180 | { 181 | /* 182 | * When we handle tie breaker AVP's, then we'll check 183 | * to see if we've both requested tunnels 184 | */ 185 | 186 | if (DEBUG) 187 | log (LOG_DEBUG, 188 | "%s: attempting to negotiate SCCRQ with state != 0\n", 189 | __FUNCTION__); 190 | return -EINVAL; 191 | } 192 | break; 193 | case SCCRP: 194 | if (t->state != SCCRQ) 195 | { 196 | if (DEBUG) 197 | log (LOG_DEBUG, 198 | "%s: attempting to negotiate SCCRP with state != SCCRQ!\n", 199 | __FUNCTION__); 200 | return -EINVAL; 201 | } 202 | break; 203 | case SCCCN: 204 | if (t->state != SCCRP) 205 | { 206 | if (DEBUG) 207 | log (LOG_DEBUG, 208 | "%s: attempting to negotiate SCCCN with state != SCCRP!\n", 209 | __FUNCTION__); 210 | return -EINVAL; 211 | } 212 | break; 213 | case ICRQ: 214 | if (t->state != SCCCN) 215 | { 216 | if (DEBUG) 217 | log (LOG_DEBUG, 218 | "%s: attempting to negotiate ICRQ when state != SCCCN\n", 219 | __FUNCTION__); 220 | return -EINVAL; 221 | } 222 | if (c != t->self) 223 | { 224 | if (DEBUG) 225 | log (LOG_DEBUG, 226 | "%s: attempting to negotiate ICRQ on a call!\n", 227 | __FUNCTION__); 228 | return -EINVAL; 229 | } 230 | break; 231 | case ICRP: 232 | if (t->state != SCCCN) 233 | { 234 | if (DEBUG) 235 | log (LOG_DEBUG, 236 | "%s: attempting to negotiate ICRP on tunnel!=SCCCN\n", 237 | __FUNCTION__); 238 | return -EINVAL; 239 | } 240 | if (c->state != ICRQ) 241 | { 242 | if (DEBUG) 243 | log (LOG_DEBUG, 244 | "%s: attempting to negotiate ICRP when state != ICRQ\n", 245 | __FUNCTION__); 246 | return -EINVAL; 247 | } 248 | break; 249 | case ICCN: 250 | if (c->state != ICRP) 251 | { 252 | if (DEBUG) 253 | log (LOG_DEBUG, 254 | "%s: attempting to negotiate ICCN when state != ICRP\n", 255 | __FUNCTION__); 256 | return -EINVAL; 257 | } 258 | break; 259 | case SLI: 260 | if (c->state != ICCN) 261 | { 262 | if (DEBUG) 263 | log (LOG_DEBUG, 264 | "%s: attempting to negotiate SLI when state != ICCN\n", 265 | __FUNCTION__); 266 | return -EINVAL; 267 | } 268 | break; 269 | case OCRP: /* jz: case for ORCP */ 270 | if (t->state != SCCCN) 271 | { 272 | if (DEBUG) 273 | log (LOG_DEBUG, 274 | "%s: attempting to negotiate OCRP on tunnel!=SCCCN\n", 275 | __FUNCTION__); 276 | return -EINVAL; 277 | } 278 | if (c->state != OCRQ) 279 | { 280 | if (DEBUG) 281 | log (LOG_DEBUG, 282 | "%s: attempting to negotiate OCRP when state != OCRQ\n", 283 | __FUNCTION__); 284 | return -EINVAL; 285 | } 286 | break; 287 | case OCCN: /* jz: case for OCCN */ 288 | 289 | if (c->state != OCRQ) 290 | { 291 | if (DEBUG) 292 | log (LOG_DEBUG, 293 | "%s: attempting to negotiate OCCN when state != OCRQ\n", 294 | __FUNCTION__); 295 | return -EINVAL; 296 | } 297 | break; 298 | case StopCCN: 299 | case CDN: 300 | case Hello: 301 | break; 302 | default: 303 | log (LOG_WARN, "%s: i don't know how to handle %s messages\n", 304 | __FUNCTION__, msgtypes[c->msgtype]); 305 | return -EINVAL; 306 | } 307 | } 308 | #endif 309 | if (c->msgtype == ICRQ) 310 | { 311 | struct call *tmp; 312 | if (debug_avp) 313 | { 314 | if (DEBUG) 315 | log (LOG_DEBUG, "%s: new incoming call\n", __FUNCTION__); 316 | } 317 | tmp = new_call (t); 318 | if (!tmp) 319 | { 320 | log (LOG_WARN, "%s: unable to create new call\n", __FUNCTION__); 321 | return -EINVAL; 322 | } 323 | tmp->next = t->call_head; 324 | t->call_head = tmp; 325 | t->count++; 326 | /* 327 | * Is this still safe to assume that the head will always 328 | * be the most recent call being negotiated? 329 | * Probably... FIXME anyway... 330 | */ 331 | 332 | } 333 | return 0; 334 | } 335 | 336 | int rand_vector_avp (struct tunnel *t, struct call *c, void *data, 337 | int datalen) 338 | { 339 | int size; 340 | _u16 *raw = (_u16 *) data; 341 | size = (raw[0] & 0x0FFF) - 6; 342 | if (t->sanity) 343 | { 344 | if (size < 0) 345 | { 346 | if (DEBUG) 347 | log (LOG_DEBUG, "%s: Random vector too small (%d < 0)\n", 348 | __FUNCTION__, size); 349 | wrong_length (c, "Random Vector", 6, datalen, 1); 350 | return -EINVAL; 351 | } 352 | if (size > MAX_VECTOR_SIZE) 353 | { 354 | if (DEBUG) 355 | log (LOG_DEBUG, "%s: Random vector too large (%d > %d)\n", 356 | __FUNCTION__, datalen, MAX_VECTOR_SIZE); 357 | wrong_length (c, "Random Vector", 6, datalen, 1); 358 | return -EINVAL; 359 | } 360 | } 361 | if (debug_avp) 362 | log (LOG_DEBUG, "%s: Random Vector of %d octets\n", __FUNCTION__, 363 | size); 364 | t->chal_us.vector = (unsigned char *) &raw[3]; 365 | t->chal_us.vector_len = size; 366 | return 0; 367 | } 368 | 369 | int ignore_avp (struct tunnel *t, struct call *c, void *data, int datalen) 370 | { 371 | /* 372 | * The spec says we have to accept authentication information 373 | * even if we just ignore it, so that's exactly what 374 | * we're going to do at this point. Proxy authentication is such 375 | * a rediculous security threat anyway except from local 376 | * controled machines. 377 | * 378 | * FIXME: I need to handle proxy authentication as an option. 379 | * One option is to simply change the options we pass to pppd. 380 | * 381 | */ 382 | if (debug_avp) 383 | { 384 | if (DEBUG) 385 | log (LOG_DEBUG, "%s : Ignoring AVP\n", __FUNCTION__); 386 | } 387 | return 0; 388 | } 389 | 390 | int seq_reqd_avp (struct tunnel *t, struct call *c, void *data, int datalen) 391 | { 392 | #ifdef SANITY 393 | if (t->sanity) 394 | { 395 | if (datalen != 6) 396 | { 397 | if (DEBUG) 398 | log (LOG_DEBUG, 399 | "%s: avp is incorrect size. %d != 6\n", __FUNCTION__, 400 | datalen); 401 | wrong_length (c, "Sequencing Required", 6, datalen, 1); 402 | return -EINVAL; 403 | } 404 | switch (c->msgtype) 405 | { 406 | case ICCN: 407 | break; 408 | default: 409 | if (DEBUG) 410 | log (LOG_DEBUG, 411 | "%s: sequencing required not appropriate for %s!\n", 412 | __FUNCTION__, msgtypes[c->msgtype]); 413 | return -EINVAL; 414 | } 415 | } 416 | #endif 417 | if (debug_avp) 418 | { 419 | if (DEBUG) 420 | log (LOG_DEBUG, "%s: peer requires sequencing.\n", __FUNCTION__); 421 | } 422 | c->seq_reqd = -1; 423 | return 0; 424 | } 425 | 426 | int result_code_avp (struct tunnel *t, struct call *c, void *data, 427 | int datalen) 428 | { 429 | /* 430 | * Find out what version of l2tp the other side is using. 431 | * I'm not sure what we're supposed to do with this but whatever.. 432 | */ 433 | 434 | int error; 435 | int result; 436 | _u16 *raw = data; 437 | #ifdef SANITY 438 | if (t->sanity) 439 | { 440 | if (datalen < 10) 441 | { 442 | if (DEBUG) 443 | log (LOG_DEBUG, 444 | "%s: avp is incorrect size. %d < 10\n", __FUNCTION__, 445 | datalen); 446 | wrong_length (c, "Result Code", 10, datalen, 1); 447 | return -EINVAL; 448 | } 449 | switch (c->msgtype) 450 | { 451 | case CDN: 452 | case StopCCN: 453 | break; 454 | default: 455 | if (DEBUG) 456 | log (LOG_DEBUG, 457 | "%s: result code not appropriate for %s. Ignoring.\n", 458 | __FUNCTION__, msgtypes[c->msgtype]); 459 | return 0; 460 | } 461 | } 462 | #endif 463 | result = ntohs (raw[3]); 464 | error = ntohs (raw[4]); 465 | if ((c->msgtype == StopCCN) && ((result > 7) || (result < 1))) 466 | { 467 | if (DEBUG) 468 | log (LOG_DEBUG, 469 | "%s: result code out of range (%d %d %d). Ignoring.\n", 470 | __FUNCTION__, result, error, datalen); 471 | return 0; 472 | } 473 | 474 | if ((c->msgtype == CDN) && ((result > 11) || (result < 1))) 475 | { 476 | if (DEBUG) 477 | log (LOG_DEBUG, 478 | "%s: result code out of range (%d %d %d). Ignoring.\n", 479 | __FUNCTION__, result, error, datalen); 480 | return 0; 481 | } 482 | 483 | c->error = error; 484 | c->result = result; 485 | safe_copy (c->errormsg, (char *) &raw[5], datalen - 10); 486 | if (debug_avp) 487 | { 488 | if (DEBUG && (c->msgtype == StopCCN)) 489 | { 490 | log (LOG_DEBUG, 491 | "%s: peer closing for reason %d (%s), error = %d (%s)\n", 492 | __FUNCTION__, result, stopccn_result_codes[result], error, 493 | c->errormsg); 494 | } 495 | else 496 | { 497 | log (LOG_DEBUG, 498 | "%s: peer closing for reason %d (%s), error = %d (%s)\n", 499 | __FUNCTION__, result, cdn_result_codes[result], error, 500 | c->errormsg); 501 | } 502 | } 503 | return 0; 504 | } 505 | 506 | int protocol_version_avp (struct tunnel *t, struct call *c, void *data, 507 | int datalen) 508 | { 509 | /* 510 | * Find out what version of l2tp the other side is using. 511 | * I'm not sure what we're supposed to do with this but whatever.. 512 | */ 513 | 514 | int ver; 515 | _u16 *raw = data; 516 | #ifdef SANITY 517 | if (t->sanity) 518 | { 519 | if (datalen != 8) 520 | { 521 | if (DEBUG) 522 | log (LOG_DEBUG, 523 | "%s: avp is incorrect size. %d != 8\n", __FUNCTION__, 524 | datalen); 525 | wrong_length (c, "Protocol Version", 8, datalen, 1); 526 | return -EINVAL; 527 | } 528 | switch (c->msgtype) 529 | { 530 | case SCCRP: 531 | case SCCRQ: 532 | break; 533 | default: 534 | if (DEBUG) 535 | log (LOG_DEBUG, 536 | "%s: protocol version not appropriate for %s. Ignoring.\n", 537 | __FUNCTION__, msgtypes[c->msgtype]); 538 | return 0; 539 | } 540 | } 541 | #endif 542 | ver = ntohs (raw[3]); 543 | if (debug_avp) 544 | { 545 | if (DEBUG) 546 | log (LOG_DEBUG, 547 | "%s: peer is using version %d, revision %d.\n", __FUNCTION__, 548 | (ver >> 8), ver & 0xFF); 549 | } 550 | return 0; 551 | } 552 | 553 | int framing_caps_avp (struct tunnel *t, struct call *c, void *data, 554 | int datalen) 555 | { 556 | /* 557 | * Retrieve the framing capabilities 558 | * from the peer 559 | */ 560 | 561 | int caps; 562 | _u16 *raw = data; 563 | 564 | #ifdef SANITY 565 | if (t->sanity) 566 | { 567 | switch (c->msgtype) 568 | { 569 | case SCCRP: 570 | case SCCRQ: 571 | break; 572 | default: 573 | if (DEBUG) 574 | log (LOG_DEBUG, 575 | "%s: framing capabilities not appropriate for %s. Ignoring.\n", 576 | __FUNCTION__, msgtypes[c->msgtype]); 577 | return 0; 578 | } 579 | if (datalen != 10) 580 | { 581 | if (DEBUG) 582 | log (LOG_DEBUG, 583 | "%s: avp is incorrect size. %d != 10\n", __FUNCTION__, 584 | datalen); 585 | wrong_length (c, "Framming Capabilities", 10, datalen, 0); 586 | return -EINVAL; 587 | } 588 | } 589 | #endif 590 | caps = ntohs (raw[4]); 591 | if (debug_avp) 592 | if (DEBUG) 593 | log (LOG_DEBUG, 594 | "%s: supported peer frames:%s%s\n", __FUNCTION__, 595 | caps & ASYNC_FRAMING ? " async" : "", 596 | caps & SYNC_FRAMING ? " sync" : ""); 597 | t->fc = caps & (ASYNC_FRAMING | SYNC_FRAMING); 598 | return 0; 599 | } 600 | 601 | int bearer_caps_avp (struct tunnel *t, struct call *c, void *data, 602 | int datalen) 603 | { 604 | /* 605 | * What kind of bearer channels does our peer support? 606 | */ 607 | int caps; 608 | _u16 *raw = data; 609 | 610 | #ifdef SANITY 611 | if (t->sanity) 612 | { 613 | switch (c->msgtype) 614 | { 615 | case SCCRP: 616 | case SCCRQ: 617 | break; 618 | default: 619 | if (DEBUG) 620 | log (LOG_DEBUG, 621 | "%s: bearer capabilities not appropriate for message %s. Ignoring.\n", 622 | __FUNCTION__, msgtypes[c->msgtype]); 623 | return 0; 624 | } 625 | if (datalen != 10) 626 | { 627 | if (DEBUG) 628 | log (LOG_DEBUG, 629 | "%s: avp is incorrect size. %d != 10\n", __FUNCTION__, 630 | datalen); 631 | wrong_length (c, "Bearer Capabilities", 10, datalen, 0); 632 | return -EINVAL; 633 | } 634 | } 635 | #endif 636 | caps = ntohs (raw[4]); 637 | if (debug_avp) 638 | { 639 | if (DEBUG) 640 | log (LOG_DEBUG, 641 | "%s: supported peer bearers:%s%s\n", 642 | caps & ANALOG_BEARER ? " analog" : "", 643 | caps & DIGITAL_BEARER ? " digital" : ""); 644 | } 645 | t->bc = caps & (ANALOG_BEARER | DIGITAL_BEARER); 646 | return 0; 647 | } 648 | 649 | 650 | /* FIXME: I need to handle tie breakers eventually */ 651 | 652 | int firmware_rev_avp (struct tunnel *t, struct call *c, void *data, 653 | int datalen) 654 | { 655 | /* 656 | * Report and record remote firmware version 657 | */ 658 | int ver; 659 | _u16 *raw = data; 660 | 661 | #ifdef SANITY 662 | if (t->sanity) 663 | { 664 | switch (c->msgtype) 665 | { 666 | case SCCRP: 667 | case SCCRQ: 668 | break; 669 | default: 670 | if (DEBUG) 671 | log (LOG_DEBUG, 672 | "%s: firmware revision not appropriate for message %s. Ignoring.\n", 673 | __FUNCTION__, msgtypes[c->msgtype]); 674 | return 0; 675 | } 676 | if (datalen != 8) 677 | { 678 | if (DEBUG) 679 | log (LOG_DEBUG, 680 | "%s: avp is incorrect size. %d != 8\n", __FUNCTION__, 681 | datalen); 682 | wrong_length (c, "Firmware Revision", 8, datalen, 0); 683 | return -EINVAL; 684 | } 685 | } 686 | #endif 687 | ver = ntohs (raw[3]); 688 | if (debug_avp) 689 | { 690 | if (DEBUG) 691 | log (LOG_DEBUG, 692 | "%s: peer reports firmware version %d (0x%.4x)\n", 693 | __FUNCTION__, ver, ver); 694 | } 695 | t->firmware = ver; 696 | return 0; 697 | } 698 | 699 | int bearer_type_avp (struct tunnel *t, struct call *c, void *data, 700 | int datalen) 701 | { 702 | /* 703 | * What kind of bearer channel is the call on? 704 | */ 705 | int b; 706 | _u16 *raw = data; 707 | 708 | #ifdef SANITY 709 | if (t->sanity) 710 | { 711 | switch (c->msgtype) 712 | { 713 | case ICRQ: 714 | case OCRQ: 715 | break; 716 | default: 717 | if (DEBUG) 718 | log (LOG_DEBUG, 719 | "%s: bearer type not appropriate for message %s. Ignoring.\n", 720 | __FUNCTION__, msgtypes[c->msgtype]); 721 | return 0; 722 | } 723 | if (datalen != 10) 724 | { 725 | if (DEBUG) 726 | log (LOG_DEBUG, 727 | "%s: avp is incorrect size. %d != 10\n", __FUNCTION__, 728 | datalen); 729 | wrong_length (c, "Bearer Type", 10, datalen, 0); 730 | return -EINVAL; 731 | } 732 | } 733 | #endif 734 | b = ntohs (raw[4]); 735 | if (debug_avp) 736 | { 737 | if (DEBUG) 738 | log (LOG_DEBUG, 739 | "%s: peer bears:%s\n", __FUNCTION__, 740 | b & ANALOG_BEARER ? " analog" : "digital"); 741 | } 742 | t->call_head->bearer = b; 743 | return 0; 744 | } 745 | 746 | int frame_type_avp (struct tunnel *t, struct call *c, void *data, int datalen) 747 | { 748 | /* 749 | * What kind of frame channel is the call on? 750 | */ 751 | int b; 752 | _u16 *raw = data; 753 | 754 | #ifdef SANITY 755 | if (t->sanity) 756 | { 757 | switch (c->msgtype) 758 | { 759 | case ICCN: 760 | case OCRQ: 761 | case OCCN: 762 | break; 763 | default: 764 | if (DEBUG) 765 | log (LOG_DEBUG, 766 | "%s: frame type not appropriate for message %s. Ignoring.\n", 767 | __FUNCTION__, msgtypes[c->msgtype]); 768 | return 0; 769 | } 770 | if (datalen != 10) 771 | { 772 | if (DEBUG) 773 | log (LOG_DEBUG, 774 | "%s: avp is incorrect size. %d != 10\n", __FUNCTION__, 775 | datalen); 776 | wrong_length (c, "Frame Type", 10, datalen, 0); 777 | return -EINVAL; 778 | } 779 | } 780 | #endif 781 | b = ntohs (raw[4]); 782 | if (debug_avp) 783 | { 784 | if (DEBUG) 785 | log (LOG_DEBUG, 786 | "%s: peer uses:%s frames\n", __FUNCTION__, 787 | b & ASYNC_FRAMING ? " async" : "sync"); 788 | } 789 | c->frame = b; 790 | return 0; 791 | } 792 | 793 | int hostname_avp (struct tunnel *t, struct call *c, void *data, int datalen) 794 | { 795 | /* 796 | * What is the peer's name? 797 | */ 798 | int size; 799 | _u16 *raw = data; 800 | 801 | #ifdef SANITY 802 | if (t->sanity) 803 | { 804 | switch (c->msgtype) 805 | { 806 | case SCCRP: 807 | case SCCRQ: 808 | break; 809 | default: 810 | if (DEBUG) 811 | log (LOG_DEBUG, 812 | "%s: hostname not appropriate for message %s. Ignoring.\n", 813 | __FUNCTION__, msgtypes[c->msgtype]); 814 | return 0; 815 | } 816 | if (datalen < 6) 817 | { 818 | if (DEBUG) 819 | log (LOG_DEBUG, 820 | "%s: avp is too small. %d < 6\n", __FUNCTION__, 821 | datalen); 822 | wrong_length (c, "Hostname", 6, datalen, 1); 823 | return -EINVAL; 824 | } 825 | } 826 | #endif 827 | size = raw[0] & 0x0FFF; 828 | if (size > MAXSTRLEN - 1) 829 | { 830 | if (DEBUG) 831 | log (LOG_DEBUG, "%s: truncating reported hostname (size is %d)\n", 832 | __FUNCTION__, size); 833 | size = MAXSTRLEN - 1; 834 | } 835 | safe_copy (t->hostname, (char *) &raw[3], size); 836 | if (debug_avp) 837 | { 838 | if (DEBUG) 839 | log (LOG_DEBUG, 840 | "%s: peer reports hostname '%s'\n", __FUNCTION__, 841 | t->hostname); 842 | } 843 | return 0; 844 | } 845 | 846 | int dialing_number_avp (struct tunnel *t, struct call *c, void *data, 847 | int datalen) 848 | { 849 | /* 850 | * What is the peer's name? 851 | */ 852 | int size; 853 | _u16 *raw = data; 854 | 855 | #ifdef SANITY 856 | if (t->sanity) 857 | { 858 | switch (c->msgtype) 859 | { 860 | case ICRQ: 861 | break; 862 | default: 863 | if (DEBUG) 864 | log (LOG_DEBUG, 865 | "%s: dialing number not appropriate for message %s. Ignoring.\n", 866 | __FUNCTION__, msgtypes[c->msgtype]); 867 | return 0; 868 | } 869 | if (datalen < 6) 870 | { 871 | if (DEBUG) 872 | log (LOG_DEBUG, 873 | "%s: avp is too small. %d < 6\n", __FUNCTION__, 874 | datalen); 875 | wrong_length (c, "Dialing Number", 6, datalen, 1); 876 | return -EINVAL; 877 | } 878 | } 879 | #endif 880 | size = raw[0] & 0x0FFF; 881 | if (size > MAXSTRLEN - 1) 882 | { 883 | if (DEBUG) 884 | log (LOG_DEBUG, 885 | "%s: truncating reported dialing number (size is %d)\n", 886 | __FUNCTION__, size); 887 | size = MAXSTRLEN - 1; 888 | } 889 | safe_copy (t->call_head->dialing, (char *) &raw[3], size); 890 | if (debug_avp) 891 | { 892 | if (DEBUG) 893 | log (LOG_DEBUG, 894 | "%s: peer reports dialing number '%s'\n", __FUNCTION__, 895 | t->call_head->dialing); 896 | } 897 | return 0; 898 | } 899 | 900 | int dialed_number_avp (struct tunnel *t, struct call *c, void *data, 901 | int datalen) 902 | { 903 | /* 904 | * What is the peer's name? 905 | */ 906 | int size; 907 | _u16 *raw = data; 908 | 909 | #ifdef SANITY 910 | if (t->sanity) 911 | { 912 | switch (c->msgtype) 913 | { 914 | case OCRQ: 915 | case ICRQ: 916 | break; 917 | default: 918 | if (DEBUG) 919 | log (LOG_DEBUG, 920 | "%s: dialed number not appropriate for message %s. Ignoring.\n", 921 | __FUNCTION__, msgtypes[c->msgtype]); 922 | return 0; 923 | } 924 | if (datalen < 6) 925 | { 926 | if (DEBUG) 927 | log (LOG_DEBUG, 928 | "%s: avp is too small. %d < 6\n", __FUNCTION__, 929 | datalen); 930 | wrong_length (c, "Dialed Number", 6, datalen, 1); 931 | return -EINVAL; 932 | } 933 | } 934 | #endif 935 | size = raw[0] & 0x0FFF; 936 | if (size > MAXSTRLEN - 1) 937 | { 938 | if (DEBUG) 939 | log (LOG_DEBUG, 940 | "%s: truncating reported dialed number (size is %d)\n", 941 | __FUNCTION__, size); 942 | size = MAXSTRLEN - 1; 943 | } 944 | safe_copy (t->call_head->dialed, (char *) &raw[3], size); 945 | if (debug_avp) 946 | { 947 | if (DEBUG) 948 | log (LOG_DEBUG, 949 | "%s: peer reports dialed number '%s'\n", __FUNCTION__, 950 | t->call_head->dialed); 951 | } 952 | return 0; 953 | } 954 | 955 | int sub_address_avp (struct tunnel *t, struct call *c, void *data, 956 | int datalen) 957 | { 958 | /* 959 | * What is the peer's name? 960 | */ 961 | int size; 962 | _u16 *raw = data; 963 | 964 | #ifdef SANITY 965 | if (t->sanity) 966 | { 967 | switch (c->msgtype) 968 | { 969 | case OCRP: 970 | case ICRQ: 971 | break; 972 | default: 973 | if (DEBUG) 974 | log (LOG_DEBUG, 975 | "%s: sub_address not appropriate for message %s. Ignoring.\n", 976 | __FUNCTION__, msgtypes[c->msgtype]); 977 | return 0; 978 | } 979 | if (datalen < 6) 980 | { 981 | if (DEBUG) 982 | log (LOG_DEBUG, 983 | "%s: avp is too small. %d < 6\n", __FUNCTION__, 984 | datalen); 985 | wrong_length (c, "Sub-address", 6, datalen, 1); 986 | return -EINVAL; 987 | } 988 | } 989 | #endif 990 | size = raw[0] & 0x0FFF; 991 | if (size > MAXSTRLEN - 1) 992 | { 993 | if (DEBUG) 994 | log (LOG_DEBUG, 995 | "%s: truncating reported sub address (size is %d)\n", 996 | __FUNCTION__, size); 997 | size = MAXSTRLEN - 1; 998 | } 999 | safe_copy (t->call_head->subaddy, (char *) &raw[3], size); 1000 | if (debug_avp) 1001 | { 1002 | if (DEBUG) 1003 | log (LOG_DEBUG, 1004 | "%s: peer reports subaddress '%s'\n", __FUNCTION__, 1005 | t->call_head->subaddy); 1006 | } 1007 | return 0; 1008 | } 1009 | 1010 | int vendor_avp (struct tunnel *t, struct call *c, void *data, int datalen) 1011 | { 1012 | /* 1013 | * What vendor makes the other end? 1014 | */ 1015 | int size; 1016 | _u16 *raw = data; 1017 | 1018 | #ifdef SANITY 1019 | if (t->sanity) 1020 | { 1021 | switch (c->msgtype) 1022 | { 1023 | case SCCRP: 1024 | case SCCRQ: 1025 | break; 1026 | default: 1027 | if (DEBUG) 1028 | log (LOG_DEBUG, 1029 | "%s: vendor not appropriate for message %s. Ignoring.\n", 1030 | __FUNCTION__, msgtypes[c->msgtype]); 1031 | return 0; 1032 | } 1033 | if (datalen < 6) 1034 | { 1035 | if (DEBUG) 1036 | log (LOG_DEBUG, 1037 | "%s: avp is too small. %d < 6\n", __FUNCTION__, 1038 | datalen); 1039 | wrong_length (c, "Vendor", 6, datalen, 1); 1040 | return -EINVAL; 1041 | } 1042 | } 1043 | #endif 1044 | size = raw[0] & 0x0FFF; 1045 | if (size > MAXSTRLEN - 1) 1046 | { 1047 | if (DEBUG) 1048 | log (LOG_DEBUG, "%s: truncating reported vendor (size is %d)\n", 1049 | __FUNCTION__, size); 1050 | size = MAXSTRLEN - 1; 1051 | } 1052 | safe_copy (t->vendor, (char *) &raw[3], size); 1053 | if (debug_avp) 1054 | { 1055 | if (DEBUG) 1056 | log (LOG_DEBUG, 1057 | "%s: peer reports vendor '%s'\n", __FUNCTION__, t->vendor); 1058 | } 1059 | return 0; 1060 | } 1061 | 1062 | int challenge_avp (struct tunnel *t, struct call *c, void *data, int datalen) 1063 | { 1064 | /* 1065 | * We are sent a challenge 1066 | */ 1067 | _u16 *raw = data; 1068 | int size; 1069 | #ifdef SANITY 1070 | if (t->sanity) 1071 | { 1072 | switch (c->msgtype) 1073 | { 1074 | case SCCRP: 1075 | case SCCRQ: 1076 | break; 1077 | default: 1078 | if (DEBUG) 1079 | log (LOG_DEBUG, 1080 | "%s: challenge not appropriate for message %s. Ignoring.\n", 1081 | __FUNCTION__, msgtypes[c->msgtype]); 1082 | return 0; 1083 | } 1084 | if (datalen < 6) 1085 | { 1086 | if (DEBUG) 1087 | log (LOG_DEBUG, 1088 | "%s: avp is too small. %d < 6\n", __FUNCTION__, 1089 | datalen); 1090 | wrong_length (c, "challenge", 6, datalen, 1); 1091 | return -EINVAL; 1092 | } 1093 | } 1094 | #endif 1095 | size = raw[0] & 0x0FFF; 1096 | size -= sizeof (struct avp_hdr); 1097 | if (size != MD_SIG_SIZE) 1098 | { 1099 | log (LOG_DEBUG, "%s: Challenge is not the right length (%d != %d)\n", 1100 | __FUNCTION__, size, MD_SIG_SIZE); 1101 | return -EINVAL; 1102 | } 1103 | bcopy (&raw[3], t->chal_us.challenge, size); 1104 | t->chal_us.state = STATE_CHALLENGED; 1105 | if (debug_avp) 1106 | { 1107 | log (LOG_DEBUG, "%s: challenge avp found\n", __FUNCTION__); 1108 | } 1109 | return 0; 1110 | } 1111 | 1112 | int chalresp_avp (struct tunnel *t, struct call *c, void *data, int datalen) 1113 | { 1114 | /* 1115 | * We are sent a challenge 1116 | */ 1117 | _u16 *raw = data; 1118 | int size; 1119 | #ifdef SANITY 1120 | if (t->sanity) 1121 | { 1122 | switch (c->msgtype) 1123 | { 1124 | case SCCRP: 1125 | case SCCCN: 1126 | break; 1127 | default: 1128 | if (DEBUG) 1129 | log (LOG_DEBUG, 1130 | "%s: challenge response not appropriate for message %s. Ignoring.\n", 1131 | __FUNCTION__, msgtypes[c->msgtype]); 1132 | return 0; 1133 | } 1134 | if (datalen < 6) 1135 | { 1136 | if (DEBUG) 1137 | log (LOG_DEBUG, 1138 | "%s: avp is too small. %d < 6\n", __FUNCTION__, 1139 | datalen); 1140 | wrong_length (c, "challenge", 6, datalen, 1); 1141 | return -EINVAL; 1142 | } 1143 | } 1144 | #endif 1145 | size = raw[0] & 0x0FFF; 1146 | size -= sizeof (struct avp_hdr); 1147 | if (size != MD_SIG_SIZE) 1148 | { 1149 | log (LOG_DEBUG, "%s: Challenge is not the right length (%d != %d)\n", 1150 | __FUNCTION__, size, MD_SIG_SIZE); 1151 | return -EINVAL; 1152 | } 1153 | 1154 | bcopy (&raw[3], t->chal_them.reply, MD_SIG_SIZE); 1155 | if (debug_avp) 1156 | { 1157 | log (LOG_DEBUG, "%s: Challenge reply found\n", __FUNCTION__); 1158 | } 1159 | return 0; 1160 | } 1161 | 1162 | int assigned_tunnel_avp (struct tunnel *t, struct call *c, void *data, 1163 | int datalen) 1164 | { 1165 | /* 1166 | * What is their TID that we must use from now on? 1167 | */ 1168 | _u16 *raw = data; 1169 | 1170 | #ifdef SANITY 1171 | if (t->sanity) 1172 | { 1173 | switch (c->msgtype) 1174 | { 1175 | case SCCRP: 1176 | case SCCRQ: 1177 | case StopCCN: 1178 | break; 1179 | default: 1180 | if (DEBUG) 1181 | log (LOG_DEBUG, 1182 | "%s: tunnel ID not appropriate for message %s. Ignoring.\n", 1183 | __FUNCTION__, msgtypes[c->msgtype]); 1184 | return 0; 1185 | } 1186 | if (datalen != 8) 1187 | { 1188 | if (DEBUG) 1189 | log (LOG_DEBUG, 1190 | "%s: avp is wrong size. %d != 8\n", __FUNCTION__, 1191 | datalen); 1192 | wrong_length (c, "Assigned Tunnel ID", 8, datalen, 0); 1193 | return -EINVAL; 1194 | } 1195 | } 1196 | #endif 1197 | if (c->msgtype == StopCCN) 1198 | { 1199 | t->qtid = ntohs (raw[3]); 1200 | } 1201 | else 1202 | { 1203 | t->tid = ntohs (raw[3]); 1204 | } 1205 | if (debug_avp) 1206 | { 1207 | if (DEBUG) 1208 | log (LOG_DEBUG, 1209 | "%s: using peer's tunnel %d\n", __FUNCTION__, 1210 | ntohs (raw[3])); 1211 | } 1212 | return 0; 1213 | } 1214 | 1215 | int assigned_call_avp (struct tunnel *t, struct call *c, void *data, 1216 | int datalen) 1217 | { 1218 | /* 1219 | * What is their CID that we must use from now on? 1220 | */ 1221 | _u16 *raw = data; 1222 | 1223 | #ifdef SANITY 1224 | if (t->sanity) 1225 | { 1226 | switch (c->msgtype) 1227 | { 1228 | case CDN: 1229 | case ICRP: 1230 | case ICRQ: 1231 | case OCRP: /* jz: deleting the debug message */ 1232 | break; 1233 | case OCRQ: 1234 | default: 1235 | if (DEBUG) 1236 | log (LOG_DEBUG, 1237 | "%s: call ID not appropriate for message %s. Ignoring.\n", 1238 | __FUNCTION__, msgtypes[c->msgtype]); 1239 | return 0; 1240 | } 1241 | if (datalen != 8) 1242 | { 1243 | if (DEBUG) 1244 | log (LOG_DEBUG, 1245 | "%s: avp is wrong size. %d != 8\n", __FUNCTION__, 1246 | datalen); 1247 | wrong_length (c, "Assigned Call ID", 8, datalen, 0); 1248 | return -EINVAL; 1249 | } 1250 | } 1251 | #endif 1252 | if (c->msgtype == CDN) 1253 | { 1254 | c->qcid = ntohs (raw[3]); 1255 | } 1256 | else if (c->msgtype == ICRQ) 1257 | { 1258 | t->call_head->cid = ntohs (raw[3]); 1259 | } 1260 | else if (c->msgtype == ICRP) 1261 | { 1262 | c->cid = ntohs (raw[3]); 1263 | } 1264 | else if (c->msgtype == OCRP) 1265 | { /* jz: copy callid to c->cid */ 1266 | c->cid = ntohs (raw[3]); 1267 | } 1268 | else 1269 | { 1270 | log (LOG_DEBUG, "%s: Dunno what to do when it's state %s!\n", 1271 | __FUNCTION__, msgtypes[c->msgtype]); 1272 | } 1273 | if (debug_avp) 1274 | { 1275 | if (DEBUG) 1276 | log (LOG_DEBUG, 1277 | "%s: using peer's call %d\n", __FUNCTION__, ntohs (raw[3])); 1278 | } 1279 | return 0; 1280 | } 1281 | 1282 | int packet_delay_avp (struct tunnel *t, struct call *c, void *data, 1283 | int datalen) 1284 | { 1285 | /* 1286 | * What is their CID that we must use from now on? 1287 | */ 1288 | _u16 *raw = data; 1289 | 1290 | #ifdef SANITY 1291 | if (t->sanity) 1292 | { 1293 | switch (c->msgtype) 1294 | { 1295 | case ICRP: 1296 | case OCRQ: 1297 | case ICCN: 1298 | case OCRP: 1299 | case OCCN: 1300 | break; 1301 | default: 1302 | if (DEBUG) 1303 | log (LOG_DEBUG, 1304 | "%s: packet delay not appropriate for message %s. Ignoring.\n", 1305 | __FUNCTION__, msgtypes[c->msgtype]); 1306 | return 0; 1307 | } 1308 | if (datalen != 8) 1309 | { 1310 | if (DEBUG) 1311 | log (LOG_DEBUG, 1312 | "%s: avp is wrong size. %d != 8\n", __FUNCTION__, 1313 | datalen); 1314 | wrong_length (c, "Assigned Call ID", 8, datalen, 0); 1315 | return -EINVAL; 1316 | } 1317 | } 1318 | #endif 1319 | c->ppd = ntohs (raw[3]); 1320 | if (debug_avp) 1321 | { 1322 | if (DEBUG) 1323 | log (LOG_DEBUG, 1324 | "%s: peer's delay is %d 1/10's of a second\n", __FUNCTION__, 1325 | ntohs (raw[3])); 1326 | } 1327 | return 0; 1328 | } 1329 | 1330 | int call_serno_avp (struct tunnel *t, struct call *c, void *data, int datalen) 1331 | { 1332 | /* 1333 | * What is the serial number of the call? 1334 | */ 1335 | _u16 *raw = data; 1336 | 1337 | #ifdef SANITY 1338 | if (t->sanity) 1339 | { 1340 | switch (c->msgtype) 1341 | { 1342 | case ICRQ: 1343 | case OCRQ: 1344 | break; 1345 | default: 1346 | if (DEBUG) 1347 | log (LOG_DEBUG, 1348 | "%s: call ID not appropriate for message %s. Ignoring.\n", 1349 | __FUNCTION__, msgtypes[c->msgtype]); 1350 | return 0; 1351 | } 1352 | if (datalen != 10) 1353 | { 1354 | #ifdef STRICT 1355 | if (DEBUG) 1356 | log (LOG_DEBUG, 1357 | "%s: avp is wrong size. %d != 10\n", __FUNCTION__, 1358 | datalen); 1359 | wrong_length (c, "Serial Number", 10, datalen, 0); 1360 | return -EINVAL; 1361 | #else 1362 | log (LOG_DEBUG, 1363 | "%s: peer is using old style serial number. Will be invalid.\n", 1364 | __FUNCTION__); 1365 | #endif 1366 | 1367 | } 1368 | } 1369 | #endif 1370 | t->call_head->serno = (((unsigned int) ntohs (raw[3])) << 16) | 1371 | ((unsigned int) ntohs (raw[4])); 1372 | if (debug_avp) 1373 | { 1374 | if (DEBUG) 1375 | log (LOG_DEBUG, 1376 | "%s: serial number is %d\n", __FUNCTION__, 1377 | t->call_head->serno); 1378 | } 1379 | return 0; 1380 | } 1381 | 1382 | int rx_speed_avp (struct tunnel *t, struct call *c, void *data, int datalen) 1383 | { 1384 | /* 1385 | * What is the received baud rate of the call? 1386 | */ 1387 | _u16 *raw = data; 1388 | 1389 | #ifdef SANITY 1390 | if (t->sanity) 1391 | { 1392 | switch (c->msgtype) 1393 | { 1394 | case ICCN: 1395 | case OCCN: 1396 | case OCRP: 1397 | break; 1398 | default: 1399 | if (DEBUG) 1400 | log (LOG_DEBUG, 1401 | "%s: rx connect speed not appropriate for message %s. Ignoring.\n", 1402 | __FUNCTION__, msgtypes[c->msgtype]); 1403 | return 0; 1404 | } 1405 | if (datalen != 10) 1406 | { 1407 | if (DEBUG) 1408 | log (LOG_DEBUG, 1409 | "%s: avp is wrong size. %d != 10\n", __FUNCTION__, 1410 | datalen); 1411 | wrong_length (c, "Connect Speed (RX)", 10, datalen, 0); 1412 | return -EINVAL; 1413 | } 1414 | } 1415 | #endif 1416 | c->rxspeed = (((unsigned int) ntohs (raw[3])) << 16) | 1417 | ((unsigned int) ntohs (raw[4])); 1418 | if (debug_avp) 1419 | { 1420 | if (DEBUG) 1421 | log (LOG_DEBUG, 1422 | "%s: receive baud rate is %d\n", __FUNCTION__, c->rxspeed); 1423 | } 1424 | return 0; 1425 | } 1426 | 1427 | int tx_speed_avp (struct tunnel *t, struct call *c, void *data, int datalen) 1428 | { 1429 | /* 1430 | * What is the tranmsit baud rate of the call? 1431 | */ 1432 | _u16 *raw = data; 1433 | 1434 | #ifdef SANITY 1435 | if (t->sanity) 1436 | { 1437 | switch (c->msgtype) 1438 | { 1439 | case ICCN: 1440 | case OCCN: 1441 | case OCRP: 1442 | break; 1443 | default: 1444 | if (DEBUG) 1445 | log (LOG_DEBUG, 1446 | "%s: tx connect speed not appropriate for message %s. Ignoring.\n", 1447 | __FUNCTION__, msgtypes[c->msgtype]); 1448 | return 0; 1449 | } 1450 | if (datalen != 10) 1451 | { 1452 | if (DEBUG) 1453 | log (LOG_DEBUG, 1454 | "%s: avp is wrong size. %d != 10\n", __FUNCTION__, 1455 | datalen); 1456 | wrong_length (c, "Connect Speed (tx)", 10, datalen, 0); 1457 | return -EINVAL; 1458 | } 1459 | } 1460 | #endif 1461 | c->txspeed = (((unsigned int) ntohs (raw[3])) << 16) | 1462 | ((unsigned int) ntohs (raw[4])); 1463 | if (debug_avp) 1464 | { 1465 | if (DEBUG) 1466 | log (LOG_DEBUG, 1467 | "%s: transmit baud rate is %d\n", __FUNCTION__, c->txspeed); 1468 | } 1469 | return 0; 1470 | } 1471 | int call_physchan_avp (struct tunnel *t, struct call *c, void *data, 1472 | int datalen) 1473 | { 1474 | /* 1475 | * What is the physical channel? 1476 | */ 1477 | _u16 *raw = data; 1478 | 1479 | #ifdef SANITY 1480 | if (t->sanity) 1481 | { 1482 | switch (c->msgtype) 1483 | { 1484 | case ICRQ: 1485 | case OCRQ: 1486 | case OCRP: 1487 | case OCCN: 1488 | break; 1489 | default: 1490 | if (DEBUG) 1491 | log (LOG_DEBUG, 1492 | "%s: physical channel not appropriate for message %s. Ignoring.\n", 1493 | __FUNCTION__, msgtypes[c->msgtype]); 1494 | return 0; 1495 | } 1496 | if (datalen != 10) 1497 | { 1498 | if (DEBUG) 1499 | log (LOG_DEBUG, 1500 | "%s: avp is wrong size. %d != 10\n", __FUNCTION__, 1501 | datalen); 1502 | wrong_length (c, "Physical Channel", 10, datalen, 0); 1503 | return -EINVAL; 1504 | } 1505 | } 1506 | #endif 1507 | t->call_head->physchan = (((unsigned int) ntohs (raw[3])) << 16) | 1508 | ((unsigned int) ntohs (raw[4])); 1509 | if (debug_avp) 1510 | { 1511 | if (DEBUG) 1512 | log (LOG_DEBUG, 1513 | "%s: physical channel is %d\n", __FUNCTION__, 1514 | t->call_head->physchan); 1515 | } 1516 | return 0; 1517 | } 1518 | 1519 | int receive_window_size_avp (struct tunnel *t, struct call *c, void *data, 1520 | int datalen) 1521 | { 1522 | /* 1523 | * What is their RWS? 1524 | */ 1525 | _u16 *raw = data; 1526 | 1527 | #ifdef SANITY 1528 | if (t->sanity) 1529 | { 1530 | switch (c->msgtype) 1531 | { 1532 | case SCCRP: 1533 | case SCCRQ: 1534 | case OCRP: /* jz */ 1535 | case OCCN: /* jz */ 1536 | case StopCCN: 1537 | /* case ICRP: 1538 | case ICCN: */ 1539 | break; 1540 | default: 1541 | if (DEBUG) 1542 | log (LOG_DEBUG, 1543 | "%s: RWS not appropriate for message %s. Ignoring.\n", 1544 | __FUNCTION__, msgtypes[c->msgtype]); 1545 | return 0; 1546 | } 1547 | if (datalen != 8) 1548 | { 1549 | if (DEBUG) 1550 | log (LOG_DEBUG, 1551 | "%s: avp is wrong size. %d != 8\n", __FUNCTION__, 1552 | datalen); 1553 | wrong_length (c, "Receive Window Size", 8, datalen, 0); 1554 | return -EINVAL; 1555 | } 1556 | } 1557 | #endif 1558 | t->rws = ntohs (raw[3]); 1559 | /* if (c->rws >= 0) 1560 | c->fbit = FBIT; */ 1561 | if (debug_avp) 1562 | { 1563 | if (DEBUG) 1564 | log (LOG_DEBUG, 1565 | "%s: peer wants RWS of %d. Will use flow control.\n", 1566 | __FUNCTION__, t->rws); 1567 | } 1568 | return 0; 1569 | } 1570 | 1571 | 1572 | int handle_avps (struct buffer *buf, struct tunnel *t, struct call *c) 1573 | { 1574 | /* 1575 | * buf's start should point to the beginning of a packet. We assume it's 1576 | * a valid packet and has had check_control done to it, so no error 1577 | * checking is done at this point. 1578 | */ 1579 | 1580 | struct avp_hdr *avp; 1581 | int len = buf->len - sizeof (struct control_hdr); 1582 | int firstavp = -1; 1583 | int hidlen; 1584 | char *data = buf->start + sizeof (struct control_hdr); 1585 | avp = (struct avp_hdr *) data; 1586 | if (debug_avp) 1587 | log (LOG_DEBUG, "%s: handling avp's for tunnel %d, call %d\n", 1588 | __FUNCTION__, t->ourtid, c->ourcid); 1589 | while (len > 0) 1590 | { 1591 | /* Go ahead and byte-swap the header */ 1592 | swaps (avp, sizeof (struct avp_hdr)); 1593 | if (avp->attr > AVP_MAX) 1594 | { 1595 | if (AMBIT (avp->length)) 1596 | { 1597 | log (LOG_WARN, 1598 | "%s: dont know how to handle mandatory attribute %d. Closing %s.\n" 1599 | __FUNCTION__, avp->attr, 1600 | (c != t->self) ? "call" : "tunnel"); 1601 | set_error (c, VENDOR_ERROR, 1602 | "mandatory attribute %d cannot be handled", 1603 | avp->attr); 1604 | c->needclose = -1; 1605 | return -EINVAL; 1606 | } 1607 | else 1608 | { 1609 | if (DEBUG) 1610 | log (LOG_WARN, 1611 | "%s: dont know how to handle atribute %d.\n", 1612 | __FUNCTION__, avp->attr); 1613 | goto next; 1614 | } 1615 | } 1616 | if (ALENGTH (avp->length) > len) 1617 | { 1618 | log (LOG_WARN, 1619 | "%s: AVP received with length > remaining packet length!\n", 1620 | __FUNCTION__); 1621 | set_error (c, ERROR_LENGTH, "Invalid AVP length"); 1622 | c->needclose = -1; 1623 | return -EINVAL; 1624 | } 1625 | if (avp->attr && firstavp) 1626 | { 1627 | log (LOG_WARN, "%s: First AVP was not message type.\n", 1628 | __FUNCTION__); 1629 | set_error (c, VENDOR_ERROR, "First AVP must be message type"); 1630 | c->needclose = -1; 1631 | return -EINVAL; 1632 | } 1633 | if (ALENGTH (avp->length) < sizeof (struct avp_hdr)) 1634 | { 1635 | log (LOG_WARN, "%s: AVP with too small of size (%d).\n", 1636 | __FUNCTION__, ALENGTH (avp->length)); 1637 | set_error (c, ERROR_LENGTH, "AVP too small"); 1638 | c->needclose = -1; 1639 | return -EINVAL; 1640 | } 1641 | if (AZBITS (avp->length)) 1642 | { 1643 | log (LOG_WARN, "%s: %sAVP has reserved bits set.\n", __FUNCTION__, 1644 | AMBIT (avp->length) ? "Mandatory " : ""); 1645 | if (AMBIT (avp->length)) 1646 | { 1647 | set_error (c, ERROR_RESERVED, "reserved bits set in AVP"); 1648 | c->needclose = -1; 1649 | return -EINVAL; 1650 | } 1651 | goto next; 1652 | } 1653 | if (AHBIT (avp->length)) 1654 | { 1655 | #ifdef DEBUG_HIDDEN 1656 | log (LOG_DEBUG, "%s: Hidden bit set on AVP.\n", __FUNCTION__); 1657 | #endif 1658 | /* We want to rewrite the AVP as an unhidden AVP 1659 | and then pass it along as normal. Remeber how 1660 | long the AVP was in the first place though! */ 1661 | hidlen = avp->length; 1662 | if (decrypt_avp (data, t)) 1663 | { 1664 | if (debug_avp) 1665 | log (LOG_WARN, "%s: Unable to handle hidden %sAVP\n:", 1666 | __FUNCTION__, 1667 | (AMBIT (avp->length) ? "mandatory " : "")); 1668 | if (AMBIT (avp->length)) 1669 | { 1670 | set_error (c, VENDOR_ERROR, "Invalid Hidden AVP"); 1671 | c->needclose = -1; 1672 | return -EINVAL; 1673 | } 1674 | goto next; 1675 | }; 1676 | len -= 2; 1677 | hidlen -= 2; 1678 | data += 2; 1679 | avp = (struct avp_hdr *) data; 1680 | /* Now we should look like a normal AVP */ 1681 | } 1682 | else 1683 | hidlen = 0; 1684 | if (avps[avp->attr].handler) 1685 | { 1686 | if (avps[avp->attr].handler (t, c, avp, ALENGTH (avp->length))) 1687 | { 1688 | if (AMBIT (avp->length)) 1689 | { 1690 | log (LOG_WARN, 1691 | "%s: Bad exit status handling attribute %d (%s) on mandatory packet.\n", 1692 | __FUNCTION__, avp->attr, 1693 | avps[avp->attr].description); 1694 | c->needclose = -1; 1695 | return -EINVAL; 1696 | } 1697 | else 1698 | { 1699 | if (DEBUG) 1700 | log (LOG_DEBUG, 1701 | "%s: Bad exit status handling attribute %d (%s).\n", 1702 | __FUNCTION__, avp->attr, 1703 | avps[avp->attr].description); 1704 | } 1705 | } 1706 | } 1707 | else 1708 | { 1709 | if (AMBIT (avp->length)) 1710 | { 1711 | log (LOG_WARN, 1712 | "%s: No handler for mandatory attribute %d (%s). Closing %s.\n", 1713 | __FUNCTION__, avp->attr, avps[avp->attr].description, 1714 | (c != t->self) ? "call" : "tunnel"); 1715 | set_error (c, VENDOR_ERROR, "No handler for attr %d (%s)\n", 1716 | avp->attr, avps[avp->attr].description); 1717 | return -EINVAL; 1718 | } 1719 | else 1720 | { 1721 | if (DEBUG) 1722 | log (LOG_WARN, "%s: no handler for atribute %d (%s).\n", 1723 | __FUNCTION__, avp->attr, 1724 | avps[avp->attr].description); 1725 | } 1726 | } 1727 | next: 1728 | if (hidlen) 1729 | { 1730 | /* Skip over the complete length of the hidden AVP */ 1731 | len -= ALENGTH (hidlen); 1732 | data += ALENGTH (hidlen); 1733 | } 1734 | else 1735 | { 1736 | len -= ALENGTH (avp->length); 1737 | data += ALENGTH (avp->length); /* Next AVP, please */ 1738 | } 1739 | avp = (struct avp_hdr *) data; 1740 | firstavp = 0; 1741 | } 1742 | if (len != 0) 1743 | { 1744 | log (LOG_WARN, "%s: negative overall packet length\n", __FUNCTION__); 1745 | return -EINVAL; 1746 | } 1747 | return 0; 1748 | }