From 39566cca6d30d533c7c95a2ae8ffad13728c1f66 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Wed, 11 Nov 2009 13:20:40 +0100 Subject: iw: add support for setting the wds/4-address flag when creating an interface Signed-off-by: Felix Fietkau Signed-off-by: Johannes Berg --- interface.c | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) (limited to 'interface.c') diff --git a/interface.c b/interface.c index bf1335a..c092aa2 100644 --- a/interface.c +++ b/interface.c @@ -137,6 +137,20 @@ static int get_if_type(int *argc, char ***argv, enum nl80211_iftype *type, return 2; } +static int parse_4addr_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 nl80211_state *state, mesh_id = argv[0]; argc--; argv++; + } else if (strcmp(argv[0], "4addr") == 0) { + argc--; + argv++; + if (parse_4addr_flag(argv[0], msg)) { + fprintf(stderr, "4addr 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 nl80211_state *state, nla_put_failure: return -ENOBUFS; } -COMMAND(interface, add, " type [mesh_id ] [flags *]", +COMMAND(interface, add, " type [mesh_id ] [4addr 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 ] [4addr on|off] [flags *]", NL80211_CMD_NEW_INTERFACE, 0, CIB_NETDEV, handle_interface_add, NULL); static int handle_interface_del(struct nl80211_state *state, -- cgit v1.2.3