summaryrefslogtreecommitdiff
path: root/src/network
diff options
context:
space:
mode:
authorTobias Jungel <tobias.jungel@bisdn.de>2016-06-09 13:44:31 +0200
committerTobias Jungel <tobias.jungel@bisdn.de>2016-06-09 21:42:05 +0200
commit6cad256dbe6343de4329934ea7c08707a365d340 (patch)
tree79fa82afebbc82509011c86c32e0f689e0058656 /src/network
parentd643a60a9e0be4bea0495f4f1a3792eb2300e48d (diff)
networkd-link: parse linkinfo to get kind
Diffstat (limited to 'src/network')
-rw-r--r--src/network/networkd-link.c20
-rw-r--r--src/network/networkd-link.h1
2 files changed, 20 insertions, 1 deletions
diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c
index 6746d88fc8..5f25873b46 100644
--- a/src/network/networkd-link.c
+++ b/src/network/networkd-link.c
@@ -396,7 +396,7 @@ static int link_update_flags(Link *link, sd_netlink_message *m) {
static int link_new(Manager *manager, sd_netlink_message *message, Link **ret) {
_cleanup_link_unref_ Link *link = NULL;
uint16_t type;
- const char *ifname;
+ const char *ifname, *kind = NULL;
int r, ifindex;
unsigned short iftype;
@@ -404,6 +404,15 @@ static int link_new(Manager *manager, sd_netlink_message *message, Link **ret) {
assert(message);
assert(ret);
+ /* check for link kind */
+ r = sd_netlink_message_enter_container(message, IFLA_LINKINFO);
+ if (r == 0) {
+ (void)sd_netlink_message_read_string(message, IFLA_INFO_KIND, &kind);
+ r = sd_netlink_message_exit_container(message);
+ if (r < 0)
+ return r;
+ }
+
r = sd_netlink_message_get_type(message, &type);
if (r < 0)
return r;
@@ -438,6 +447,12 @@ static int link_new(Manager *manager, sd_netlink_message *message, Link **ret) {
if (!link->ifname)
return -ENOMEM;
+ if (kind) {
+ link->kind = strdup(kind);
+ if (!link->kind)
+ return -ENOMEM;
+ }
+
r = sd_netlink_message_read_ether_addr(message, IFLA_ADDRESS, &link->mac);
if (r < 0)
log_link_debug_errno(link, r, "MAC address not found for new device, continuing without");
@@ -515,6 +530,9 @@ static void link_free(Link *link) {
free(link->ifname);
+ if (link->kind)
+ free(link->kind);
+
(void)unlink(link->state_file);
free(link->state_file);
diff --git a/src/network/networkd-link.h b/src/network/networkd-link.h
index 7db94e79e8..2809b1fe0b 100644
--- a/src/network/networkd-link.h
+++ b/src/network/networkd-link.h
@@ -68,6 +68,7 @@ typedef struct Link {
int ifindex;
char *ifname;
+ char *kind;
unsigned short iftype;
char *state_file;
struct ether_addr mac;