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 | * Main Daemon source. 12 | * 13 | */ 14 | 15 | #include <stdlib.h> 16 | #include <sys/utsname.h> 17 | #include <sys/stat.h> 18 | #include <sys/wait.h> 19 | #include <stdio.h> 20 | #include <errno.h> 21 | #include <unistd.h> 22 | #if (__GLIBC__ < 2) 23 | # if defined(FREEBSD) 24 | # include <sys/signal.h> 25 | # elif defined(LINUX) 26 | # include <bsd/signal.h> 27 | # elif defined(SOLARIS) 28 | # include <signal.h> 29 | # endif 30 | #else 31 | # include <signal.h> 32 | #endif 33 | #include <netdb.h> 34 | #include <string.h> 35 | #include <fcntl.h> 36 | #include <netinet/in.h> 37 | #include <arpa/inet.h> 38 | #ifdef USE_KERNEL 39 | #include <sys/ioctl.h> 40 | #endif 41 | #include "l2tp.h" 42 | 43 | struct tunnel_list tunnels; 44 | int max_tunnels = DEF_MAX_TUNNELS; 45 | struct utsname uts; 46 | int ppd = 1; /* Packet processing delay */ 47 | int control_fd; /* descriptor of control area */ 48 | char *args; 49 | 50 | char *dial_no_tmp; /* jz: Dialnumber for Outgoing Call */ 51 | int switch_io = 0; /* jz: Switch for Incoming or Outgoing Call */ 52 | 53 | void init_tunnel_list (struct tunnel_list *t) 54 | { 55 | t->head = NULL; 56 | t->count = 0; 57 | t->calls = 0; 58 | } 59 | 60 | void show_status (int fd) 61 | { 62 | struct schedule_entry *se; 63 | struct tunnel *t; 64 | struct call *c; 65 | struct lns *tlns; 66 | struct lac *tlac; 67 | struct host *h; 68 | int s = 0; 69 | int fd2 = dup (fd); 70 | FILE *f = fdopen (fd2, "a"); 71 | if (!f) 72 | { 73 | log (LOG_WARN, "show_status: fdopen() failed on fd %d\n", fd); 74 | return; 75 | } 76 | fprintf (f, "====== l2tpd statistics ========\n"); 77 | fprintf (f, " Scheduler entries:\n"); 78 | se = events; 79 | while (se) 80 | { 81 | s++; 82 | t = (struct tunnel *) se->data; 83 | tlac = (struct lac *) se->data; 84 | c = (struct call *) se->data; 85 | if (se->func == &hello) 86 | { 87 | fprintf (f, "%d: HELLO to %d\n", s, t->tid); 88 | } 89 | else if (se->func == &magic_lac_dial) 90 | { 91 | fprintf (f, "%d: Magic dial on %s\n", s, tlac->entname); 92 | } 93 | else if (se->func == &send_zlb) 94 | { 95 | fprintf (f, "%d: Send payload ZLB on call %d:%d\n", s, 96 | c->container->tid, c->cid); 97 | } 98 | else if (se->func == &dethrottle) 99 | { 100 | fprintf (f, "%d: Dethrottle call %d:%d\n", s, c->container->tid, 101 | c->cid); 102 | } 103 | else 104 | fprintf (f, "%d: Unknown event\n", s); 105 | se = se->next; 106 | }; 107 | fprintf (f, "Total Events scheduled: %d\n", s); 108 | fprintf (f, "Number of tunnels open: %d\n", tunnels.count); 109 | fprintf (f, "Highest file descriptor: %d\n", fd2); 110 | t = tunnels.head; 111 | while (t) 112 | { 113 | fprintf (f, "Tunnel %s, ID = %d (local), %d (remote) to %s:%d\n" 114 | " cSs = %d, cSr = %d, cLr = %d\n", 115 | (t->lac ? t->lac->entname : (t->lns ? t->lns->entname : "")), 116 | t->ourtid, t->tid, IPADDY (t->peer.sin_addr), 117 | ntohs (t->peer.sin_port), t->cSs, t->cSr, t->cLr); 118 | c = t->call_head; 119 | while (c) 120 | { 121 | fprintf (f, 122 | " Call %s, ID = %d (local), %d (remote), serno = %d\n" 123 | " pSs = %d, pSr = %d, pLr = %d, tx = %d bytes (%d), rx= %d bytes (%d)\n", 124 | (c->lac ? c->lac-> 125 | entname : (c->lns ? c->lns->entname : "")), c->ourcid, 126 | c->cid, c->serno, c->pSs, c->pSr, c->pLr, c->tx_bytes, 127 | c->tx_pkts, c->rx_bytes, c->rx_pkts); 128 | c = c->next; 129 | } 130 | t = t->next; 131 | } 132 | fprintf (f, "==========Config File===========\n"); 133 | tlns = lnslist; 134 | while (tlns) 135 | { 136 | fprintf (f, "LNS entry %s\n", 137 | tlns->entname[0] ? tlns->entname : "(unnamed)"); 138 | tlns = tlns->next; 139 | }; 140 | tlac = laclist; 141 | while (tlac) 142 | { 143 | fprintf (f, "LAC entry %s, LNS is/are:", 144 | tlac->entname[0] ? tlac->entname : "(unnamed)"); 145 | h = tlac->lns; 146 | if (h) 147 | { 148 | while (h) 149 | { 150 | fprintf (f, " %s", h->hostname); 151 | h = h->next; 152 | } 153 | } 154 | else 155 | fprintf (f, " [none]"); 156 | fprintf (f, "\n"); 157 | tlac = tlac->next; 158 | }; 159 | fprintf (f, "================================\n"); 160 | fclose (f); 161 | close (fd2); 162 | } 163 | 164 | void status_handler (int sig) 165 | { 166 | show_status (1); 167 | } 168 | 169 | void child_handler (int signal) 170 | { 171 | /* 172 | * Oops, somebody we launched was killed. 173 | * It's time to reap them and close that call. 174 | * But first, we have to find out what PID died. 175 | * unfortunately, pppd will 176 | */ 177 | struct tunnel *t; 178 | struct call *c; 179 | pid_t pid; 180 | int status; 181 | t = tunnels.head; 182 | pid = waitpid (-1, &status, WNOHANG); 183 | if (pid < 1) 184 | { 185 | /* 186 | * Oh well, nobody there. Maybe we reaped it 187 | * somewhere else already 188 | */ 189 | return; 190 | } 191 | while (t) 192 | { 193 | c = t->call_head; 194 | while (c) 195 | { 196 | if (c->pppd == pid) 197 | { 198 | log (LOG_DEBUG, "%s : pppd died for call %d\n", __FUNCTION__, 199 | c->cid); 200 | 201 | c->needclose = -1; 202 | return; 203 | } 204 | c = c->next; 205 | } 206 | t = t->next; 207 | } 208 | } 209 | 210 | void death_handler (int signal) 211 | { 212 | /* 213 | * If we get here, somebody terminated us with a kill or a control-c. 214 | * we call call_close on each tunnel twice to get a StopCCN out 215 | * for each one (we can't pause to make sure it's received. 216 | * Then we close the connections 217 | */ 218 | struct tunnel *st, *st2; 219 | int sec; 220 | log (LOG_CRIT, "%s: Fatal signal %d received\n", __FUNCTION__, signal); 221 | st = tunnels.head; 222 | while (st) 223 | { 224 | st2 = st->next; 225 | strcpy (st->self->errormsg, "Server closing"); 226 | sec = st->self->closing; 227 | if (st->lac) 228 | st->lac->redial = 0; 229 | call_close (st->self); 230 | if (!sec) 231 | { 232 | st->self->closing = -1; 233 | call_close (st->self); 234 | } 235 | st = st2; 236 | } 237 | exit (1); 238 | } 239 | 240 | int start_pppd (struct call *c, struct ppp_opts *opts) 241 | { 242 | char a, b; 243 | char tty[80]; 244 | char *stropt[80]; 245 | struct ppp_opts *p; 246 | #ifdef USE_KERNEL 247 | struct l2tp_call_opts co; 248 | #endif 249 | int pos = 1; 250 | int fd2; 251 | #ifdef DEBUG_PPPD 252 | int x; 253 | #endif 254 | struct termios ptyconf; 255 | char *str; 256 | p = opts; 257 | stropt[0] = strdup (PPPD); 258 | while (p) 259 | { 260 | stropt[pos] = (char *) malloc (strlen (p->option) + 1); 261 | strncpy (stropt[pos], p->option, strlen (p->option) + 1); 262 | pos++; 263 | p = p->next; 264 | } 265 | stropt[pos] = NULL; 266 | if (c->pppd > 0) 267 | { 268 | log (LOG_WARN, "%s: PPP already started on call!\n", __FUNCTION__); 269 | return -EINVAL; 270 | } 271 | if (c->fd > -1) 272 | { 273 | log (LOG_WARN, "%s: file descriptor already assigned!\n", 274 | __FUNCTION__); 275 | return -EINVAL; 276 | } 277 | #ifdef USE_KERNEL 278 | if (kernel_support) 279 | { 280 | co.ourtid = c->container->ourtid; 281 | co.ourcid = c->ourcid; 282 | ioctl (server_socket, L2TPIOCGETCALLOPTS, &co); 283 | stropt[pos++] = strdup ("channel"); 284 | stropt[pos] = (char *) malloc (10); 285 | snprintf (stropt[pos], 10, "%d", co.id); 286 | pos++; 287 | stropt[pos] = NULL; 288 | } 289 | else 290 | { 291 | #endif 292 | if ((c->fd = getPtyMaster (&a, &b)) < 0) 293 | { 294 | log (LOG_WARN, "%s: unable to allocate pty, abandoning!\n", 295 | __FUNCTION__); 296 | return -EINVAL; 297 | } 298 | 299 | /* set fd opened above to not echo so we don't see read our own packets 300 | back of the file descriptor that we just wrote them to */ 301 | tcgetattr (c->fd, &ptyconf); 302 | *(c->oldptyconf) = ptyconf; 303 | ptyconf.c_cflag &= ~(ICANON | ECHO); 304 | tcsetattr (c->fd, TCSANOW, &ptyconf); 305 | 306 | snprintf (tty, sizeof (tty), "/dev/tty%c%c", a, b); 307 | fd2 = open (tty, O_RDWR); 308 | 309 | #ifdef USE_KERNEL 310 | } 311 | #endif 312 | str = stropt[0]; 313 | #ifdef DEBUG_PPPD 314 | log (LOG_DEBUG, "%s: I'm running: ", __FUNCTION__); 315 | for (x = 0; stropt[x]; x++) 316 | { 317 | log (LOG_DEBUG, "\"%s\" ", stropt[x]); 318 | }; 319 | log (LOG_DEBUG, "\n"); 320 | #endif 321 | c->pppd = fork (); 322 | if (c->pppd < 0) 323 | { 324 | log (LOG_WARN, "%s: unable to fork(), abandoning!\n", __FUNCTION__); 325 | return -EINVAL; 326 | } 327 | else if (!c->pppd) 328 | { 329 | struct call *sc; 330 | struct tunnel *st; 331 | 332 | close (0); 333 | close (1); 334 | close (2); 335 | #ifdef USE_KERNEL 336 | if (!kernel_support && (fd2 < 0)) 337 | #else 338 | if (fd2 < 0) 339 | #endif 340 | { 341 | log (LOG_WARN, "%s: Unable to open %s to launch pppd!\n", 342 | __FUNCTION__, tty); 343 | exit (1); 344 | } 345 | dup2 (fd2, 0); 346 | dup2 (fd2, 1); 347 | 348 | 349 | /* close all the calls pty fds */ 350 | st = tunnels.head; 351 | while (st) 352 | { 353 | sc = st->call_head; 354 | while (sc) 355 | { 356 | close (sc->fd); 357 | sc = sc->next; 358 | } 359 | st = st->next; 360 | } 361 | 362 | /* close the UDP socket fd */ 363 | close (server_socket); 364 | 365 | /* close the control pipe fd */ 366 | close (control_fd); 367 | 368 | 369 | execv (PPPD, stropt); 370 | log (LOG_WARN, "%s: Exec of %s failed!\n", PPPD); 371 | exit (1); 372 | }; 373 | close (fd2); 374 | pos = 0; 375 | while (stropt[pos]) 376 | { 377 | free (stropt[pos]); 378 | pos++; 379 | }; 380 | return 0; 381 | } 382 | 383 | void destroy_tunnel (struct tunnel *t) 384 | { 385 | /* 386 | * Immediately destroy a tunnel (and all its calls) 387 | * and free its resources. This may be called 388 | * by the tunnel itself,so it needs to be 389 | * "suicide safe" 390 | */ 391 | 392 | struct call *c, *me; 393 | struct tunnel *p; 394 | struct timeval tv; 395 | if (!t) 396 | return; 397 | 398 | /* 399 | * Save ourselves until the very 400 | * end, since we might be calling this ourselves. 401 | * We must divorce ourself from the tunnel 402 | * structure, however, to avoid recursion 403 | * because of the logic of the destroy_call 404 | */ 405 | me = t->self; 406 | 407 | /* 408 | * Destroy all the member calls 409 | */ 410 | c = t->call_head; 411 | while (c) 412 | { 413 | destroy_call (c); 414 | c = c->next; 415 | }; 416 | /* 417 | * Remove ourselves from the list of tunnels 418 | */ 419 | 420 | if (tunnels.head == t) 421 | { 422 | tunnels.head = t->next; 423 | tunnels.count--; 424 | } 425 | else 426 | { 427 | p = tunnels.head; 428 | if (p) 429 | { 430 | while (p->next && (p->next != t)) 431 | p = p->next; 432 | if (p->next) 433 | { 434 | p->next = t->next; 435 | tunnels.count--; 436 | } 437 | else 438 | { 439 | log (LOG_WARN, 440 | "%s: unable to locate tunnel in tunnel list\n", 441 | __FUNCTION__); 442 | } 443 | } 444 | else 445 | { 446 | log (LOG_WARN, "%s: tunnel list is empty!\n", __FUNCTION__); 447 | } 448 | } 449 | if (t->lac) 450 | { 451 | t->lac->t = NULL; 452 | if (t->lac->redial && (t->lac->rtimeout > 0) && !t->lac->rsched && 453 | t->lac->active) 454 | { 455 | log (LOG_LOG, "%s: Will redial in %d seconds\n", __FUNCTION__, 456 | t->lac->rtimeout); 457 | tv.tv_sec = t->lac->rtimeout; 458 | tv.tv_usec = 0; 459 | t->lac->rsched = schedule (tv, magic_lac_dial, t->lac); 460 | } 461 | } 462 | /* XXX L2TP/IPSec: remove relevant SAs here? NTB 20011010 463 | * XXX But what if another tunnel is using same SA? 464 | */ 465 | if (t->lns) 466 | t->lns->t = NULL; 467 | free (t); 468 | free (me); 469 | } 470 | 471 | struct tunnel *l2tp_call (char *host, int port, struct lac *lac, 472 | struct lns *lns) 473 | { 474 | /* 475 | * Establish a tunnel from us to host 476 | * on port port 477 | */ 478 | struct call *tmp = NULL; 479 | struct hostent *hp; 480 | unsigned int addr; 481 | port = htons (port); 482 | hp = gethostbyname (host); 483 | if (!hp) 484 | { 485 | log (LOG_WARN, "%s: gethostbyname() failed for %s.\n", __FUNCTION__, 486 | host); 487 | return NULL; 488 | } 489 | bcopy (hp->h_addr, &addr, hp->h_length); 490 | /* Force creation of a new tunnel 491 | and set it's tid to 0 to cause 492 | negotiation to occur */ 493 | /* XXX L2TP/IPSec: Set up SA to addr:port here? NTB 20011010 494 | */ 495 | tmp = get_call (0, 0, addr, port); 496 | if (!tmp) 497 | { 498 | log (LOG_WARN, "%s: Unable to create tunnel to %s.\n", __FUNCTION__, 499 | host); 500 | return NULL; 501 | } 502 | tmp->container->tid = 0; 503 | tmp->container->lac = lac; 504 | tmp->container->lns = lns; 505 | tmp->lac = lac; 506 | tmp->lns = lns; 507 | if (lac) 508 | lac->t = tmp->container; 509 | if (lns) 510 | lns->t = tmp->container; 511 | /* 512 | * Since our state is 0, we will establish a tunnel now 513 | */ 514 | log (LOG_LOG, "%s:Connecting to host %s, port %d\n", __FUNCTION__, host, 515 | ntohs (port)); 516 | control_finish (tmp->container, tmp); 517 | return tmp->container; 518 | } 519 | 520 | void magic_lac_tunnel (void *data) 521 | { 522 | struct lac *lac; 523 | lac = (struct lac *) data; 524 | if (!lac) 525 | { 526 | log (LOG_WARN, "%s: magic_lac_tunnel: called on NULL lac!\n", 527 | __FUNCTION__); 528 | return; 529 | } 530 | if (lac->lns) 531 | { 532 | /* FIXME: I should try different LNS's if I get failures */ 533 | l2tp_call (lac->lns->hostname, lac->lns->port, lac, NULL); 534 | return; 535 | } 536 | else if (deflac && deflac->lns) 537 | { 538 | l2tp_call (deflac->lns->hostname, deflac->lns->port, lac, NULL); 539 | return; 540 | } 541 | else 542 | { 543 | log (LOG_WARN, "%s: Unable to find hostname to dial for '%s'\n", 544 | __FUNCTION__, lac->entname); 545 | return; 546 | } 547 | } 548 | 549 | struct call *lac_call (int tid, struct lac *lac, struct lns *lns) 550 | { 551 | struct tunnel *t = tunnels.head; 552 | struct call *tmp; 553 | while (t) 554 | { 555 | if (t->ourtid == tid) 556 | { 557 | tmp = new_call (t); 558 | if (!tmp) 559 | { 560 | log (LOG_WARN, "%s: unable to create new call\n", 561 | __FUNCTION__); 562 | return NULL; 563 | } 564 | tmp->next = t->call_head; 565 | t->call_head = tmp; 566 | t->count++; 567 | tmp->cid = 0; 568 | tmp->lac = lac; 569 | tmp->lns = lns; 570 | if (lac) 571 | lac->c = tmp; 572 | log (LOG_LOG, "%s: Calling on tunnel %d\n", __FUNCTION__, tid); 573 | strcpy (tmp->dial_no, dial_no_tmp); /* jz: copy dialnumber to tmp->dial_no */ 574 | control_finish (t, tmp); 575 | return tmp; 576 | } 577 | t = t->next; 578 | }; 579 | log (LOG_DEBUG, "%s: No such tunnel %d to generate call.\n", __FUNCTION__, 580 | tid); 581 | return NULL; 582 | } 583 | 584 | void magic_lac_dial (void *data) 585 | { 586 | struct lac *lac; 587 | lac = (struct lac *) data; 588 | if (!lac->active) 589 | { 590 | log (LOG_DEBUG, "%s: LAC %s not active", __FUNCTION__, lac->entname); 591 | return; 592 | } 593 | lac->rsched = NULL; 594 | lac->rtries++; 595 | if (lac->rmax && (lac->rtries > lac->rmax)) 596 | { 597 | log (LOG_LOG, "%s: maximum retries exceeded.\n", __FUNCTION__); 598 | return; 599 | } 600 | if (!lac) 601 | { 602 | log (LOG_WARN, "%s : called on NULL lac!\n", __FUNCTION__); 603 | return; 604 | } 605 | if (!lac->t) 606 | { 607 | #ifdef DEGUG_MAGIC 608 | log (LOG_DEBUG, "%s : tunnel not up! Connecting!\n", __FUNCTION__); 609 | #endif 610 | magic_lac_tunnel (lac); 611 | return; 612 | } 613 | lac_call (lac->t->ourtid, lac, NULL); 614 | } 615 | 616 | void lac_hangup (int cid) 617 | { 618 | struct tunnel *t = tunnels.head; 619 | struct call *tmp; 620 | while (t) 621 | { 622 | tmp = t->call_head; 623 | while (tmp) 624 | { 625 | if (tmp->ourcid == cid) 626 | { 627 | log (LOG_LOG, 628 | "%s :Hanging up call %d, Local: %d, Remote: %d\n", 629 | __FUNCTION__, tmp->serno, tmp->ourcid, tmp->cid); 630 | strcpy (tmp->errormsg, "Goodbye!"); 631 | /* tmp->needclose = -1; */ 632 | kill (tmp->pppd, SIGTERM); 633 | return; 634 | } 635 | tmp = tmp->next; 636 | } 637 | t = t->next; 638 | }; 639 | log (LOG_DEBUG, "%s : No such call %d to hang up.\n", __FUNCTION__, cid); 640 | return; 641 | } 642 | 643 | void lac_disconnect (int tid) 644 | { 645 | struct tunnel *t = tunnels.head; 646 | while (t) 647 | { 648 | if (t->ourtid == tid) 649 | { 650 | log (LOG_LOG, 651 | "%s: Disconnecting from %s, Local: %d, Remote: %d\n", 652 | __FUNCTION__, IPADDY (t->peer.sin_addr), t->ourtid, t->tid); 653 | t->self->needclose = -1; 654 | strcpy (t->self->errormsg, "Goodbye!"); 655 | call_close (t->self); 656 | return; 657 | } 658 | t = t->next; 659 | }; 660 | log (LOG_DEBUG, "%s: No such tunnel %d to hang up.\n", __FUNCTION__, tid); 661 | return; 662 | } 663 | 664 | struct tunnel *new_tunnel () 665 | { 666 | struct tunnel *tmp = malloc (sizeof (struct tunnel)); 667 | if (!tmp) 668 | return NULL; 669 | tmp->cSs = 0; 670 | tmp->cSr = 0; 671 | tmp->cLr = 0; 672 | tmp->call_head = NULL; 673 | tmp->next = NULL; 674 | tmp->debug = -1; 675 | tmp->tid = -1; 676 | tmp->hello = NULL; 677 | #ifndef TESTING 678 | /* while(get_call((tmp->ourtid = rand() & 0xFFFF),0,0,0)); */ 679 | #ifdef USE_KERNEL 680 | if (kernel_support) 681 | tmp->ourtid = ioctl (server_socket, L2TPIOCADDTUNNEL, 0); 682 | else 683 | #endif 684 | tmp->ourtid = rand () & 0xFFFF; 685 | #else 686 | tmp->ourtid = 0x6227; 687 | #endif 688 | tmp->nego = 0; 689 | tmp->count = 0; 690 | tmp->state = 0; /* Nothing */ 691 | tmp->peer.sin_family = AF_INET; 692 | tmp->peer.sin_port = 0; 693 | bzero (&(tmp->peer.sin_addr), sizeof (tmp->peer.sin_addr)); 694 | tmp->sanity = -1; 695 | tmp->qtid = -1; 696 | tmp->ourfc = ASYNC_FRAMING | SYNC_FRAMING; 697 | tmp->ourbc = 0; 698 | tmp->ourtb = (((_u64) rand ()) << 32) | ((_u64) rand ()); 699 | tmp->fc = -1; /* These really need to be specified by the peer */ 700 | tmp->bc = -1; /* And we want to know if they forgot */ 701 | tmp->hostname[0] = 0; 702 | tmp->vendor[0] = 0; 703 | tmp->secret[0] = 0; 704 | if (!(tmp->self = new_call (tmp))) 705 | { 706 | free (tmp); 707 | return NULL; 708 | }; 709 | tmp->ourrws = DEFAULT_RWS_SIZE; 710 | tmp->self->ourfbit = FBIT; 711 | tmp->lac = NULL; 712 | tmp->lns = NULL; 713 | tmp->chal_us.state = 0; 714 | tmp->chal_us.secret[0] = 0; 715 | memset (tmp->chal_us.reply, 0, MD_SIG_SIZE); 716 | tmp->chal_them.state = 0; 717 | tmp->chal_them.secret[0] = 0; 718 | memset (tmp->chal_them.reply, 0, MD_SIG_SIZE); 719 | tmp->chal_them.vector = (unsigned char *) malloc (VECTOR_SIZE); 720 | tmp->chal_us.vector = NULL; 721 | tmp->hbit = 0; 722 | return tmp; 723 | } 724 | 725 | void do_control () 726 | { 727 | char buf[1024]; 728 | char *host; 729 | char *tunstr; 730 | char *callstr; 731 | 732 | char *sub_str; /* jz: use by the strtok function */ 733 | char *tmp_ptr; /* jz: use by the strtok function */ 734 | struct lac *lac; 735 | int call; 736 | int tunl; 737 | int cnt = -1; 738 | while (cnt) 739 | { 740 | cnt = read (control_fd, buf, sizeof (buf)); 741 | if (cnt > 0) 742 | { 743 | if (buf[cnt - 1] == '\n') 744 | buf[--cnt] = 0; 745 | #ifdef DEBUG_CONTROL 746 | log (LOG_DEBUG, "%s: Got message %s (%d bytes long)\n", 747 | __FUNCTION__, buf, cnt); 748 | #endif 749 | switch (buf[0]) 750 | { 751 | case 't': 752 | host = strchr (buf, ' ') + 1; 753 | #ifdef DEBUG_CONTROL 754 | log (LOG_DEBUG, "%s: Attempting to tunnel to %s\n", 755 | __FUNCTION__, host); 756 | #endif 757 | l2tp_call (host, UDP_LISTEN_PORT, NULL, NULL); 758 | break; 759 | case 'c': 760 | 761 | switch_io = 1; /* jz: Switch for Incoming - Outgoing Calls */ 762 | 763 | tunstr = strchr (buf, ' ') + 1; 764 | lac = laclist; 765 | while (lac) 766 | { 767 | if (!strcasecmp (lac->entname, tunstr)) 768 | { 769 | lac->active = -1; 770 | lac->rtries = 0; 771 | if (!lac->c) 772 | magic_lac_dial (lac); 773 | else 774 | log (LOG_DEBUG, 775 | "%s: Session '%s' already active!\n", 776 | __FUNCTION__, lac->entname); 777 | break; 778 | } 779 | lac = lac->next; 780 | } 781 | if (lac) 782 | break; 783 | tunl = atoi (tunstr); 784 | if (!tunl) 785 | { 786 | log (LOG_DEBUG, "%s: No such tunnel '%s'\n", __FUNCTION__, 787 | tunstr); 788 | break; 789 | } 790 | #ifdef DEBUG_CONTROL 791 | log (LOG_DEBUG, "%s: Attempting to call on tunnel %d\n", 792 | __FUNCTION__, tunl); 793 | #endif 794 | lac_call (tunl, NULL, NULL); 795 | break; 796 | 797 | case 'o': /* jz: option 'o' for doing a outgoing call */ 798 | 799 | switch_io = 0; /* jz: Switch for incoming - outgoing Calls */ 800 | 801 | sub_str = strchr (buf, ' ') + 1; 802 | 803 | tunstr = strtok (sub_str, " "); /* jz: using strtok function to get */ 804 | tmp_ptr = strtok (NULL, " "); /* params out of the pipe */ 805 | strcpy (dial_no_tmp, tmp_ptr); 806 | 807 | lac = laclist; 808 | while (lac) 809 | { 810 | if (!strcasecmp (lac->entname, tunstr)) 811 | { 812 | lac->active = -1; 813 | lac->rtries = 0; 814 | if (!lac->c) 815 | magic_lac_dial (lac); 816 | else 817 | log (LOG_DEBUG, 818 | "%s: Session '%s' already active!\n", 819 | __FUNCTION__, lac->entname); 820 | break; 821 | } 822 | lac = lac->next; 823 | } 824 | if (lac) 825 | break; 826 | tunl = atoi (tunstr); 827 | if (!tunl) 828 | { 829 | log (LOG_DEBUG, "%s: No such tunnel '%s'\n", __FUNCTION__, 830 | tunstr); 831 | break; 832 | } 833 | #ifdef DEBUG_CONTROL 834 | log (LOG_DEBUG, "%s: Attempting to call on tunnel %d\n", 835 | __FUNCTION__, tunl); 836 | #endif 837 | lac_call (tunl, NULL, NULL); 838 | break; 839 | 840 | case 'h': 841 | callstr = strchr (buf, ' ') + 1; 842 | call = atoi (callstr); 843 | #ifdef DEBUG_CONTROL 844 | log (LOG_DEBUG, "%s: Attempting to call %d\n", __FUNCTION__, 845 | call); 846 | #endif 847 | lac_hangup (call); 848 | break; 849 | case 'd': 850 | tunstr = strchr (buf, ' ') + 1; 851 | lac = laclist; 852 | while (lac) 853 | { 854 | if (!strcasecmp (lac->entname, tunstr)) 855 | { 856 | lac->active = 0; 857 | lac->rtries = 0; 858 | if (lac->t) 859 | lac_disconnect (lac->t->ourtid); 860 | else 861 | log (LOG_DEBUG, "%s: Session '%s' not up\n", 862 | __FUNCTION__, lac->entname); 863 | break; 864 | } 865 | lac = lac->next; 866 | } 867 | if (lac) 868 | break; 869 | tunl = atoi (tunstr); 870 | if (!tunl) 871 | { 872 | log (LOG_DEBUG, "%s: No such tunnel '%s'\n", __FUNCTION__, 873 | tunstr); 874 | break; 875 | } 876 | #ifdef DEBUG_CONTROL 877 | log (LOG_DEBUG, "%s: Attempting to disconnect tunnel %d\n", 878 | __FUNCTION__, tunl); 879 | #endif 880 | lac_disconnect (tunl); 881 | break; 882 | case 's': 883 | show_status (1); 884 | break; 885 | default: 886 | log (LOG_DEBUG, "%s: Unknown command %c\n", __FUNCTION__, 887 | buf[0]); 888 | } 889 | } 890 | } 891 | /* Otherwise select goes nuts */ 892 | close (control_fd); 893 | control_fd = open (CONTROL_PIPE, O_RDONLY | O_NONBLOCK, 0600); 894 | } 895 | 896 | void init () 897 | { 898 | struct lac *lac; 899 | init_addr (); 900 | if (init_config ()) 901 | { 902 | log (LOG_CRIT, "%s: Unable to load config file\n", __FUNCTION__); 903 | exit (1); 904 | } 905 | if (uname (&uts)) 906 | { 907 | log (LOG_CRIT, "%s : Unable to determine host system\n", 908 | __FUNCTION__); 909 | exit (1); 910 | } 911 | init_tunnel_list (&tunnels); 912 | if (init_network ()) 913 | exit (1); 914 | signal (SIGTERM, &death_handler); 915 | signal (SIGINT, &death_handler); 916 | signal (SIGCHLD, &child_handler); 917 | signal (SIGUSR1, &status_handler); 918 | init_scheduler (); 919 | mkfifo (CONTROL_PIPE, 0600); 920 | control_fd = open (CONTROL_PIPE, O_RDONLY | O_NONBLOCK, 0600); 921 | if (control_fd < 0) 922 | { 923 | log (LOG_CRIT, "%s: Unable to open " CONTROL_PIPE " for reading.", 924 | __FUNCTION__); 925 | exit (1); 926 | } 927 | log (LOG_LOG, "l2tpd version " SERVER_VERSION " started on %s PID:%d\n", 928 | hostname, getpid ()); 929 | log (LOG_LOG, 930 | "Written by Mark Spencer, Copyright (C) 1998, Adtran, Inc.\n"); 931 | log (LOG_LOG, "Forked by Scott Balmos and David Stipp, (C) 2001\n"); 932 | log (LOG_LOG, "%s version %s on a %s, port %d\n", uts.sysname, 933 | uts.release, uts.machine, gconfig.port); 934 | lac = laclist; 935 | while (lac) 936 | { 937 | if (lac->autodial) 938 | { 939 | #ifdef DEBUG_MAGIC 940 | log (LOG_DEBUG, "%s: Autodialing '%s'\n", __FUNCTION__, 941 | lac->entname[0] ? lac->entname : "(unnamed)"); 942 | #endif 943 | lac->active = -1; 944 | switch_io = 1; /* If we're a LAC, autodials will be ICRQ's */ 945 | magic_lac_dial (lac); 946 | } 947 | lac = lac->next; 948 | } 949 | } 950 | 951 | int main (int argc, char *argv[]) 952 | { 953 | args = argv[0]; 954 | init (); 955 | dial_no_tmp = calloc (128, sizeof (char)); 956 | network_thread (); 957 | return 0; 958 | }