static char * nl80211_ifadd(const char *ifname) { int phyidx; char *rv = NULL; static char nif[IFNAMSIZ] = { 0 }; struct nl80211_msg_conveyor *req, *res; req = nl80211_msg(ifname, NL80211_CMD_NEW_INTERFACE, 0); if (req) { snprintf(nif, sizeof(nif), "tmp.%s", ifname); NLA_PUT_STRING(req->msg, NL80211_ATTR_IFNAME, nif); NLA_PUT_U32(req->msg, NL80211_ATTR_IFTYPE, NL80211_IFTYPE_STATION); nl80211_send(req, NULL, NULL); rv = nif; nla_put_failure: nl80211_free(req); } return rv; }
static char * nl80211_ifname2phy(const char *ifname) { static char phy[32] = { 0 }; struct nl80211_msg_conveyor *req; req = nl80211_msg(ifname, NL80211_CMD_GET_WIPHY, 0); if (req) { nl80211_send(req, nl80211_ifname2phy_cb, phy); nl80211_free(req); } return phy[0] ? phy : NULL; }
static void nl80211_ifdel(const char *ifname) { struct nl80211_msg_conveyor *req; req = nl80211_msg(ifname, NL80211_CMD_DEL_INTERFACE, 0); if (req) { NLA_PUT_STRING(req->msg, NL80211_ATTR_IFNAME, ifname); nl80211_send(req, NULL, NULL); nla_put_failure: nl80211_free(req); } }
static struct nl80211_msg_conveyor * nl80211_msg(const char *ifname, int cmd, int flags) { int ifidx = -1, phyidx = -1; struct nl80211_msg_conveyor *cv; if (nl80211_init() < 0) return NULL; if (!strncmp(ifname, "phy", 3)) phyidx = atoi(&ifname[3]); else if (!strncmp(ifname, "radio", 5)) phyidx = atoi(&ifname[5]); else if (!strncmp(ifname, "mon.", 4)) ifidx = if_nametoindex(&ifname[4]); else ifidx = if_nametoindex(ifname); if ((ifidx < 0) && (phyidx < 0)) return NULL; cv = nl80211_new(nls->nl80211, cmd, flags); if (!cv) return NULL; if (ifidx > -1) NLA_PUT_U32(cv->msg, NL80211_ATTR_IFINDEX, ifidx); if (phyidx > -1) NLA_PUT_U32(cv->msg, NL80211_ATTR_WIPHY, phyidx); return cv; nla_put_failure: nl80211_free(cv); return NULL; }