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