1*2ee67178SXianjun Jiao #ifndef __IW_H 2*2ee67178SXianjun Jiao #define __IW_H 3*2ee67178SXianjun Jiao 4*2ee67178SXianjun Jiao #include <stdbool.h> 5*2ee67178SXianjun Jiao #include <netlink/netlink.h> 6*2ee67178SXianjun Jiao #include <netlink/genl/genl.h> 7*2ee67178SXianjun Jiao #include <netlink/genl/family.h> 8*2ee67178SXianjun Jiao #include <netlink/genl/ctrl.h> 9*2ee67178SXianjun Jiao #include <endian.h> 10*2ee67178SXianjun Jiao 11*2ee67178SXianjun Jiao #include "nl80211.h" 12*2ee67178SXianjun Jiao #include "ieee80211.h" 13*2ee67178SXianjun Jiao 14*2ee67178SXianjun Jiao #define ETH_ALEN 6 15*2ee67178SXianjun Jiao 16*2ee67178SXianjun Jiao /* libnl 1.x compatibility code */ 17*2ee67178SXianjun Jiao #if !defined(CONFIG_LIBNL20) && !defined(CONFIG_LIBNL30) 18*2ee67178SXianjun Jiao # define nl_sock nl_handle 19*2ee67178SXianjun Jiao #endif 20*2ee67178SXianjun Jiao 21*2ee67178SXianjun Jiao struct nl80211_state { 22*2ee67178SXianjun Jiao struct nl_sock *nl_sock; 23*2ee67178SXianjun Jiao int nl80211_id; 24*2ee67178SXianjun Jiao }; 25*2ee67178SXianjun Jiao 26*2ee67178SXianjun Jiao enum command_identify_by { 27*2ee67178SXianjun Jiao CIB_NONE, 28*2ee67178SXianjun Jiao CIB_PHY, 29*2ee67178SXianjun Jiao CIB_NETDEV, 30*2ee67178SXianjun Jiao CIB_WDEV, 31*2ee67178SXianjun Jiao }; 32*2ee67178SXianjun Jiao 33*2ee67178SXianjun Jiao enum id_input { 34*2ee67178SXianjun Jiao II_NONE, 35*2ee67178SXianjun Jiao II_NETDEV, 36*2ee67178SXianjun Jiao II_PHY_NAME, 37*2ee67178SXianjun Jiao II_PHY_IDX, 38*2ee67178SXianjun Jiao II_WDEV, 39*2ee67178SXianjun Jiao }; 40*2ee67178SXianjun Jiao 41*2ee67178SXianjun Jiao struct cmd { 42*2ee67178SXianjun Jiao const char *name; 43*2ee67178SXianjun Jiao const char *args; 44*2ee67178SXianjun Jiao const char *help; 45*2ee67178SXianjun Jiao const enum nl80211_commands cmd; 46*2ee67178SXianjun Jiao int nl_msg_flags; 47*2ee67178SXianjun Jiao int hidden; 48*2ee67178SXianjun Jiao const enum command_identify_by idby; 49*2ee67178SXianjun Jiao /* 50*2ee67178SXianjun Jiao * The handler should return a negative error code, 51*2ee67178SXianjun Jiao * zero on success, 1 if the arguments were wrong 52*2ee67178SXianjun Jiao * and the usage message should and 2 otherwise. 53*2ee67178SXianjun Jiao */ 54*2ee67178SXianjun Jiao int (*handler)(struct nl80211_state *state, 55*2ee67178SXianjun Jiao struct nl_cb *cb, 56*2ee67178SXianjun Jiao struct nl_msg *msg, 57*2ee67178SXianjun Jiao int argc, char **argv, 58*2ee67178SXianjun Jiao enum id_input id); 59*2ee67178SXianjun Jiao const struct cmd *(*selector)(int argc, char **argv); 60*2ee67178SXianjun Jiao const struct cmd *parent; 61*2ee67178SXianjun Jiao }; 62*2ee67178SXianjun Jiao 63*2ee67178SXianjun Jiao #define ARRAY_SIZE(ar) (sizeof(ar)/sizeof(ar[0])) 64*2ee67178SXianjun Jiao #define DIV_ROUND_UP(x, y) (((x) + (y - 1)) / (y)) 65*2ee67178SXianjun Jiao 66*2ee67178SXianjun Jiao #define __COMMAND(_section, _symname, _name, _args, _nlcmd, _flags, _hidden, _idby, _handler, _help, _sel)\ 67*2ee67178SXianjun Jiao static struct cmd \ 68*2ee67178SXianjun Jiao __cmd ## _ ## _symname ## _ ## _handler ## _ ## _nlcmd ## _ ## _idby ## _ ## _hidden\ 69*2ee67178SXianjun Jiao __attribute__((used)) __attribute__((section("__cmd"))) = { \ 70*2ee67178SXianjun Jiao .name = (_name), \ 71*2ee67178SXianjun Jiao .args = (_args), \ 72*2ee67178SXianjun Jiao .cmd = (_nlcmd), \ 73*2ee67178SXianjun Jiao .nl_msg_flags = (_flags), \ 74*2ee67178SXianjun Jiao .hidden = (_hidden), \ 75*2ee67178SXianjun Jiao .idby = (_idby), \ 76*2ee67178SXianjun Jiao .handler = (_handler), \ 77*2ee67178SXianjun Jiao .help = (_help), \ 78*2ee67178SXianjun Jiao .parent = _section, \ 79*2ee67178SXianjun Jiao .selector = (_sel), \ 80*2ee67178SXianjun Jiao } 81*2ee67178SXianjun Jiao #define __ACMD(_section, _symname, _name, _args, _nlcmd, _flags, _hidden, _idby, _handler, _help, _sel, _alias)\ 82*2ee67178SXianjun Jiao __COMMAND(_section, _symname, _name, _args, _nlcmd, _flags, _hidden, _idby, _handler, _help, _sel);\ 83*2ee67178SXianjun Jiao static const struct cmd *_alias = &__cmd ## _ ## _symname ## _ ## _handler ## _ ## _nlcmd ## _ ## _idby ## _ ## _hidden 84*2ee67178SXianjun Jiao #define COMMAND(section, name, args, cmd, flags, idby, handler, help) \ 85*2ee67178SXianjun Jiao __COMMAND(&(__section ## _ ## section), name, #name, args, cmd, flags, 0, idby, handler, help, NULL) 86*2ee67178SXianjun Jiao #define COMMAND_ALIAS(section, name, args, cmd, flags, idby, handler, help, selector, alias)\ 87*2ee67178SXianjun Jiao __ACMD(&(__section ## _ ## section), name, #name, args, cmd, flags, 0, idby, handler, help, selector, alias) 88*2ee67178SXianjun Jiao #define HIDDEN(section, name, args, cmd, flags, idby, handler) \ 89*2ee67178SXianjun Jiao __COMMAND(&(__section ## _ ## section), name, #name, args, cmd, flags, 1, idby, handler, NULL, NULL) 90*2ee67178SXianjun Jiao 91*2ee67178SXianjun Jiao #define TOPLEVEL(_name, _args, _nlcmd, _flags, _idby, _handler, _help) \ 92*2ee67178SXianjun Jiao struct cmd \ 93*2ee67178SXianjun Jiao __section ## _ ## _name \ 94*2ee67178SXianjun Jiao __attribute__((used)) __attribute__((section("__cmd"))) = { \ 95*2ee67178SXianjun Jiao .name = (#_name), \ 96*2ee67178SXianjun Jiao .args = (_args), \ 97*2ee67178SXianjun Jiao .cmd = (_nlcmd), \ 98*2ee67178SXianjun Jiao .nl_msg_flags = (_flags), \ 99*2ee67178SXianjun Jiao .idby = (_idby), \ 100*2ee67178SXianjun Jiao .handler = (_handler), \ 101*2ee67178SXianjun Jiao .help = (_help), \ 102*2ee67178SXianjun Jiao } 103*2ee67178SXianjun Jiao #define SECTION(_name) \ 104*2ee67178SXianjun Jiao struct cmd __section ## _ ## _name \ 105*2ee67178SXianjun Jiao __attribute__((used)) __attribute__((section("__cmd"))) = { \ 106*2ee67178SXianjun Jiao .name = (#_name), \ 107*2ee67178SXianjun Jiao .hidden = 1, \ 108*2ee67178SXianjun Jiao } 109*2ee67178SXianjun Jiao 110*2ee67178SXianjun Jiao #define DECLARE_SECTION(_name) \ 111*2ee67178SXianjun Jiao extern struct cmd __section ## _ ## _name; 112*2ee67178SXianjun Jiao 113*2ee67178SXianjun Jiao extern const char sdrctl_version[]; 114*2ee67178SXianjun Jiao 115*2ee67178SXianjun Jiao extern int iw_debug; 116*2ee67178SXianjun Jiao 117*2ee67178SXianjun Jiao int handle_cmd(struct nl80211_state *state, enum id_input idby, 118*2ee67178SXianjun Jiao int argc, char **argv); 119*2ee67178SXianjun Jiao 120*2ee67178SXianjun Jiao struct print_event_args { 121*2ee67178SXianjun Jiao struct timeval ts; /* internal */ 122*2ee67178SXianjun Jiao bool have_ts; /* must be set false */ 123*2ee67178SXianjun Jiao bool frame, time, reltime; 124*2ee67178SXianjun Jiao }; 125*2ee67178SXianjun Jiao 126*2ee67178SXianjun Jiao __u32 listen_events(struct nl80211_state *state, 127*2ee67178SXianjun Jiao const int n_waits, const __u32 *waits); 128*2ee67178SXianjun Jiao int __prepare_listen_events(struct nl80211_state *state); 129*2ee67178SXianjun Jiao __u32 __do_listen_events(struct nl80211_state *state, 130*2ee67178SXianjun Jiao const int n_waits, const __u32 *waits, 131*2ee67178SXianjun Jiao struct print_event_args *args); 132*2ee67178SXianjun Jiao 133*2ee67178SXianjun Jiao 134*2ee67178SXianjun Jiao int mac_addr_a2n(unsigned char *mac_addr, char *arg); 135*2ee67178SXianjun Jiao void mac_addr_n2a(char *mac_addr, unsigned char *arg); 136*2ee67178SXianjun Jiao int parse_hex_mask(char *hexmask, unsigned char **result, size_t *result_len, 137*2ee67178SXianjun Jiao unsigned char **mask); 138*2ee67178SXianjun Jiao unsigned char *parse_hex(char *hex, size_t *outlen); 139*2ee67178SXianjun Jiao 140*2ee67178SXianjun Jiao int parse_keys(struct nl_msg *msg, char **argv, int argc); 141*2ee67178SXianjun Jiao 142*2ee67178SXianjun Jiao void print_ht_mcs(const __u8 *mcs); 143*2ee67178SXianjun Jiao void print_ampdu_length(__u8 exponent); 144*2ee67178SXianjun Jiao void print_ampdu_spacing(__u8 spacing); 145*2ee67178SXianjun Jiao void print_ht_capability(__u16 cap); 146*2ee67178SXianjun Jiao void print_vht_info(__u32 capa, const __u8 *mcs); 147*2ee67178SXianjun Jiao 148*2ee67178SXianjun Jiao char *channel_width_name(enum nl80211_chan_width width); 149*2ee67178SXianjun Jiao const char *iftype_name(enum nl80211_iftype iftype); 150*2ee67178SXianjun Jiao const char *command_name(enum nl80211_commands cmd); 151*2ee67178SXianjun Jiao int ieee80211_channel_to_frequency(int chan, enum nl80211_band band); 152*2ee67178SXianjun Jiao int ieee80211_frequency_to_channel(int freq); 153*2ee67178SXianjun Jiao 154*2ee67178SXianjun Jiao void print_ssid_escaped(const uint8_t len, const uint8_t *data); 155*2ee67178SXianjun Jiao 156*2ee67178SXianjun Jiao int nl_get_multicast_id(struct nl_sock *sock, const char *family, const char *group); 157*2ee67178SXianjun Jiao 158*2ee67178SXianjun Jiao char *reg_initiator_to_string(__u8 initiator); 159*2ee67178SXianjun Jiao 160*2ee67178SXianjun Jiao const char *get_reason_str(uint16_t reason); 161*2ee67178SXianjun Jiao const char *get_status_str(uint16_t status); 162*2ee67178SXianjun Jiao 163*2ee67178SXianjun Jiao enum print_ie_type { 164*2ee67178SXianjun Jiao PRINT_SCAN, 165*2ee67178SXianjun Jiao PRINT_LINK, 166*2ee67178SXianjun Jiao }; 167*2ee67178SXianjun Jiao 168*2ee67178SXianjun Jiao #define BIT(x) (1ULL<<(x)) 169*2ee67178SXianjun Jiao 170*2ee67178SXianjun Jiao void print_ies(unsigned char *ie, int ielen, bool unknown, 171*2ee67178SXianjun Jiao enum print_ie_type ptype); 172*2ee67178SXianjun Jiao 173*2ee67178SXianjun Jiao void parse_bitrate(struct nlattr *bitrate_attr, char *buf, int buflen); 174*2ee67178SXianjun Jiao void iw_hexdump(const char *prefix, const __u8 *data, size_t len); 175*2ee67178SXianjun Jiao 176*2ee67178SXianjun Jiao DECLARE_SECTION(set); 177*2ee67178SXianjun Jiao DECLARE_SECTION(get); 178*2ee67178SXianjun Jiao 179*2ee67178SXianjun Jiao #endif /* __IW_H */ 180