Lines Matching +full:hp +full:- +full:cfg

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
4 * Copyright (c) 1996 - 2001 Brian Somers <brian@Awfulhak.org>
5 * based on work by Toshiharu OHNO <tony-o@iij.ad.jp>
100 #define REJECTED(p, x) ((p)->peer_reject & (1<<(x)))
145 { 1, "IPADDRS" }, /* IP-Addresses */ /* deprecated */ in protoname()
146 { 2, "COMPPROTO" }, /* IP-Compression-Protocol */ in protoname()
147 { 3, "IPADDR" }, /* IP-Address */ in protoname()
165 throughput_addin(&ipcp->throughput, n); in ipcp_AddInOctets()
171 throughput_addout(&ipcp->throughput, n); in ipcp_AddOutOctets()
179 ipcp->ns.dns[0].s_addr = ipcp->ns.dns[1].s_addr = INADDR_NONE; in ipcp_LoadDNS()
181 if (ipcp->ns.resolv != NULL) { in ipcp_LoadDNS()
182 free(ipcp->ns.resolv); in ipcp_LoadDNS()
183 ipcp->ns.resolv = NULL; in ipcp_LoadDNS()
185 if (ipcp->ns.resolv_nons != NULL) { in ipcp_LoadDNS()
186 free(ipcp->ns.resolv_nons); in ipcp_LoadDNS()
187 ipcp->ns.resolv_nons = NULL; in ipcp_LoadDNS()
189 ipcp->ns.resolver = 0; in ipcp_LoadDNS()
191 if ((fd = open(_PATH_RESCONF, O_RDONLY)) != -1) { in ipcp_LoadDNS()
201 if ((ipcp->ns.resolv_nons = (char *)malloc(st.st_size + 1)) == NULL) in ipcp_LoadDNS()
204 else if ((ipcp->ns.resolv = (char *)malloc(st.st_size + 1)) == NULL) { in ipcp_LoadDNS()
207 free(ipcp->ns.resolv_nons); in ipcp_LoadDNS()
208 ipcp->ns.resolv_nons = NULL; in ipcp_LoadDNS()
209 } else if ((got = read(fd, ipcp->ns.resolv, st.st_size)) != st.st_size) { in ipcp_LoadDNS()
210 if (got == -1) in ipcp_LoadDNS()
217 free(ipcp->ns.resolv_nons); in ipcp_LoadDNS()
218 ipcp->ns.resolv_nons = NULL; in ipcp_LoadDNS()
219 free(ipcp->ns.resolv); in ipcp_LoadDNS()
220 ipcp->ns.resolv = NULL; in ipcp_LoadDNS()
225 ipcp->ns.resolv[st.st_size] = '\0'; in ipcp_LoadDNS()
226 ipcp->ns.resolver = 1; in ipcp_LoadDNS()
228 cp_nons = ipcp->ns.resolv_nons; in ipcp_LoadDNS()
229 cp = ipcp->ns.resolv; in ipcp_LoadDNS()
234 memcpy(cp_nons, cp, ncp - cp); in ipcp_LoadDNS()
235 cp_nons += ncp - cp; in ipcp_LoadDNS()
237 if ((ncp != cp && ncp[-1] != '\n') || !issep(ncp[10])) { in ipcp_LoadDNS()
252 if (n < 2 && inet_aton(cp, ipcp->ns.dns)) in ipcp_LoadDNS()
265 strcpy(cp_nons, cp); /* Copy the end - including the NUL */ in ipcp_LoadDNS()
266 cp_nons += strlen(cp_nons) - 1; in ipcp_LoadDNS()
267 while (cp_nons >= ipcp->ns.resolv_nons && *cp_nons == '\n') in ipcp_LoadDNS()
268 *cp_nons-- = '\0'; in ipcp_LoadDNS()
269 if (n == 2 && ipcp->ns.dns[0].s_addr == INADDR_ANY) { in ipcp_LoadDNS()
270 ipcp->ns.dns[0].s_addr = ipcp->ns.dns[1].s_addr; in ipcp_LoadDNS()
271 ipcp->ns.dns[1].s_addr = INADDR_ANY; in ipcp_LoadDNS()
273 bundle_AdjustDNS(ipcp->fsm.bundle); in ipcp_LoadDNS()
290 if (ipcp->ns.dns[0].s_addr == INADDR_ANY && in ipcp_WriteDNS()
291 ipcp->ns.dns[1].s_addr == INADDR_ANY) { in ipcp_WriteDNS()
297 if (ipcp->ns.dns[0].s_addr == INADDR_ANY) { in ipcp_WriteDNS()
298 ipcp->ns.dns[0].s_addr = ipcp->ns.dns[1].s_addr; in ipcp_WriteDNS()
299 ipcp->ns.dns[1].s_addr = INADDR_ANY; in ipcp_WriteDNS()
305 if (ipcp->ns.resolv_nons) in ipcp_WriteDNS()
306 fputs(ipcp->ns.resolv_nons, fp); in ipcp_WriteDNS()
307 paddr = inet_ntoa(ipcp->ns.dns[0]); in ipcp_WriteDNS()
310 if (ipcp->ns.dns[1].s_addr != INADDR_ANY && in ipcp_WriteDNS()
311 ipcp->ns.dns[1].s_addr != INADDR_NONE && in ipcp_WriteDNS()
312 ipcp->ns.dns[1].s_addr != ipcp->ns.dns[0].s_addr) { in ipcp_WriteDNS()
313 paddr = inet_ntoa(ipcp->ns.dns[1]); in ipcp_WriteDNS()
334 if (ipcp->ns.resolver) { in ipcp_RestoreDNS()
338 if ((fd = ID0open(_PATH_RESCONF, O_WRONLY|O_TRUNC, 0644)) != -1) { in ipcp_RestoreDNS()
339 len = strlen(ipcp->ns.resolv); in ipcp_RestoreDNS()
340 if ((got = write(fd, ipcp->ns.resolv, len)) != len) { in ipcp_RestoreDNS()
341 if (got == -1) in ipcp_RestoreDNS()
352 } else if (remove(_PATH_RESCONF) == -1) in ipcp_RestoreDNS()
361 struct ipcp *ipcp = &arg->bundle->ncp.ipcp; in ipcp_Show()
363 prompt_Printf(arg->prompt, "%s [%s]\n", ipcp->fsm.name, in ipcp_Show()
364 State2Nam(ipcp->fsm.state)); in ipcp_Show()
365 if (ipcp->fsm.state == ST_OPENED) { in ipcp_Show()
366 prompt_Printf(arg->prompt, " His side: %s, %s\n", in ipcp_Show()
367 inet_ntoa(ipcp->peer_ip), vj2asc(ipcp->peer_compproto)); in ipcp_Show()
368 prompt_Printf(arg->prompt, " My side: %s, %s\n", in ipcp_Show()
369 inet_ntoa(ipcp->my_ip), vj2asc(ipcp->my_compproto)); in ipcp_Show()
370 prompt_Printf(arg->prompt, " Queued packets: %lu\n", in ipcp_Show()
374 prompt_Printf(arg->prompt, "\nDefaults:\n"); in ipcp_Show()
375 prompt_Printf(arg->prompt, " FSM retry = %us, max %u Config" in ipcp_Show()
376 " REQ%s, %u Term REQ%s\n", ipcp->cfg.fsm.timeout, in ipcp_Show()
377 ipcp->cfg.fsm.maxreq, ipcp->cfg.fsm.maxreq == 1 ? "" : "s", in ipcp_Show()
378 ipcp->cfg.fsm.maxtrm, ipcp->cfg.fsm.maxtrm == 1 ? "" : "s"); in ipcp_Show()
379 prompt_Printf(arg->prompt, " My Address: %s\n", in ipcp_Show()
380 ncprange_ntoa(&ipcp->cfg.my_range)); in ipcp_Show()
381 if (ipcp->cfg.HaveTriggerAddress) in ipcp_Show()
382 prompt_Printf(arg->prompt, " Trigger address: %s\n", in ipcp_Show()
383 inet_ntoa(ipcp->cfg.TriggerAddress)); in ipcp_Show()
385 prompt_Printf(arg->prompt, " VJ compression: %s (%d slots %s slot " in ipcp_Show()
386 "compression)\n", command_ShowNegval(ipcp->cfg.vj.neg), in ipcp_Show()
387 ipcp->cfg.vj.slots, ipcp->cfg.vj.slotcomp ? "with" : "without"); in ipcp_Show()
389 if (iplist_isvalid(&ipcp->cfg.peer_list)) in ipcp_Show()
390 prompt_Printf(arg->prompt, " His Address: %s\n", in ipcp_Show()
391 ipcp->cfg.peer_list.src); in ipcp_Show()
393 prompt_Printf(arg->prompt, " His Address: %s\n", in ipcp_Show()
394 ncprange_ntoa(&ipcp->cfg.peer_range)); in ipcp_Show()
396 prompt_Printf(arg->prompt, " DNS: %s", in ipcp_Show()
397 ipcp->cfg.ns.dns[0].s_addr == INADDR_NONE ? in ipcp_Show()
398 "none" : inet_ntoa(ipcp->cfg.ns.dns[0])); in ipcp_Show()
399 if (ipcp->cfg.ns.dns[1].s_addr != INADDR_NONE) in ipcp_Show()
400 prompt_Printf(arg->prompt, ", %s", in ipcp_Show()
401 inet_ntoa(ipcp->cfg.ns.dns[1])); in ipcp_Show()
402 prompt_Printf(arg->prompt, ", %s\n", in ipcp_Show()
403 command_ShowNegval(ipcp->cfg.ns.dns_neg)); in ipcp_Show()
404 prompt_Printf(arg->prompt, " Resolver DNS: %s", in ipcp_Show()
405 ipcp->ns.dns[0].s_addr == INADDR_NONE ? in ipcp_Show()
406 "none" : inet_ntoa(ipcp->ns.dns[0])); in ipcp_Show()
407 if (ipcp->ns.dns[1].s_addr != INADDR_NONE && in ipcp_Show()
408 ipcp->ns.dns[1].s_addr != ipcp->ns.dns[0].s_addr) in ipcp_Show()
409 prompt_Printf(arg->prompt, ", %s", in ipcp_Show()
410 inet_ntoa(ipcp->ns.dns[1])); in ipcp_Show()
411 prompt_Printf(arg->prompt, "\n NetBIOS NS: %s, ", in ipcp_Show()
412 inet_ntoa(ipcp->cfg.ns.nbns[0])); in ipcp_Show()
413 prompt_Printf(arg->prompt, "%s\n\n", in ipcp_Show()
414 inet_ntoa(ipcp->cfg.ns.nbns[1])); in ipcp_Show()
416 throughput_disp(&ipcp->throughput, arg->prompt); in ipcp_Show()
424 if (arg->argc != arg->argn+2) in ipcp_vjset()
425 return -1; in ipcp_vjset()
426 if (!strcasecmp(arg->argv[arg->argn], "slots")) { in ipcp_vjset()
429 slots = atoi(arg->argv[arg->argn+1]); in ipcp_vjset()
432 arg->bundle->ncp.ipcp.cfg.vj.slots = slots; in ipcp_vjset()
434 } else if (!strcasecmp(arg->argv[arg->argn], "slotcomp")) { in ipcp_vjset()
435 if (!strcasecmp(arg->argv[arg->argn+1], "on")) in ipcp_vjset()
436 arg->bundle->ncp.ipcp.cfg.vj.slotcomp = 1; in ipcp_vjset()
437 else if (!strcasecmp(arg->argv[arg->argn+1], "off")) in ipcp_vjset()
438 arg->bundle->ncp.ipcp.cfg.vj.slotcomp = 0; in ipcp_vjset()
443 return -1; in ipcp_vjset()
450 struct hostent *hp; in ipcp_Init() local
456 fsm_Init(&ipcp->fsm, "IPCP", PROTO_IPCP, 1, IPCP_MAXCODE, LogIPCP, in ipcp_Init()
459 ipcp->cfg.vj.slots = DEF_VJ_STATES; in ipcp_Init()
460 ipcp->cfg.vj.slotcomp = 1; in ipcp_Init()
461 memset(&ipcp->cfg.my_range, '\0', sizeof ipcp->cfg.my_range); in ipcp_Init()
464 ipcp->cfg.netmask.s_addr = INADDR_ANY; in ipcp_Init()
466 hp = gethostbyname(name); in ipcp_Init()
467 if (hp && hp->h_addrtype == AF_INET && hp->h_length == sizeof host.s_addr) in ipcp_Init()
468 memcpy(&host.s_addr, hp->h_addr, sizeof host.s_addr); in ipcp_Init()
470 ncprange_setip4(&ipcp->cfg.my_range, host, ipcp->cfg.netmask); in ipcp_Init()
471 ncprange_setip4(&ipcp->cfg.peer_range, ipcp->cfg.netmask, ipcp->cfg.netmask); in ipcp_Init()
473 iplist_setsrc(&ipcp->cfg.peer_list, ""); in ipcp_Init()
474 ipcp->cfg.HaveTriggerAddress = 0; in ipcp_Init()
476 ipcp->cfg.ns.dns[0].s_addr = INADDR_NONE; in ipcp_Init()
477 ipcp->cfg.ns.dns[1].s_addr = INADDR_NONE; in ipcp_Init()
478 ipcp->cfg.ns.dns_neg = 0; in ipcp_Init()
479 ipcp->cfg.ns.nbns[0].s_addr = INADDR_ANY; in ipcp_Init()
480 ipcp->cfg.ns.nbns[1].s_addr = INADDR_ANY; in ipcp_Init()
482 ipcp->cfg.fsm.timeout = DEF_FSMRETRY; in ipcp_Init()
483 ipcp->cfg.fsm.maxreq = DEF_FSMTRIES; in ipcp_Init()
484 ipcp->cfg.fsm.maxtrm = DEF_FSMTRIES; in ipcp_Init()
485 ipcp->cfg.vj.neg = NEG_ENABLED|NEG_ACCEPTED; in ipcp_Init()
487 memset(&ipcp->vj, '\0', sizeof ipcp->vj); in ipcp_Init()
489 ipcp->ns.resolv = NULL; in ipcp_Init()
490 ipcp->ns.resolv_nons = NULL; in ipcp_Init()
491 ipcp->ns.writable = 1; in ipcp_Init()
494 throughput_init(&ipcp->throughput, SAMPLE_PERIOD); in ipcp_Init()
495 memset(ipcp->Queue, '\0', sizeof ipcp->Queue); in ipcp_Init()
502 throughput_destroy(&ipcp->throughput); in ipcp_Destroy()
504 if (ipcp->ns.resolv != NULL) { in ipcp_Destroy()
505 free(ipcp->ns.resolv); in ipcp_Destroy()
506 ipcp->ns.resolv = NULL; in ipcp_Destroy()
508 if (ipcp->ns.resolv_nons != NULL) { in ipcp_Destroy()
509 free(ipcp->ns.resolv_nons); in ipcp_Destroy()
510 ipcp->ns.resolv_nons = NULL; in ipcp_Destroy()
517 ipcp->fsm.link = l; in ipcp_SetLink()
523 struct iface *iface = ipcp->fsm.bundle->iface; in ipcp_Setup()
529 ipcp->fsm.open_mode = 0; in ipcp_Setup()
530 ipcp->ifmask.s_addr = mask == INADDR_NONE ? ipcp->cfg.netmask.s_addr : mask; in ipcp_Setup()
532 if (iplist_isvalid(&ipcp->cfg.peer_list)) { in ipcp_Setup()
534 for (n = 0; n < iface->addrs; n++) { in ipcp_Setup()
535 if (!ncpaddr_getip4(&iface->addr[n].peer, &peer)) in ipcp_Setup()
537 if ((pos = iplist_ip2pos(&ipcp->cfg.peer_list, peer)) != -1) { in ipcp_Setup()
538 ncpaddr_setip4(&ipaddr, iplist_setcurpos(&ipcp->cfg.peer_list, pos)); in ipcp_Setup()
542 if (n == iface->addrs) in ipcp_Setup()
544 ncpaddr_setip4(&ipaddr, iplist_setrandpos(&ipcp->cfg.peer_list)); in ipcp_Setup()
546 ncprange_sethost(&ipcp->cfg.peer_range, &ipaddr); in ipcp_Setup()
549 ipcp->heis1172 = 0; in ipcp_Setup()
550 ipcp->peer_req = 0; in ipcp_Setup()
551 ncprange_getip4addr(&ipcp->cfg.peer_range, &ipcp->peer_ip); in ipcp_Setup()
552 ipcp->peer_compproto = 0; in ipcp_Setup()
554 if (ipcp->cfg.HaveTriggerAddress) { in ipcp_Setup()
560 ipcp->my_ip = ipcp->cfg.TriggerAddress; in ipcp_Setup()
562 inet_ntoa(ipcp->cfg.TriggerAddress)); in ipcp_Setup()
570 for (n = 0; n < iface->addrs; n++) { in ipcp_Setup()
571 ncprange_getaddr(&iface->addr[n].ifa, &ipaddr); in ipcp_Setup()
572 if (ncprange_contains(&ipcp->cfg.my_range, &ipaddr)) { in ipcp_Setup()
573 ncpaddr_getip4(&ipaddr, &ipcp->my_ip); in ipcp_Setup()
577 if (n == iface->addrs) in ipcp_Setup()
578 ncprange_getip4addr(&ipcp->cfg.my_range, &ipcp->my_ip); in ipcp_Setup()
581 if (IsEnabled(ipcp->cfg.vj.neg) in ipcp_Setup()
583 || (ipcp->fsm.bundle->radius.valid && ipcp->fsm.bundle->radius.vj) in ipcp_Setup()
586 ipcp->my_compproto = (PROTO_VJCOMP << 16) + in ipcp_Setup()
587 ((ipcp->cfg.vj.slots - 1) << 8) + in ipcp_Setup()
588 ipcp->cfg.vj.slotcomp; in ipcp_Setup()
590 ipcp->my_compproto = 0; in ipcp_Setup()
591 sl_compress_init(&ipcp->vj.cslc, ipcp->cfg.vj.slots - 1); in ipcp_Setup()
593 ipcp->peer_reject = 0; in ipcp_Setup()
594 ipcp->my_reject = 0; in ipcp_Setup()
596 /* Copy startup values into ipcp->ns.dns */ in ipcp_Setup()
597 if (ipcp->cfg.ns.dns[0].s_addr != INADDR_NONE) in ipcp_Setup()
598 memcpy(ipcp->ns.dns, ipcp->cfg.ns.dns, sizeof ipcp->ns.dns); in ipcp_Setup()
624 struct bundle *bundle = ipcp->fsm.bundle; in ipcp_proxyarp()
628 if (!ncpaddr_getip4(&addr->peer, &peer)) { in ipcp_proxyarp()
636 ncprange_getip4mask(&addr->ifa, &mask); in ipcp_proxyarp()
639 ncprange_ntoa(&addr->ifa)); in ipcp_proxyarp()
645 n -= 2; in ipcp_proxyarp()
651 n--; in ipcp_proxyarp()
666 struct bundle *bundle = ipcp->fsm.bundle; in ipcp_SetIPaddress()
683 if (ipcp->ifmask.s_addr != INADDR_ANY && in ipcp_SetIPaddress()
684 (ipcp->ifmask.s_addr & mask.s_addr) == mask.s_addr) in ipcp_SetIPaddress()
685 ncprange_setip4mask(&myrange, ipcp->ifmask); in ipcp_SetIPaddress()
687 if (!iface_Add(bundle->iface, &bundle->ncp, &myrange, &hisncpaddr, in ipcp_SetIPaddress()
692 iface_Clear(bundle->iface, &bundle->ncp, AF_INET, in ipcp_SetIPaddress()
695 if (bundle->ncp.cfg.sendpipe > 0 || bundle->ncp.cfg.recvpipe > 0) { in ipcp_SetIPaddress()
702 route_Change(bundle, bundle->ncp.route, &myncpaddr, &hisncpaddr); in ipcp_SetIPaddress()
705 if (bundle->radius.valid) in ipcp_SetIPaddress()
706 route_Change(bundle, bundle->radius.routes, &myncpaddr, &hisncpaddr); in ipcp_SetIPaddress()
718 for (f = 0; f < bundle->ncp.ipcp.cfg.peer_list.nItems; f++) { in ChooseHisAddr()
719 try = iplist_next(&bundle->ncp.ipcp.cfg.peer_list); in ChooseHisAddr()
722 if (ipcp_SetIPaddress(&bundle->ncp.ipcp, gw, try)) { in ChooseHisAddr()
728 if (f == bundle->ncp.ipcp.cfg.peer_list.nItems) { in ChooseHisAddr()
742 fp->FsmTimer.load = ipcp->cfg.fsm.timeout * SECTICKS; in IpcpInitRestartCounter()
745 fp->restart = ipcp->cfg.fsm.maxreq; in IpcpInitRestartCounter()
748 fp->restart = ipcp->cfg.fsm.maxtrm; in IpcpInitRestartCounter()
751 fp->restart = 1; in IpcpInitRestartCounter()
760 struct physical *p = link2physical(fp->link); in IpcpSendConfigReq()
768 memcpy(o->data, &ipcp->my_ip.s_addr, 4); in IpcpSendConfigReq()
772 if (ipcp->my_compproto && !REJECTED(ipcp, TY_COMPPROTO)) { in IpcpSendConfigReq()
773 if (ipcp->heis1172) { in IpcpSendConfigReq()
776 ua_htons(&proto, o->data); in IpcpSendConfigReq()
781 req.proto = htons(ipcp->my_compproto >> 16); in IpcpSendConfigReq()
782 req.slots = (ipcp->my_compproto >> 8) & 255; in IpcpSendConfigReq()
783 req.compcid = ipcp->my_compproto & 1; in IpcpSendConfigReq()
784 memcpy(o->data, &req, 4); in IpcpSendConfigReq()
789 if (IsEnabled(ipcp->cfg.ns.dns_neg)) { in IpcpSendConfigReq()
790 if (!REJECTED(ipcp, TY_PRIMARY_DNS - TY_ADJUST_NS)) { in IpcpSendConfigReq()
791 memcpy(o->data, &ipcp->ns.dns[0].s_addr, 4); in IpcpSendConfigReq()
795 if (!REJECTED(ipcp, TY_SECONDARY_DNS - TY_ADJUST_NS)) { in IpcpSendConfigReq()
796 memcpy(o->data, &ipcp->ns.dns[1].s_addr, 4); in IpcpSendConfigReq()
801 fsm_Output(fp, CODE_CONFIGREQ, fp->reqid, buff, (u_char *)o - buff, in IpcpSendConfigReq()
824 log_Printf(LogIPCP, "%s: LayerStart.\n", fp->link->name); in IpcpLayerStart()
825 throughput_start(&ipcp->throughput, "IPCP throughput", in IpcpLayerStart()
826 Enabled(fp->bundle, OPT_THROUGHPUT)); in IpcpLayerStart()
827 fp->more.reqs = fp->more.naks = fp->more.rejs = ipcp->cfg.fsm.maxreq * 3; in IpcpLayerStart()
828 ipcp->peer_req = 0; in IpcpLayerStart()
837 log_Printf(LogIPCP, "%s: LayerFinish.\n", fp->link->name); in IpcpLayerFinish()
838 throughput_stop(&ipcp->throughput); in IpcpLayerFinish()
839 throughput_log(&ipcp->throughput, LogIPCP, NULL); in IpcpLayerFinish()
848 struct bundle *bundle = ipcp->fsm.bundle; in ipcp_IfaceAddrAdded()
860 struct bundle *bundle = ipcp->fsm.bundle; in ipcp_IfaceAddrDeleted()
875 snprintf(addr, sizeof addr, "%s", inet_ntoa(ipcp->my_ip)); in IpcpLayerDown()
876 log_Printf(LogIPCP, "%s: LayerDown: %s\n", fp->link->name, addr); in IpcpLayerDown()
879 radius_Flush(&fp->bundle->radius); in IpcpLayerDown()
880 radius_Account(&fp->bundle->radius, &fp->bundle->radacct, in IpcpLayerDown()
881 fp->bundle->links, RAD_STOP, &ipcp->throughput); in IpcpLayerDown()
883 if (*fp->bundle->radius.cfg.file && fp->bundle->radius.filterid) in IpcpLayerDown()
884 system_Select(fp->bundle, fp->bundle->radius.filterid, LINKDOWNFILE, in IpcpLayerDown()
886 radius_StopTimer(&fp->bundle->radius); in IpcpLayerDown()
893 if (system_Select(fp->bundle, addr, LINKDOWNFILE, NULL, NULL) < 0) { in IpcpLayerDown()
894 if (bundle_GetLabel(fp->bundle)) { in IpcpLayerDown()
895 if (system_Select(fp->bundle, bundle_GetLabel(fp->bundle), in IpcpLayerDown()
897 system_Select(fp->bundle, "MYADDR", LINKDOWNFILE, NULL, NULL); in IpcpLayerDown()
899 system_Select(fp->bundle, "MYADDR", LINKDOWNFILE, NULL, NULL); in IpcpLayerDown()
904 recursing--; in IpcpLayerDown()
910 if (!ipcp_SetIPaddress(ipcp, ipcp->my_ip, ipcp->peer_ip)) { in ipcp_InterfaceUp()
915 if (!iface_SetFlags(ipcp->fsm.bundle->iface->name, IFF_UP)) { in ipcp_InterfaceUp()
917 ipcp->fsm.bundle->iface->name); in ipcp_InterfaceUp()
922 if (ipcp->fsm.bundle->NatEnabled) in ipcp_InterfaceUp()
923 LibAliasSetAddress(la, ipcp->my_ip); in ipcp_InterfaceUp()
936 log_Printf(LogIPCP, "%s: LayerUp.\n", fp->link->name); in IpcpLayerUp()
937 snprintf(tbuff, sizeof tbuff, "%s", inet_ntoa(ipcp->my_ip)); in IpcpLayerUp()
939 tbuff, inet_ntoa(ipcp->peer_ip)); in IpcpLayerUp()
941 if (ipcp->peer_compproto >> 16 == PROTO_VJCOMP) in IpcpLayerUp()
942 sl_compress_init(&ipcp->vj.cslc, (ipcp->peer_compproto >> 8) & 255); in IpcpLayerUp()
948 radius_Account_Set_Ip(&fp->bundle->radacct, &ipcp->peer_ip, &ipcp->ifmask); in IpcpLayerUp()
949 radius_Account(&fp->bundle->radius, &fp->bundle->radacct, fp->bundle->links, in IpcpLayerUp()
950 RAD_START, &ipcp->throughput); in IpcpLayerUp()
952 if (*fp->bundle->radius.cfg.file && fp->bundle->radius.filterid) in IpcpLayerUp()
953 system_Select(fp->bundle, fp->bundle->radius.filterid, LINKUPFILE, in IpcpLayerUp()
955 radius_StartTimer(fp->bundle); in IpcpLayerUp()
962 if (system_Select(fp->bundle, tbuff, LINKUPFILE, NULL, NULL) < 0) { in IpcpLayerUp()
963 if (bundle_GetLabel(fp->bundle)) { in IpcpLayerUp()
964 if (system_Select(fp->bundle, bundle_GetLabel(fp->bundle), in IpcpLayerUp()
966 system_Select(fp->bundle, "MYADDR", LINKUPFILE, NULL, NULL); in IpcpLayerUp()
968 system_Select(fp->bundle, "MYADDR", LINKUPFILE, NULL, NULL); in IpcpLayerUp()
971 fp->more.reqs = fp->more.naks = fp->more.rejs = ipcp->cfg.fsm.maxreq * 3; in IpcpLayerUp()
980 struct bundle *bundle = ipcp->fsm.bundle; in ipcp_ValidateReq()
981 struct iface *iface = bundle->iface; in ipcp_ValidateReq()
985 if (iplist_isvalid(&ipcp->cfg.peer_list)) { in ipcp_ValidateReq()
986 ncprange_getip4addr(&ipcp->cfg.my_range, &myaddr); in ipcp_ValidateReq()
988 iplist_ip2pos(&ipcp->cfg.peer_list, ip) < 0 || in ipcp_ValidateReq()
997 for (n = 0; n < iface->addrs; n++) { in ipcp_ValidateReq()
998 if (!ncpaddr_getip4(&iface->addr[n].peer, &peer)) in ipcp_ValidateReq()
1000 if (iplist_ip2pos(&ipcp->cfg.peer_list, peer) >= 0) { in ipcp_ValidateReq()
1001 ipcp->peer_ip = peer; in ipcp_ValidateReq()
1006 if (n == iface->addrs) { in ipcp_ValidateReq()
1008 ipcp->peer_ip = ChooseHisAddr(bundle, myaddr); in ipcp_ValidateReq()
1011 if (ipcp->peer_ip.s_addr == INADDR_ANY) { in ipcp_ValidateReq()
1012 *dec->rejend++ = TY_IPADDR; in ipcp_ValidateReq()
1013 *dec->rejend++ = 6; in ipcp_ValidateReq()
1014 memcpy(dec->rejend, &ip.s_addr, 4); in ipcp_ValidateReq()
1015 dec->rejend += 4; in ipcp_ValidateReq()
1017 *dec->nakend++ = TY_IPADDR; in ipcp_ValidateReq()
1018 *dec->nakend++ = 6; in ipcp_ValidateReq()
1019 memcpy(dec->nakend, &ipcp->peer_ip.s_addr, 4); in ipcp_ValidateReq()
1020 dec->nakend += 4; in ipcp_ValidateReq()
1025 !ncprange_containsip4(&ipcp->cfg.peer_range, ip)) { in ipcp_ValidateReq()
1030 *dec->nakend++ = TY_IPADDR; in ipcp_ValidateReq()
1031 *dec->nakend++ = 6; in ipcp_ValidateReq()
1032 for (n = 0; n < iface->addrs; n++) in ipcp_ValidateReq()
1033 if (ncprange_contains(&ipcp->cfg.peer_range, &iface->addr[n].peer)) { in ipcp_ValidateReq()
1034 /* We prefer the already-configured address */ in ipcp_ValidateReq()
1035 ncpaddr_getip4addr(&iface->addr[n].peer, (u_int32_t *)dec->nakend); in ipcp_ValidateReq()
1039 if (n == iface->addrs) in ipcp_ValidateReq()
1040 memcpy(dec->nakend, &ipcp->peer_ip.s_addr, 4); in ipcp_ValidateReq()
1042 dec->nakend += 4; in ipcp_ValidateReq()
1046 ipcp->peer_ip = ip; in ipcp_ValidateReq()
1047 *dec->ackend++ = TY_IPADDR; in ipcp_ValidateReq()
1048 *dec->ackend++ = 6; in ipcp_ValidateReq()
1049 memcpy(dec->ackend, &ip.s_addr, 4); in ipcp_ValidateReq()
1050 dec->ackend += 4; in ipcp_ValidateReq()
1069 while (end - cp >= (int)sizeof(opt->hdr)) { in IpcpDecodeConfig()
1073 snprintf(tbuff, sizeof tbuff, " %s[%d]", protoname(opt->hdr.id), in IpcpDecodeConfig()
1074 opt->hdr.len); in IpcpDecodeConfig()
1076 switch (opt->hdr.id) { in IpcpDecodeConfig()
1078 memcpy(&ipaddr.s_addr, opt->data, 4); in IpcpDecodeConfig()
1083 ipcp->peer_req = 1; in IpcpDecodeConfig()
1088 if (ncprange_containsip4(&ipcp->cfg.my_range, ipaddr)) { in IpcpDecodeConfig()
1091 inet_ntoa(ipcp->my_ip)); in IpcpDecodeConfig()
1092 log_Printf(LogIPCP, "%s --> %s\n", tbuff2, inet_ntoa(ipaddr)); in IpcpDecodeConfig()
1093 ipcp->my_ip = ipaddr; in IpcpDecodeConfig()
1094 ncpaddr_setip4(&ncpaddr, ipcp->my_ip); in IpcpDecodeConfig()
1095 bundle_AdjustFilters(fp->bundle, &ncpaddr, NULL); in IpcpDecodeConfig()
1099 fsm_Close(&ipcp->fsm); in IpcpDecodeConfig()
1104 ipcp->peer_reject |= (1 << opt->hdr.id); in IpcpDecodeConfig()
1110 memcpy(&pcomp, opt->data, sizeof pcomp); in IpcpDecodeConfig()
1117 if (!IsAccepted(ipcp->cfg.vj.neg)) in IpcpDecodeConfig()
1120 switch (opt->hdr.len) { in IpcpDecodeConfig()
1125 ipcp->heis1172 = 1; in IpcpDecodeConfig()
1126 ipcp->peer_compproto = compproto; in IpcpDecodeConfig()
1141 ipcp->peer_compproto = compproto; in IpcpDecodeConfig()
1142 ipcp->heis1172 = 0; in IpcpDecodeConfig()
1146 ipcp->heis1172 = 0; in IpcpDecodeConfig()
1180 log_Printf(LogIPCP, "%s changing compproto: %08x --> %08x\n", in IpcpDecodeConfig()
1181 tbuff, ipcp->my_compproto, compproto); in IpcpDecodeConfig()
1182 ipcp->my_compproto = compproto; in IpcpDecodeConfig()
1186 ipcp->peer_reject |= (1 << opt->hdr.id); in IpcpDecodeConfig()
1192 memcpy(&ipaddr.s_addr, opt->data, 4); in IpcpDecodeConfig()
1193 memcpy(&dstipaddr.s_addr, opt->data + 4, 4); in IpcpDecodeConfig()
1210 memcpy(&ipaddr.s_addr, opt->data, 4); in IpcpDecodeConfig()
1215 if (!IsAccepted(ipcp->cfg.ns.dns_neg)) { in IpcpDecodeConfig()
1216 ipcp->my_reject |= (1 << (opt->hdr.id - TY_ADJUST_NS)); in IpcpDecodeConfig()
1220 have_ip = ipcp->ns.dns[opt->hdr.id == TY_PRIMARY_DNS ? 0 : 1]; in IpcpDecodeConfig()
1222 if (opt->hdr.id == TY_PRIMARY_DNS && ipaddr.s_addr != have_ip.s_addr && in IpcpDecodeConfig()
1223 ipaddr.s_addr == ipcp->ns.dns[1].s_addr) { in IpcpDecodeConfig()
1225 ipcp->ns.dns[0] = ipcp->ns.dns[1]; in IpcpDecodeConfig()
1226 ipcp->ns.dns[1] = have_ip; in IpcpDecodeConfig()
1227 have_ip = ipcp->ns.dns[0]; in IpcpDecodeConfig()
1235 nak.hdr.id = opt->hdr.id; in IpcpDecodeConfig()
1249 if (IsEnabled(ipcp->cfg.ns.dns_neg)) { in IpcpDecodeConfig()
1251 memcpy(&ipcp->ns.dns[opt->hdr.id == TY_PRIMARY_DNS ? 0 : 1].s_addr, in IpcpDecodeConfig()
1252 opt->data, 4); in IpcpDecodeConfig()
1257 ipcp->peer_reject |= (1 << (opt->hdr.id - TY_ADJUST_NS)); in IpcpDecodeConfig()
1264 memcpy(&ipaddr.s_addr, opt->data, 4); in IpcpDecodeConfig()
1270 ipcp->cfg.ns.nbns[opt->hdr.id == TY_PRIMARY_NBNS ? 0 : 1].s_addr; in IpcpDecodeConfig()
1273 log_Printf(LogIPCP, "NBNS REQ - rejected - nbns not set\n"); in IpcpDecodeConfig()
1274 ipcp->my_reject |= (1 << (opt->hdr.id - TY_ADJUST_NS)); in IpcpDecodeConfig()
1280 nak.hdr.id = opt->hdr.id; in IpcpDecodeConfig()
1289 log_Printf(LogIPCP, "MS NBNS req %d - NAK??\n", opt->hdr.id); in IpcpDecodeConfig()
1293 log_Printf(LogIPCP, "MS NBNS req %d - REJ??\n", opt->hdr.id); in IpcpDecodeConfig()
1300 ipcp->my_reject |= (1 << opt->hdr.id); in IpcpDecodeConfig()
1308 if (ipcp->ns.writable) { in IpcpDecodeConfig()
1311 ipcp->peer_reject |= (1 << (TY_PRIMARY_DNS - TY_ADJUST_NS)); in IpcpDecodeConfig()
1312 ipcp->peer_reject |= (1 << (TY_SECONDARY_DNS - TY_ADJUST_NS)); in IpcpDecodeConfig()
1314 bundle_AdjustDNS(fp->bundle); in IpcpDecodeConfig()
1317 bundle_AdjustDNS(fp->bundle); in IpcpDecodeConfig()
1322 if (mode_type == MODE_REQ && !ipcp->peer_req) { in IpcpDecodeConfig()
1323 if (dec->rejend == dec->rej && dec->nakend == dec->nak) { in IpcpDecodeConfig()
1331 ipcp->peer_req = 1; in IpcpDecodeConfig()
1346 fsm_Input(&bundle->ncp.ipcp.fsm, bp); in ipcp_Input()
1350 l->name, bundle_PhaseName(bundle)); in ipcp_Input()
1359 struct ipcp *ipcp = &bundle->ncp.ipcp; in ipcp_UseHisIPaddr()
1362 memset(&ipcp->cfg.peer_range, '\0', sizeof ipcp->cfg.peer_range); in ipcp_UseHisIPaddr()
1363 iplist_reset(&ipcp->cfg.peer_list); in ipcp_UseHisIPaddr()
1364 ipcp->peer_ip = hisaddr; in ipcp_UseHisIPaddr()
1365 ncprange_setip4host(&ipcp->cfg.peer_range, hisaddr); in ipcp_UseHisIPaddr()
1366 ncprange_getip4addr(&ipcp->cfg.my_range, &myaddr); in ipcp_UseHisIPaddr()
1375 struct ncp *ncp = &bundle->ncp; in ipcp_UseHisaddr()
1376 struct ipcp *ipcp = &ncp->ipcp; in ipcp_UseHisaddr()
1380 memset(&ipcp->cfg.peer_range, '\0', sizeof ipcp->cfg.peer_range); in ipcp_UseHisaddr()
1381 iplist_reset(&ipcp->cfg.peer_list); in ipcp_UseHisaddr()
1382 if (strpbrk(hisaddr, ",-")) { in ipcp_UseHisaddr()
1383 iplist_setsrc(&ipcp->cfg.peer_list, hisaddr); in ipcp_UseHisaddr()
1384 if (iplist_isvalid(&ipcp->cfg.peer_list)) { in ipcp_UseHisaddr()
1385 iplist_setrandpos(&ipcp->cfg.peer_list); in ipcp_UseHisaddr()
1386 ipcp->peer_ip = ChooseHisAddr(bundle, ipcp->my_ip); in ipcp_UseHisaddr()
1387 if (ipcp->peer_ip.s_addr == INADDR_ANY) { in ipcp_UseHisaddr()
1388 log_Printf(LogWARN, "%s: None available !\n", ipcp->cfg.peer_list.src); in ipcp_UseHisaddr()
1391 ncprange_setip4host(&ipcp->cfg.peer_range, ipcp->peer_ip); in ipcp_UseHisaddr()
1396 } else if (ncprange_aton(&ipcp->cfg.peer_range, ncp, hisaddr) != 0) { in ipcp_UseHisaddr()
1397 if (ncprange_family(&ipcp->cfg.my_range) != AF_INET) { in ipcp_UseHisaddr()
1401 ncprange_getip4addr(&ipcp->cfg.my_range, &myaddr); in ipcp_UseHisaddr()
1402 ncprange_getip4addr(&ipcp->cfg.peer_range, &ipcp->peer_ip); in ipcp_UseHisaddr()
1404 if (setaddr && !ipcp_SetIPaddress(ipcp, myaddr, ipcp->peer_ip)) in ipcp_UseHisaddr()
1409 ncpaddr_setip4(&ncpaddr, ipcp->peer_ip); in ipcp_UseHisaddr()
1435 for (q = ipcp->Queue; q < ipcp->Queue + IPCP_QUEUES(ipcp); q++) in ipcp_QueueLen()
1436 result += q->len; in ipcp_QueueLen()
1444 struct bundle *bundle = ipcp->fsm.bundle; in ipcp_PushPacket()
1451 if (ipcp->fsm.state != ST_OPENED) in ipcp_PushPacket()
1457 if (l->ccp.fsm.state != ST_OPENED && ccp_Required(&l->ccp)) { in ipcp_PushPacket()
1458 log_Printf(LogPHASE, "%s: Not transmitting... waiting for CCP\n", l->name); in ipcp_PushPacket()
1462 queue = ipcp->Queue + IPCP_QUEUES(ipcp) - 1; in ipcp_PushPacket()
1464 if (queue->top) { in ipcp_PushPacket()
1469 if (!FilterCheck(MBUF_CTOP(bp), AF_INET, &bundle->filter.alive, in ipcp_PushPacket()
1479 } while (queue-- != ipcp->Queue); in ipcp_PushPacket()