xref: /openwifi/user_space/sdrctl_src/sdrctl.h (revision c654e5ed88622f78b3db1a2d59dbf2fe7a550e97)
1a6085186SLina Ceballos /*
2*c654e5edSJiao Xianjun  * Author: Xianjun Jiao
3*c654e5edSJiao Xianjun  * SPDX-FileCopyrightText: 2019 UGent
4a6085186SLina Ceballos  * SPDX-License-Identifier: AGPL-3.0-or-later
5a6085186SLina Ceballos */
6a6085186SLina Ceballos 
72ee67178SXianjun Jiao #ifndef __IW_H
82ee67178SXianjun Jiao #define __IW_H
92ee67178SXianjun Jiao 
102ee67178SXianjun Jiao #include <stdbool.h>
112ee67178SXianjun Jiao #include <netlink/netlink.h>
122ee67178SXianjun Jiao #include <netlink/genl/genl.h>
132ee67178SXianjun Jiao #include <netlink/genl/family.h>
142ee67178SXianjun Jiao #include <netlink/genl/ctrl.h>
152ee67178SXianjun Jiao #include <endian.h>
162ee67178SXianjun Jiao 
172ee67178SXianjun Jiao #include "nl80211.h"
184ecf49bbSJiao Xianjun //#include "ieee80211.h"
192ee67178SXianjun Jiao 
202ee67178SXianjun Jiao #define ETH_ALEN 6
212ee67178SXianjun Jiao 
222ee67178SXianjun Jiao /* libnl 1.x compatibility code */
232ee67178SXianjun Jiao #if !defined(CONFIG_LIBNL20) && !defined(CONFIG_LIBNL30)
242ee67178SXianjun Jiao #  define nl_sock nl_handle
252ee67178SXianjun Jiao #endif
262ee67178SXianjun Jiao 
272ee67178SXianjun Jiao struct nl80211_state {
282ee67178SXianjun Jiao 	struct nl_sock *nl_sock;
292ee67178SXianjun Jiao 	int nl80211_id;
302ee67178SXianjun Jiao };
312ee67178SXianjun Jiao 
322ee67178SXianjun Jiao enum command_identify_by {
332ee67178SXianjun Jiao 	CIB_NONE,
342ee67178SXianjun Jiao 	CIB_PHY,
352ee67178SXianjun Jiao 	CIB_NETDEV,
362ee67178SXianjun Jiao 	CIB_WDEV,
372ee67178SXianjun Jiao };
382ee67178SXianjun Jiao 
392ee67178SXianjun Jiao enum id_input {
402ee67178SXianjun Jiao 	II_NONE,
412ee67178SXianjun Jiao 	II_NETDEV,
422ee67178SXianjun Jiao 	II_PHY_NAME,
432ee67178SXianjun Jiao 	II_PHY_IDX,
442ee67178SXianjun Jiao 	II_WDEV,
452ee67178SXianjun Jiao };
462ee67178SXianjun Jiao 
472ee67178SXianjun Jiao struct cmd {
482ee67178SXianjun Jiao 	const char *name;
492ee67178SXianjun Jiao 	const char *args;
502ee67178SXianjun Jiao 	const char *help;
512ee67178SXianjun Jiao 	const enum nl80211_commands cmd;
522ee67178SXianjun Jiao 	int nl_msg_flags;
532ee67178SXianjun Jiao 	int hidden;
542ee67178SXianjun Jiao 	const enum command_identify_by idby;
552ee67178SXianjun Jiao 	/*
562ee67178SXianjun Jiao 	 * The handler should return a negative error code,
572ee67178SXianjun Jiao 	 * zero on success, 1 if the arguments were wrong
582ee67178SXianjun Jiao 	 * and the usage message should and 2 otherwise.
592ee67178SXianjun Jiao 	 */
602ee67178SXianjun Jiao 	int (*handler)(struct nl80211_state *state,
612ee67178SXianjun Jiao 		       struct nl_cb *cb,
622ee67178SXianjun Jiao 		       struct nl_msg *msg,
632ee67178SXianjun Jiao 		       int argc, char **argv,
642ee67178SXianjun Jiao 		       enum id_input id);
652ee67178SXianjun Jiao 	const struct cmd *(*selector)(int argc, char **argv);
662ee67178SXianjun Jiao 	const struct cmd *parent;
672ee67178SXianjun Jiao };
682ee67178SXianjun Jiao 
692ee67178SXianjun Jiao #define ARRAY_SIZE(ar) (sizeof(ar)/sizeof(ar[0]))
702ee67178SXianjun Jiao #define DIV_ROUND_UP(x, y) (((x) + (y - 1)) / (y))
712ee67178SXianjun Jiao 
722ee67178SXianjun Jiao #define __COMMAND(_section, _symname, _name, _args, _nlcmd, _flags, _hidden, _idby, _handler, _help, _sel)\
732ee67178SXianjun Jiao 	static struct cmd						\
742ee67178SXianjun Jiao 	__cmd ## _ ## _symname ## _ ## _handler ## _ ## _nlcmd ## _ ## _idby ## _ ## _hidden\
752ee67178SXianjun Jiao 	__attribute__((used)) __attribute__((section("__cmd")))	= {	\
762ee67178SXianjun Jiao 		.name = (_name),					\
772ee67178SXianjun Jiao 		.args = (_args),					\
782ee67178SXianjun Jiao 		.cmd = (_nlcmd),					\
792ee67178SXianjun Jiao 		.nl_msg_flags = (_flags),				\
802ee67178SXianjun Jiao 		.hidden = (_hidden),					\
812ee67178SXianjun Jiao 		.idby = (_idby),					\
822ee67178SXianjun Jiao 		.handler = (_handler),					\
832ee67178SXianjun Jiao 		.help = (_help),					\
842ee67178SXianjun Jiao 		.parent = _section,					\
852ee67178SXianjun Jiao 		.selector = (_sel),					\
862ee67178SXianjun Jiao 	}
872ee67178SXianjun Jiao #define __ACMD(_section, _symname, _name, _args, _nlcmd, _flags, _hidden, _idby, _handler, _help, _sel, _alias)\
882ee67178SXianjun Jiao 	__COMMAND(_section, _symname, _name, _args, _nlcmd, _flags, _hidden, _idby, _handler, _help, _sel);\
892ee67178SXianjun Jiao 	static const struct cmd *_alias = &__cmd ## _ ## _symname ## _ ## _handler ## _ ## _nlcmd ## _ ## _idby ## _ ## _hidden
902ee67178SXianjun Jiao #define COMMAND(section, name, args, cmd, flags, idby, handler, help)	\
912ee67178SXianjun Jiao 	__COMMAND(&(__section ## _ ## section), name, #name, args, cmd, flags, 0, idby, handler, help, NULL)
922ee67178SXianjun Jiao #define COMMAND_ALIAS(section, name, args, cmd, flags, idby, handler, help, selector, alias)\
932ee67178SXianjun Jiao 	__ACMD(&(__section ## _ ## section), name, #name, args, cmd, flags, 0, idby, handler, help, selector, alias)
942ee67178SXianjun Jiao #define HIDDEN(section, name, args, cmd, flags, idby, handler)		\
952ee67178SXianjun Jiao 	__COMMAND(&(__section ## _ ## section), name, #name, args, cmd, flags, 1, idby, handler, NULL, NULL)
962ee67178SXianjun Jiao 
972ee67178SXianjun Jiao #define TOPLEVEL(_name, _args, _nlcmd, _flags, _idby, _handler, _help)	\
982ee67178SXianjun Jiao 	struct cmd							\
992ee67178SXianjun Jiao 	__section ## _ ## _name						\
1002ee67178SXianjun Jiao 	__attribute__((used)) __attribute__((section("__cmd")))	= {	\
1012ee67178SXianjun Jiao 		.name = (#_name),					\
1022ee67178SXianjun Jiao 		.args = (_args),					\
1032ee67178SXianjun Jiao 		.cmd = (_nlcmd),					\
1042ee67178SXianjun Jiao 		.nl_msg_flags = (_flags),				\
1052ee67178SXianjun Jiao 		.idby = (_idby),					\
1062ee67178SXianjun Jiao 		.handler = (_handler),					\
1072ee67178SXianjun Jiao 		.help = (_help),					\
1082ee67178SXianjun Jiao 	 }
1092ee67178SXianjun Jiao #define SECTION(_name)							\
1102ee67178SXianjun Jiao 	struct cmd __section ## _ ## _name				\
1112ee67178SXianjun Jiao 	__attribute__((used)) __attribute__((section("__cmd"))) = {	\
1122ee67178SXianjun Jiao 		.name = (#_name),					\
1132ee67178SXianjun Jiao 		.hidden = 1,						\
1142ee67178SXianjun Jiao 	}
1152ee67178SXianjun Jiao 
1162ee67178SXianjun Jiao #define DECLARE_SECTION(_name)						\
1172ee67178SXianjun Jiao 	extern struct cmd __section ## _ ## _name;
1182ee67178SXianjun Jiao 
1192ee67178SXianjun Jiao extern const char sdrctl_version[];
1202ee67178SXianjun Jiao 
1212ee67178SXianjun Jiao extern int iw_debug;
1222ee67178SXianjun Jiao 
1232ee67178SXianjun Jiao int handle_cmd(struct nl80211_state *state, enum id_input idby,
1242ee67178SXianjun Jiao 	       int argc, char **argv);
1252ee67178SXianjun Jiao 
1262ee67178SXianjun Jiao struct print_event_args {
1272ee67178SXianjun Jiao 	struct timeval ts; /* internal */
1282ee67178SXianjun Jiao 	bool have_ts; /* must be set false */
1292ee67178SXianjun Jiao 	bool frame, time, reltime;
1302ee67178SXianjun Jiao };
1312ee67178SXianjun Jiao 
1322ee67178SXianjun Jiao __u32 listen_events(struct nl80211_state *state,
1332ee67178SXianjun Jiao 		    const int n_waits, const __u32 *waits);
1342ee67178SXianjun Jiao int __prepare_listen_events(struct nl80211_state *state);
1352ee67178SXianjun Jiao __u32 __do_listen_events(struct nl80211_state *state,
1362ee67178SXianjun Jiao 			 const int n_waits, const __u32 *waits,
1372ee67178SXianjun Jiao 			 struct print_event_args *args);
1382ee67178SXianjun Jiao 
1392ee67178SXianjun Jiao 
1402ee67178SXianjun Jiao int mac_addr_a2n(unsigned char *mac_addr, char *arg);
1412ee67178SXianjun Jiao void mac_addr_n2a(char *mac_addr, unsigned char *arg);
1422ee67178SXianjun Jiao int parse_hex_mask(char *hexmask, unsigned char **result, size_t *result_len,
1432ee67178SXianjun Jiao 		   unsigned char **mask);
1442ee67178SXianjun Jiao unsigned char *parse_hex(char *hex, size_t *outlen);
1452ee67178SXianjun Jiao 
1462ee67178SXianjun Jiao int parse_keys(struct nl_msg *msg, char **argv, int argc);
1472ee67178SXianjun Jiao 
1482ee67178SXianjun Jiao void print_ht_mcs(const __u8 *mcs);
1492ee67178SXianjun Jiao void print_ampdu_length(__u8 exponent);
1502ee67178SXianjun Jiao void print_ampdu_spacing(__u8 spacing);
1512ee67178SXianjun Jiao void print_ht_capability(__u16 cap);
1522ee67178SXianjun Jiao void print_vht_info(__u32 capa, const __u8 *mcs);
1532ee67178SXianjun Jiao 
1542ee67178SXianjun Jiao char *channel_width_name(enum nl80211_chan_width width);
1552ee67178SXianjun Jiao const char *iftype_name(enum nl80211_iftype iftype);
1562ee67178SXianjun Jiao const char *command_name(enum nl80211_commands cmd);
1572ee67178SXianjun Jiao int ieee80211_channel_to_frequency(int chan, enum nl80211_band band);
1582ee67178SXianjun Jiao int ieee80211_frequency_to_channel(int freq);
1592ee67178SXianjun Jiao 
1602ee67178SXianjun Jiao void print_ssid_escaped(const uint8_t len, const uint8_t *data);
1612ee67178SXianjun Jiao 
1622ee67178SXianjun Jiao int nl_get_multicast_id(struct nl_sock *sock, const char *family, const char *group);
1632ee67178SXianjun Jiao 
1642ee67178SXianjun Jiao char *reg_initiator_to_string(__u8 initiator);
1652ee67178SXianjun Jiao 
1662ee67178SXianjun Jiao const char *get_reason_str(uint16_t reason);
1672ee67178SXianjun Jiao const char *get_status_str(uint16_t status);
1682ee67178SXianjun Jiao 
1692ee67178SXianjun Jiao enum print_ie_type {
1702ee67178SXianjun Jiao 	PRINT_SCAN,
1712ee67178SXianjun Jiao 	PRINT_LINK,
1722ee67178SXianjun Jiao };
1732ee67178SXianjun Jiao 
1742ee67178SXianjun Jiao #define BIT(x) (1ULL<<(x))
1752ee67178SXianjun Jiao 
1762ee67178SXianjun Jiao void print_ies(unsigned char *ie, int ielen, bool unknown,
1772ee67178SXianjun Jiao 	       enum print_ie_type ptype);
1782ee67178SXianjun Jiao 
1792ee67178SXianjun Jiao void parse_bitrate(struct nlattr *bitrate_attr, char *buf, int buflen);
1802ee67178SXianjun Jiao void iw_hexdump(const char *prefix, const __u8 *data, size_t len);
1812ee67178SXianjun Jiao 
1822ee67178SXianjun Jiao DECLARE_SECTION(set);
1832ee67178SXianjun Jiao DECLARE_SECTION(get);
1842ee67178SXianjun Jiao 
1852ee67178SXianjun Jiao #endif /* __IW_H */
186