For the record, as I don't see why `o->ifconfig_pool_end` was `(o->server_network | ~o->server_netmask) - 2` for tun + subnet while it was `(o->server_network | ~o->server_netmask) - 1` for tap, I assume the former is a typo.
By the way, why does `o->ifconfig_pool_netmask` need to be set even when `nopool` is set? On Wed, 13 Nov 2019 at 16:59, Tom Yan <tom.t...@gmail.com> wrote: > > As /31 subnet now works (as we stop setting broadcast address), the server > directives can be fixed for it as well. Also stop repeating code for tap and > tun + subnet. > --- > src/openvpn/helper.c | 90 ++++++++++++++++++-------------------------- > 1 file changed, 37 insertions(+), 53 deletions(-) > > diff --git a/src/openvpn/helper.c b/src/openvpn/helper.c > index ff9df506..608f886f 100644 > --- a/src/openvpn/helper.c > +++ b/src/openvpn/helper.c > @@ -286,13 +286,13 @@ helper_client_server(struct options *o) > print_netmask(IFCONFIG_POOL_MIN_NETBITS, &gc)); > } > > - if (dev == DEV_TYPE_TUN) > + if (dev == DEV_TYPE_TUN && (topology == TOP_NET30 || topology == > TOP_P2P)) > { > int pool_end_reserve = 4; > > if (netbits > 29) > { > - msg(M_USAGE, "--server directive when used with --dev tun > must define a subnet of %s or lower", > + msg(M_USAGE, "subnet must be %s or lower", > print_netmask(29, &gc)); > } > > @@ -304,85 +304,69 @@ helper_client_server(struct options *o) > o->mode = MODE_SERVER; > o->tls_server = true; > > - if (topology == TOP_NET30 || topology == TOP_P2P) > + o->ifconfig_local = print_in_addr_t(o->server_network + 1, 0, > &o->gc); > + o->ifconfig_remote_netmask = print_in_addr_t(o->server_network + > 2, 0, &o->gc); > + > + if (!(o->server_flags & SF_NOPOOL)) > { > - o->ifconfig_local = print_in_addr_t(o->server_network + 1, > 0, &o->gc); > - o->ifconfig_remote_netmask = > print_in_addr_t(o->server_network + 2, 0, &o->gc); > - > - if (!(o->server_flags & SF_NOPOOL)) > - { > - o->ifconfig_pool_defined = true; > - o->ifconfig_pool_start = o->server_network + 4; > - o->ifconfig_pool_end = (o->server_network | > ~o->server_netmask) - pool_end_reserve; > - ifconfig_pool_verify_range(M_USAGE, > o->ifconfig_pool_start, o->ifconfig_pool_end); > - } > - > - helper_add_route(o->server_network, o->server_netmask, o); > - if (o->enable_c2c) > - { > - push_option(o, print_opt_route(o->server_network, > o->server_netmask, &o->gc), M_USAGE); > - } > - else if (topology == TOP_NET30) > - { > - push_option(o, print_opt_route(o->server_network + 1, 0, > &o->gc), M_USAGE); > - } > + o->ifconfig_pool_defined = true; > + o->ifconfig_pool_start = o->server_network + 4; > + o->ifconfig_pool_end = (o->server_network | > ~o->server_netmask) - pool_end_reserve; > + ifconfig_pool_verify_range(M_USAGE, o->ifconfig_pool_start, > o->ifconfig_pool_end); > } > - else if (topology == TOP_SUBNET) > + > + helper_add_route(o->server_network, o->server_netmask, o); > + if (o->enable_c2c) > { > - o->ifconfig_local = print_in_addr_t(o->server_network + 1, > 0, &o->gc); > - o->ifconfig_remote_netmask = > print_in_addr_t(o->server_netmask, 0, &o->gc); > - > - if (!(o->server_flags & SF_NOPOOL)) > - { > - o->ifconfig_pool_defined = true; > - o->ifconfig_pool_start = o->server_network + 2; > - o->ifconfig_pool_end = (o->server_network | > ~o->server_netmask) - 2; > - ifconfig_pool_verify_range(M_USAGE, > o->ifconfig_pool_start, o->ifconfig_pool_end); > - } > - o->ifconfig_pool_netmask = o->server_netmask; > - > - push_option(o, print_opt_route_gateway(o->server_network + > 1, &o->gc), M_USAGE); > - if (!o->route_default_gateway) > - { > - o->route_default_gateway = > print_in_addr_t(o->server_network + 2, 0, &o->gc); > - } > + push_option(o, print_opt_route(o->server_network, > o->server_netmask, &o->gc), M_USAGE); > } > - else > + else if (topology == TOP_NET30) > { > - ASSERT(0); > + push_option(o, print_opt_route(o->server_network + 1, 0, > &o->gc), M_USAGE); > } > - > - push_option(o, print_opt_topology(topology, &o->gc), M_USAGE); > } > - else if (dev == DEV_TYPE_TAP) > + else if (dev == DEV_TYPE_TAP || (dev == DEV_TYPE_TUN && topology == > TOP_SUBNET)) > { > - if (netbits > 30) > + int ptp = 1; > + > + if (netbits > 31) > { > - msg(M_USAGE, "--server directive when used with --dev tap > must define a subnet of %s or lower", > - print_netmask(30, &gc)); > + msg(M_USAGE, "subnet must be %s or lower", > + print_netmask(31, &gc)); > } > > + if (netbits == 31) > + ptp = 0; > + > o->mode = MODE_SERVER; > o->tls_server = true; > - o->ifconfig_local = print_in_addr_t(o->server_network + 1, 0, > &o->gc); > + > + o->ifconfig_local = print_in_addr_t(o->server_network + ptp, 0, > &o->gc); > o->ifconfig_remote_netmask = print_in_addr_t(o->server_netmask, > 0, &o->gc); > > if (!(o->server_flags & SF_NOPOOL)) > { > o->ifconfig_pool_defined = true; > - o->ifconfig_pool_start = o->server_network + 2; > - o->ifconfig_pool_end = (o->server_network | > ~o->server_netmask) - 1; > + o->ifconfig_pool_start = o->server_network + ptp + 1; > + o->ifconfig_pool_end = (o->server_network | > ~o->server_netmask) - ptp; > ifconfig_pool_verify_range(M_USAGE, o->ifconfig_pool_start, > o->ifconfig_pool_end); > } > o->ifconfig_pool_netmask = o->server_netmask; > > - push_option(o, print_opt_route_gateway(o->server_network + 1, > &o->gc), M_USAGE); > + push_option(o, print_opt_route_gateway(o->server_network + ptp, > &o->gc), M_USAGE); > + if (dev == DEV_TYPE_TUN && !o->route_default_gateway) > + { > + o->route_default_gateway = print_in_addr_t(o->server_network > + ptp + 1, 0, &o->gc); > + } > } > else > { > ASSERT(0); > } > > + if (dev == DEV_TYPE_TUN) > + push_option(o, print_opt_topology(topology, &o->gc), M_USAGE); > + > /* set push-ifconfig-constraint directive */ > if ((dev == DEV_TYPE_TAP || topology == TOP_SUBNET)) > { > -- > 2.24.0 > _______________________________________________ Openvpn-devel mailing list Openvpn-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/openvpn-devel