On 08/07/2013 04:46 AM, Xu Wang wrote:
The default network card (used as forward device in network pool)
name
was set as "eth0" in Virt_SettingDefineCapabilities.c. This patch added
check if there is such a network card exists in the network info list.
If it exists, use it. If not, the default network card would be changed
into the first one in the network devices list.
Signed-off-by: Xu Wang <gesaint(a)linux.vnet.ibm.com>
Something is not quite right - I got the following result
when using this code and the RASD test
--------------------------------------------------------------------
RASD - 06_parent_net_pool.py: FAIL
ERROR - Exception details: Mismatching Mode and device values, Got [('None', 0L),
('None', 1L), ('tun0', 1L), ('None', 2L), ('tun0', 2L)],
Expected [('None', 0L), ('None', 1L), ('lo', 1L), ('None',
2L), ('lo', 2L)]
--------------------------------------------------------------------
I seem to have had some other failures afterwards which caused
libvirtd to crash, but that could be because I'm running with top
of tree and other changes...
If I cut out your code and run it in it's own program passing "eth0"
as a parameter here's what I get (although em1 is what I'd be
expecting to return):
interface num = 4
network device name: tun0
network device name: virbr0
network device name: em1
network device name: lo
forward_device = lo
I have Fedora 19.. and here's some ip addr results:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
2: em1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen
1000
3: wlp3s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
4: virbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
5: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master virbr0
state UNKNOWN qlen 500
6: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state
UNKNOWN qlen 100
8: vnet1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master virbr0
state UNKNOWN qlen 500
and ifconfig:
em1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
tun0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1500
virbr0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
vnet0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
vnet1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
Specific comments below
---
libxkutil/misc_util.c | 39 +++++++++++++++++++++++++++++++++
libxkutil/misc_util.h | 2 +-
src/Virt_SettingsDefineCapabilities.c | 6 ++++-
3 files changed, 45 insertions(+), 2 deletions(-)
diff --git a/libxkutil/misc_util.c b/libxkutil/misc_util.c
index 9e7e0d5..7541aa3 100644
--- a/libxkutil/misc_util.c
+++ b/libxkutil/misc_util.c
@@ -33,6 +33,8 @@
#include <errno.h>
#include <libvirt/libvirt.h>
#include <libvirt/virterror.h>
+#include <net/if.h>
+#include <sys/ioctl.h>
#include "cmpidt.h"
#include "cmpift.h"
@@ -900,6 +902,43 @@ int virt_set_status(const CMPIBroker *broker,
return ret;
}
+char *get_avail_net(const char *def_name)
+{
+ int fd;
+ int interfaceNum = 0;
+ struct ifreq buf[16];
+ struct ifconf ifc;
+ char *avail_name = NULL;
+
^
'git am' complains about trailing whitespace
+ if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
+ CU_DEBUG("socket() failed.");
+ goto out;
Need to add extra space before each line
+ }
+
^
'git am' complains about trailing whitespace
+ ifc.ifc_len = sizeof(buf);
+ ifc.ifc_buf = (caddr_t)buf;
If you're going to go this route SIOCGIFCOUNT will get you
the interface count so you don't have use a constant 16 value
which could be too limiting.
+ if (!ioctl(fd, SIOCGIFCONF, (char *)&ifc)) {
+ interfaceNum = ifc.ifc_len / sizeof(struct ifreq);
+ CU_DEBUG("interface num = %d", interfaceNum);
Unfortunately you know nothing "about" the interface - just that it
exists and that's your sole criteria for selecting. If you don't find
the one that's passed in you select the last one in the list - which
happens to be loopback (lo) which certainly isn't what you want.
You can look at libvirt source code src/util/virnetdev.c for some sample
processing - get the names, get their flags, get other state/date info
about them.
I think the method I had asked for before was to use bind to INADDR_ANY
and socket/bind. It's been a while since I've had to do this so I'm
not sure of the best mechanism to use to solve the problem to find a
network interface card that can/should be used for this.
One would think there'd be an easier way to get what is wanted here!
+ while (interfaceNum-- > 0) {
+ CU_DEBUG("network device name: %s",
buf[interfaceNum].ifr_name);
+ if (!strcmp(def_name, buf[interfaceNum].ifr_name)) {
+ avail_name = strdup(buf[interfaceNum].ifr_name);
+ goto out;
+ }
+ }
+
+ avail_name = strdup(buf[0].ifr_name);
+ } else {
+ CU_DEBUG("ioctl: %s [%s:%d]\n", strerror(errno), __FILE__,
__LINE__);
+ goto out;
Need to remove extra space before each of the lines above
+ }
+
^
'git am' complains about trailing whitespace
+out:
+ close(fd);
if (fd >= 0)
close(fd);
+ return avail_name;
+}
+
/*
* Local Variables:
diff --git a/libxkutil/misc_util.h b/libxkutil/misc_util.h
index fd4f191..9489a18 100644
--- a/libxkutil/misc_util.h
+++ b/libxkutil/misc_util.h
@@ -157,7 +157,7 @@ const char *get_mig_ssh_tmp_key(void);
bool get_disable_kvm(void);
const char *get_lldptool_query_options(void);
const char *get_vsi_support_key_string(void);
-
+char *get_avail_net(const char *def_name);
/*
* Local Variables:
* mode: C
diff --git a/src/Virt_SettingsDefineCapabilities.c
b/src/Virt_SettingsDefineCapabilities.c
index 78c128c..817980c 100644
--- a/src/Virt_SettingsDefineCapabilities.c
+++ b/src/Virt_SettingsDefineCapabilities.c
@@ -777,6 +777,7 @@ static CMPIStatus set_net_pool_props(const CMPIObjectPath *ref,
int dev_count;
int i;
char *tmp_str = NULL;
+ char *forward_device = NULL;
/* Isolated network pools don't have a forward device */
if (pool_type == NETPOOL_FORWARD_NONE)
@@ -836,14 +837,17 @@ static CMPIStatus set_net_pool_props(const CMPIObjectPath *ref,
(CMPIValue *)&pool_type, CMPI_uint16);
if (i == 1) {
+ forward_device = get_avail_net("eth0");
+
CMSetProperty(inst, "ForwardDevice",
- (CMPIValue *)"eth0", CMPI_chars);
+ (CMPIValue *)forward_device, CMPI_chars);
}
inst_list_add(list, inst);
}
out:
+ free(forward_device);
return s;
}