[][Add mwctl support for mtk opensource/proprietary driver]
[Description]
Add mwctl support for mtk opensource/proprietary driver, mwctl is used
to replace iwpriv and mt76-vendor tools, mwctl uses nl80211 to
communicate with driver.
[Release-log]
Change-Id: If6deb6bfb9582212fa6ea8e5e589b478d206a383
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/5648065
diff --git a/feed/mwctl/src/mwctl.h b/feed/mwctl/src/mwctl.h
new file mode 100755
index 0000000..15bf92e
--- /dev/null
+++ b/feed/mwctl/src/mwctl.h
@@ -0,0 +1,112 @@
+#ifndef __WM_H
+#define __WM_H
+
+#include <stdbool.h>
+#include <netlink/netlink.h>
+#include <netlink/genl/genl.h>
+#include <netlink/genl/family.h>
+#include <netlink/genl/ctrl.h>
+#include <endian.h>
+
+enum command_identify_by {
+ CIB_NONE,
+ CIB_PHY,
+ CIB_NETDEV,
+ CIB_WDEV,
+};
+
+/* libnl 1.x compatibility code */
+#if !defined(CONFIG_LIBNL20) && !defined(CONFIG_LIBNL30)
+# define nl_sock nl_handle
+#endif
+
+struct nl80211_state {
+ struct nl_sock *nl_sock;
+ int nl80211_id;
+};
+
+enum id_input {
+ II_NONE,
+ II_NETDEV,
+ II_PHY_NAME,
+ II_PHY_IDX,
+ II_WDEV,
+};
+
+struct cmd {
+ const char *name;
+ const char *args;
+ const char *help;
+ const enum mtk_nl80211_vendor_commands cmd;
+ int nl_msg_flags;
+ int hidden;
+ const enum command_identify_by idby;
+ /*
+ * The handler should return a negative error code,
+ * zero on success, 1 if the arguments were wrong.
+ * Return 2 iff you provide the error message yourself.
+ */
+ int (*handler)(struct nl_msg *msg, int argc,
+ char **argv, void *ctx);
+ const struct cmd *(*selector)(int argc, char **argv);
+ const struct cmd *parent;
+};
+#ifndef ARRAY_SIZE
+#define ARRAY_SIZE(ar) (sizeof(ar)/sizeof(ar[0]))
+#endif
+#ifndef DIV_ROUND_UP
+#define DIV_ROUND_UP(x, y) (((x) + (y - 1)) / (y))
+#endif
+#define __COMMAND(_section, _symname, _name, _args, _nlcmd, _flags, _hidden, _idby, _handler, _help, _sel)\
+ static struct cmd \
+ __cmd ## _ ## _symname ## _ ## _handler ## _ ## _nlcmd ## _ ## _idby ## _ ## _hidden = {\
+ .name = (_name), \
+ .args = (_args), \
+ .cmd = (_nlcmd), \
+ .nl_msg_flags = (_flags), \
+ .hidden = (_hidden), \
+ .idby = (_idby), \
+ .handler = (_handler), \
+ .help = (_help), \
+ .parent = _section, \
+ .selector = (_sel), \
+ }; \
+ static struct cmd *__cmd ## _ ## _symname ## _ ## _handler ## _ ## _nlcmd ## _ ## _idby ## _ ## _hidden ## _p \
+ __attribute__((used,section("__cmd"))) = \
+ &__cmd ## _ ## _symname ## _ ## _handler ## _ ## _nlcmd ## _ ## _idby ## _ ## _hidden
+#define __ACMD(_section, _symname, _name, _args, _nlcmd, _flags, _hidden, _idby, _handler, _help, _sel, _alias)\
+ __COMMAND(_section, _symname, _name, _args, _nlcmd, _flags, _hidden, _idby, _handler, _help, _sel);\
+ static const struct cmd *_alias = &__cmd ## _ ## _symname ## _ ## _handler ## _ ## _nlcmd ## _ ## _idby ## _ ## _hidden
+#define COMMAND(section, name, args, cmd, flags, idby, handler, help) \
+ __COMMAND(&(__section ## _ ## section), name, #name, args, cmd, flags, 0, idby, handler, help, NULL)
+#define COMMAND_ALIAS(section, name, args, cmd, flags, idby, handler, help, selector, alias)\
+ __ACMD(&(__section ## _ ## section), name, #name, args, cmd, flags, 0, idby, handler, help, selector, alias)
+#define HIDDEN(section, name, args, cmd, flags, idby, handler) \
+ __COMMAND(&(__section ## _ ## section), name, #name, args, cmd, flags, 1, idby, handler, NULL, NULL)
+
+#define TOPLEVEL(_name, _args, _nlcmd, _flags, _idby, _handler, _help) \
+ struct cmd __section ## _ ## _name = { \
+ .name = (#_name), \
+ .args = (_args), \
+ .cmd = (_nlcmd), \
+ .nl_msg_flags = (_flags), \
+ .idby = (_idby), \
+ .handler = (_handler), \
+ .help = (_help), \
+ }; \
+ static struct cmd *__section ## _ ## _name ## _p \
+ __attribute__((used,section("__cmd"))) = &__section ## _ ## _name
+
+#define SECTION(_name) \
+ struct cmd __section ## _ ## _name = { \
+ .name = (#_name), \
+ .hidden = 1, \
+ }; \
+ static struct cmd *__section ## _ ## _name ## _p \
+ __attribute__((used,section("__cmd"))) = &__section ## _ ## _name
+
+#define DECLARE_SECTION(_name) \
+ extern struct cmd __section ## _ ## _name;
+
+void register_handler(int (*handler)(struct nl_msg *, void *), void *data);
+#endif