From patchwork Fri Oct 24 15:35:42 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Greear X-Patchwork-Id: 5148671 Return-Path: X-Original-To: patchwork-linux-wireless@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id ECEC69F349 for ; Fri, 24 Oct 2014 15:35:52 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id D4FCD20251 for ; Fri, 24 Oct 2014 15:35:51 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id C7A68201DD for ; Fri, 24 Oct 2014 15:35:50 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755768AbaJXPfs (ORCPT ); Fri, 24 Oct 2014 11:35:48 -0400 Received: from mail2.candelatech.com ([208.74.158.173]:48088 "EHLO mail2.candelatech.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755262AbaJXPfr (ORCPT ); Fri, 24 Oct 2014 11:35:47 -0400 Received: from build-f17.candelatech.com (firewall.candelatech.com [70.89.124.249]) by mail2.candelatech.com (Postfix) with ESMTP id 119CC40AC0B; Fri, 24 Oct 2014 08:35:47 -0700 (PDT) From: greearb@candelatech.com To: linux-wireless@vger.kernel.org Cc: johannes@sipsolutions.net, Ben Greear Subject: [PATCH v2] iw: support setting vif MAC during creation Date: Fri, 24 Oct 2014 08:35:42 -0700 Message-Id: <1414164942-23125-1-git-send-email-greearb@candelatech.com> X-Mailer: git-send-email 1.7.11.7 Sender: linux-wireless-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org X-Spam-Status: No, score=-8.3 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Ben Greear 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 --- v2: Removed header changes per request. info.c | 2 ++ interface.c | 20 ++++++++++++++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/info.c b/info.c index c5917d7..6244218 100644 --- a/info.c +++ b/info.c @@ -558,6 +558,8 @@ broken_combination: printf("\tDevice supports scan flush.\n"); if (features & NL80211_FEATURE_AP_SCAN) printf("\tDevice supports AP scan.\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]) diff --git a/interface.c b/interface.c index f769752..f8e39b3 100644 --- a/interface.c +++ b/interface.c @@ -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, " type [mesh_id ] [4addr on|off] [flags *]", +COMMAND(interface, add, " type [mesh_id ] [4addr on|off] [flags *] [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, " type [mesh_id ] [4addr on|off] [flags *]", +COMMAND(interface, add, " type [mesh_id ] [4addr on|off] [flags *] [addr ]", NL80211_CMD_NEW_INTERFACE, 0, CIB_NETDEV, handle_interface_add, NULL); static int handle_interface_del(struct nl80211_state *state,