]> git.ipfire.org Git - thirdparty/iw.git/commitdiff
iw: event: handle interface add/del
authorMarkus Theil <markus.theil@tu-ilmenau.de>
Mon, 6 Jan 2020 15:10:21 +0000 (16:10 +0100)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 15 Jan 2020 10:05:59 +0000 (11:05 +0100)
Signed-off-by: Markus Theil <markus.theil@tu-ilmenau.de>
Link: https://lore.kernel.org/r/20200106151024.124315-2-markus.theil@tu-ilmenau.de
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
event.c

diff --git a/event.c b/event.c
index 2a12ca6901f271d31fba1d70dd848f738ab37bfb..baeafaeb53b86be673f5c0f348d7be7c2ecb9098 100644 (file)
--- a/event.c
+++ b/event.c
@@ -668,9 +668,22 @@ static void parse_new_peer_candidate(struct nlattr **attrs)
        printf("\n");
 }
 
-static void parse_set_interface(struct nlattr **attrs)
+static void parse_recv_interface(struct nlattr **attrs, int command)
 {
-       printf("set interface");
+       switch (command) {
+       case NL80211_CMD_NEW_INTERFACE:
+               printf("new interface");
+               break;
+       case NL80211_CMD_DEL_INTERFACE:
+               printf("del interface");
+               break;
+       case NL80211_CMD_SET_INTERFACE:
+               printf("set interface");
+               break;
+       default:
+               printf("unknown interface command (%i) received\n", command);
+               return;
+       }
 
        if (attrs[NL80211_ATTR_IFTYPE]) {
                printf(" type ");
@@ -787,8 +800,11 @@ static int print_event(struct nl_msg *msg, void *arg)
                  genlmsg_attrlen(gnlh, 0), NULL);
 
        if (tb[NL80211_ATTR_IFINDEX] && tb[NL80211_ATTR_WIPHY]) {
-               if_indextoname(nla_get_u32(tb[NL80211_ATTR_IFINDEX]), ifname);
-               printf("%s (phy #%d): ", ifname, nla_get_u32(tb[NL80211_ATTR_WIPHY]));
+               /* if_indextoname may fails on delete interface/wiphy event */
+               if(if_indextoname(nla_get_u32(tb[NL80211_ATTR_IFINDEX]), ifname))
+                       printf("%s (phy #%d): ", ifname, nla_get_u32(tb[NL80211_ATTR_WIPHY]));
+               else
+                       printf("phy #%d: ", nla_get_u32(tb[NL80211_ATTR_WIPHY]));
        } else if (tb[NL80211_ATTR_WDEV] && tb[NL80211_ATTR_WIPHY]) {
                printf("wdev 0x%llx (phy #%d): ",
                        (unsigned long long)nla_get_u64(tb[NL80211_ATTR_WDEV]),
@@ -1095,8 +1111,10 @@ static int print_event(struct nl_msg *msg, void *arg)
        case NL80211_CMD_NEW_PEER_CANDIDATE:
                parse_new_peer_candidate(tb);
                break;
+       case NL80211_CMD_NEW_INTERFACE:
        case NL80211_CMD_SET_INTERFACE:
-               parse_set_interface(tb);
+       case NL80211_CMD_DEL_INTERFACE:
+               parse_recv_interface(tb, gnlh->cmd);
                break;
        case NL80211_CMD_STA_OPMODE_CHANGED:
                parse_sta_opmode_changed(tb);