summaryrefslogtreecommitdiffstats
path: root/python-ethtool/etherinfo.c
diff options
context:
space:
mode:
Diffstat (limited to 'python-ethtool/etherinfo.c')
-rw-r--r--python-ethtool/etherinfo.c32
1 files changed, 27 insertions, 5 deletions
diff --git a/python-ethtool/etherinfo.c b/python-ethtool/etherinfo.c
index 538bcb5..c8bbb0f 100644
--- a/python-ethtool/etherinfo.c
+++ b/python-ethtool/etherinfo.c
@@ -78,6 +78,7 @@ void free_etherinfo(struct etherinfo *ptr)
free(ptr->hwaddress);
}
Py_XDECREF(ptr->ipv4_addresses);
+ Py_XDECREF(ptr->ipv6_addresses);
free(ptr);
}
@@ -117,6 +118,7 @@ append_object_for_netlink_address(struct etherinfo *ethi,
assert(ethi);
assert(ethi->ipv4_addresses);
+ assert(ethi->ipv6_addresses);
assert(addr);
addr_obj = make_python_address_from_rtnl_addr(addr);
@@ -124,11 +126,24 @@ append_object_for_netlink_address(struct etherinfo *ethi,
return -1;
}
- if (-1 == PyList_Append(ethi->ipv4_addresses, addr_obj)) {
- Py_DECREF(addr_obj);
- return -1;
- }
+ switch (rtnl_addr_get_family(addr)) {
+ case AF_INET:
+ if (-1 == PyList_Append(ethi->ipv4_addresses, addr_obj)) {
+ Py_DECREF(addr_obj);
+ return -1;
+ }
+ break;
+
+ case AF_INET6:
+ if (-1 == PyList_Append(ethi->ipv6_addresses, addr_obj)) {
+ Py_DECREF(addr_obj);
+ return -1;
+ }
+ break;
+ default:
+ return -1;
+ }
Py_DECREF(addr_obj);
/* Success */
@@ -153,6 +168,7 @@ static void callback_nl_address(struct nl_object *obj, void *arg)
switch( rtnl_addr_get_family(rtaddr) ) {
case AF_INET:
+ case AF_INET6:
append_object_for_netlink_address(ethi, rtaddr);
return;
default:
@@ -168,7 +184,6 @@ static void callback_nl_address(struct nl_object *obj, void *arg)
*
*/
-
/**
* Query NETLINK for ethernet configuration
*
@@ -252,6 +267,13 @@ int get_etherinfo(struct etherinfo_obj_data *data, nlQuery query)
return 0;
}
+ /* Likewise for IPv6 addresses: */
+ Py_XDECREF(ethinf->ipv6_addresses);
+ ethinf->ipv6_addresses = PyList_New(0);
+ if (!ethinf->ipv6_addresses) {
+ return 0;
+ }
+
/* Retrieve all address information */
nl_cache_foreach_filter(addr_cache, OBJ_CAST(addr), callback_nl_address, ethinf);
rtnl_addr_put(addr);