* Tue Jan 16 2024 Jon Maloy <jmaloy@redhat.com> - 0-0.36.20180415git

- hpvd-Revert-Changes-for-adding-keyfile-support-in-RHEL-sp.patch [RHEL-9901]
- hpvd-Revert-hv-hv_kvp_daemon-Some-small-fixes-for-handlin.patch [RHEL-9901]
- hpvd-Revert-hv-hv_kvp_daemon-Support-for-keyfile-based-co.patch [RHEL-9901]
- Resolves: RHEL-9901
  ([Hyper-V][RHEL-8] hyperv-daemons write incompatible IPv6 prefix (IPV6NETMASK) in connection configuration)
This commit is contained in:
Jon Maloy 2024-01-16 14:42:11 -05:00
parent 050f9bb8ac
commit 955e830b87
4 changed files with 578 additions and 1 deletions

View File

@ -0,0 +1,65 @@
From eb4f3620e350c45a88c24d1a56523bbb1ab28fe8 Mon Sep 17 00:00:00 2001
From: Ani Sinha <anisinha@redhat.com>
Date: Tue, 9 Jan 2024 10:05:14 +0530
Subject: [PATCH 1/3] Revert "Changes for adding keyfile support in RHEL
specific script"
RH-Author: Ani Sinha <None>
RH-MergeRequest: 14: Revert all changes related to adding keyfile support in hyperv-daemons
RH-Jira: RHEL-9901
RH-Acked-by: Cathy Avery <cavery@redhat.com>
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
RH-Commit: [1/3] 474dc7d7388a29dbf3e15217b092504295efee25
This reverts commit eeb77fe2cd3232abd96a1bdf1bbcfcd04053ffff.
The revert is necessary because the keyfile support generates a regression when
both ipv4 and ipv6 are used together. Please see the thread
https://lkml.org/lkml/2023/12/23/138
Signed-off-by: Ani Sinha <anisinha@redhat.com>
---
hv_set_ifconfig.sh | 26 +++++++++++---------------
1 file changed, 11 insertions(+), 15 deletions(-)
diff --git a/hv_set_ifconfig.sh b/hv_set_ifconfig.sh
index 93decd6..9c2ee30 100644
--- a/hv_set_ifconfig.sh
+++ b/hv_set_ifconfig.sh
@@ -74,23 +74,19 @@
# call.
#
-# This is RHEL specific bash script that configures NM keyfiles.
-# ifcfg files passed as the first argument to this script remains untouched.
-if [ -z "$2" ]; then
- echo "No input NM keyfile. Exiting!"
- exit 1
-fi
-sed -i '/\[ipv4\]/a ignore-auto-dns=false' $2
-sed -i '/\[connection\]/a autoconnect=true' $2
+echo "IPV6INIT=yes" >> $1
+echo "PEERDNS=yes" >> $1
+echo "ONBOOT=yes" >> $1
-filename="${2##*/}"
+#Unlike older sysconfig scripts, NetworkManager expects GATEWAYx=ipaddr for all values of x.
+#So the first gateway is GATEWAY0 instead of GATEWAY. Other values should remain unchanged.
+#Workaround this by replacing GATEWAY= with GATEWAY0=.
+sed -i "s/GATEWAY=/GATEWAY0=/" $1
-cp $2 /etc/NetworkManager/system-connections/
-chmod 600 /etc/NetworkManager/system-connections/$filename
+cp $1 /etc/sysconfig/network-scripts/
-nmcli connection load "/etc/NetworkManager/system-connections/${filename}"
-nmcli connection up filename "/etc/NetworkManager/system-connections/${filename}"
-
-exit 0
+filename="${1##*/}"
+nmcli connection load "/etc/sysconfig/network-scripts/${filename}"
+nmcli connection up filename "/etc/sysconfig/network-scripts/${filename}"
--
2.41.0

View File

