From 1dbcfdaf2f52ee208a7ee88f09f0642dbdb6c882 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Tue, 10 Nov 2009 19:27:19 +0000 Subject: mac80211: implement wds sta support (wds ap support work in progress, needs hostapd changes) SVN-Revision: 18356 --- package/iw/patches/000-upstream.patch | 155 ++++++++++++++++++++++++++++++++++ package/iw/patches/100-4addr.patch | 76 +++++++++++++++++ package/iw/patches/110-sta_vlan.patch | 69 +++++++++++++++ 3 files changed, 300 insertions(+) create mode 100644 package/iw/patches/000-upstream.patch create mode 100644 package/iw/patches/100-4addr.patch create mode 100644 package/iw/patches/110-sta_vlan.patch (limited to 'package/iw/patches') diff --git a/package/iw/patches/000-upstream.patch b/package/iw/patches/000-upstream.patch new file mode 100644 index 0000000000..8aee7758ae --- /dev/null +++ b/package/iw/patches/000-upstream.patch @@ -0,0 +1,155 @@ +--- a/Makefile ++++ b/Makefile +@@ -3,7 +3,7 @@ + MAKEFLAGS += --no-print-directory + + PREFIX ?= /usr +-BINDIR ?= $(PREFIX)/bin ++SBINDIR ?= $(PREFIX)/sbin + MANDIR ?= $(PREFIX)/share/man + PKG_CONFIG ?= pkg-config + +@@ -85,8 +85,8 @@ check: + + install: iw iw.8.gz + @$(NQ) ' INST iw' +- $(Q)$(MKDIR) $(DESTDIR)$(BINDIR) +- $(Q)$(INSTALL) -m 755 -t $(DESTDIR)$(BINDIR) iw ++ $(Q)$(MKDIR) $(DESTDIR)$(SBINDIR) ++ $(Q)$(INSTALL) -m 755 -t $(DESTDIR)$(SBINDIR) iw + @$(NQ) ' INST iw.8' + $(Q)$(MKDIR) $(DESTDIR)$(MANDIR)/man8/ + $(Q)$(INSTALL) -m 644 -t $(DESTDIR)$(MANDIR)/man8/ iw.8.gz +--- a/iw.c ++++ b/iw.c +@@ -223,9 +223,12 @@ static int phy_lookup(char *name) + if (fd < 0) + return -1; + pos = read(fd, buf, sizeof(buf) - 1); +- if (pos < 0) ++ if (pos < 0) { ++ close(fd); + return -1; ++ } + buf[pos] = '\0'; ++ close(fd); + return atoi(buf); + } + +--- a/nl80211.h ++++ b/nl80211.h +@@ -262,6 +262,9 @@ + * reasons, for this the %NL80211_ATTR_DISCONNECTED_BY_AP and + * %NL80211_ATTR_REASON_CODE attributes are used. + * ++ * @NL80211_CMD_SET_WIPHY_NETNS: Set a wiphy's netns. Note that all devices ++ * associated with this wiphy must be down and will follow. ++ * + * @NL80211_CMD_MAX: highest used command number + * @__NL80211_CMD_AFTER_LAST: internal use + */ +@@ -336,6 +339,8 @@ enum nl80211_commands { + NL80211_CMD_ROAM, + NL80211_CMD_DISCONNECT, + ++ NL80211_CMD_SET_WIPHY_NETNS, ++ + /* add new commands above here */ + + /* used to define NL80211_CMD_MAX below */ +@@ -475,10 +480,6 @@ enum nl80211_commands { + * @NL80211_ATTR_SCAN_FREQUENCIES: nested attribute with frequencies (in MHz) + * @NL80211_ATTR_SCAN_SSIDS: nested attribute with SSIDs, leave out for passive + * scanning and include a zero-length SSID (wildcard) for wildcard scan +- * @NL80211_ATTR_SCAN_GENERATION: the scan generation increases whenever the +- * scan result list changes (BSS expired or added) so that applications +- * can verify that they got a single, consistent snapshot (when all dump +- * messages carried the same generation number) + * @NL80211_ATTR_BSS: scan result BSS + * + * @NL80211_ATTR_REG_INITIATOR: indicates who requested the regulatory domain +@@ -573,6 +574,16 @@ enum nl80211_commands { + * and join_ibss(), key information is in a nested attribute each + * with %NL80211_KEY_* sub-attributes + * ++ * @NL80211_ATTR_PID: Process ID of a network namespace. ++ * ++ * @NL80211_ATTR_GENERATION: Used to indicate consistent snapshots for ++ * dumps. This number increases whenever the object list being ++ * dumped changes, and as such userspace can verify that it has ++ * obtained a complete and consistent snapshot by verifying that ++ * all dump messages contain the same generation number. If it ++ * changed then the list changed and the dump should be repeated ++ * completely from scratch. ++ * + * @NL80211_ATTR_MAX: highest attribute number currently defined + * @__NL80211_ATTR_AFTER_LAST: internal use + */ +@@ -644,7 +655,7 @@ enum nl80211_attrs { + + NL80211_ATTR_SCAN_FREQUENCIES, + NL80211_ATTR_SCAN_SSIDS, +- NL80211_ATTR_SCAN_GENERATION, ++ NL80211_ATTR_GENERATION, /* replaces old SCAN_GENERATION */ + NL80211_ATTR_BSS, + + NL80211_ATTR_REG_INITIATOR, +@@ -701,12 +712,17 @@ enum nl80211_attrs { + NL80211_ATTR_KEY, + NL80211_ATTR_KEYS, + ++ NL80211_ATTR_PID, ++ + /* add attributes here, update the policy in nl80211.c */ + + __NL80211_ATTR_AFTER_LAST, + NL80211_ATTR_MAX = __NL80211_ATTR_AFTER_LAST - 1 + }; + ++/* source-level API compatibility */ ++#define NL80211_ATTR_SCAN_GENERATION NL80211_ATTR_GENERATION ++ + /* + * Allow user space programs to use #ifdef on new attributes by defining them + * here +--- a/phy.c ++++ b/phy.c +@@ -140,3 +140,27 @@ static int handle_rts(struct nl80211_sta + COMMAND(set, rts, "", + NL80211_CMD_SET_WIPHY, 0, CIB_PHY, handle_rts, + "Set rts threshold."); ++ ++static int handle_netns(struct nl80211_state *state, ++ struct nl_cb *cb, ++ struct nl_msg *msg, ++ int argc, char **argv) ++{ ++ char *end; ++ ++ if (argc != 1) ++ return 1; ++ ++ NLA_PUT_U32(msg, NL80211_ATTR_PID, ++ strtoul(argv[0], &end, 10)); ++ ++ if (*end != '\0') ++ return 1; ++ ++ return 0; ++ nla_put_failure: ++ return -ENOBUFS; ++} ++COMMAND(set, netns, "", ++ NL80211_CMD_SET_WIPHY_NETNS, 0, CIB_PHY, handle_netns, ++ "Put this wireless device into a different network namespace"); +--- a/station.c ++++ b/station.c +@@ -127,7 +127,7 @@ static int print_sta_handler(struct nl_m + printf("\n\tmesh plid:\t%d", + nla_get_u16(sinfo[NL80211_STA_INFO_PLID])); + if (sinfo[NL80211_STA_INFO_PLINK_STATE]) { +- switch (nla_get_u16(sinfo[NL80211_STA_INFO_PLINK_STATE])) { ++ switch (nla_get_u8(sinfo[NL80211_STA_INFO_PLINK_STATE])) { + case LISTEN: + strcpy(state_name, "LISTEN"); + break; diff --git a/package/iw/patches/100-4addr.patch b/package/iw/patches/100-4addr.patch new file mode 100644 index 0000000000..db6b88010b --- /dev/null +++ b/package/iw/patches/100-4addr.patch @@ -0,0 +1,76 @@ +--- a/interface.c ++++ b/interface.c +@@ -137,6 +137,20 @@ static int get_if_type(int *argc, char * + return 2; + } + ++static int parse_wds_flag(const char *value, struct nl_msg *msg) ++{ ++ if (strcmp(value, "on") == 0) ++ NLA_PUT_U8(msg, NL80211_ATTR_4ADDR, 1); ++ else if (strcmp(value, "off") == 0) ++ NLA_PUT_U8(msg, NL80211_ATTR_4ADDR, 0); ++ else ++ return 1; ++ return 0; ++ ++nla_put_failure: ++ return 1; ++} ++ + static int handle_interface_add(struct nl80211_state *state, + struct nl_cb *cb, + struct nl_msg *msg, +@@ -168,6 +182,15 @@ static int handle_interface_add(struct n + mesh_id = argv[0]; + argc--; + argv++; ++ } else if (strcmp(argv[0], "wds") == 0) { ++ argc--; ++ argv++; ++ if (parse_wds_flag(argv[0], msg)) { ++ fprintf(stderr, "wds error\n"); ++ return 2; ++ } ++ argc--; ++ argv++; + } else if (strcmp(argv[0], "flags") == 0) { + argc--; + argv++; +@@ -192,14 +215,14 @@ static int handle_interface_add(struct n + nla_put_failure: + return -ENOBUFS; + } +-COMMAND(interface, add, " type [mesh_id ] [flags *]", ++COMMAND(interface, add, " type [mesh_id ] [wds on|off] [flags *]", + 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 ] [flags *]", ++COMMAND(interface, add, " type [mesh_id ] [wds on|off] [flags *]", + NL80211_CMD_NEW_INTERFACE, 0, CIB_NETDEV, handle_interface_add, NULL); + + static int handle_interface_del(struct nl80211_state *state, +--- a/nl80211.h ++++ b/nl80211.h +@@ -584,6 +584,8 @@ enum nl80211_commands { + * changed then the list changed and the dump should be repeated + * completely from scratch. + * ++ * @NL80211_ATTR_4ADDR: Use 4-address frames on a virtual interface ++ * + * @NL80211_ATTR_MAX: highest attribute number currently defined + * @__NL80211_ATTR_AFTER_LAST: internal use + */ +@@ -714,6 +716,8 @@ enum nl80211_attrs { + + NL80211_ATTR_PID, + ++ NL80211_ATTR_4ADDR, ++ + /* add attributes here, update the policy in nl80211.c */ + + __NL80211_ATTR_AFTER_LAST, diff --git a/package/iw/patches/110-sta_vlan.patch b/package/iw/patches/110-sta_vlan.patch new file mode 100644 index 0000000000..913c698bbc --- /dev/null +++ b/package/iw/patches/110-sta_vlan.patch @@ -0,0 +1,69 @@ +--- a/station.c ++++ b/station.c +@@ -196,7 +196,7 @@ COMMAND(station, del, "", + 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 nl8 + return -ENOBUFS; + } + COMMAND(station, set, " plink_action ", +- 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, " vlan ", ++ 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, -- cgit v1.2.3