Hi,

On 08-11-16 13:45, Gert Doering wrote:
> We used to add "route for this subnet" by using our own address as
> the gateway address, which used to mean "connected to the interface,
> no gateway".  FreeBSD commit 293159 changed the kernel side of that
> assumption so "my address" is now always bound to "lo0" - thus, our
> subnet route also ended up pointing to "lo0", breaking connectivity
> for all hosts in the subnet except the one we used as "remote".
> 
> commit 60fd44e501f200 already introduced a "remote address" we use
> for the "ifconfig tunX <us> <remote>" part - extend that to be used
> as gateway address for the "tunX subnet" as well, and things will
> work more robustly.
> 
> Tested on FreeBSD 11.0-RELEASE and 7.4-RELEASE (client and server)
> (this particular issue is not present before 11.0, but "adding the
> subnet route" never worked right, not even in 7.4 - 11.0 just made
> the problem manifest more clearly)
> 
> Trac #425
> URL: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=207831
> 
> Signed-off-by: Gert Doering <g...@greenie.muc.de>
> ---
>  src/openvpn/tun.c | 13 ++++++++-----
>  1 file changed, 8 insertions(+), 5 deletions(-)
> 
> diff --git a/src/openvpn/tun.c b/src/openvpn/tun.c
> index af685de..a6d38d5 100644
> --- a/src/openvpn/tun.c
> +++ b/src/openvpn/tun.c
> @@ -721,8 +721,8 @@ void delete_route_connected_v6_net(struct tuntap * tt,
>   * is still point to point and no layer 2 resolution is done...
>   */
>  
> -const char *
> -create_arbitrary_remote( struct tuntap *tt, struct gc_arena * gc )
> +in_addr_t
> +create_arbitrary_remote( struct tuntap *tt )
>  {
>    in_addr_t remote;
>  
> @@ -730,7 +730,7 @@ create_arbitrary_remote( struct tuntap *tt, struct 
> gc_arena * gc )
>  
>    if ( remote == tt->local ) remote ++;
>  
> -  return print_in_addr_t (remote, 0, gc);
> +  return remote;
>  }
>  #endif
>  
> @@ -1230,6 +1230,8 @@ do_ifconfig (struct tuntap *tt,
>  
>  #elif defined(TARGET_FREEBSD)||defined(TARGET_DRAGONFLY)
>  
> +      in_addr_t remote_end;          /* for "virtual" subnet topology */
> +
>        /* example: ifconfig tun2 10.2.0.2 10.2.0.1 mtu 1450 netmask 
> 255.255.255.255 up */
>        if (tun)
>       argv_printf (&argv,
> @@ -1242,12 +1244,13 @@ do_ifconfig (struct tuntap *tt,
>                         );
>        else if ( tt->topology == TOP_SUBNET )
>       {
> +         remote_end = create_arbitrary_remote( tt );
>           argv_printf (&argv,
>                         "%s %s %s %s mtu %d netmask %s up",
>                         IFCONFIG_PATH,
>                         actual,
>                         ifconfig_local,
> -                       create_arbitrary_remote( tt, &gc ),
> +                       print_in_addr_t (remote_end, 0, &gc),
>                         tun_mtu,
>                         ifconfig_remote_netmask
>                         );
> @@ -1274,7 +1277,7 @@ do_ifconfig (struct tuntap *tt,
>            r.flags = RT_DEFINED;
>            r.network = tt->local & tt->remote_netmask;
>            r.netmask = tt->remote_netmask;
> -          r.gateway = tt->local;
> +          r.gateway = remote_end;
>            add_route (&r, tt, 0, NULL, es);
>          }
>  

Code-ACK.

I didn't test (no freebsd for me), but Gert did, and the pfsense guys
(garga, in particular) reported this patch resolves their issue in #425.

-Steffan

------------------------------------------------------------------------------
Developer Access Program for Intel Xeon Phi Processors
Access to Intel Xeon Phi processor-based developer platforms.
With one year of Intel Parallel Studio XE.
Training and support from Colfax.
Order your platform today. http://sdm.link/xeonphi
_______________________________________________
Openvpn-devel mailing list
Openvpn-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openvpn-devel

Reply via email to