diff options
Diffstat (limited to 'package/iw/patches/100-4addr.patch')
-rw-r--r-- | package/iw/patches/100-4addr.patch | 76 |
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, |