Hi,

On Fri, Mar 29, 2019 at 6:25 AM Christopher Schenk
<csch...@mail.uni-paderborn.de> wrote:
>
> Hi,
>
> On 28/03/2019 16:00, Selva Nair wrote:
> > I would go a step further to say we should not add new features that
> > do not work when started using the interactive service.
> >
> > Secondly, we should avoid the old style use of netsh and instead use the
> > iphelper API as far as possible. It should be possible to
> > set MTU using the SetIfEntry() or SetIpInterfaceEnrty() function -- I
> > haven't
> > checked which one is appropriate here.
>
> I agree on the point that we should add this functionality to the
> interactive service as well. So i modified the patch accordingly.
> I also modified my patch so that it uses the SetIpInterfaceEnrty
> function instead of netsh.

Thanks for the update. Looks okay, but would prefer a version
sent out by git-send-email so that we can apply and test the patch.

Some minor comments below.

>
> ---
> diff --git a/include/openvpn-msg.h b/include/openvpn-msg.h
> index 66177a21..f59c5a21 100644
> --- a/include/openvpn-msg.h
> +++ b/include/openvpn-msg.h
> @@ -39,6 +39,7 @@ typedef enum {
>       msg_del_block_dns,
>       msg_register_dns,
>       msg_enable_dhcp,
> +    msg_set_mtu,
>   } message_type_t;
>
>   typedef struct {
> @@ -117,4 +118,11 @@ typedef struct {
>       interface_t iface;
>   } enable_dhcp_message_t;
>
> +typedef struct {
> +    message_header_t header;
> +    interface_t iface;
> +    short family;
> +    int mtu;
> +} set_mtu_message_t;
> +
>   #endif /* ifndef OPENVPN_MSG_H_ */
> diff --git a/src/openvpn/tun.c b/src/openvpn/tun.c
> index 48a8fdf7..9fe8444f 100644
> --- a/src/openvpn/tun.c
> +++ b/src/openvpn/tun.c
> @@ -69,6 +69,10 @@ static void netsh_ifconfig(const struct
> tuntap_options *to,
>                              const in_addr_t netmask,
>                              const unsigned int flags);
>
> +static void windows_set_mtu(const int iface_indey,

iface_indey -> iface_index ?

> +                                short family,
> +                               const int mtu);
> +
>   static void netsh_set_dns6_servers(const struct in6_addr *addr_list,
>                                      const int addr_len,
>                                      const char *flex_name);
> @@ -201,6 +205,63 @@ out:
>       return ret;
>   }
>
> +static bool
> +do_set_mtu_service(const struct tuntap *tt, const short family, const
> int mtu)
> +{
> +    DWORD len;
> +    bool ret = false;
> +    ack_message_t ack;
> +    struct gc_arena gc = gc_new();
> +    HANDLE pipe = tt->options.msg_channel;
> +
> +    set_mtu_message_t mtu_msg = {
> +        .header = {
> +            msg_set_mtu,
> +            sizeof(set_mtu_message_t),
> +            0
> +        },
> +        .iface = {.index = tt->adapter_index,.name = tt->actual_name },
> +        .mtu = mtu,
> +        .family = family
> +    };
> +
> +    if (!send_msg_iservice(pipe, &mtu_msg, sizeof(mtu_msg), &ack,
> "Set_mtu"))
> +    {
> +        goto out;
> +    }
> +
> +    if (family == AF_INET)
> +    {
> +        if (ack.error_number != NO_ERROR)
> +        {
> +            msg(M_NONFATAL, "TUN: setting IPv4 mtu using service
> failed: %s [status=%u if_index=%d]",
> +                strerror_win32(ack.error_number, &gc),
> ack.error_number, mtu_msg.iface.index);
> +        }
> +        else
> +        {
> +            msg(M_INFO, "IPv4 MTU set to %d on interface %d using
> service", mtu, mtu_msg.iface.index);
> +            ret = true;
> +        }
> +    }
> +    else if (family == AF_INET6)
> +    {
> +        if (ack.error_number != NO_ERROR)
> +        {
> +            msg(M_NONFATAL, "TUN: setting IPv6 mtu using service
> failed: %s [status=%u if_index=%d]",
> +                strerror_win32(ack.error_number, &gc),
> ack.error_number, mtu_msg.iface.index);
> +        }

Though this repetition is fine with me and may be we do
the same in other similar contexts, cant we combine these
two cases into one by defining a string "IPv4" or "IPv6"
based on the value of family?

The same applies to windows_set_mtu() as well.

> +        else
> +        {
> +            msg(M_INFO, "IPv6 MTU set to %d on interface %d using
> service", mtu, mtu_msg.iface.index);
> +            ret = true;
> +        }
> +    }
> +
> +out:
> +    gc_free(&gc);
> +    return ret;
> +}
> +
>   #endif /* ifdef _WIN32 */
>
>   #ifdef TARGET_SOLARIS
> @@ -984,6 +1045,7 @@ do_ifconfig_ipv6(struct tuntap *tt, const char
> *ifname, int tun_mtu,
>       {
>           do_address_service(true, AF_INET6, tt);
>           do_dns6_service(true, tt);
> +        do_set_mtu_service(tt, AF_INET6, tun_mtu);
>       }
>       else
>       {
> @@ -1000,6 +1062,7 @@ do_ifconfig_ipv6(struct tuntap *tt, const char
> *ifname, int tun_mtu,
>           netsh_command(&argv, 4, M_FATAL);
>           /* set ipv6 dns servers if any are specified */
>           netsh_set_dns6_servers(tt->options.dns6, tt->options.dns6_len,
> ifname);
> +        windows_set_mtu(tt->adapter_index, AF_INET6, tun_mtu);
>       }
>
>       /* explicit route needed */
> @@ -1391,9 +1454,16 @@ do_ifconfig_ipv4(struct tuntap *tt, const char
> *ifname, int tun_mtu,
>               case IPW32_SET_NETSH:
>                   netsh_ifconfig(&tt->options, ifname, tt->local,
>                                  tt->adapter_netmask,
> NI_IP_NETMASK|NI_OPTIONS);
> -
>                   break;
>           }
> +        if (tt->options.msg_channel)
> +        {
> +            do_set_mtu_service(tt, AF_INET, tun_mtu);
> +        }
> +        else
> +        {
> +            windows_set_mtu(tt->adapter_index, AF_INET, tun_mtu);
> +        }
>       }
>
>   #else  /* if defined(TARGET_LINUX) */
> @@ -5236,6 +5306,46 @@ out:
>       return ret;
>   }
>
> +static void
> +windows_set_mtu(const int iface_index, const short family,
> +    const int mtu)
> +{
> +    DWORD err = 0;
> +    struct gc_arena gc = gc_new();
> +    MIB_IPINTERFACE_ROW row;
> +    InitializeIpInterfaceEntry(&row);
> +    row.Family = family;
> +    row.InterfaceIndex = iface_index;
> +    row.NlMtu = mtu;
> +
> +    err = SetIpInterfaceEntry(&row);
> +    if (family == AF_INET)
> +    {
> +        if (err != NO_ERROR)
> +        {
> +            msg(M_WARN, "TUN: Setting IPv4 mtu failed: %s [status=%u
> if_index=%d]",
> +                strerror_win32(err, &gc), err, iface_index);
> +        }
> +        else
> +        {
> +            msg(M_INFO, "Successfully set IPv4 mtu on interface %d",
> iface_index);
> +        }
> +    }
> +    else if (family == AF_INET6)
> +    {
> +        if (err != NO_ERROR)
> +        {
> +            msg(M_WARN, "TUN: Setting IPv6 mtu failed: %s [status=%u
> if_index=%d]",
> +                strerror_win32(err, &gc), err, iface_index);
> +        }
> +        else
> +        {
> +            msg(M_INFO, "Successfully set IPv6 mtu on interface %d",
> iface_index);
> +        }
> +    }

See the comment above..



> +}
> +
> +
>   /*
>    * Return a TAP name for netsh commands.
>    */
> diff --git a/src/openvpnserv/interactive.c b/src/openvpnserv/interactive.c
> index 623c3ff7..6e6a63fe 100644
> --- a/src/openvpnserv/interactive.c
> +++ b/src/openvpnserv/interactive.c
> @@ -33,6 +33,7 @@
>   #include <sddl.h>
>   #include <shellapi.h>
>   #include <mstcpip.h>
> +#include <netioapi.h>
>
>   #ifdef HAVE_VERSIONHELPERS_H
>   #include <versionhelpers.h>
> @@ -1198,6 +1199,20 @@ HandleEnableDHCPMessage(const
> enable_dhcp_message_t *dhcp)
>       return err;
>   }
>
> +static DWORD
> +HandleMTUMessage(const set_mtu_message_t *mtu)
> +{
> +    DWORD err = 0;
> +    MIB_IPINTERFACE_ROW row;
> +    InitializeIpInterfaceEntry(&row);
> +    row.Family = mtu->family;
> +    row.InterfaceIndex = mtu->iface.index;
> +    row.NlMtu = mtu->mtu;
> +
> +    err = SetIpInterfaceEntry(&row);
> +    return err;
> +}
> +
>   static VOID
>   HandleMessage(HANDLE pipe, DWORD bytes, DWORD count, LPHANDLE events,
> undo_lists_t *lists)
>   {
> @@ -1210,6 +1225,7 @@ HandleMessage(HANDLE pipe, DWORD bytes, DWORD
> count, LPHANDLE events, undo_lists
>           block_dns_message_t block_dns;
>           dns_cfg_message_t dns;
>           enable_dhcp_message_t dhcp;
> +        set_mtu_message_t mtu;
>       } msg;
>       ack_message_t ack = {
>           .header = {
> @@ -1276,6 +1292,12 @@ HandleMessage(HANDLE pipe, DWORD bytes, DWORD
> count, LPHANDLE events, undo_lists
>                   ack.error_number = HandleEnableDHCPMessage(&msg.dhcp);
>               }
>               break;
> +        case msg_set_mtu:
> +            if (msg.header.size == sizeof(msg.mtu))
> +            {
> +                ack.error_number = HandleMTUMessage(&msg.mtu);
> +            }
> +            break;
>
>           default:
>               ack.error_number = ERROR_MESSAGE_TYPE;
>

Selva


_______________________________________________
Openvpn-devel mailing list
Openvpn-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openvpn-devel

Reply via email to