]> git.ipfire.org Git - thirdparty/iw.git/commitdiff
iw: add a command for moving a STA into an AP VLAN
authorFelix Fietkau <nbd@openwrt.org>
Wed, 11 Nov 2009 12:22:23 +0000 (13:22 +0100)
committerJohannes Berg <johannes@sipsolutions.net>
Wed, 11 Nov 2009 13:41:28 +0000 (14:41 +0100)
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
station.c

index a4865f9d7c536c4e127d10e8ac81245986e0bd4e..609ce952651ff7eb70c9f4c9eb74f27e7b6a4230 100644 (file)
--- a/station.c
+++ b/station.c
@@ -196,7 +196,7 @@ COMMAND(station, del, "<MAC address>",
        NL80211_CMD_DEL_STATION, 0, CIB_NETDEV, handle_station_get,
        "Remove the given station entry (use with caution!)");
 
-static int handle_station_set(struct nl80211_state *state,
+static int handle_station_set_plink(struct nl80211_state *state,
                              struct nl_cb *cb,
                              struct nl_msg *msg,
                              int argc, char **argv)
@@ -241,9 +241,56 @@ static int handle_station_set(struct nl80211_state *state,
        return -ENOBUFS;
 }
 COMMAND(station, set, "<MAC address> plink_action <open|block>",
-       NL80211_CMD_SET_STATION, 0, CIB_NETDEV, handle_station_set,
+       NL80211_CMD_SET_STATION, 0, CIB_NETDEV, handle_station_set_plink,
        "Set mesh peer link action for this station (peer).");
 
+static int handle_station_set_vlan(struct nl80211_state *state,
+                             struct nl_cb *cb,
+                             struct nl_msg *msg,
+                             int argc, char **argv)
+{
+       unsigned char mac_addr[ETH_ALEN];
+       unsigned long sta_vlan = 0;
+       char *err = NULL;
+
+       if (argc < 3)
+               return 1;
+
+       if (mac_addr_a2n(mac_addr, argv[0])) {
+               fprintf(stderr, "invalid mac address\n");
+               return 2;
+       }
+       argc--;
+       argv++;
+
+       if (strcmp("vlan", argv[0]) != 0)
+               return 1;
+       argc--;
+       argv++;
+
+       sta_vlan = strtoul(argv[0], &err, 0);
+       if (err && *err) {
+               fprintf(stderr, "invalid vlan id\n");
+               return 2;
+       }
+       argc--;
+       argv++;
+
+       if (argc)
+               return 1;
+
+       NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr);
+       NLA_PUT_U32(msg, NL80211_ATTR_STA_VLAN, sta_vlan);
+
+       return 0;
+ nla_put_failure:
+       return -ENOBUFS;
+}
+COMMAND(station, set, "<MAC address> vlan <ifindex>",
+       NL80211_CMD_SET_STATION, 0, CIB_NETDEV, handle_station_set_vlan,
+       "Set an AP VLAN for this station.");
+
+
 static int handle_station_dump(struct nl80211_state *state,
                               struct nl_cb *cb,
                               struct nl_msg *msg,