aboutsummaryrefslogtreecommitdiffstats
path: root/package/iw/patches/100-4addr.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/iw/patches/100-4addr.patch')
-rw-r--r--package/iw/patches/100-4addr.patch76
1 files changed, 76 insertions, 0 deletions
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, "<name> type <type> [mesh_id <meshid>] [flags <flag>*]",
++COMMAND(interface, add, "<name> type <type> [mesh_id <meshid>] [wds on|off] [flags <flag>*]",
+ 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>] [flags <flag>*]",
++COMMAND(interface, add, "<name> type <type> [mesh_id <meshid>] [wds on|off] [flags <flag>*]",
+ 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,