]> git.ipfire.org Git - thirdparty/iw.git/commitdiff
iw: support setting vif MAC during creation
authorBen Greear <greearb@candelatech.com>
Fri, 24 Oct 2014 15:35:42 +0000 (08:35 -0700)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 29 Oct 2014 16:10:19 +0000 (17:10 +0100)
This saves an extra call to change it later, and will
also keep udev from potentially messing with a vif
it should not be messing with.

Signed-off-by: Ben Greear <greearb@candelatech.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
info.c
interface.c

diff --git a/info.c b/info.c
index 77101ea88457d64c840e8e331dd293f524a94ca6..62b4581dbca41b61db149f408f02a1d15fd42ce9 100644 (file)
--- a/info.c
+++ b/info.c
@@ -583,6 +583,8 @@ broken_combination:
                        printf("\tDevice supports static SMPS\n");
                if (features & NL80211_FEATURE_DYNAMIC_SMPS)
                        printf("\tDevice supports dynamic SMPS\n");
+               if (features & NL80211_FEATURE_MAC_ON_CREATE)
+                       printf("\tDevice supports configuring vdev MAC-addr on create.\n");
        }
 
        if (tb_msg[NL80211_ATTR_TDLS_SUPPORT])
index f7697523a53e63965c2ace4eb70cb25bb4b51b76..f8e39b37147042826acb6f07824605725ce1c547 100644 (file)
@@ -171,6 +171,8 @@ static int handle_interface_add(struct nl80211_state *state,
        char *mesh_id = NULL;
        enum nl80211_iftype type;
        int tpset;
+       unsigned char mac_addr[ETH_ALEN];
+       int found_mac = 0;
 
        if (argc < 1)
                return 1;
@@ -183,6 +185,7 @@ static int handle_interface_add(struct nl80211_state *state,
        if (tpset)
                return tpset;
 
+try_another:
        if (argc) {
                if (strcmp(argv[0], "mesh_id") == 0) {
                        argc--;
@@ -193,6 +196,17 @@ static int handle_interface_add(struct nl80211_state *state,
                        mesh_id = argv[0];
                        argc--;
                        argv++;
+               } else if (strcmp(argv[0], "addr") == 0) {
+                       argc--;
+                       argv++;
+                       if (mac_addr_a2n(mac_addr, argv[0])) {
+                               fprintf(stderr, "Invalid MAC address\n");
+                               return 2;
+                       }
+                       argc--;
+                       argv++;
+                       found_mac = 1;
+                       goto try_another;
                } else if (strcmp(argv[0], "4addr") == 0) {
                        argc--;
                        argv++;
@@ -221,19 +235,21 @@ static int handle_interface_add(struct nl80211_state *state,
        NLA_PUT_U32(msg, NL80211_ATTR_IFTYPE, type);
        if (mesh_id)
                NLA_PUT(msg, NL80211_ATTR_MESH_ID, strlen(mesh_id), mesh_id);
+       if (found_mac)
+               NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr);
 
        return 0;
  nla_put_failure:
        return -ENOBUFS;
 }
-COMMAND(interface, add, "<name> type <type> [mesh_id <meshid>] [4addr on|off] [flags <flag>*]",
+COMMAND(interface, add, "<name> type <type> [mesh_id <meshid>] [4addr on|off] [flags <flag>*] [addr <mac-addr>]",
        NL80211_CMD_NEW_INTERFACE, 0, CIB_PHY, handle_interface_add,
        "Add a new virtual interface with the given configuration.\n"
        IFACE_TYPES "\n\n"
        "The flags are only used for monitor interfaces, valid flags are:\n"
        VALID_FLAGS "\n\n"
        "The mesh_id is used only for mesh mode.");
-COMMAND(interface, add, "<name> type <type> [mesh_id <meshid>] [4addr on|off] [flags <flag>*]",
+COMMAND(interface, add, "<name> type <type> [mesh_id <meshid>] [4addr on|off] [flags <flag>*] [addr <mac-addr>]",
        NL80211_CMD_NEW_INTERFACE, 0, CIB_NETDEV, handle_interface_add, NULL);
 
 static int handle_interface_del(struct nl80211_state *state,