void
remove_iroutes_from_push_route_list(struct options *o)
{
- if (o && o->push_list.head && o->iroutes)
+ if (o && o->push_list.head && (o->iroutes || o->iroutes_ipv6))
{
struct gc_arena gc = gc_new();
struct push_entry *e = o->push_list.head;
&& parse_line(e->option, p, SIZE(p), "[PUSH_ROUTE_REMOVE]", 1, D_ROUTE_DEBUG, &gc))
{
/* is the push item a route directive? */
- if (p[0] && !strcmp(p[0], "route") && !p[3])
+ if (p[0] && !strcmp(p[0], "route") && !p[3] && o->iroutes)
{
/* get route parameters */
bool status1, status2;
}
}
}
+ else if (p[0] && !strcmp(p[0], "route-ipv6") && !p[2]
+ && o->iroutes_ipv6)
+ {
+ /* get route parameters */
+ struct in6_addr network;
+ unsigned int netbits;
+
+ /* parse route-ipv6 arguments */
+ if (get_ipv6_addr(p[1], &network, &netbits, D_ROUTE_DEBUG))
+ {
+ struct iroute_ipv6 *ir;
+
+ /* does this route-ipv6 match an iroute-ipv6? */
+ for (ir = o->iroutes_ipv6; ir != NULL; ir = ir->next)
+ {
+ if (!memcmp(&network, &ir->network, sizeof(network))
+ && netbits == ir->netbits)
+ {
+ enable = false;
+ break;
+ }
+ }
+ }
+ }
/* should we copy the push item? */
e->enable = enable;