1 #ifndef __CALIBRATOR_H 2 #define __CALIBRATOR_H 3 4 #include <stdbool.h> 5 #include <netlink/netlink.h> 6 #include <netlink/genl/genl.h> 7 #include <netlink/genl/family.h> 8 #include <netlink/genl/ctrl.h> 9 10 #include "nl80211.h" 11 12 #define ETH_ALEN 6 13 14 #ifndef CONFIG_LIBNL20 15 # define nl_sock nl_handle 16 #endif 17 18 struct nl80211_state { 19 struct nl_sock *nl_sock; 20 struct nl_cache *nl_cache; 21 struct genl_family *nl80211; 22 }; 23 24 enum command_identify_by { 25 CIB_NONE, 26 CIB_PHY, 27 CIB_NETDEV, 28 }; 29 30 enum id_input { 31 II_NONE, 32 II_NETDEV, 33 II_PHY_NAME, 34 II_PHY_IDX, 35 }; 36 37 struct cmd { 38 const char *name; 39 const char *args; 40 const char *help; 41 const enum nl80211_commands cmd; 42 int nl_msg_flags; 43 int hidden; 44 const enum command_identify_by idby; 45 /* 46 * The handler should return a negative error code, 47 * zero on success, 1 if the arguments were wrong 48 * and the usage message should and 2 otherwise. 49 */ 50 int (*handler)(struct nl80211_state *state, 51 struct nl_cb *cb, 52 struct nl_msg *msg, 53 int argc, char **argv); 54 const struct cmd *parent; 55 }; 56 57 #define ARRAY_SIZE(ar) (sizeof(ar)/sizeof(ar[0])) 58 59 #define __COMMAND(_section, _symname, _name, _args, _nlcmd, _flags, _hidden, _idby, _handler, _help)\ 60 static struct cmd \ 61 __cmd ## _ ## _symname ## _ ## _handler ## _ ## _nlcmd ## _ ## _idby ## _ ## _hidden\ 62 __attribute__((used)) __attribute__((section("__cmd"))) = { \ 63 .name = (_name), \ 64 .args = (_args), \ 65 .cmd = (_nlcmd), \ 66 .nl_msg_flags = (_flags), \ 67 .hidden = (_hidden), \ 68 .idby = (_idby), \ 69 .handler = (_handler), \ 70 .help = (_help), \ 71 .parent = _section, \ 72 } 73 #define COMMAND(section, name, args, cmd, flags, idby, handler, help) \ 74 __COMMAND(&(__section ## _ ## section), name, #name, args, cmd, flags, 0, idby, handler, help) 75 #define HIDDEN(section, name, args, cmd, flags, idby, handler) \ 76 __COMMAND(&(__section ## _ ## section), name, #name, args, cmd, flags, 1, idby, handler, NULL) 77 78 #define TOPLEVEL(_name, _args, _nlcmd, _flags, _idby, _handler, _help) \ 79 struct cmd \ 80 __section ## _ ## _name \ 81 __attribute__((used)) __attribute__((section("__cmd"))) = { \ 82 .name = (#_name), \ 83 .args = (_args), \ 84 .cmd = (_nlcmd), \ 85 .nl_msg_flags = (_flags), \ 86 .idby = (_idby), \ 87 .handler = (_handler), \ 88 .help = (_help), \ 89 } 90 #define SECTION(_name) \ 91 struct cmd __section ## _ ## _name \ 92 __attribute__((used)) __attribute__((section("__cmd"))) = { \ 93 .name = (#_name), \ 94 .hidden = 1, \ 95 } 96 97 #define DECLARE_SECTION(_name) \ 98 extern struct cmd __section ## _ ## _name; 99 100 extern int calibrator_debug; 101 102 int handle_cmd(struct nl80211_state *state, enum id_input idby, 103 int argc, char **argv); 104 105 struct print_event_args { 106 bool frame, time; 107 }; 108 109 __u32 listen_events(struct nl80211_state *state, 110 const int n_waits, const __u32 *waits); 111 __u32 __listen_events(struct nl80211_state *state, 112 const int n_waits, const __u32 *waits, 113 struct print_event_args *args); 114 115 116 int mac_addr_a2n(unsigned char *mac_addr, char *arg); 117 void mac_addr_n2a(char *mac_addr, unsigned char *arg); 118 119 int parse_keys(struct nl_msg *msg, char **argv, int argc); 120 121 void print_ht_mcs(const __u8 *mcs); 122 void print_ampdu_length(__u8 exponent); 123 void print_ampdu_spacing(__u8 spacing); 124 void print_ht_capability(__u16 cap); 125 126 const char *iftype_name(enum nl80211_iftype iftype); 127 const char *command_name(enum nl80211_commands cmd); 128 int ieee80211_channel_to_frequency(int chan); 129 int ieee80211_frequency_to_channel(int freq); 130 131 void print_ssid_escaped(const uint8_t len, const uint8_t *data); 132 133 int nl_get_multicast_id(struct nl_sock *sock, const char *family, 134 const char *group); 135 136 char *reg_initiator_to_string(__u8 initiator); 137 138 const char *get_reason_str(uint16_t reason); 139 const char *get_status_str(uint16_t status); 140 141 enum print_ie_type { 142 PRINT_SCAN, 143 PRINT_LINK, 144 }; 145 146 #define BIT(x) (1ULL<<(x)) 147 148 void print_ies(unsigned char *ie, int ielen, bool unknown, 149 enum print_ie_type ptype); 150 151 152 DECLARE_SECTION(set); 153 DECLARE_SECTION(get); 154 DECLARE_SECTION(plt); 155 156 #endif /* __CALIBRATOR_H */ 157