Any discussion / opinions ? Here https://github.com/OpenVPN/openvpn
/pull/97#issuecomment-372530059 one user reported, that this patch were
useful for him.
2018-01-31 14:37 GMT+01:00 Jiří Engelthaler <eng...@gmail.com>:
> Comments accepted. Thank you Selva. This patch is also as pull request
> https://github.com/OpenVPN/openvpn/pull/97
>
>
> When DHCP media sense configuration is disabled, network applications
> including DHCP client will not receive information about link status
> changes and the link seems to be always connected. This lead to the
> non-renewal DHCP address on OpenVPN connect.
>
> DHCP media sense status can by shown with command
> "netsh interface ipv4 show global"
>
> There are several reports of problems with DHCP address renewal.
> https://community.openvpn.net/openvpn/ticket/665
> https://community.openvpn.net/openvpn/ticket/807
>
> Added checking of disabled DHCP media sense and print a warning with
> forced dhcp-renew option and suggestion to enable DHCP media sense.
>
> Signed-off-by: Jiřà Engelthaler <eng...@gmail.com>
> ---
> src/openvpn/tun.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 47 insertions(+)
>
> diff --git a/src/openvpn/tun.c b/src/openvpn/tun.c
> index 2644d996..c8ab8796 100644
> --- a/src/openvpn/tun.c
> +++ b/src/openvpn/tun.c
> @@ -3827,6 +3827,46 @@ get_panel_reg(struct gc_arena *gc)
> return first;
> }
>
> +/*
> + * Return DhcpMediaSense enabled value
> + */
> +static bool
> +get_dhcp_media_sense(void)
> +{
> + const char registry_tcpip_params[] =
> "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters";
> + const char disable_dhcp_media_sense_string[] =
> "DisableDHCPMediaSense";
> + HKEY tcpip_params;
> + LONG status;
> + DWORD len;
> + DWORD disable_dhcp_media_sense;
> + DWORD data_type;
> + bool ret_value = true;
> +
> + status = RegOpenKeyEx(HKEY_LOCAL_MACHINE, registry_tcpip_params,
> 0, KEY_READ, &tcpip_params);
> +
> + if (status != ERROR_SUCCESS)
> + {
> + msg(M_WARN, "Error opening registry key: %s",
> registry_tcpip_params);
> + }
> + else
> + {
> + len = sizeof(disable_dhcp_media_sense);
> + status = RegQueryValueEx(tcpip_params,
> disable_dhcp_media_sense_string, NULL, &data_type,
> (PBYTE)&disable_dhcp_media_sense, &len);
> +
> + if (status == ERROR_SUCCESS && data_type == REG_DWORD)
> + {
> + if (disable_dhcp_media_sense != 0)
> + {
> + ret_value = false;
> + }
> + }
> +
> + RegCloseKey(tcpip_params);
> + }
> +
> + return ret_value;
> +}
> +
> /*
> * Check that two addresses are part of the same 255.255.255.252 subnet.
> */
> @@ -5898,6 +5938,13 @@ open_tun(const char *dev, const char *dev_type,
> const char *dev_node, struct tun
> {
> uint32_t ep[4];
>
> + /* Check DHCP media sense value */
> + if (!tt->options.dhcp_renew && !get_dhcp_media_sense())
> + {
> + msg(M_WARN, "WARNING: DHCP media sense disabled,
> dhcp_renew option forced. You can enable media sense with \"netsh
> interface ipv4 set global dhcpmediasense=enabled\" shell command");
> + tt->options.dhcp_renew = true;
> + }
> +
> /* We will answer DHCP requests with a reply to set IP/subnet
> to these values */
> ep[0] = htonl(tt->local);
> ep[1] = htonl(tt->adapter_netmask);
> --
> 2.14.2.windows.3
>
>
>
> 2018-01-21 23:21 GMT+01:00 Selva Nair <selva.n...@gmail.com>:
> > Hi,
> >
> > I haven't tested this, but looks like a useful thing to do. The code
> > looks good too. Some minor comments below:
> >
> > On Tue, Dec 5, 2017 at 7:19 AM, Jiří Engelthaler <eng...@gmail.com>
> wrote:
> >> When DHCP media sense configuration is disabled, network applications
> >> including DHCP client will not receive information about link status
> >> changes and the link seems to be always connected. This lead to the
> >> non-renewal DHCP address on OpenVPN connect.
> >>
> >> DHCP media sense status can by shown with command
> >> "netsh interface ipv4 show global"
> >>
> >> There are several reports of problems with DHCP address renewal.
> >> https://community.openvpn.net/openvpn/ticket/665
> >> https://community.openvpn.net/openvpn/ticket/807
> >>
> >> Added checking of disabled DHCP media sense and print a warning with
> >> forced dhcp-renew option and suggestion to enable DHCP media sense.
> >
> > Typo in commit header: "Window" should be "Windows"
> >
> >>
> >> Signed-off-by: Jiří Engelthaler <eng...@gmail.com>
> >> ---
> >> src/openvpn/tun.c | 59 ++++++++++++++++++++++++++++++
> +++++++++++++++++++++++++
> >> 1 file changed, 59 insertions(+)
> >>
> >> diff --git a/src/openvpn/tun.c b/src/openvpn/tun.c
> >> index 25831ce3..35811975 100644
> >> --- a/src/openvpn/tun.c
> >> +++ b/src/openvpn/tun.c
> >> @@ -62,6 +62,8 @@
> >> #define NI_IP_NETMASK (1<<1)
> >> #define NI_OPTIONS (1<<2)
> >>
> >> +#define TCPIP_PARAMS "SYSTEM\\CurrentControlSet\\
> Services\\Tcpip\\Parameters"
> >> +
> >
> > This is only used inside get_dhcp_media_sense. Better move it there as
> > a const char *. Less macros, the better.
> >
> >> static void netsh_ifconfig(const struct tuntap_options *to,
> >> const char *flex_name,
> >> const in_addr_t ip,
> >> @@ -3827,6 +3829,56 @@ get_panel_reg(struct gc_arena *gc)
> >> return first;
> >> }
> >>
> >> +/*
> >> + * Return DhcpMediaSense enabled value
> >> + */
> >> +static bool
> >> +get_dhcp_media_sense(void)
> >> +{
> >> + HKEY tcpip_params;
> >> + LONG status;
> >> + DWORD len;
> >> + char disable_dhcp_media_sense_string[] = "DisableDHCPMediaSense";
> >
> > This would benefit from a const.
> >
> >> + DWORD disable_dhcp_media_sense;
> >> + DWORD data_type;
> >> + bool ret_value = true;
> >> +
> >> + status = RegOpenKeyEx(
> >> + HKEY_LOCAL_MACHINE,
> >> + TCPIP_PARAMS,
> >> + 0,
> >> + KEY_READ,
> >> + &tcpip_params);
> >
> > I'm not sure whether its specified in the newly adopted style, but
> > please avoid writing one argument per line. Original has many such,
> > but not preferred in new code.
> >
> >> +
> >> + if (status != ERROR_SUCCESS)
> >> + {
> >> + msg(M_WARN, "Error opening registry key: %s", TCPIP_PARAMS);
> >> + }
> >> + else
> >> + {
> >> + len = sizeof(disable_dhcp_media_sense);
> >> + status = RegQueryValueEx(
> >> + tcpip_params,
> >> + disable_dhcp_media_sense_string,
> >> + NULL,
> >> + &data_type,
> >> + (PBYTE)&disable_dhcp_media_sense,
> >> + &len);
> >
> > Same here.
> >
> >> +
> >> + if (status == ERROR_SUCCESS && data_type == REG_DWORD)
> >> + {
> >> + if (disable_dhcp_media_sense != 0)
> >> + {
> >> + ret_value = false;
> >> + }
> >> + }
> >> +
> >> + RegCloseKey(tcpip_params);
> >> + }
> >> +
> >> + return ret_value;
> >> +}
> >> +
> >> /*
> >> * Check that two addresses are part of the same 255.255.255.252
> subnet.
> >> */
> >> @@ -5901,6 +5953,13 @@ open_tun(const char *dev, const char *dev_type,
> const char *dev_node, struct tun
> >> {
> >> uint32_t ep[4];
> >>
> >> + /* Check DHCP media sense value */
> >> + if (!tt->options.dhcp_renew && !get_dhcp_media_sense())
> >> + {
> >> + msg(M_WARN, "WARNING: DHCP media sense disabled,
> dhcp_renew option forced. You can enable media sense with \"netsh interface
> ipv4 set global dhcpmediasense=enabled\" shell command");
> >> + tt->options.dhcp_renew = true;
> >> + }
> >> +
> >> /* We will answer DHCP requests with a reply to set IP/subnet
> to these values */
> >> ep[0] = htonl(tt->local);
> >> ep[1] = htonl(tt->adapter_netmask);
> >
> > Thanks,
> >
> > Selva
>
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Openvpn-devel mailing list
Openvpn-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openvpn-devel