diff --git a/src/openvpn/dco.c b/src/openvpn/dco.c index ad35fee8..78023eea 100644 --- a/src/openvpn/dco.c +++ b/src/openvpn/dco.c @@ -603,26 +603,14 @@ dco_install_iroute(struct multi_context *m, struct multi_instance *mi, if (addrtype == MR_ADDR_IPV6) { - int netbits = 128; - if (addr->type & MR_WITH_NETBITS) - { - netbits = addr->netbits; - } - - net_route_v6_add(&m->top.net_ctx, &addr->v6.addr, netbits, + net_route_v6_add(&m->top.net_ctx, &addr->v6.addr, addr->netbits, &mi->context.c2.push_ifconfig_ipv6_local, dev, 0, DCO_IROUTE_METRIC); } else if (addrtype == MR_ADDR_IPV4) { - int netbits = 32; - if (addr->type & MR_WITH_NETBITS) - { - netbits = addr->netbits; - } - in_addr_t dest = htonl(addr->v4.addr); - net_route_v4_add(&m->top.net_ctx, &dest, netbits, + net_route_v4_add(&m->top.net_ctx, &dest, addr->netbits, &mi->context.c2.push_ifconfig_local, dev, 0, DCO_IROUTE_METRIC); } diff --git a/src/openvpn/multi.c b/src/openvpn/multi.c index 95414429..b58bea7b 100644 --- a/src/openvpn/multi.c +++ b/src/openvpn/multi.c @@ -1241,6 +1241,7 @@ multi_learn_in_addr_t(struct multi_context *m, /* "primary" is the VPN ifconfig address of the peer and already * known to DCO, so only install "extra" iroutes (primary = false) */ + ASSERT(netbits >= 0); /* DCO requires populated netbits */ dco_install_iroute(m, mi, &addr); } @@ -1280,6 +1281,7 @@ multi_learn_in6_addr(struct multi_context *m, /* "primary" is the VPN ifconfig address of the peer and already * known to DCO, so only install "extra" iroutes (primary = false) */ + ASSERT(netbits >= 0); /* DCO requires populated netbits */ dco_install_iroute(m, mi, &addr); } diff --git a/src/openvpn/options.c b/src/openvpn/options.c index f82457e4..a296086d 100644 --- a/src/openvpn/options.c +++ b/src/openvpn/options.c @@ -1572,12 +1572,14 @@ option_iroute(struct options *o, ALLOC_OBJ_GC(ir, struct iroute, &o->gc); ir->network = getaddr(GETADDR_HOST_ORDER, network_str, 0, NULL, NULL); - ir->netbits = -1; + ir->netbits = 32; /* host route if no netmask given */ if (netmask_str) { const in_addr_t netmask = getaddr(GETADDR_HOST_ORDER, netmask_str, 0, NULL, NULL); - if (!netmask_to_netbits(ir->network, netmask, &ir->netbits)) + ir->netbits = netmask_to_netbits2(netmask); + + if (ir->netbits < 0) { msg(msglevel, "in --iroute %s %s : Bad network/subnet specification", network_str,