Lines Matching +full:y +full:- +full:rp
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>
97 (int)phost->sa_family, (int)phost->sa_len); in p_sockaddr()
98 inet_ntop(phost->sa_family, phost->sa_data, tmp, sizeof tmp); in p_sockaddr()
101 inet_ntop(pmask->sa_family, pmask->sa_data, tmp, sizeof tmp); in p_sockaddr()
106 switch (phost->sa_family) { in p_sockaddr()
113 prompt_Printf(prompt, "%-*s ", width - 1, "default"); in p_sockaddr()
115 prompt_Printf(prompt, "%-*s ", width - 1, ncprange_ntoa(&range)); in p_sockaddr()
119 if (dl->sdl_nlen) in p_sockaddr()
120 snprintf(buf, sizeof buf, "%.*s", dl->sdl_nlen, dl->sdl_data); in p_sockaddr()
121 else if (dl->sdl_alen) { in p_sockaddr()
122 if (dl->sdl_type == IFT_ETHER) { in p_sockaddr()
123 if (dl->sdl_alen < sizeof buf / 3) { in p_sockaddr()
127 MAC = (u_char *)dl->sdl_data + dl->sdl_nlen; in p_sockaddr()
128 for (f = 0; f < dl->sdl_alen; f++) in p_sockaddr()
130 buf[f*3-1] = '\0'; in p_sockaddr()
134 sprintf(buf, "<IFT type %d>", dl->sdl_type); in p_sockaddr()
135 } else if (dl->sdl_slen) in p_sockaddr()
136 sprintf(buf, "<slen %d?>", dl->sdl_slen); in p_sockaddr()
138 sprintf(buf, "link#%d", dl->sdl_index); in p_sockaddr()
142 sprintf(buf, "<AF type %d>", phost->sa_family); in p_sockaddr()
146 prompt_Printf(prompt, "%-*s ", width-1, buf); in p_sockaddr()
186 if (max > sizeof name - 1) in p_flags()
187 max = sizeof name - 1; in p_flags()
189 for (flags = name; p->b_mask && flags - name < (int)max; p++) in p_flags()
190 if (p->b_mask & f) in p_flags()
191 *flags++ = p->b_val; in p_flags()
193 prompt_Printf(prompt, "%-*.*s", (int)max, (int)max, name); in p_flags()
196 static int route_nifs = -1;
210 if (idx > route_nifs || (idx > 0 && ifs[idx-1] == NULL)) { in Index2Nam()
245 for (ptr = buf; ptr < end; ptr += ifm->ifm_msglen) { in Index2Nam()
247 if (ifm->ifm_type != RTM_IFINFO) in Index2Nam()
250 if (ifm->ifm_index > 0) { in Index2Nam()
251 if (ifm->ifm_index > have) { in Index2Nam()
255 have = ifm->ifm_index + 5; in Index2Nam()
271 memset(ifs + had, '\0', sizeof(char *) * (have - had)); in Index2Nam()
273 if (ifs[ifm->ifm_index-1] == NULL) { in Index2Nam()
274 ifs[ifm->ifm_index-1] = (char *)malloc(dl->sdl_nlen+1); in Index2Nam()
275 if (ifs[ifm->ifm_index-1] == NULL) in Index2Nam()
277 ifm->ifm_index); in Index2Nam()
279 memcpy(ifs[ifm->ifm_index-1], dl->sdl_data, dl->sdl_nlen); in Index2Nam()
280 ifs[ifm->ifm_index-1][dl->sdl_nlen] = '\0'; in Index2Nam()
281 if (route_nifs < ifm->ifm_index) in Index2Nam()
282 route_nifs = ifm->ifm_index; in Index2Nam()
286 log_Printf(LogDEBUG, "Skipping out-of-range interface %d!\n", in Index2Nam()
287 ifm->ifm_index); in Index2Nam()
302 if (idx < 1 || idx > route_nifs || ifs[idx-1] == NULL) in Index2Nam()
305 return ifs[idx-1]; in Index2Nam()
317 if (rtm->rtm_addrs & (1 << rtax)) { in route_ParseHdr()
319 wp += ROUNDUP(sa[rtax]->sa_len); in route_ParseHdr()
320 if (sa[rtax]->sa_family == 0) in route_ParseHdr()
355 prompt_Printf(arg->prompt, "%-20s%-20sFlags Netif\n", in route_Show()
357 for (cp = sp; cp < ep; cp += rtm->rtm_msglen) { in route_Show()
363 p_sockaddr(arg->prompt, sa[RTAX_DST], sa[RTAX_NETMASK], 20); in route_Show()
364 p_sockaddr(arg->prompt, sa[RTAX_GATEWAY], NULL, 20); in route_Show()
366 p_flags(arg->prompt, rtm->rtm_flags, 6); in route_Show()
367 prompt_Printf(arg->prompt, " %s\n", Index2Nam(rtm->rtm_index)); in route_Show()
369 prompt_Printf(arg->prompt, "<can't parse routing entry>\n"); in route_Show()
389 log_Printf(LogDEBUG, "route_IfDelete (%d)\n", bundle->iface->index); in route_IfDelete()
418 * deletes all non-cloned routes. This is done to avoid in route_IfDelete()
419 * potential errors from trying to delete route X after route Y where in route_IfDelete()
420 * route X was cloned from route Y (and is no longer there 'cos it in route_IfDelete()
421 * may have gone with route Y). in route_IfDelete()
426 for (cp = sp; cp < ep; cp += rtm->rtm_msglen) { in route_IfDelete()
429 if (rtm->rtm_index == bundle->iface->index && in route_IfDelete()
431 (sa[RTAX_DST]->sa_family == AF_INET in route_IfDelete()
433 || sa[RTAX_DST]->sa_family == AF_INET6 in route_IfDelete()
436 (all || (rtm->rtm_flags & RTF_GATEWAY))) { in route_IfDelete()
445 if (sa[RTAX_GATEWAY]->sa_family == AF_INET || in route_IfDelete()
447 sa[RTAX_GATEWAY]->sa_family == AF_INET6 || in route_IfDelete()
449 sa[RTAX_GATEWAY]->sa_family == AF_LINK) { in route_IfDelete()
458 sa[RTAX_GATEWAY]->sa_family); in route_IfDelete()
479 log_Printf(LogDEBUG, "route_UpdateMTU (%d)\n", bundle->iface->index); in route_UpdateMTU()
505 for (cp = sp; cp < ep; cp += rtm->rtm_msglen) { in route_UpdateMTU()
508 if (sa[RTAX_DST] && (sa[RTAX_DST]->sa_family == AF_INET in route_UpdateMTU()
510 || sa[RTAX_DST]->sa_family == AF_INET6 in route_UpdateMTU()
513 sa[RTAX_GATEWAY] && rtm->rtm_index == bundle->iface->index) { in route_UpdateMTU()
517 " mtu %lu\n", rtm->rtm_index, Index2Nam(rtm->rtm_index), in route_UpdateMTU()
518 ncprange_ntoa(&dst), bundle->iface->mtu); in route_UpdateMTU()
534 while (route_nifs == -1 || idx < route_nifs) in GetIfIndex()
539 return -1; in GetIfIndex()
548 for (; r; r = r->next) { in route_Change()
549 ncprange_getaddr(&r->dst, &dst); in route_Change()
551 if ((r->type & ROUTE_DSTMYADDR) && !ncpaddr_equal(&dst, me)) { in route_Change()
552 rt_Set(bundle, RTM_DELETE, &r->dst, NULL, 1, 0); in route_Change()
553 ncprange_sethost(&r->dst, me); in route_Change()
554 if (r->type & ROUTE_GWHISADDR) in route_Change()
555 ncpaddr_copy(&r->gw, peer); in route_Change()
556 } else if ((r->type & ROUTE_DSTHISADDR) && !ncpaddr_equal(&dst, peer)) { in route_Change()
557 rt_Set(bundle, RTM_DELETE, &r->dst, NULL, 1, 0); in route_Change()
558 ncprange_sethost(&r->dst, peer); in route_Change()
559 if (r->type & ROUTE_GWHISADDR) in route_Change()
560 ncpaddr_copy(&r->gw, peer); in route_Change()
561 } else if ((r->type & ROUTE_DSTDNS0) && !ncpaddr_equal(&dst, peer)) { in route_Change()
562 if (bundle->ncp.ipcp.ns.dns[0].s_addr == INADDR_NONE) in route_Change()
564 rt_Set(bundle, RTM_DELETE, &r->dst, NULL, 1, 0); in route_Change()
565 if (r->type & ROUTE_GWHISADDR) in route_Change()
566 ncpaddr_copy(&r->gw, peer); in route_Change()
567 } else if ((r->type & ROUTE_DSTDNS1) && !ncpaddr_equal(&dst, peer)) { in route_Change()
568 if (bundle->ncp.ipcp.ns.dns[1].s_addr == INADDR_NONE) in route_Change()
570 rt_Set(bundle, RTM_DELETE, &r->dst, NULL, 1, 0); in route_Change()
571 if (r->type & ROUTE_GWHISADDR) in route_Change()
572 ncpaddr_copy(&r->gw, peer); in route_Change()
573 } else if ((r->type & ROUTE_GWHISADDR) && !ncpaddr_equal(&r->gw, peer)) in route_Change()
574 ncpaddr_copy(&r->gw, peer); in route_Change()
577 if ((r->type & ROUTE_DSTMYADDR6) && !ncpaddr_equal(&dst, me)) { in route_Change()
578 rt_Set(bundle, RTM_DELETE, &r->dst, NULL, 1, 0); in route_Change()
579 ncprange_sethost(&r->dst, me); in route_Change()
580 if (r->type & ROUTE_GWHISADDR) in route_Change()
581 ncpaddr_copy(&r->gw, peer); in route_Change()
582 } else if ((r->type & ROUTE_DSTHISADDR6) && !ncpaddr_equal(&dst, peer)) { in route_Change()
583 rt_Set(bundle, RTM_DELETE, &r->dst, NULL, 1, 0); in route_Change()
584 ncprange_sethost(&r->dst, peer); in route_Change()
585 if (r->type & ROUTE_GWHISADDR) in route_Change()
586 ncpaddr_copy(&r->gw, peer); in route_Change()
587 } else if ((r->type & ROUTE_GWHISADDR6) && !ncpaddr_equal(&r->gw, peer)) in route_Change()
588 ncpaddr_copy(&r->gw, peer); in route_Change()
591 rt_Set(bundle, RTM_ADD, &r->dst, &r->gw, 1, 0); in route_Change()
596 route_Add(struct sticky_route **rp, int type, const struct ncprange *dst, in route_Add() argument
603 while (*rp) { in route_Add()
604 if ((dsttype && dsttype == ((*rp)->type & ROUTE_DSTANY)) || in route_Add()
605 (!dsttype && ncprange_equal(&(*rp)->dst, dst))) { in route_Add()
606 /* Oops, we already have this route - unlink it */ in route_Add()
608 r = *rp; in route_Add()
609 *rp = r->next; in route_Add()
611 rp = &(*rp)->next; in route_Add()
621 r->type = type; in route_Add()
622 r->next = NULL; in route_Add()
623 ncprange_copy(&r->dst, dst); in route_Add()
624 ncpaddr_copy(&r->gw, gw); in route_Add()
625 *rp = r; in route_Add()
629 route_Delete(struct sticky_route **rp, int type, const struct ncprange *dst) in route_Delete() argument
634 for (; *rp; rp = &(*rp)->next) { in route_Delete()
635 if ((dsttype && dsttype == ((*rp)->type & ROUTE_DSTANY)) || in route_Delete()
636 (!dsttype && ncprange_equal(dst, &(*rp)->dst))) { in route_Delete()
637 r = *rp; in route_Delete()
638 *rp = r->next; in route_Delete()
646 route_DeleteAll(struct sticky_route **rp) in route_DeleteAll() argument
650 for (r = *rp; r; r = rn) { in route_DeleteAll()
651 rn = r->next; in route_DeleteAll()
654 *rp = NULL; in route_DeleteAll()
666 prompt_Printf(p, "%s:%*s", tag, indent - tlen - 1, ""); in route_ShowSticky()
668 for (; r; r = r->next) { in route_ShowSticky()
671 if (r->type & ROUTE_DSTMYADDR) in route_ShowSticky()
673 else if (r->type & ROUTE_DSTMYADDR6) in route_ShowSticky()
675 else if (r->type & ROUTE_DSTHISADDR) in route_ShowSticky()
677 else if (r->type & ROUTE_DSTHISADDR6) in route_ShowSticky()
679 else if (r->type & ROUTE_DSTDNS0) in route_ShowSticky()
681 else if (r->type & ROUTE_DSTDNS1) in route_ShowSticky()
683 else if (ncprange_isdefault(&r->dst)) in route_ShowSticky()
686 prompt_Printf(p, "%s", ncprange_ntoa(&r->dst)); in route_ShowSticky()
688 if (r->type & ROUTE_GWHISADDR) in route_ShowSticky()
690 else if (r->type & ROUTE_GWHISADDR6) in route_ShowSticky()
693 prompt_Printf(p, " %s\n", ncpaddr_ntoa(&r->gw)); in route_ShowSticky()
710 memset(cp + len, '\0', padlen - len); in memcpy_roundup()
721 if (sa->sa_family != AF_INET6) in add_scope()
724 if (!IN6_IS_ADDR_LINKLOCAL(&sa6->sin6_addr) && in add_scope()
725 !IN6_IS_ADDR_MC_LINKLOCAL(&sa6->sin6_addr)) in add_scope()
727 if (*(u_int16_t *)&sa6->sin6_addr.s6_addr[2] != 0) in add_scope()
729 *(u_int16_t *)&sa6->sin6_addr.s6_addr[2] = htons(ifindex); in add_scope()
757 rtmes.m_rtm.rtm_seq = ++bundle->routing_seq; in rt_Set()
762 if (bundle->ncp.cfg.sendpipe > 0) { in rt_Set()
763 rtmes.m_rtm.rtm_rmx.rmx_sendpipe = bundle->ncp.cfg.sendpipe; in rt_Set()
766 if (bundle->ncp.cfg.recvpipe > 0) { in rt_Set()
767 rtmes.m_rtm.rtm_rmx.rmx_recvpipe = bundle->ncp.cfg.recvpipe; in rt_Set()
774 add_scope((struct sockaddr *)&sadst, bundle->iface->index); in rt_Set()
787 add_scope((struct sockaddr *)&sagw, bundle->iface->index); in rt_Set()
807 nb = cp - (char *)&rtmes; in rt_Set()
832 log_Printf(LogWARN, "Del route failed: %s: Non-existent\n", in rt_Set()
878 rtmes.m_rtm.rtm_seq = ++bundle->routing_seq; in rt_Update()
882 if (bundle->ncp.cfg.sendpipe > 0) { in rt_Update()
883 rtmes.m_rtm.rtm_rmx.rmx_sendpipe = bundle->ncp.cfg.sendpipe; in rt_Update()
887 if (bundle->ncp.cfg.recvpipe > 0) { in rt_Update()
888 rtmes.m_rtm.rtm_rmx.rmx_recvpipe = bundle->ncp.cfg.recvpipe; in rt_Update()
892 rtmes.m_rtm.rtm_rmx.rmx_mtu = bundle->iface->mtu; in rt_Update()
898 p += memcpy_roundup(p, dst, dst->sa_len); in rt_Update()
903 p += memcpy_roundup(p, gw, gw->sa_len); in rt_Update()
908 p += memcpy_roundup(p, mask, mask->sa_len); in rt_Update()
912 if (ifa && ifp && ifp->sa_family == AF_LINK) { in rt_Update()
914 p += memcpy_roundup(p, ifp, ifp->sa_len); in rt_Update()
916 p += memcpy_roundup(p, ifa, ifa->sa_len); in rt_Update()
919 rtmes.m_rtm.rtm_msglen = p - (char *)&rtmes; in rt_Update()