void route_Change(struct bundle *bundle, struct sticky_route *r, const struct ncpaddr *me, const struct ncpaddr *peer) { struct ncpaddr dst; for (; r; r = r->next) { ncprange_getaddr(&r->dst, &dst); if (ncpaddr_family(me) == AF_INET) { if ((r->type & ROUTE_DSTMYADDR) && !ncpaddr_equal(&dst, me)) { rt_Set(bundle, RTM_DELETE, &r->dst, NULL, 1, 0); ncprange_sethost(&r->dst, me); if (r->type & ROUTE_GWHISADDR) ncpaddr_copy(&r->gw, peer); } else if ((r->type & ROUTE_DSTHISADDR) && !ncpaddr_equal(&dst, peer)) { rt_Set(bundle, RTM_DELETE, &r->dst, NULL, 1, 0); ncprange_sethost(&r->dst, peer); if (r->type & ROUTE_GWHISADDR) ncpaddr_copy(&r->gw, peer); } else if ((r->type & ROUTE_DSTDNS0) && !ncpaddr_equal(&dst, peer)) { if (bundle->ncp.ipcp.ns.dns[0].s_addr == INADDR_NONE) continue; rt_Set(bundle, RTM_DELETE, &r->dst, NULL, 1, 0); if (r->type & ROUTE_GWHISADDR) ncpaddr_copy(&r->gw, peer); } else if ((r->type & ROUTE_DSTDNS1) && !ncpaddr_equal(&dst, peer)) { if (bundle->ncp.ipcp.ns.dns[1].s_addr == INADDR_NONE) continue; rt_Set(bundle, RTM_DELETE, &r->dst, NULL, 1, 0); if (r->type & ROUTE_GWHISADDR) ncpaddr_copy(&r->gw, peer); } else if ((r->type & ROUTE_GWHISADDR) && !ncpaddr_equal(&r->gw, peer)) ncpaddr_copy(&r->gw, peer); #ifndef NOINET6 } else if (ncpaddr_family(me) == AF_INET6) { if ((r->type & ROUTE_DSTMYADDR6) && !ncpaddr_equal(&dst, me)) { rt_Set(bundle, RTM_DELETE, &r->dst, NULL, 1, 0); ncprange_sethost(&r->dst, me); if (r->type & ROUTE_GWHISADDR) ncpaddr_copy(&r->gw, peer); } else if ((r->type & ROUTE_DSTHISADDR6) && !ncpaddr_equal(&dst, peer)) { rt_Set(bundle, RTM_DELETE, &r->dst, NULL, 1, 0); ncprange_sethost(&r->dst, peer); if (r->type & ROUTE_GWHISADDR) ncpaddr_copy(&r->gw, peer); } else if ((r->type & ROUTE_GWHISADDR6) && !ncpaddr_equal(&r->gw, peer)) ncpaddr_copy(&r->gw, peer); #endif } rt_Set(bundle, RTM_ADD, &r->dst, &r->gw, 1, 0); } }
void filter_AdjustAddr(struct filter *filter, struct ncpaddr *local, struct ncpaddr *remote, struct in_addr *dns) { struct filterent *fp; int n; for (fp = filter->rule, n = 0; n < MAXFILTERS; fp++, n++) if (fp->f_action != A_NONE) { if (local) { if (fp->f_srctype == T_MYADDR && ncpaddr_family(local) == AF_INET) ncprange_sethost(&fp->f_src, local); if (fp->f_dsttype == T_MYADDR && ncpaddr_family(local) == AF_INET) ncprange_sethost(&fp->f_dst, local); #ifndef NOINET6 if (fp->f_srctype == T_MYADDR6 && ncpaddr_family(local) == AF_INET6) ncprange_sethost(&fp->f_src, local); if (fp->f_dsttype == T_MYADDR6 && ncpaddr_family(local) == AF_INET6) ncprange_sethost(&fp->f_dst, local); #endif } if (remote) { if (fp->f_srctype == T_HISADDR && ncpaddr_family(remote) == AF_INET) ncprange_sethost(&fp->f_src, remote); if (fp->f_dsttype == T_HISADDR && ncpaddr_family(remote) == AF_INET) ncprange_sethost(&fp->f_dst, remote); #ifndef NOINET6 if (fp->f_srctype == T_HISADDR6 && ncpaddr_family(remote) == AF_INET6) ncprange_sethost(&fp->f_src, remote); if (fp->f_dsttype == T_HISADDR6 && ncpaddr_family(remote) == AF_INET6) ncprange_sethost(&fp->f_dst, remote); #endif } if (dns) { if (fp->f_srctype == T_DNS0) ncprange_setip4host(&fp->f_src, dns[0]); if (fp->f_dsttype == T_DNS0) ncprange_setip4host(&fp->f_dst, dns[0]); if (fp->f_srctype == T_DNS1) ncprange_setip4host(&fp->f_src, dns[1]); if (fp->f_dsttype == T_DNS1) ncprange_setip4host(&fp->f_dst, dns[1]); } } }
void ncprange_set(struct ncprange *range, const struct ncpaddr *addr, int width) { ncprange_sethost(range, addr); ncprange_setwidth(range, width); }