Lines Matching defs:ipcp

30  * $FreeBSD: stable/11/usr.sbin/ppp/ipcp.c 330449 2018-03-05 07:26:05Z eadler $
79 #include "ipcp.h"
165 ipcp_AddInOctets(struct ipcp *ipcp, int n)
167 throughput_addin(&ipcp->throughput, n);
171 ipcp_AddOutOctets(struct ipcp *ipcp, int n)
173 throughput_addout(&ipcp->throughput, n);
177 ipcp_LoadDNS(struct ipcp *ipcp)
181 ipcp->ns.dns[0].s_addr = ipcp->ns.dns[1].s_addr = INADDR_NONE;
183 if (ipcp->ns.resolv != NULL) {
184 free(ipcp->ns.resolv);
185 ipcp->ns.resolv = NULL;
187 if (ipcp->ns.resolv_nons != NULL) {
188 free(ipcp->ns.resolv_nons);
189 ipcp->ns.resolv_nons = NULL;
191 ipcp->ns.resolver = 0;
203 if ((ipcp->ns.resolv_nons = (char *)malloc(st.st_size + 1)) == NULL)
206 else if ((ipcp->ns.resolv = (char *)malloc(st.st_size + 1)) == NULL) {
209 free(ipcp->ns.resolv_nons);
210 ipcp->ns.resolv_nons = NULL;
211 } else if ((got = read(fd, ipcp->ns.resolv, st.st_size)) != st.st_size) {
219 free(ipcp->ns.resolv_nons);
220 ipcp->ns.resolv_nons = NULL;
221 free(ipcp->ns.resolv);
222 ipcp->ns.resolv = NULL;
227 ipcp->ns.resolv[st.st_size] = '\0';
228 ipcp->ns.resolver = 1;
230 cp_nons = ipcp->ns.resolv_nons;
231 cp = ipcp->ns.resolv;
254 if (n < 2 && inet_aton(cp, ipcp->ns.dns))
269 while (cp_nons >= ipcp->ns.resolv_nons && *cp_nons == '\n')
271 if (n == 2 && ipcp->ns.dns[0].s_addr == INADDR_ANY) {
272 ipcp->ns.dns[0].s_addr = ipcp->ns.dns[1].s_addr;
273 ipcp->ns.dns[1].s_addr = INADDR_ANY;
275 bundle_AdjustDNS(ipcp->fsm.bundle);
286 ipcp_WriteDNS(struct ipcp *ipcp)
292 if (ipcp->ns.dns[0].s_addr == INADDR_ANY &&
293 ipcp->ns.dns[1].s_addr == INADDR_ANY) {
299 if (ipcp->ns.dns[0].s_addr == INADDR_ANY) {
300 ipcp->ns.dns[0].s_addr = ipcp->ns.dns[1].s_addr;
301 ipcp->ns.dns[1].s_addr = INADDR_ANY;
307 if (ipcp->ns.resolv_nons)
308 fputs(ipcp->ns.resolv_nons, fp);
309 paddr = inet_ntoa(ipcp->ns.dns[0]);
312 if (ipcp->ns.dns[1].s_addr != INADDR_ANY &&
313 ipcp->ns.dns[1].s_addr != INADDR_NONE &&
314 ipcp->ns.dns[1].s_addr != ipcp->ns.dns[0].s_addr) {
315 paddr = inet_ntoa(ipcp->ns.dns[1]);
334 ipcp_RestoreDNS(struct ipcp *ipcp)
336 if (ipcp->ns.resolver) {
341 len = strlen(ipcp->ns.resolv);
342 if ((got = write(fd, ipcp->ns.resolv, len)) != len) {
363 struct ipcp *ipcp = &arg->bundle->ncp.ipcp;
365 prompt_Printf(arg->prompt, "%s [%s]\n", ipcp->fsm.name,
366 State2Nam(ipcp->fsm.state));
367 if (ipcp->fsm.state == ST_OPENED) {
369 inet_ntoa(ipcp->peer_ip), vj2asc(ipcp->peer_compproto));
371 inet_ntoa(ipcp->my_ip), vj2asc(ipcp->my_compproto));
373 (unsigned long)ipcp_QueueLen(ipcp));
378 " REQ%s, %u Term REQ%s\n", ipcp->cfg.fsm.timeout,
379 ipcp->cfg.fsm.maxreq, ipcp->cfg.fsm.maxreq == 1 ? "" : "s",
380 ipcp->cfg.fsm.maxtrm, ipcp->cfg.fsm.maxtrm == 1 ? "" : "s");
382 ncprange_ntoa(&ipcp->cfg.my_range));
383 if (ipcp->cfg.HaveTriggerAddress)
385 inet_ntoa(ipcp->cfg.TriggerAddress));
388 "compression)\n", command_ShowNegval(ipcp->cfg.vj.neg),
389 ipcp->cfg.vj.slots, ipcp->cfg.vj.slotcomp ? "with" : "without");
391 if (iplist_isvalid(&ipcp->cfg.peer_list))
393 ipcp->cfg.peer_list.src);
396 ncprange_ntoa(&ipcp->cfg.peer_range));
399 ipcp->cfg.ns.dns[0].s_addr == INADDR_NONE ?
400 "none" : inet_ntoa(ipcp->cfg.ns.dns[0]));
401 if (ipcp->cfg.ns.dns[1].s_addr != INADDR_NONE)
403 inet_ntoa(ipcp->cfg.ns.dns[1]));
405 command_ShowNegval(ipcp->cfg.ns.dns_neg));
407 ipcp->ns.dns[0].s_addr == INADDR_NONE ?
408 "none" : inet_ntoa(ipcp->ns.dns[0]));
409 if (ipcp->ns.dns[1].s_addr != INADDR_NONE &&
410 ipcp->ns.dns[1].s_addr != ipcp->ns.dns[0].s_addr)
412 inet_ntoa(ipcp->ns.dns[1]));
414 inet_ntoa(ipcp->cfg.ns.nbns[0]));
416 inet_ntoa(ipcp->cfg.ns.nbns[1]));
418 throughput_disp(&ipcp->throughput, arg->prompt);
434 arg->bundle->ncp.ipcp.cfg.vj.slots = slots;
438 arg->bundle->ncp.ipcp.cfg.vj.slotcomp = 1;
440 arg->bundle->ncp.ipcp.cfg.vj.slotcomp = 0;
449 ipcp_Init(struct ipcp *ipcp, struct bundle *bundle, struct link *l,
458 fsm_Init(&ipcp->fsm, "IPCP", PROTO_IPCP, 1, IPCP_MAXCODE, LogIPCP,
461 ipcp->cfg.vj.slots = DEF_VJ_STATES;
462 ipcp->cfg.vj.slotcomp = 1;
463 memset(&ipcp->cfg.my_range, '\0', sizeof ipcp->cfg.my_range);
466 ipcp->cfg.netmask.s_addr = INADDR_ANY;
472 ncprange_setip4(&ipcp->cfg.my_range, host, ipcp->cfg.netmask);
473 ncprange_setip4(&ipcp->cfg.peer_range, ipcp->cfg.netmask, ipcp->cfg.netmask);
475 iplist_setsrc(&ipcp->cfg.peer_list, "");
476 ipcp->cfg.HaveTriggerAddress = 0;
478 ipcp->cfg.ns.dns[0].s_addr = INADDR_NONE;
479 ipcp->cfg.ns.dns[1].s_addr = INADDR_NONE;
480 ipcp->cfg.ns.dns_neg = 0;
481 ipcp->cfg.ns.nbns[0].s_addr = INADDR_ANY;
482 ipcp->cfg.ns.nbns[1].s_addr = INADDR_ANY;
484 ipcp->cfg.fsm.timeout = DEF_FSMRETRY;
485 ipcp->cfg.fsm.maxreq = DEF_FSMTRIES;
486 ipcp->cfg.fsm.maxtrm = DEF_FSMTRIES;
487 ipcp->cfg.vj.neg = NEG_ENABLED|NEG_ACCEPTED;
489 memset(&ipcp->vj, '\0', sizeof ipcp->vj);
491 ipcp->ns.resolv = NULL;
492 ipcp->ns.resolv_nons = NULL;
493 ipcp->ns.writable = 1;
494 ipcp_LoadDNS(ipcp);
496 throughput_init(&ipcp->throughput, SAMPLE_PERIOD);
497 memset(ipcp->Queue, '\0', sizeof ipcp->Queue);
498 ipcp_Setup(ipcp, INADDR_NONE);
502 ipcp_Destroy(struct ipcp *ipcp)
504 throughput_destroy(&ipcp->throughput);
506 if (ipcp->ns.resolv != NULL) {
507 free(ipcp->ns.resolv);
508 ipcp->ns.resolv = NULL;
510 if (ipcp->ns.resolv_nons != NULL) {
511 free(ipcp->ns.resolv_nons);
512 ipcp->ns.resolv_nons = NULL;
517 ipcp_SetLink(struct ipcp *ipcp, struct link *l)
519 ipcp->fsm.link = l;
523 ipcp_Setup(struct ipcp *ipcp, u_int32_t mask)
525 struct iface *iface = ipcp->fsm.bundle->iface;
531 ipcp->fsm.open_mode = 0;
532 ipcp->ifmask.s_addr = mask == INADDR_NONE ? ipcp->cfg.netmask.s_addr : mask;
534 if (iplist_isvalid(&ipcp->cfg.peer_list)) {
539 if ((pos = iplist_ip2pos(&ipcp->cfg.peer_list, peer)) != -1) {
540 ncpaddr_setip4(&ipaddr, iplist_setcurpos(&ipcp->cfg.peer_list, pos));
546 ncpaddr_setip4(&ipaddr, iplist_setrandpos(&ipcp->cfg.peer_list));
548 ncprange_sethost(&ipcp->cfg.peer_range, &ipaddr);
551 ipcp->heis1172 = 0;
552 ipcp->peer_req = 0;
553 ncprange_getip4addr(&ipcp->cfg.peer_range, &ipcp->peer_ip);
554 ipcp->peer_compproto = 0;
556 if (ipcp->cfg.HaveTriggerAddress) {
562 ipcp->my_ip = ipcp->cfg.TriggerAddress;
564 inet_ntoa(ipcp->cfg.TriggerAddress));
574 if (ncprange_contains(&ipcp->cfg.my_range, &ipaddr)) {
575 ncpaddr_getip4(&ipaddr, &ipcp->my_ip);
580 ncprange_getip4addr(&ipcp->cfg.my_range, &ipcp->my_ip);
583 if (IsEnabled(ipcp->cfg.vj.neg)
585 || (ipcp->fsm.bundle->radius.valid && ipcp->fsm.bundle->radius.vj)
588 ipcp->my_compproto = (PROTO_VJCOMP << 16) +
589 ((ipcp->cfg.vj.slots - 1) << 8) +
590 ipcp->cfg.vj.slotcomp;
592 ipcp->my_compproto = 0;
593 sl_compress_init(&ipcp->vj.cslc, ipcp->cfg.vj.slots - 1);
595 ipcp->peer_reject = 0;
596 ipcp->my_reject = 0;
598 /* Copy startup values into ipcp->ns.dns */
599 if (ipcp->cfg.ns.dns[0].s_addr != INADDR_NONE)
600 memcpy(ipcp->ns.dns, ipcp->cfg.ns.dns, sizeof ipcp->ns.dns);
622 ipcp_proxyarp(struct ipcp *ipcp,
626 struct bundle *bundle = ipcp->fsm.bundle;
665 ipcp_SetIPaddress(struct ipcp *ipcp, struct in_addr myaddr,
668 struct bundle *bundle = ipcp->fsm.bundle;
685 if (ipcp->ifmask.s_addr != INADDR_ANY &&
686 (ipcp->ifmask.s_addr & mask.s_addr) == mask.s_addr)
687 ncprange_setip4mask(&myrange, ipcp->ifmask);
720 for (f = 0; f < bundle->ncp.ipcp.cfg.peer_list.nItems; f++) {
721 try = iplist_next(&bundle->ncp.ipcp.cfg.peer_list);
724 if (ipcp_SetIPaddress(&bundle->ncp.ipcp, gw, try)) {
730 if (f == bundle->ncp.ipcp.cfg.peer_list.nItems) {
742 struct ipcp *ipcp = fsm2ipcp(fp);
744 fp->FsmTimer.load = ipcp->cfg.fsm.timeout * SECTICKS;
747 fp->restart = ipcp->cfg.fsm.maxreq;
750 fp->restart = ipcp->cfg.fsm.maxtrm;
763 struct ipcp *ipcp = fsm2ipcp(fp);
769 if ((p && !physical_IsSync(p)) || !REJECTED(ipcp, TY_IPADDR)) {
770 memcpy(o->data, &ipcp->my_ip.s_addr, 4);
774 if (ipcp->my_compproto && !REJECTED(ipcp, TY_COMPPROTO)) {
775 if (ipcp->heis1172) {
783 req.proto = htons(ipcp->my_compproto >> 16);
784 req.slots = (ipcp->my_compproto >> 8) & 255;
785 req.compcid = ipcp->my_compproto & 1;
791 if (IsEnabled(ipcp->cfg.ns.dns_neg)) {
792 if (!REJECTED(ipcp, TY_PRIMARY_DNS - TY_ADJUST_NS)) {
793 memcpy(o->data, &ipcp->ns.dns[0].s_addr, 4);
797 if (!REJECTED(ipcp, TY_SECONDARY_DNS - TY_ADJUST_NS)) {
798 memcpy(o->data, &ipcp->ns.dns[1].s_addr, 4);
824 struct ipcp *ipcp = fsm2ipcp(fp);
827 throughput_start(&ipcp->throughput, "IPCP throughput",
829 fp->more.reqs = fp->more.naks = fp->more.rejs = ipcp->cfg.fsm.maxreq * 3;
830 ipcp->peer_req = 0;
837 struct ipcp *ipcp = fsm2ipcp(fp);
840 throughput_stop(&ipcp->throughput);
841 throughput_log(&ipcp->throughput, LogIPCP, NULL);
848 ipcp_IfaceAddrAdded(struct ipcp *ipcp, const struct iface_addr *addr)
850 struct bundle *bundle = ipcp->fsm.bundle;
853 ipcp_proxyarp(ipcp, arp_SetProxy, addr);
860 ipcp_IfaceAddrDeleted(struct ipcp *ipcp, const struct iface_addr *addr)
862 struct bundle *bundle = ipcp->fsm.bundle;
865 ipcp_proxyarp(ipcp, arp_ClearProxy, addr);
872 struct ipcp *ipcp = fsm2ipcp(fp);
877 snprintf(addr, sizeof addr, "%s", inet_ntoa(ipcp->my_ip));
883 fp->bundle->links, RAD_STOP, &ipcp->throughput);
904 ipcp_Setup(ipcp, INADDR_NONE);
910 ipcp_InterfaceUp(struct ipcp *ipcp)
912 if (!ipcp_SetIPaddress(ipcp, ipcp->my_ip, ipcp->peer_ip)) {
917 if (!iface_SetFlags(ipcp->fsm.bundle->iface->name, IFF_UP)) {
919 ipcp->fsm.bundle->iface->name);
924 if (ipcp->fsm.bundle->NatEnabled)
925 LibAliasSetAddress(la, ipcp->my_ip);
935 struct ipcp *ipcp = fsm2ipcp(fp);
939 snprintf(tbuff, sizeof tbuff, "%s", inet_ntoa(ipcp->my_ip));
941 tbuff, inet_ntoa(ipcp->peer_ip));
943 if (ipcp->peer_compproto >> 16 == PROTO_VJCOMP)
944 sl_compress_init(&ipcp->vj.cslc, (ipcp->peer_compproto >> 8) & 255);
946 if (!ipcp_InterfaceUp(ipcp))
950 radius_Account_Set_Ip(&fp->bundle->radacct, &ipcp->peer_ip, &ipcp->ifmask);
952 RAD_START, &ipcp->throughput);
973 fp->more.reqs = fp->more.naks = fp->more.rejs = ipcp->cfg.fsm.maxreq * 3;
980 ipcp_ValidateReq(struct ipcp *ipcp, struct in_addr ip, struct fsm_decode *dec)
982 struct bundle *bundle = ipcp->fsm.bundle;
987 if (iplist_isvalid(&ipcp->cfg.peer_list)) {
988 ncprange_getip4addr(&ipcp->cfg.my_range, &myaddr);
990 iplist_ip2pos(&ipcp->cfg.peer_list, ip) < 0 ||
991 !ipcp_SetIPaddress(ipcp, myaddr, ip)) {
1002 if (iplist_ip2pos(&ipcp->cfg.peer_list, peer) >= 0) {
1003 ipcp->peer_ip = peer;
1010 ipcp->peer_ip = ChooseHisAddr(bundle, myaddr);
1013 if (ipcp->peer_ip.s_addr == INADDR_ANY) {
1021 memcpy(dec->nakend, &ipcp->peer_ip.s_addr, 4);
1027 !ncprange_containsip4(&ipcp->cfg.peer_range, ip)) {
1035 if (ncprange_contains(&ipcp->cfg.peer_range, &iface->addr[n].peer)) {
1042 memcpy(dec->nakend, &ipcp->peer_ip.s_addr, 4);
1048 ipcp->peer_ip = ip;
1061 struct ipcp *ipcp = fsm2ipcp(fp);
1085 ipcp->peer_req = 1;
1086 ipcp_ValidateReq(ipcp, ipaddr, dec);
1090 if (ncprange_containsip4(&ipcp->cfg.my_range, ipaddr)) {
1093 inet_ntoa(ipcp->my_ip));
1095 ipcp->my_ip = ipaddr;
1096 ncpaddr_setip4(&ncpaddr, ipcp->my_ip);
1101 fsm_Close(&ipcp->fsm);
1106 ipcp->peer_reject |= (1 << opt->hdr.id);
1119 if (!IsAccepted(ipcp->cfg.vj.neg))
1127 ipcp->heis1172 = 1;
1128 ipcp->peer_compproto = compproto;
1143 ipcp->peer_compproto = compproto;
1144 ipcp->heis1172 = 0;
1148 ipcp->heis1172 = 0;
1183 tbuff, ipcp->my_compproto, compproto);
1184 ipcp->my_compproto = compproto;
1188 ipcp->peer_reject |= (1 << opt->hdr.id);
1217 if (!IsAccepted(ipcp->cfg.ns.dns_neg)) {
1218 ipcp->my_reject |= (1 << (opt->hdr.id - TY_ADJUST_NS));
1222 have_ip = ipcp->ns.dns[opt->hdr.id == TY_PRIMARY_DNS ? 0 : 1];
1225 ipaddr.s_addr == ipcp->ns.dns[1].s_addr) {
1227 ipcp->ns.dns[0] = ipcp->ns.dns[1];
1228 ipcp->ns.dns[1] = have_ip;
1229 have_ip = ipcp->ns.dns[0];
1251 if (IsEnabled(ipcp->cfg.ns.dns_neg)) {
1253 memcpy(&ipcp->ns.dns[opt->hdr.id == TY_PRIMARY_DNS ? 0 : 1].s_addr,
1259 ipcp->peer_reject |= (1 << (opt->hdr.id - TY_ADJUST_NS));
1272 ipcp->cfg.ns.nbns[opt->hdr.id == TY_PRIMARY_NBNS ? 0 : 1].s_addr;
1276 ipcp->my_reject |= (1 << (opt->hdr.id - TY_ADJUST_NS));
1302 ipcp->my_reject |= (1 << opt->hdr.id);
1310 if (ipcp->ns.writable) {
1312 if (!ipcp_WriteDNS(ipcp)) {
1313 ipcp->peer_reject |= (1 << (TY_PRIMARY_DNS - TY_ADJUST_NS));
1314 ipcp->peer_reject |= (1 << (TY_SECONDARY_DNS - TY_ADJUST_NS));
1324 if (mode_type == MODE_REQ && !ipcp->peer_req) {
1333 ipcp->peer_req = 1;
1336 ipcp_ValidateReq(ipcp, ipaddr, dec);
1348 fsm_Input(&bundle->ncp.ipcp.fsm, bp);
1361 struct ipcp *ipcp = &bundle->ncp.ipcp;
1364 memset(&ipcp->cfg.peer_range, '\0', sizeof ipcp->cfg.peer_range);
1365 iplist_reset(&ipcp->cfg.peer_list);
1366 ipcp->peer_ip = hisaddr;
1367 ncprange_setip4host(&ipcp->cfg.peer_range, hisaddr);
1368 ncprange_getip4addr(&ipcp->cfg.my_range, &myaddr);
1370 return ipcp_SetIPaddress(ipcp, myaddr, hisaddr);
1378 struct ipcp *ipcp = &ncp->ipcp;
1382 memset(&ipcp->cfg.peer_range, '\0', sizeof ipcp->cfg.peer_range);
1383 iplist_reset(&ipcp->cfg.peer_list);
1385 iplist_setsrc(&ipcp->cfg.peer_list, hisaddr);
1386 if (iplist_isvalid(&ipcp->cfg.peer_list)) {
1387 iplist_setrandpos(&ipcp->cfg.peer_list);
1388 ipcp->peer_ip = ChooseHisAddr(bundle, ipcp->my_ip);
1389 if (ipcp->peer_ip.s_addr == INADDR_ANY) {
1390 log_Printf(LogWARN, "%s: None available !\n", ipcp->cfg.peer_list.src);
1393 ncprange_setip4host(&ipcp->cfg.peer_range, ipcp->peer_ip);
1398 } else if (ncprange_aton(&ipcp->cfg.peer_range, ncp, hisaddr) != 0) {
1399 if (ncprange_family(&ipcp->cfg.my_range) != AF_INET) {
1403 ncprange_getip4addr(&ipcp->cfg.my_range, &myaddr);
1404 ncprange_getip4addr(&ipcp->cfg.peer_range, &ipcp->peer_ip);
1406 if (setaddr && !ipcp_SetIPaddress(ipcp, myaddr, ipcp->peer_ip))
1411 ncpaddr_setip4(&ncpaddr, ipcp->peer_ip);
1431 ipcp_QueueLen(struct ipcp *ipcp)
1437 for (q = ipcp->Queue; q < ipcp->Queue + IPCP_QUEUES(ipcp); q++)
1444 ipcp_PushPacket(struct ipcp *ipcp, struct link *l)
1446 struct bundle *bundle = ipcp->fsm.bundle;
1453 if (ipcp->fsm.state != ST_OPENED)
1464 queue = ipcp->Queue + IPCP_QUEUES(ipcp) - 1;
1478 ipcp_AddOutOctets(ipcp, m_len);
1481 } while (queue-- != ipcp->Queue);