#ifndef __CALIBRATOR_H
#define __CALIBRATOR_H

#include <stdbool.h>
#include <netlink/netlink.h>
#include <netlink/genl/genl.h>
#include <netlink/genl/family.h>
#include <netlink/genl/ctrl.h>

#include "nl80211.h"

#define ETH_ALEN 6

#ifndef CONFIG_LIBNL20
#  define nl_sock nl_handle
#endif

struct nl80211_state {
    struct nl_sock *nl_sock;
    struct nl_cache *nl_cache;
    struct genl_family *nl80211;
};

enum command_identify_by {
    CIB_NONE,
    CIB_PHY,
    CIB_NETDEV,
};

enum id_input {
    II_NONE,
    II_NETDEV,
    II_PHY_NAME,
    II_PHY_IDX,
};

struct cmd {
    const char *name;
    const char *args;
    const char *help;
    const enum nl80211_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
     * and the usage message should and 2 otherwise.
     */
    int (*handler)(struct nl80211_state *state,
               struct nl_cb *cb,
               struct nl_msg *msg,
               int argc, char **argv);
    const struct cmd *parent;
};

#define ARRAY_SIZE(ar) (sizeof(ar)/sizeof(ar[0]))

#define __COMMAND(_section, _symname, _name, _args, _nlcmd, _flags, _hidden, _idby, _handler, _help)\
    static struct cmd                        \
    __cmd ## _ ## _symname ## _ ## _handler ## _ ## _nlcmd ## _ ## _idby ## _ ## _hidden\
    __attribute__((used)) __attribute__((section("__cmd")))    = {    \
        .name = (_name),                    \
        .args = (_args),                    \
        .cmd = (_nlcmd),                    \
        .nl_msg_flags = (_flags),                \
        .hidden = (_hidden),                    \
        .idby = (_idby),                    \
        .handler = (_handler),                    \
        .help = (_help),                    \
        .parent = _section,                    \
     }
#define COMMAND(section, name, args, cmd, flags, idby, handler, help)    \
    __COMMAND(&(__section ## _ ## section), name, #name, args, cmd, flags, 0, idby, handler, help)
#define HIDDEN(section, name, args, cmd, flags, idby, handler)        \
    __COMMAND(&(__section ## _ ## section), name, #name, args, cmd, flags, 1, idby, handler, NULL)

#define TOPLEVEL(_name, _args, _nlcmd, _flags, _idby, _handler, _help)    \
    struct cmd                            \
    __section ## _ ## _name                        \
    __attribute__((used)) __attribute__((section("__cmd")))    = {    \
        .name = (#_name),                    \
        .args = (_args),                    \
        .cmd = (_nlcmd),                    \
        .nl_msg_flags = (_flags),                \
        .idby = (_idby),                    \
        .handler = (_handler),                    \
        .help = (_help),                    \
     }
#define SECTION(_name)                            \
    struct cmd __section ## _ ## _name                \
    __attribute__((used)) __attribute__((section("__cmd"))) = {    \
        .name = (#_name),                    \
        .hidden = 1,                        \
    }

#define DECLARE_SECTION(_name)                        \
    extern struct cmd __section ## _ ## _name;

extern int calibrator_debug;

int handle_cmd(struct nl80211_state *state, enum id_input idby,
           int argc, char **argv);

struct print_event_args {
    bool frame, time;
};

__u32 listen_events(struct nl80211_state *state,
            const int n_waits, const __u32 *waits);
__u32 __listen_events(struct nl80211_state *state,
              const int n_waits, const __u32 *waits,
              struct print_event_args *args);


int mac_addr_a2n(unsigned char *mac_addr, char *arg);
void mac_addr_n2a(char *mac_addr, unsigned char *arg);

int parse_keys(struct nl_msg *msg, char **argv, int argc);

void print_ht_mcs(const __u8 *mcs);
void print_ampdu_length(__u8 exponent);
void print_ampdu_spacing(__u8 spacing);
void print_ht_capability(__u16 cap);

const char *iftype_name(enum nl80211_iftype iftype);
const char *command_name(enum nl80211_commands cmd);
int ieee80211_channel_to_frequency(int chan);
int ieee80211_frequency_to_channel(int freq);

void print_ssid_escaped(const uint8_t len, const uint8_t *data);

int nl_get_multicast_id(struct nl_sock *sock, const char *family,
    const char *group);

char *reg_initiator_to_string(__u8 initiator);

const char *get_reason_str(uint16_t reason);
const char *get_status_str(uint16_t status);

enum print_ie_type {
    PRINT_SCAN,
    PRINT_LINK,
};

#define BIT(x) (1ULL<<(x))

void print_ies(unsigned char *ie, int ielen, bool unknown,
           enum print_ie_type ptype);


DECLARE_SECTION(set);
DECLARE_SECTION(get);
DECLARE_SECTION(plt);

#endif /* __CALIBRATOR_H */
