File 0001-virsh-iface-list-not-working-as-expected-bsc-1029201.patch of Package netcontrol.14434

From 9653faeead3d1a851c3cb2f20af353a629ee01a7 Mon Sep 17 00:00:00 2001
From: Nikola Pajkovsky <npajkovsky@suse.de>
Date: Mon, 10 Jul 2017 11:52:09 +0100
References: bsc#1029201
Upstream: merged
Subject: [PATCH] virsh iface-list not working as expected (bsc#1029201)

commit f1592239fc68afd254e207ec833964b9c672db85
Author: Marius Tomaschewski <mt@suse.de>
Date:   Mon Jul 10 10:40:10 2017 +0200

    filter inactive configs by iftype, not by arp-type

commit 45271cb4fe11aa3415535247f480614af9472c5a
Author: Marius Tomaschewski <mt@suse.de>
Date:   Mon Jul 10 10:29:25 2017 +0200

    call regular ifstatus, do not try to shorten in read

diff --git a/src/backend-suse.c b/src/backend-suse.c
index 7e76a24..5e5e811 100644
--- a/src/backend-suse.c
+++ b/src/backend-suse.c
@@ -138,7 +138,7 @@ static int		__suse_config_read_routes(nc_route_array_t *routes,
 						  const char       *file,
 						  const char       *ifname);
 static int		__suse_system_read_state(nc_interface_t *ifp);
-static int		__suse_ifstatus(nc_interface_t *ifp, unsigned *status);
+
 
 #define _SYSCONFIG_NETWORK_DIR		"/etc/sysconfig/network"
 #define _CONFIG_GLOBAL  		"config"
@@ -2109,7 +2109,6 @@ __suse_config_read_ifcfg(nc_handle_t *nh, nc_interface_t *ifp, nc_sysconfig_t *s
 		__suse_ifcfg_bootproto_set(ifp, "static");
 	}
 
-	__suse_ifstatus(ifp, &ifp->ifflags);
 	/*
 	__suse_config_load_sysctls(nh, ifp, &sysctl);
 	__suse_adjust_ipv6_autoconf(ifp, &sysctl);
@@ -2528,8 +2527,6 @@ __suse_system_read_state(nc_interface_t *ifp)
 	/* TODO: double check use of 'none' */
 	__nc_discover_bootproto(ifp);
 
-	__suse_ifstatus(ifp, &ifp->ifflags);
-
 	if(nc_sysfs_netif_get_string(ifp->name, "address", &value) < 0) {
 		nc_warn("failed to read hwaddr from sysfs");
 	} else if(value && nc_string_len(value)) {
@@ -2540,60 +2537,6 @@ __suse_system_read_state(nc_interface_t *ifp)
 	return ret;
 }
 
-int
-__suse_ifstatus(nc_interface_t *ifp, unsigned *status)
-{
-	char if_file[PATH_MAX + 1] = {'\0'};
-	nc_sysconfig_t *sc;
-	nc_var_t *v;
-#if 0
-	char *operstate = NULL;
-#endif
-
-	if(!ifp || !ifp->name || !status)
-		return -1;
-
-	/* for now ... */
-
-	*status &= ~NC_IFF_NETWORK_UP;
-
-#if 0	/* Hmm... ifstatus usually check UP flag, not operstate...
-	 * It is very expensive to call ifstatus in every refresh
-	 * [~ every 3 secs with active virt-manager] ...
-	 *
-	 * => ncf_if_status for true ifstatus call.
-	 */
-	if(nc_sysfs_netif_get_string(ifp->name, "operstate", &operstate) == 0) {
-		if(nc_string_eq(operstate, "down") ||
-		   nc_string_eq(operstate, "lowerlayerdown")) {
-			nc_string_free(&operstate);
-			return 0;
-		}
-		nc_string_free(&operstate);
-	}
-#endif
-
-	snprintf(if_file, sizeof(if_file), "/dev/.sysconfig/network/if-%s", ifp->name);
-	sc = nc_sysconfig_read(if_file);
-	if(sc) {
-		if(NC_ADDRCONF_TEST(ifp->ipv4.addrconf, NC_ADDRCONF_DHCP)) {
-			v = nc_sysconfig_get(sc, "dhcp4_state");
-			if(v && (nc_string_eq(v->value, "complete") ||
-				 nc_string_eq(v->value, "new") ||
-				 nc_string_eq(v->value, "up"))) {
-				*status |= NC_IFF_NETWORK_UP;
-			}
-		} else {
-			v = nc_sysconfig_get(sc, "status");
-			if(v && nc_string_eq(v->value, "connected")) {
-				*status |= NC_IFF_NETWORK_UP;
-			}
-		}
-		nc_sysconfig_free(sc);
-	}
-	return 0;
-}
-
 void
 nc_ifcfg_trace_dump(const nc_sysconfig_t *sc)
 {
diff --git a/src/netcf-xml.c b/src/netcf-xml.c
index 02c6538..c4d938b 100644
--- a/src/netcf-xml.c
+++ b/src/netcf-xml.c
@@ -131,25 +131,31 @@ __get_iftype_name(unsigned int type)
 }
 
 static unsigned int
-__map_iftype_to_netcf(unsigned int type)
+__map_iftype_to_netcf(const nc_interface_t *ifp, unsigned int strict)
 {
-	switch(type) {
+	switch(ifp ? ifp->type : NC_IFTYPE_UNKNOWN) {
+		case NC_IFTYPE_ETHERNET:
 		case NC_IFTYPE_BRIDGE:
-		case NC_IFTYPE_BOND:
 		case NC_IFTYPE_VLAN:
-			return type;
-		break;
+			return ifp->type;
+
+		case NC_IFTYPE_BOND:
+			if (strict && ifp->bonding &&
+			    ifp->bonding->slave_type != NC_IFTYPE_ETHERNET)
+				break;
+			return ifp->type;
 
-		case NC_IFTYPE_ETHERNET:
 		case NC_IFTYPE_LOOPBACK:	/* as netcf does ... */
 		case NC_IFTYPE_TOKENRING:
-		case NC_IFTYPE_INFINIBAND:	/* hmm... for now */
+		case NC_IFTYPE_INFINIBAND:
+			if (strict)
+				break;
 		case NC_IFTYPE_DUMMY:
 		case NC_IFTYPE_TAP:
 			return NC_IFTYPE_ETHERNET;
-		break;
+
 		default:
-		break;
+			break;
 	}
 	return NC_IFTYPE_UNKNOWN;
 }
@@ -244,10 +250,10 @@ __nc_netcf_supported_inteface(	nc_syntax_t          *syntax,
 	if(!syntax || !handle || !ifp || !ifp->name)
 		return -1;
 
-	if(syntax->strict && ifp->arp_type != ARPHRD_ETHER)
+	if(syntax->strict && ifp->ifindex && ifp->arp_type != ARPHRD_ETHER)
 		return 1;
 
-	if(__map_iftype_to_netcf(ifp->type) == NC_IFTYPE_UNKNOWN)
+	if(__map_iftype_to_netcf(ifp, syntax->strict) == NC_IFTYPE_UNKNOWN)
 		return 1;
 
 	if(ifp->startmode == NC_STARTMODE_NFSROOT ||
@@ -356,7 +362,7 @@ __netcf_xml_from_interface(	nc_syntax_t          *syntax,
 		return NULL;
 
 	assert(ifp && ifp->name);
-	type = __map_iftype_to_netcf(ifp->type);
+	type = __map_iftype_to_netcf(ifp, syntax->strict);
 	if(type == NC_IFTYPE_UNKNOWN)
 		return NULL;
 
diff --git a/src/netcf.c b/src/netcf.c
index a3a78f9..33a0499 100644
--- a/src/netcf.c
+++ b/src/netcf.c
@@ -718,6 +718,7 @@ __ncf_list_interfaces(struct netcf *ncf, unsigned int flags,
 			state = NETCF_IFACE_INACTIVE;
 			cur = nc_interface_by_name(ncf->system.handle, ifp->name);
 			if(cur) {
+				nc_interface_status(ncf->system.handle, cur);
 				if(nc_interface_network_is_up(cur))
 					state = NETCF_IFACE_ACTIVE;
 			}
-- 
2.16.4

openSUSE Build Service is sponsored by