@ -0,0 +1,89 @@
From af30a3d74a1c6b4a501f994ec43d97597e94e098 Mon Sep 17 00:00:00 2001
From: Ani Sinha <anisinha@redhat.com>
Date: Tue, 9 Jan 2024 10:07:57 +0530
Subject: [PATCH 2/3] Revert "hv/hv_kvp_daemon: Some small fixes for handling
NM keyfiles"
RH-Author: Ani Sinha <None>
RH-MergeRequest: 14: Revert all changes related to adding keyfile support in hyperv-daemons
RH-Jira: RHEL-9901
RH-Acked-by: Cathy Avery <cavery@redhat.com>
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
RH-Commit: [2/3] 9d25d58204ad78881d21865fda902dd29a462fa8
This reverts commit 0b5a275023d7779db38f3d944103419532f034f4.
The revert is necessary because the keyfile support generates a regression when
both ipv4 and ipv6 are used together. Please see the thread
https://lkml.org/lkml/2023/12/23/138
Signed-off-by: Ani Sinha <anisinha@redhat.com>
---
hv_kvp_daemon.c | 20 ++++++++------------
hv_set_ifconfig.sh | 4 ++--
2 files changed, 10 insertions(+), 14 deletions(-)
diff --git a/hv_kvp_daemon.c b/hv_kvp_daemon.c
index 318e2da..264eeb9 100644
--- a/hv_kvp_daemon.c
+++ b/hv_kvp_daemon.c
@@ -1421,7 +1421,7 @@ static int kvp_set_ip_info(char *if_name, struct hv_kvp_ipaddr_value *new_val)
if (error)
goto setval_error;
- if (new_val->addr_family & ADDR_FAMILY_IPV6) {
+ if (new_val->addr_family == ADDR_FAMILY_IPV6) {
error = fprintf(nmfile, "\n[ipv6]\n");
if (error < 0)
goto setval_error;
@@ -1455,18 +1455,14 @@ static int kvp_set_ip_info(char *if_name, struct hv_kvp_ipaddr_value *new_val)
if (error < 0)
goto setval_error;
- /* we do not want ipv4 addresses in ipv6 section and vice versa */
- if (is_ipv6 != is_ipv4((char *)new_val->gate_way)) {
- error = fprintf(nmfile, "gateway=%s\n", (char *)new_val->gate_way);
- if (error < 0)
- goto setval_error;
- }
+ error = fprintf(nmfile, "gateway=%s\n", (char *)new_val->gate_way);
+ if (error < 0)
+ goto setval_error;
+
+ error = fprintf(nmfile, "dns=%s\n", (char *)new_val->dns_addr);
+ if (error < 0)
+ goto setval_error;
- if (is_ipv6 != is_ipv4((char *)new_val->dns_addr)) {
- error = fprintf(nmfile, "dns=%s\n", (char *)new_val->dns_addr);
- if (error < 0)
- goto setval_error;
- }
fclose(nmfile);
fclose(ifcfg_file);
diff --git a/hv_set_ifconfig.sh b/hv_set_ifconfig.sh
index 9c2ee30..35aae6f 100644
--- a/hv_set_ifconfig.sh
+++ b/hv_set_ifconfig.sh
@@ -53,7 +53,7 @@
# or "manual" if no boot-time protocol should be used)
#
# address1=ipaddr1/plen
-# address2=ipaddr2/plen
+# address=ipaddr2/plen
#
# gateway=gateway1;gateway2
#
@@ -61,7 +61,7 @@
#
# [ipv6]
# address1=ipaddr1/plen
-# address2=ipaddr2/plen
+# address2=ipaddr1/plen
#
# gateway=gateway1;gateway2
#
--
2.41.0

View File

@ -0,0 +1,407 @@
From 814ef4ba2f28f766811da9cbf39c4dd826810fea Mon Sep 17 00:00:00 2001
From: Ani Sinha <anisinha@redhat.com>
Date: Tue, 9 Jan 2024 10:10:29 +0530
Subject: [PATCH 3/3] Revert "hv/hv_kvp_daemon:Support for keyfile based
connection profile"
RH-Author: Ani Sinha <None>
RH-MergeRequest: 14: Revert all changes related to adding keyfile support in hyperv-daemons
RH-Jira: RHEL-9901
RH-Acked-by: Cathy Avery <cavery@redhat.com>
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
RH-Commit: [3/3] e5ef938a993ede072c749d9923fe5384d82586fa
This reverts commit a360344134e075dfebc99c1551e141e2ec25a2fa.
The revert is necessary because the keyfile support generates a regression when
both ipv4 and ipv6 are used together. Please see the thread
https://lkml.org/lkml/2023/12/23/138
Signed-off-by: Ani Sinha <anisinha@redhat.com>
---
hv_kvp_daemon.c | 233 ++++++---------------------------------------
hv_set_ifconfig.sh | 30 +-----
2 files changed, 33 insertions(+), 230 deletions(-)
diff --git a/hv_kvp_daemon.c b/hv_kvp_daemon.c
index 264eeb9..27f5e7d 100644
--- a/hv_kvp_daemon.c
+++ b/hv_kvp_daemon.c
@@ -1171,79 +1171,12 @@ static int process_ip_string(FILE *f, char *ip_string, int type)
return 0;
}
-/*
- * Only IPv4 subnet strings needs to be converted to plen
- * For IPv6 the subnet is already privided in plen format
- */
-static int kvp_subnet_to_plen(char *subnet_addr_str)
-{
- int plen = 0;
- struct in_addr subnet_addr4;
-
- /*
- * Convert subnet address to binary representation
- */
- if (inet_pton(AF_INET, subnet_addr_str, &subnet_addr4) == 1) {
- uint32_t subnet_mask = ntohl(subnet_addr4.s_addr);
-
- while (subnet_mask & 0x80000000) {
- plen++;
- subnet_mask <<= 1;
- }
- } else {
- return -1;
- }
-
- return plen;
-}
-
-static int process_ip_string_nm(FILE *f, char *ip_string, char *subnet,
- int is_ipv6)
-{
- char addr[INET6_ADDRSTRLEN];
- char subnet_addr[INET6_ADDRSTRLEN];
- int error, i = 0;
- int ip_offset = 0, subnet_offset = 0;
- int plen;
-
- memset(addr, 0, sizeof(addr));
- memset(subnet_addr, 0, sizeof(subnet_addr));
-
- while (parse_ip_val_buffer(ip_string, &ip_offset, addr,
- (MAX_IP_ADDR_SIZE * 2)) &&
- parse_ip_val_buffer(subnet,
- &subnet_offset,
- subnet_addr,
- (MAX_IP_ADDR_SIZE *
- 2))) {
- if (!is_ipv6)
- plen = kvp_subnet_to_plen((char *)subnet_addr);
- else
- plen = atoi(subnet_addr);
-
- if (plen < 0)
- return plen;
-
- error = fprintf(f, "address%d=%s/%d\n", ++i, (char *)addr,
- plen);
- if (error < 0)
- return error;
-
- memset(addr, 0, sizeof(addr));
- memset(subnet_addr, 0, sizeof(subnet_addr));
- }
-
- return 0;
-}
-
static int kvp_set_ip_info(char *if_name, struct hv_kvp_ipaddr_value *new_val)
{
int error = 0;
- char if_filename[PATH_MAX];
- char nm_filename[PATH_MAX];
- FILE *ifcfg_file, *nmfile;
+ char if_file[PATH_MAX];
+ FILE *file;
char cmd[PATH_MAX];
- int is_ipv6 = 0;
char *mac_addr;
int str_len;
@@ -1264,7 +1197,7 @@ static int kvp_set_ip_info(char *if_name, struct hv_kvp_ipaddr_value *new_val)
* in a given distro to configure the interface and so are free
* ignore information that may not be relevant.
*
- * Here is the ifcfg format of the ip configuration file:
+ * Here is the format of the ip configuration file:
*
* HWADDR=macaddr
* DEVICE=interface name
@@ -1287,32 +1220,6 @@ static int kvp_set_ip_info(char *if_name, struct hv_kvp_ipaddr_value *new_val)
* tagged as IPV6_DEFAULTGW and IPV6 NETMASK will be tagged as
* IPV6NETMASK.
*
- * Here is the keyfile format of the ip configuration file:
- *
- * [ethernet]
- * mac-address=macaddr
- * [connection]
- * interface-name=interface name
- *
- * [ipv4]
- * method=<protocol> (where <protocol> is "auto" if DHCP is configured
- * or "manual" if no boot-time protocol should be used)
- *
- * address1=ipaddr1/plen
- * address2=ipaddr2/plen
- *
- * gateway=gateway1;gateway2
- *
- * dns=dns1;dns2
- *
- * [ipv6]
- * address1=ipaddr1/plen
- * address2=ipaddr2/plen
- *
- * gateway=gateway1;gateway2
- *
- * dns=dns1;dns2
- *
* The host can specify multiple ipv4 and ipv6 addresses to be
* configured for the interface. Furthermore, the configuration
* needs to be persistent. A subsequent GET call on the interface
@@ -1320,29 +1227,14 @@ static int kvp_set_ip_info(char *if_name, struct hv_kvp_ipaddr_value *new_val)
* call.
*/
- /*
- * We are populating both ifcfg and nmconnection files
- */
- snprintf(if_filename, sizeof(if_filename), "%s%s%s", KVP_CONFIG_LOC,
- "/ifcfg-", if_name);
+ snprintf(if_file, sizeof(if_file), "%s%s%s", KVP_CONFIG_LOC,
+ "/ifcfg-", if_name);
- ifcfg_file = fopen(if_filename, "w");
+ file = fopen(if_file, "w");
- if (!ifcfg_file) {
+ if (file == NULL) {
syslog(LOG_ERR, "Failed to open config file; error: %d %s",
- errno, strerror(errno));
- return HV_E_FAIL;
- }
-
- snprintf(nm_filename, sizeof(nm_filename), "%s%s%s%s", KVP_CONFIG_LOC,
- "/", if_name, ".nmconnection");
-
- nmfile = fopen(nm_filename, "w");
-
- if (!nmfile) {
- syslog(LOG_ERR, "Failed to open config file; error: %d %s",
- errno, strerror(errno));
- fclose(ifcfg_file);
+ errno, strerror(errno));
return HV_E_FAIL;
}
@@ -1356,31 +1248,14 @@ static int kvp_set_ip_info(char *if_name, struct hv_kvp_ipaddr_value *new_val)
goto setval_error;
}
- error = kvp_write_file(ifcfg_file, "HWADDR", "", mac_addr);
- if (error < 0)
- goto setmac_error;
-
- error = kvp_write_file(ifcfg_file, "DEVICE", "", if_name);
- if (error < 0)
- goto setmac_error;
-
- error = fprintf(nmfile, "\n[connection]\n");
- if (error < 0)
- goto setmac_error;
-
- error = kvp_write_file(nmfile, "interface-name", "", if_name);
+ error = kvp_write_file(file, "HWADDR", "", mac_addr);
+ free(mac_addr);
if (error)
- goto setmac_error;
-
- error = fprintf(nmfile, "\n[ethernet]\n");
- if (error < 0)
- goto setmac_error;
+ goto setval_error;
- error = kvp_write_file(nmfile, "mac-address", "", mac_addr);
+ error = kvp_write_file(file, "DEVICE", "", if_name);
if (error)
- goto setmac_error;
-
- free(mac_addr);
+ goto setval_error;
/*
* The dhcp_enabled flag is only for IPv4. In the case the host only
@@ -1388,91 +1263,47 @@ static int kvp_set_ip_info(char *if_name, struct hv_kvp_ipaddr_value *new_val)
* proceed to parse and pass the IPv6 information to the
* disto-specific script hv_set_ifconfig.
*/
-
- /*
- * First populate the ifcfg file format
- */
if (new_val->dhcp_enabled) {
- error = kvp_write_file(ifcfg_file, "BOOTPROTO", "", "dhcp");
+ error = kvp_write_file(file, "BOOTPROTO", "", "dhcp");
if (error)
goto setval_error;
+
} else {
- error = kvp_write_file(ifcfg_file, "BOOTPROTO", "", "none");
+ error = kvp_write_file(file, "BOOTPROTO", "", "none");
if (error)
goto setval_error;
}
- error = process_ip_string(ifcfg_file, (char *)new_val->ip_addr,
- IPADDR);
- if (error)
- goto setval_error;
+ /*
+ * Write the configuration for ipaddress, netmask, gateway and
+ * name servers.
+ */
- error = process_ip_string(ifcfg_file, (char *)new_val->sub_net,
- NETMASK);
+ error = process_ip_string(file, (char *)new_val->ip_addr, IPADDR);
if (error)
goto setval_error;
- error = process_ip_string(ifcfg_file, (char *)new_val->gate_way,
- GATEWAY);
+ error = process_ip_string(file, (char *)new_val->sub_net, NETMASK);
if (error)
goto setval_error;
- error = process_ip_string(ifcfg_file, (char *)new_val->dns_addr, DNS);
+ error = process_ip_string(file, (char *)new_val->gate_way, GATEWAY);
if (error)
goto setval_error;
- if (new_val->addr_family == ADDR_FAMILY_IPV6) {
- error = fprintf(nmfile, "\n[ipv6]\n");
- if (error < 0)
- goto setval_error;
- is_ipv6 = 1;
- } else {
- error = fprintf(nmfile, "\n[ipv4]\n");
- if (error < 0)
- goto setval_error;
- }
-
- /*
- * Now we populate the keyfile format
- */
-
- if (new_val->dhcp_enabled) {
- error = kvp_write_file(nmfile, "method", "", "auto");
- if (error < 0)
- goto setval_error;
- } else {
- error = kvp_write_file(nmfile, "method", "", "manual");
- if (error < 0)
- goto setval_error;
- }
-
- /*
- * Write the configuration for ipaddress, netmask, gateway and
- * name services
- */
- error = process_ip_string_nm(nmfile, (char *)new_val->ip_addr,
- (char *)new_val->sub_net, is_ipv6);
- if (error < 0)
- goto setval_error;
-
- error = fprintf(nmfile, "gateway=%s\n", (char *)new_val->gate_way);
- if (error < 0)
- goto setval_error;
-
- error = fprintf(nmfile, "dns=%s\n", (char *)new_val->dns_addr);
- if (error < 0)
+ error = process_ip_string(file, (char *)new_val->dns_addr, DNS);
+ if (error)
goto setval_error;
- fclose(nmfile);
- fclose(ifcfg_file);
+ fclose(file);
/*
* Now that we have populated the configuration file,
* invoke the external script to do its magic.
*/
- str_len = snprintf(cmd, sizeof(cmd), KVP_SCRIPTS_PATH "%s %s %s",
- "hv_set_ifconfig", if_filename, nm_filename);
+ str_len = snprintf(cmd, sizeof(cmd), KVP_SCRIPTS_PATH "%s %s",
+ "hv_set_ifconfig", if_file);
/*
* This is a little overcautious, but it's necessary to suppress some
* false warnings from gcc 8.0.1.
@@ -1485,16 +1316,14 @@ static int kvp_set_ip_info(char *if_name, struct hv_kvp_ipaddr_value *new_val)
if (system(cmd)) {
syslog(LOG_ERR, "Failed to execute cmd '%s'; error: %d %s",
- cmd, errno, strerror(errno));
+ cmd, errno, strerror(errno));
return HV_E_FAIL;
}
return 0;
-setmac_error:
- free(mac_addr);
+
setval_error:
syslog(LOG_ERR, "Failed to write config file");
- fclose(ifcfg_file);
- fclose(nmfile);
+ fclose(file);
return error;
}
diff --git a/hv_set_ifconfig.sh b/hv_set_ifconfig.sh
index 35aae6f..fe7fccf 100644
--- a/hv_set_ifconfig.sh
+++ b/hv_set_ifconfig.sh
@@ -18,12 +18,12 @@
#
# This example script is based on a RHEL environment.
#
-# Here is the ifcfg format of the ip configuration file:
+# Here is the format of the ip configuration file:
#
# HWADDR=macaddr
# DEVICE=interface name
# BOOTPROTO=<protocol> (where <protocol> is "dhcp" if DHCP is configured
-# or "none" if no boot-time protocol should be used)
+# or "none" if no boot-time protocol should be used)
#
# IPADDR0=ipaddr1
# IPADDR1=ipaddr2
@@ -41,32 +41,6 @@
# tagged as IPV6_DEFAULTGW and IPV6 NETMASK will be tagged as
# IPV6NETMASK.
#
-# Here is the keyfile format of the ip configuration file:
-#
-# [ethernet]
-# mac-address=macaddr
-# [connection]
-# interface-name=interface name
-#
-# [ipv4]
-# method=<protocol> (where <protocol> is "auto" if DHCP is configured
-# or "manual" if no boot-time protocol should be used)
-#
-# address1=ipaddr1/plen
-# address=ipaddr2/plen
-#
-# gateway=gateway1;gateway2
-#
-# dns=dns1;
-#
-# [ipv6]
-# address1=ipaddr1/plen
-# address2=ipaddr1/plen
-#
-# gateway=gateway1;gateway2
-#
-# dns=dns1;dns2
-#
# The host can specify multiple ipv4 and ipv6 addresses to be
# configured for the interface. Furthermore, the configuration
# needs to be persistent. A subsequent GET call on the interface
--
2.41.0

View File

@ -13,7 +13,7 @@
Name: hyperv-daemons
Version: 0
Release: 0.35%{?snapver}%{?dist}
Release: 0.36%{?snapver}%{?dist}
Summary: Hyper-V daemons suite
Group: System Environment/Daemons
@ -78,6 +78,12 @@ Patch13: hpvd-hv-hv_kvp_daemon-Support-for-keyfile-based-connectio.patch
Patch14: hpvd-hv-hv_kvp_daemon-Some-small-fixes-for-handling-NM-ke.patch
# For RHEL-9901 - [Hyper-V][RHEL-8] hyperv-daemons write incompatible IPv6 prefix (IPV6NETMASK) in connection configuration
Patch15: hpvd-Changes-for-adding-keyfile-support-in-RHEL-specific-.patch
# For RHEL-9901 - [Hyper-V][RHEL-8] hyperv-daemons write incompatible IPv6 prefix (IPV6NETMASK) in connection configuration
Patch16: hpvd-Revert-Changes-for-adding-keyfile-support-in-RHEL-sp.patch
# For RHEL-9901 - [Hyper-V][RHEL-8] hyperv-daemons write incompatible IPv6 prefix (IPV6NETMASK) in connection configuration
Patch17: hpvd-Revert-hv-hv_kvp_daemon-Some-small-fixes-for-handlin.patch
# For RHEL-9901 - [Hyper-V][RHEL-8] hyperv-daemons write incompatible IPv6 prefix (IPV6NETMASK) in connection configuration
Patch18: hpvd-Revert-hv-hv_kvp_daemon-Support-for-keyfile-based-co.patch
# For bz#2020141 - [Hyper-V][RHEL8.6][ARM64] No hyperv-daemons package built for aarch64 platform
# Patch6: hpvd-Enable-build-on-aarch64.patch
@ -200,6 +206,9 @@ cp -pvL %{SOURCE4} hv_set_ifconfig.sh
%patch13 -p1
%patch14 -p1
%patch15 -p1
%patch16 -p1
%patch17 -p1
%patch18 -p1
%build
# HYPERV KVP DAEMON
@ -317,6 +326,13 @@ fi
%{_sbindir}/vmbus_testing
%changelog
* Tue Jan 16 2024 Jon Maloy <jmaloy@redhat.com> - 0-0.36.20180415git
- hpvd-Revert-Changes-for-adding-keyfile-support-in-RHEL-sp.patch [RHEL-9901]
- hpvd-Revert-hv-hv_kvp_daemon-Some-small-fixes-for-handlin.patch [RHEL-9901]
- hpvd-Revert-hv-hv_kvp_daemon-Support-for-keyfile-based-co.patch [RHEL-9901]
- Resolves: RHEL-9901
([Hyper-V][RHEL-8] hyperv-daemons write incompatible IPv6 prefix (IPV6NETMASK) in connection configuration)
* Thu Dec 21 2023 Jon Maloy <jmaloy@redhat.com> - 0-0.35.20180415git
- hpvd-hv-hv_kvp_daemon-Support-for-keyfile-based-connectio.patch [RHEL-9901]
- hpvd-hv-hv_kvp_daemon-Some-small-fixes-for-handling-NM-ke.patch [RHEL-9901]