static int nl80211_subscribe_cb(struct nl_msg *msg, void *arg) { struct nl80211_group_conveyor *cv = arg; struct nlattr **attr = nl80211_parse(msg); struct nlattr *mgrpinfo[CTRL_ATTR_MCAST_GRP_MAX + 1]; struct nlattr *mgrp; int mgrpidx; if (!attr[CTRL_ATTR_MCAST_GROUPS]) return NL_SKIP; nla_for_each_nested(mgrp, attr[CTRL_ATTR_MCAST_GROUPS], mgrpidx) { nla_parse(mgrpinfo, CTRL_ATTR_MCAST_GRP_MAX, nla_data(mgrp), nla_len(mgrp), NULL); if (mgrpinfo[CTRL_ATTR_MCAST_GRP_ID] && mgrpinfo[CTRL_ATTR_MCAST_GRP_NAME] && !strncmp(nla_data(mgrpinfo[CTRL_ATTR_MCAST_GRP_NAME]), cv->name, nla_len(mgrpinfo[CTRL_ATTR_MCAST_GRP_NAME]))) { cv->id = nla_get_u32(mgrpinfo[CTRL_ATTR_MCAST_GRP_ID]); break; } }
static int nl80211_fill_signal_cb(struct nl_msg *msg, void *arg) { int8_t dbm; int16_t mbit; struct nl80211_rssi_rate *rr = arg; struct nlattr **attr = nl80211_parse(msg); struct nlattr *sinfo[NL80211_STA_INFO_MAX + 1]; struct nlattr *rinfo[NL80211_RATE_INFO_MAX + 1]; static struct nla_policy stats_policy[NL80211_STA_INFO_MAX + 1] = { [NL80211_STA_INFO_INACTIVE_TIME] = { .type = NLA_U32 },
static int nl80211_ifname2phy_cb(struct nl_msg *msg, void *arg) { char *buf = arg; struct nlattr **attr = nl80211_parse(msg); if (attr[NL80211_ATTR_WIPHY_NAME]) sprintf(buf, "%s", nla_data(attr[NL80211_ATTR_WIPHY_NAME])); else buf[0] = 0; return NL_SKIP; }