I agree with you that tunnel device type and subnet vs. point-to-point mode
are mutually exclusive properties.

My main concern is preventing an explosion in the size of the parameter
permutation space, where the code has to handle 4 cases of dev/net
permutations instead of only two.

$ grep DEV_TYPE *.[ch] | wc
     59     328    2855

There are a lot of places where DEV_TYPE_x is referenced, and many of these
places will now need to handle 4 cases instead of only 2.

James

Neil Brown <ne...@cse.unsw.edu.au> said:

> 
> 
> This is the third for 4 patches.  Possible it is a little more
> controversial.
> This patch doesn't actually make any functional change to openvpn.
> However it prepares the way for a functional change to be implemented
> in the next patch.
> 
> (Ignoring null,) openvpn has two types for devices, tun and tap.
> It also has two ways of configuring the local interface: pointopoint
> or subnet.
> This is most obvious in the usage of "ifconfig": in "pointopoint" mode
> the second argument is the remote IP address, in subnet mode the
> second argument is a subnet.
> 
> Currently openvpn has a built in assumption that if it is using a tun
> device it should work in pointopoint mode, and if it is use a tap
> device it should work in subnet mode.
> 
> I don't think this assumption is necessarily correct.  In particular,
> I think it can be useful to run with a tun device and subnet mode.
> 
> This would be only really useful when using the new server mode, but
> it is (for me at least) particularly useful in that situation.
> 
> I want to use tun devices (as I am only interested in IP traffic, and
> I want some checking of source IP address to be done) but I want to
> treat the collection of openvpn instances (the server and several
> clients) as a single subnet.
> A particular advantage of this is that ifconfig-pool can hand out
> individual IP addresses to clients instead of 2-bit subnets.
> 
> This patch introduces a concept of a "NET_TYPE" which can be
> NET_TYPE_PTP or NET_TYPE_SUBNET.  In this patch, the NET_TYPE is
> determines directly from the TUNNEL_TYPE.  
> 
> All the times where TUNNEL_TYPE are currently used where the important
> issues is "subnet or pointopoint" have been change to use NET_TYPE
> instead.
> 
> Thus this change does (as mentioned) not actually affect functionality
> (yet), only appearance of the code.
> 
> If you aren't convinced that this is a good idea, I am happy to
> discuss it further.
> 
> Thanks,
> NeilBrown
> 
> ========================================
> ### Diffstat output
>  ./init.c  |    4 +--
>  ./multi.c |   12 +++++-----
>  ./tun.c   |   72 
> +++++++++++++++++++++++++++++++-------------------------------
>  ./tun.h   |   14 ++++++++++++
>  4 files changed, 58 insertions(+), 44 deletions(-)
> 
> diff ./init.c~current~ ./init.c
> --- ./init.c~current~ 2004-07-27 11:44:22.000000000 +1000
> +++ ./init.c  2004-07-27 11:44:22.000000000 +1000
> @@ -492,9 +492,9 @@ do_init_route_list (const struct options
>                   bool fatal)
>  {
>    const char *gw = NULL;
> -  int dev = dev_type_enum (options->dev, options->dev_type);
> +  int net = dev_to_net (dev_type_enum (options->dev, options->dev_type));
>  
> -  if (dev == DEV_TYPE_TUN)
> +  if (net == NET_TYPE_PTP)
>      gw = options->ifconfig_remote_netmask;
>    if (options->route_default_gateway)
>      gw = options->route_default_gateway;
> 
> diff ./multi.c~current~ ./multi.c
> --- ./multi.c~current~        2004-07-26 14:36:35.000000000 +1000
> +++ ./multi.c 2004-07-27 11:44:22.000000000 +1000
> @@ -195,7 +195,7 @@ reap_buckets_per_pass (int n_buckets)
>  static void
>  multi_init (struct multi_context *m, struct context *t)
>  {
> -  int dev = DEV_TYPE_UNDEF;
> +  int net = NET_TYPE_UNDEF;
>  
>    msg (D_MULTI_LOW, "MULTI: multi_init called, r=%d v=%d",
>         t->options.real_hash_size,
> @@ -204,7 +204,7 @@ multi_init (struct multi_context *m, str
>    /*
>     * Get tun/tap/null device type
>     */
> -  dev = dev_type_enum (t->options.dev, t->options.dev_type);
> +  net = dev_to_net (dev_type_enum (t->options.dev, t->options.dev_type));
>  
>    /*
>     * Init our multi_context object.
> @@ -263,13 +263,13 @@ multi_init (struct multi_context *m, str
>     */
>    if (t->options.ifconfig_pool_defined)
>      {
> -      if (dev == DEV_TYPE_TUN)
> +      if (net == NET_TYPE_PTP)
>       {
>         m->ifconfig_pool = ifconfig_pool_init (IFCONFIG_POOL_30NET,
>                                                t->options.ifconfig_pool_start,
>                                                t->options.ifconfig_pool_end);
>       }
> -      else if (dev == DEV_TYPE_TAP)
> +      else if (net == NET_TYPE_SUBNET)
>       {
>         m->ifconfig_pool = ifconfig_pool_init (IFCONFIG_POOL_INDIV,
>                                                t->options.ifconfig_pool_start,
> @@ -1066,12 +1066,12 @@ multi_connection_established (struct mul
>       {
>         /* use pool ifconfig address(es) */
>         mi->context.c2.push_ifconfig_local = remote;
> -       if (TUNNEL_TYPE (mi->context.c1.tuntap) == DEV_TYPE_TUN)
> +       if (NET_TYPE (mi->context.c1.tuntap) == NET_TYPE_PTP)
>           {
>             mi->context.c2.push_ifconfig_remote_netmask = local;
>             mi->context.c2.push_ifconfig_defined = true;
>           }
> -       else if (TUNNEL_TYPE (mi->context.c1.tuntap) == DEV_TYPE_TAP)
> +       else if (NET_TYPE (mi->context.c1.tuntap) == NET_TYPE_SUBNET)
>           {
>             mi->context.c2.push_ifconfig_remote_netmask =
mi->context.c1.tuntap->remote_netmask;
>             mi->context.c2.push_ifconfig_defined = true;
> 
> diff ./tun.c~current~ ./tun.c
> --- ./tun.c~current~  2004-07-27 11:44:22.000000000 +1000
> +++ ./tun.c   2004-07-27 11:44:22.000000000 +1000
> @@ -157,23 +157,23 @@ ipv6_support (bool ipv6, bool ipv6_expli
>  }
>  
>  /*
> - * If !tun, make sure ifconfig_remote_netmask looks
> + * If !ptp, make sure ifconfig_remote_netmask looks
>   *  like a netmask.
>   *
> - * If tun, make sure ifconfig_remote_netmask looks
> + * If ptp, make sure ifconfig_remote_netmask looks
>   *  like an IPv4 address.
>   */
>  static void
> -ifconfig_sanity_check (bool tun, in_addr_t addr)
> +ifconfig_sanity_check (bool ptp, in_addr_t addr)
>  {
>    struct gc_arena gc = gc_new ();
>    const bool looks_like_netmask = ((addr & 0xFF000000) == 0xFF000000);
> -  if (tun)
> +  if (ptp)
>      {
>        if (looks_like_netmask)
>       msg (M_WARN, "WARNING: Since you are using --dev tun, the second 
> argument
to --ifconfig must be an IP address.  You are using something (%s) that looks
more like a netmask.", print_in_addr_t (addr, false, &gc));
>      }
> -  else /* tap */
> +  else /* subnet */
>      {
>        if (!looks_like_netmask)
>       msg (M_WARN, "WARNING: Since you are using --dev tap, the second 
> argument
to --ifconfig must be a netmask, for example something like 255.255.255.0.");
> @@ -213,7 +213,7 @@ check_addr_clash (const char *name,
>  
>    if (public)
>      {
> -      if (type == DEV_TYPE_TUN)
> +      if (type == NET_TYPE_PTP)
>       {
>         const in_addr_t test_netmask = 0xFFFFFF00;
>         const in_addr_t public_net = public & test_netmask;
> @@ -236,7 +236,7 @@ check_addr_clash (const char *name,
>                print_in_addr_t (local, false, &gc),
>                print_in_addr_t (remote_netmask, false, &gc));
>       }
> -      else if (type == DEV_TYPE_TAP)
> +      else if (type == NET_TYPE_SUBNET)
>       {
>         const in_addr_t public_network = public & remote_netmask;
>         const in_addr_t virtual_network = local & remote_netmask;
> @@ -272,7 +272,7 @@ ifconfig_options_string (const struct tu
>    struct buffer out = alloc_buf_gc (256, gc);
>    if (tt->did_ifconfig_setup && !disable)
>      {
> -      if (tt->type == DEV_TYPE_TUN)
> +      if (NET_TYPE(tt) == NET_TYPE_PTP)
>       {
>         const char *l, *r;
>         if (remote)
> @@ -287,7 +287,7 @@ ifconfig_options_string (const struct tu
>           }
>         buf_printf (&out, "%s %s", r, l);
>       }
> -      else if (tt->type == DEV_TYPE_TAP)
> +      else if (NET_TYPE(tt) == NET_TYPE_SUBNET)
>       {
>         buf_printf (&out, "%s %s",
>                     print_in_addr_t (tt->local & tt->remote_netmask, false, 
> gc),
> @@ -358,7 +358,7 @@ init_tun (const char *dev,       /* --de
>  
>    if (ifconfig_local_parm && ifconfig_remote_netmask_parm)
>      {
> -      bool tun = false;
> +      bool ptp = false;
>        const char *ifconfig_local = NULL;
>        const char *ifconfig_remote_netmask = NULL;
>        const char *ifconfig_broadcast = NULL;
> @@ -366,10 +366,10 @@ init_tun (const char *dev,       /* --de
>        /*
>         * We only handle TUN/TAP devices here, not --dev null devices.
>         */
> -      if (tt->type == DEV_TYPE_TUN)
> -     tun = true;
> -      else if (tt->type == DEV_TYPE_TAP)
> -     tun = false;
> +      if (NET_TYPE(tt) == NET_TYPE_PTP)
> +     ptp = true;
> +      else if (NET_TYPE(tt) == NET_TYPE_SUBNET)
> +     ptp = false;
>        else
>       msg (M_FATAL, "'%s' is not a TUN/TAP device.  The --ifconfig option 
> works
only for TUN/TAP devices.", dev);
>  
> @@ -388,7 +388,7 @@ init_tun (const char *dev,       /* --de
>                          NULL);
>  
>        tt->remote_netmask = getaddr (
> -                                 (tun ? GETADDR_RESOLVE : 0)
> +                                 (ptp ? GETADDR_RESOLVE : 0)
>                                   | GETADDR_FATAL
>                                   | GETADDR_HOST_ORDER
>                                   | GETADDR_FATAL_ON_SIGNAL,
> @@ -397,7 +397,7 @@ init_tun (const char *dev,       /* --de
>                                   NULL,
>                                   NULL);
>  
> -      ifconfig_sanity_check (tun, tt->remote_netmask);
> +      ifconfig_sanity_check (ptp, tt->remote_netmask);
>  
>        /*
>         * If local_public or remote_public addresses are defined,
> @@ -405,13 +405,13 @@ init_tun (const char *dev,       /* --de
>         */
>  
>        check_addr_clash ("local",
> -                     tt->type,
> +                     NET_TYPE(tt),
>                       local_public,
>                       tt->local,
>                       tt->remote_netmask);
>  
>        check_addr_clash ("remote",
> -                     tt->type,
> +                     NET_TYPE(tt),
>                       remote_public,
>                       tt->local,
>                       tt->remote_netmask);
> @@ -425,7 +425,7 @@ init_tun (const char *dev,       /* --de
>        /*
>         * If TAP-style interface, generate broadcast address.
>         */
> -      if (!tun)
> +      if (!ptp)
>       {
>         tt->broadcast = generate_ifconfig_broadcast_addr (tt->local,
tt->remote_netmask);
>         ifconfig_broadcast = print_in_addr_t (tt->broadcast, false, &gc);
> @@ -435,7 +435,7 @@ init_tun (const char *dev,       /* --de
>         * Set environmental variables with ifconfig parameters.
>         */
>        setenv_str ("ifconfig_local", ifconfig_local);
> -      if (tun)
> +      if (ptp)
>       {
>         setenv_str ("ifconfig_remote", ifconfig_remote_netmask);
>       }
> @@ -478,7 +478,7 @@ do_ifconfig (struct tuntap *tt,
>  
>    if (tt->did_ifconfig_setup)
>      {
> -      bool tun = false;
> +      bool ptp = false;
>        const char *ifconfig_local = NULL;
>        const char *ifconfig_remote_netmask = NULL;
>        const char *ifconfig_broadcast = NULL;
> @@ -487,10 +487,10 @@ do_ifconfig (struct tuntap *tt,
>        /*
>         * We only handle TUN/TAP devices here, not --dev null devices.
>         */
> -      if (tt->type == DEV_TYPE_TUN)
> -     tun = true;
> -      else if (tt->type == DEV_TYPE_TAP)
> -     tun = false;
> +      if (NET_TYPE(tt) == NET_TYPE_PTP)
> +     ptp = true;
> +      else if (NET_TYPE(tt) == NET_TYPE_SUBNET)
> +     ptp = false;
>        else
>       ASSERT (0); /* should have been caught in init_tun */
>  
> @@ -503,7 +503,7 @@ do_ifconfig (struct tuntap *tt,
>        /*
>         * If TAP-style device, generate broadcast address.
>         */
> -      if (!tun)
> +      if (!ptp)
>       ifconfig_broadcast = print_in_addr_t (tt->broadcast, false, &gc);
>  
>  #if defined(TARGET_LINUX)
> @@ -520,7 +520,7 @@ do_ifconfig (struct tuntap *tt,
>         system_check (command_line, "Linux ip link set failed", true);
>  
>  
> -     if (tun) {
> +     if (ptp) {
>  
>               /*
>                * Set the address for the device
> @@ -547,7 +547,7 @@ do_ifconfig (struct tuntap *tt,
>       }
>       tt->did_ifconfig = true;
>  #else
> -      if (tun)
> +      if (ptp)
>       openvpn_snprintf (command_line, sizeof (command_line),
>                         IFCONFIG_PATH " %s %s pointopoint %s mtu %d",
>                         actual,
> @@ -572,7 +572,7 @@ do_ifconfig (struct tuntap *tt,
>  #elif defined(TARGET_SOLARIS)
>  
>        /* example: ifconfig tun2 10.2.0.2 10.2.0.1 mtu 1450 netmask
255.255.255.255 up */
> -      if (tun)
> +      if (ptp)
>       openvpn_snprintf (command_line, sizeof (command_line),
>                         IFCONFIG_PATH " %s %s %s mtu %d netmask 
> 255.255.255.255 up",
>                         actual,
> @@ -611,7 +611,7 @@ do_ifconfig (struct tuntap *tt,
>        msg (M_INFO, "NOTE: Tried to delete pre-existing tun/tap instance --
No Problem if failure");
>  
>        /* example: ifconfig tun2 10.2.0.2 10.2.0.1 mtu 1450 netmask
255.255.255.255 up */
> -      if (tun)
> +      if (ptp)
>       openvpn_snprintf (command_line, sizeof (command_line),
>                         IFCONFIG_PATH " %s %s %s mtu %d netmask 
> 255.255.255.255 up",
>                         actual,
> @@ -627,7 +627,7 @@ do_ifconfig (struct tuntap *tt,
>  
>  #elif defined(TARGET_NETBSD)
>  
> -      if (tun)
> +      if (ptp)
>       openvpn_snprintf (command_line, sizeof (command_line),
>                         IFCONFIG_PATH " %s %s %s mtu %d netmask 
> 255.255.255.255 up",
>                         actual,
> @@ -656,7 +656,7 @@ do_ifconfig (struct tuntap *tt,
>  
>  
>        /* example: ifconfig tun2 10.2.0.2 10.2.0.1 mtu 1450 netmask
255.255.255.255 up */
> -      if (tun)
> +      if (ptp)
>       openvpn_snprintf (command_line, sizeof (command_line),
>                         IFCONFIG_PATH " %s %s %s mtu %d netmask 
> 255.255.255.255 up",
>                         actual,
> @@ -673,7 +673,7 @@ do_ifconfig (struct tuntap *tt,
>  #elif defined(TARGET_FREEBSD)
>  
>        /* example: ifconfig tun2 10.2.0.2 10.2.0.1 mtu 1450 netmask
255.255.255.255 up */
> -      if (tun)
> +      if (ptp)
>       openvpn_snprintf (command_line, sizeof (command_line),
>                         IFCONFIG_PATH " %s %s %s mtu %d netmask 
> 255.255.255.255 up",
>                         actual,
> @@ -702,7 +702,7 @@ do_ifconfig (struct tuntap *tt,
>        * Make sure that both ifconfig addresses are part of the
>        * same .252 subnet.
>        */
> -     if (tun)
> +     if (ptp)
>         {
>           verify_255_255_255_252 (tt->local, tt->remote_netmask);
>           tt->adapter_netmask = ~3;
> @@ -2481,7 +2481,7 @@ open_tun (const char *dev, const char *d
>        ep[1] = htonl (tt->adapter_netmask);
>  
>        /* At what IP address should the DHCP server masquerade at? */
> -      if (tt->type == DEV_TYPE_TUN)
> +      if (NET_TYPE(tt) == NET_TYPE_PTP)
>       {
>         ep[2] = htonl (tt->remote_netmask);
>         if (tt->options.dhcp_masq_custom_offset)
> @@ -2491,7 +2491,7 @@ open_tun (const char *dev, const char *d
>       {
>         in_addr_t dsa; /* DHCP server addr */
>  
> -       ASSERT (tt->type == DEV_TYPE_TAP);
> +       ASSERT (NET_TYPE(tt) == NET_TYPE_SUBNET);
>  
>         if (tt->options.dhcp_masq_offset < 0)
>           dsa = (tt->local | (~tt->adapter_netmask)) + 
> tt->options.dhcp_masq_offset;
> 
> diff ./tun.h~current~ ./tun.h
> --- ./tun.h~current~  2004-07-27 11:44:22.000000000 +1000
> +++ ./tun.h   2004-07-27 11:44:22.000000000 +1000
> @@ -107,9 +107,23 @@ struct tuntap_options {
>   * Define a TUN/TAP dev.
>   */
>  
> +/* The device can be configured as pointopoint or subnet */
> +#define      NET_TYPE_UNDEF  0
> +#define      NET_TYPE_PTP    2       /* two IP addresses */
> +#define      NET_TYPE_SUBNET 3       /* an IP address and a subnet mask */
> +
> +static inline dev_to_net(int dev)
> +{
> +     /* values for NET_TYPE cunning chosen to match
> +      * DEV_TYPE for which they match 
> +      */
> +     return dev;
> +}
> +
>  struct tuntap
>  {
>  # define TUNNEL_TYPE(tt) ((tt) ? ((tt)->type) : DEV_TYPE_UNDEF)
> +# define NET_TYPE(tt) (dev_to_net(TUNNEL_TYPE(tt)))
>    int type; /* DEV_TYPE_x as defined in proto.h */
>  
>    bool did_ifconfig_setup;
> 



-- 




Reply via email to