return NL_SKIP;
}
+struct nl80211_ack_err_args {
+ int err;
+ struct nl_msg *orig_msg;
+ struct nl80211_err_info *err_info;
+};
+
static int error_handler(struct sockaddr_nl *nla, struct nlmsgerr *err,
void *arg)
{
+ struct nl80211_ack_err_args *err_args = arg;
struct nlmsghdr *nlh = (struct nlmsghdr *) err - 1;
+ struct nlmsghdr *orig_nlh = nlmsg_hdr(err_args->orig_msg);
int len = nlh->nlmsg_len;
struct nlattr *attrs;
struct nlattr *tb[NLMSGERR_ATTR_MAX + 1];
- int *ret = arg;
int ack_len = sizeof(*nlh) + sizeof(int) + sizeof(*nlh);
+ struct nlattr *mlo_links, *link_attr;
+ u32 offset;
+ int rem;
- *ret = err->error;
+ err_args->err = err->error;
+ if (err_args->err_info)
+ err_args->err_info->link_id = -1;
if (!(nlh->nlmsg_flags & NLM_F_ACK_TLVS))
return NL_SKIP;
len, (char *) nla_data(tb[NLMSGERR_ATTR_MSG]));
}
+ if (!err_args->err_info)
+ return NL_SKIP;
+
+ /* Check if it was a per-link error report */
+
+ if (!tb[NLMSGERR_ATTR_OFFS] ||
+ os_memcmp(orig_nlh, &err->msg, sizeof(err->msg)) != 0)
+ return NL_SKIP;
+
+ offset = nla_get_u32(tb[NLMSGERR_ATTR_OFFS]);
+
+ mlo_links = nlmsg_find_attr(orig_nlh, GENL_HDRLEN,
+ NL80211_ATTR_MLO_LINKS);
+ if (!mlo_links)
+ return NL_SKIP;
+
+ nla_for_each_nested(link_attr, mlo_links, rem) {
+ struct nlattr *link_id;
+ size_t link_offset = (u8 *) link_attr - (u8 *) orig_nlh;
+
+ if (offset < link_offset ||
+ offset >= link_offset + link_attr->nla_len)
+ continue;
+
+ link_id = nla_find(nla_data(link_attr), nla_len(link_attr),
+ NL80211_ATTR_MLO_LINK_ID);
+ if (link_id) {
+ err_args->err_info->link_id = nla_get_u8(link_id);
+ wpa_printf(MSG_DEBUG,
+ "nl80211: kernel reports error for link: %d",
+ err_args->err_info->link_id);
+ break;
+ }
+ }
+
return NL_SKIP;
}
int (*valid_handler)(struct nl_msg *, void *),
void *valid_data,
int (*ack_handler_custom)(struct nl_msg *, void *),
- void *ack_data)
+ void *ack_data,
+ struct nl80211_err_info *err_info)
{
struct nl_cb *cb;
- int err = -ENOMEM, opt;
+ struct nl80211_ack_err_args err;
+ int opt;
if (!msg)
return -ENOMEM;
+ err.err = -ENOMEM;
+
cb = nl_cb_clone(global->nl_cb);
if (!cb)
goto out;
setsockopt(nl_socket_get_fd(nl_handle), SOL_NETLINK,
NETLINK_CAP_ACK, &opt, sizeof(opt));
- err = nl_send_auto_complete(nl_handle, msg);
- if (err < 0) {
+ err.err = nl_send_auto_complete(nl_handle, msg);
+ if (err.err < 0) {
wpa_printf(MSG_INFO,
"nl80211: nl_send_auto_complete() failed: %s",
- nl_geterror(err));
+ nl_geterror(err.err));
/* Need to convert libnl error code to an errno value. For now,
* just hardcode this to EBADF; the real error reason is shown
* in that error print above. */
- err = -EBADF;
+ err.err = -EBADF;
goto out;
}
- err = 1;
+ err.err = 1;
+ err.orig_msg = msg;
+ err.err_info = err_info;
nl_cb_err(cb, NL_CB_CUSTOM, error_handler, &err);
- nl_cb_set(cb, NL_CB_FINISH, NL_CB_CUSTOM, finish_handler, &err);
+ nl_cb_set(cb, NL_CB_FINISH, NL_CB_CUSTOM, finish_handler, &err.err);
if (ack_handler_custom) {
struct nl80211_ack_ext_arg *ext_arg = ack_data;
- ext_arg->err = &err;
+ ext_arg->err = &err.err;
nl_cb_set(cb, NL_CB_ACK, NL_CB_CUSTOM,
ack_handler_custom, ack_data);
} else {
nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM,
valid_handler, valid_data);
- while (err > 0) {
+ while (err.err > 0) {
int res = nl_recvmsgs(nl_handle, cb);
if (res == -NLE_DUMP_INTR) {
* will stop and return an error. */
wpa_printf(MSG_DEBUG, "nl80211: %s; convert to -EAGAIN",
nl_geterror(res));
- err = -EAGAIN;
+ err.err = -EAGAIN;
} else if (res < 0) {
wpa_printf(MSG_INFO,
"nl80211: %s->nl_recvmsgs failed: %d (%s)",
/* Always clear the message as it can potentially contain keys */
nl80211_nlmsg_clear(msg);
nlmsg_free(msg);
- return err;
+ return err.err;
}
int (*valid_handler)(struct nl_msg *, void *),
void *valid_data,
int (*ack_handler_custom)(struct nl_msg *, void *),
- void *ack_data)
+ void *ack_data,
+ struct nl80211_err_info *err_info)
{
return send_and_recv(drv->global, drv->global->nl, msg,
valid_handler, valid_data,
- ack_handler_custom, ack_data);
+ ack_handler_custom, ack_data, err_info);
}
void *valid_data,
int (*ack_handler_custom)(struct nl_msg *,
void *),
- void *ack_data)
+ void *ack_data,
+ struct nl80211_err_info *err_info)
{
if (!msg)
return -ENOMEM;
return send_and_recv(drv->global, handle ? handle : drv->global->nl,
msg, valid_handler, valid_data,
- ack_handler_custom, ack_data);
+ ack_handler_custom, ack_data, err_info);
}
-
static int
send_and_recv_msgs_connect_handle(struct wpa_driver_nl80211_data *drv,
struct nl_msg *msg, struct i802_bss *bss,
- int set_owner)
+ int set_owner,
+ struct nl80211_err_info *err_info)
{
struct nl_sock *nl_connect = get_connect_handle(bss);
if (nl_connect)
return send_and_recv_msgs_owner(drv, msg, nl_connect, set_owner,
process_bss_event, bss, NULL,
- NULL);
+ NULL, err_info);
else
- return send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ return send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL,
+ err_info);
}
}
ret = send_and_recv(global, global->nl, msg, family_handler, &res,
- NULL, NULL);
+ NULL, NULL, NULL);
if (ret == 0)
ret = res.id;
return ret;
return -1;
if (send_and_recv_msgs(bss->drv, msg, netdev_info_handler, &data,
- NULL, NULL) == 0)
+ NULL, NULL, NULL) == 0)
return data.wiphy_idx;
return -1;
}
return NL80211_IFTYPE_UNSPECIFIED;
if (send_and_recv_msgs(bss->drv, msg, netdev_info_handler, &data,
- NULL, NULL) == 0)
+ NULL, NULL, NULL) == 0)
return data.nlmode;
return NL80211_IFTYPE_UNSPECIFIED;
}
return -1;
return send_and_recv_msgs(bss->drv, msg, netdev_info_handler, &data,
- NULL, NULL);
+ NULL, NULL, NULL);
}
if (!(msg = nl80211_cmd_msg(bss, 0, NL80211_CMD_GET_INTERFACE)) ||
send_and_recv_msgs(bss->drv, msg, netdev_info_handler, &data,
- NULL, NULL))
+ NULL, NULL, NULL))
return -1;
return data.use_4addr;
}
}
ret = send_and_recv(drv->global, w->nl_beacons, msg, NULL, NULL,
- NULL, NULL);
+ NULL, NULL, NULL);
if (ret) {
wpa_printf(MSG_DEBUG, "nl80211: Register beacons command "
"failed: ret=%d (%s)",
msg = nl80211_drv_msg(drv, 0, NL80211_CMD_GET_INTERFACE);
if (send_and_recv_msgs(drv, msg, get_mlo_info,
- &drv->sta_mlo_info, NULL, NULL))
+ &drv->sta_mlo_info, NULL, NULL, NULL))
return -1;
}
os_memset(&arg, 0, sizeof(arg));
arg.drv = drv;
ret = send_and_recv_msgs(drv, msg, nl80211_get_assoc_freq_handler,
- &arg, NULL, NULL);
+ &arg, NULL, NULL, NULL);
if (ret == -EAGAIN) {
count++;
if (count >= 10) {
os_memset(&arg, 0, sizeof(arg));
arg.drv = drv;
ret = send_and_recv_msgs(drv, msg, nl80211_get_assoc_freq_handler,
- &arg, NULL, NULL);
+ &arg, NULL, NULL, NULL);
if (ret == -EAGAIN) {
count++;
if (count >= 10) {
msg = nl80211_drv_msg(drv, NLM_F_DUMP, NL80211_CMD_GET_SURVEY);
return send_and_recv_msgs(drv, msg, get_link_noise, sig_change,
- NULL, NULL);
+ NULL, NULL, NULL);
}
struct nl_msg *msg;
msg = nl80211_drv_msg(drv, 0, NL80211_CMD_GET_INTERFACE);
- return send_and_recv_msgs(drv, msg, get_channel_info, ci, NULL, NULL);
+ return send_and_recv_msgs(drv, msg, get_channel_info, ci, NULL, NULL,
+ NULL);
}
nlmsg_free(msg);
return -EINVAL;
}
- if (send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL))
+ if (send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL))
return -EINVAL;
return 0;
}
alpha2[0] = '\0';
ret = send_and_recv_msgs(drv, msg, nl80211_get_country, alpha2,
- NULL, NULL);
+ NULL, NULL, NULL);
if (!alpha2[0])
ret = -1;
}
ret = send_and_recv(drv->global, nl_handle, msg, NULL, NULL,
- NULL, NULL);
+ NULL, NULL, NULL);
if (ret) {
wpa_printf(MSG_DEBUG, "nl80211: Register frame command "
"failed (type=%u): ret=%d (%s)",
msg = nl80211_bss_msg(bss, 0, NL80211_CMD_UNEXPECTED_FRAME);
ret = send_and_recv(bss->drv->global, bss->nl_mgmt, msg, NULL, NULL,
- NULL, NULL);
+ NULL, NULL, NULL);
if (ret) {
wpa_printf(MSG_DEBUG, "nl80211: Register spurious class3 "
"failed: ret=%d (%s)",
int ret;
msg = nl80211_cmd_msg(bss, 0, NL80211_CMD_DEL_INTERFACE);
- ret = send_and_recv_msgs(bss->drv, msg, NULL, NULL, NULL, NULL);
+ ret = send_and_recv_msgs(bss->drv, msg, NULL, NULL, NULL, NULL, NULL);
wpa_printf(MSG_DEBUG, "nl80211: Delete P2P Device %s (0x%llx): %s",
bss->ifname, (long long unsigned int) bss->wdev_id,
msg = nl80211_cmd_msg(bss, 0, start ? NL80211_CMD_START_P2P_DEVICE :
NL80211_CMD_STOP_P2P_DEVICE);
- ret = send_and_recv_msgs(bss->drv, msg, NULL, NULL, NULL, NULL);
+ ret = send_and_recv_msgs(bss->drv, msg, NULL, NULL, NULL, NULL, NULL);
wpa_printf(MSG_DEBUG, "nl80211: %s P2P Device %s (0x%llx): %s",
start ? "Start" : "Stop",
nla_nest_end(msg, params);
ret = send_and_recv_msgs(drv, msg, qca_vendor_test_cmd_handler, drv,
- NULL, NULL);
+ NULL, NULL, NULL);
wpa_printf(MSG_DEBUG,
"nl80211: QCA vendor test command returned %d (%s)",
ret, strerror(-ret));
}
}
- return send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ return send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
}
nlmsg_free(msg);
return -1;
}
- ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
if (ret) {
wpa_printf(MSG_DEBUG,
"nl80211: Key management set key failed: ret=%d (%s)",
return -ENOBUFS;
}
- ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
if (ret) {
wpa_printf(MSG_DEBUG, "nl80211: Set PMK failed: ret=%d (%s)",
ret, strerror(-ret));
goto fail;
}
- ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
if ((ret == -ENOENT || ret == -ENOLINK) && alg == WPA_ALG_NONE)
ret = 0;
if (ret)
goto fail;
}
- ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
if (ret)
wpa_printf(MSG_DEBUG,
"nl80211: set_key default failed; err=%d %s",
if (nl_connect)
ret = send_and_recv(drv->global, nl_connect, msg,
- process_bss_event, bss, NULL, NULL);
+ process_bss_event, bss, NULL, NULL, NULL);
else
- ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL,
+ NULL);
if (ret) {
wpa_dbg(drv->ctx, MSG_DEBUG,
"nl80211: MLME command failed: reason=%u ret=%d (%s)",
goto fail;
}
- ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
msg = NULL;
if (ret) {
wpa_dbg(drv->ctx, MSG_DEBUG,
return -ENOBUFS;
}
- return send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ return send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
}
}
nlmsg_free(acl);
- ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
if (ret) {
wpa_printf(MSG_DEBUG, "nl80211: Failed to set MAC ACL: %d (%s)",
ret, strerror(-ret));
return ret;
}
- ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
if (ret) {
wpa_printf(MSG_ERROR,
"nl80211: Mesh config set failed: %d (%s)",
return -ENOBUFS;
}
- ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
switch (ret) {
case 0:
nla_nest_end(msg, freqs_list);
nla_nest_end(msg, params);
- ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
if (ret)
wpa_printf(MSG_ERROR,
"nl80211: Failed set AP alllowed frequency list: %d (%s)",
int_array_len(params->allowed_freqs));
#endif /* CONFIG_DRIVER_NL80211_QCA */
- ret = send_and_recv_msgs_connect_handle(drv, msg, bss, 1);
+ ret = send_and_recv_msgs_connect_handle(drv, msg, bss, 1, NULL);
if (ret) {
wpa_printf(MSG_DEBUG, "nl80211: Beacon set failed: %d (%s)",
ret, strerror(-ret));
}
}
- ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
if (ret == 0) {
nl80211_link_set_freq(bss, freq->link_id, freq->freq);
return 0;
goto fail;
}
- ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
msg = NULL;
if (ret)
wpa_printf(MSG_DEBUG, "nl80211: %s result: %d (%s)",
return -ENOBUFS;
}
- ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
wpa_printf(MSG_DEBUG, "nl80211: sta_remove -> DEL_STATION %s " MACSTR
" --> %d (%s)",
bss->ifname, MAC2STR(addr), ret, strerror(-ret));
}
msg = nl80211_ifindex_msg(drv, ifidx, 0, NL80211_CMD_DEL_INTERFACE);
- if (send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL) == 0)
+ if (send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL) == 0)
return;
wpa_printf(MSG_ERROR, "Failed to remove interface (ifidx=%d)", ifidx);
}
nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr))
goto fail;
- ret = send_and_recv_msgs(drv, msg, handler, arg, NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, handler, arg, NULL, NULL, NULL);
msg = NULL;
if (ret) {
fail:
os_memset(&ext_arg, 0, sizeof(struct nl80211_ack_ext_arg));
ext_arg.ext_data = &cookie;
ret = send_and_recv_msgs(bss->drv, msg, NULL, NULL,
- ack_handler_cookie, &ext_arg);
+ ack_handler_cookie, &ext_arg, NULL);
if (ret) {
wpa_printf(MSG_DEBUG,
"nl80211: tx_control_port failed: ret=%d (%s)",
if (nla_put(msg, NL80211_ATTR_STA_FLAGS2, sizeof(upd), &upd))
goto fail;
- return send_and_recv_msgs(bss->drv, msg, NULL, NULL, NULL, NULL);
+ return send_and_recv_msgs(bss->drv, msg, NULL, NULL, NULL, NULL, NULL);
fail:
nlmsg_free(msg);
return -ENOBUFS;
nla_put_u16(msg, NL80211_ATTR_AIRTIME_WEIGHT, weight))
goto fail;
- ret = send_and_recv_msgs(bss->drv, msg, NULL, NULL, NULL, NULL);
+ ret = send_and_recv_msgs(bss->drv, msg, NULL, NULL, NULL, NULL, NULL);
if (ret) {
wpa_printf(MSG_DEBUG,
"nl80211: SET_STATION[AIRTIME_WEIGHT] failed: ret=%d (%s)",
int ret;
msg = nl80211_drv_msg(drv, 0, NL80211_CMD_LEAVE_IBSS);
- ret = send_and_recv_msgs_connect_handle(drv, msg, drv->first_bss, 1);
+ ret = send_and_recv_msgs_connect_handle(drv, msg, drv->first_bss, 1,
+ NULL);
if (ret) {
wpa_printf(MSG_DEBUG, "nl80211: Leave IBSS failed: ret=%d "
"(%s)", ret, strerror(-ret));
if (ret < 0)
goto fail;
- ret = send_and_recv_msgs_connect_handle(drv, msg, drv->first_bss, 1);
+ ret = send_and_recv_msgs_connect_handle(drv, msg, drv->first_bss, 1,
+ NULL);
msg = NULL;
if (ret) {
wpa_printf(MSG_DEBUG, "nl80211: Join IBSS failed: ret=%d (%s)",
if (ret)
goto fail;
- ret = send_and_recv_msgs_connect_handle(drv, msg, bss, 1);
+ ret = send_and_recv_msgs_connect_handle(drv, msg, bss, 1, NULL);
msg = NULL;
if (ret) {
wpa_printf(MSG_DEBUG, "nl80211: MLME connect failed: ret=%d "
goto fail;
}
- ret = send_and_recv_msgs_connect_handle(drv, msg, drv->first_bss, 1);
+ ret = send_and_recv_msgs_connect_handle(drv, msg, drv->first_bss, 1,
+ NULL);
msg = NULL;
if (ret) {
wpa_dbg(drv->ctx, MSG_DEBUG,
if (!msg || nla_put_u32(msg, NL80211_ATTR_IFTYPE, mode))
goto fail;
- ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
msg = NULL;
if (!ret)
return 0;
return -ENOBUFS;
}
- ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
if (!ret)
return 0;
wpa_printf(MSG_DEBUG, "nl80211: Failed to set STA flag: %d (%s)",
}
os_memset(seq, 0, 6);
- res = send_and_recv_msgs(drv, msg, get_key_handler, seq, NULL, NULL);
+ res = send_and_recv_msgs(drv, msg, get_key_handler, seq, NULL, NULL,
+ NULL);
if (res) {
wpa_printf(MSG_DEBUG,
"nl80211: Failed to get current TX sequence for a key (link_id=%d idx=%d): %d (%s)",
return -ENOBUFS;
}
- ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
if (!ret)
return 0;
wpa_printf(MSG_DEBUG, "nl80211: Failed to set RTS threshold %d: "
return -ENOBUFS;
}
- ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
if (!ret)
return 0;
wpa_printf(MSG_DEBUG, "nl80211: Failed to set fragmentation threshold "
* XXX: FIX! this needs to flush all VLANs too
*/
msg = nl80211_bss_msg(bss, 0, NL80211_CMD_DEL_STATION);
- res = send_and_recv_msgs(bss->drv, msg, NULL, NULL, NULL, NULL);
+ res = send_and_recv_msgs(bss->drv, msg, NULL, NULL, NULL, NULL, NULL);
if (res) {
wpa_printf(MSG_DEBUG, "nl80211: Station flush failed: ret=%d "
"(%s)", res, strerror(-res));
return -ENOBUFS;
}
- return send_and_recv_msgs(drv, msg, get_sta_handler, data, NULL, NULL);
+ return send_and_recv_msgs(drv, msg, get_sta_handler, data, NULL, NULL,
+ NULL);
}
}
return send_and_recv_msgs(bss->drv, msg, get_sta_handler, data,
- NULL, NULL);
+ NULL, NULL, NULL);
}
nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id))
goto fail;
- res = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ res = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
wpa_printf(MSG_DEBUG,
"nl80211: TX queue param set: queue=%d aifs=%d cw_min=%d cw_max=%d burst_time=%d --> res=%d",
queue, aifs, cw_min, cw_max, burst_time, res);
return -ENOBUFS;
}
- ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
if (ret < 0) {
wpa_printf(MSG_ERROR, "nl80211: NL80211_ATTR_STA_VLAN (addr="
MACSTR " ifname=%s vlan_id=%d) failed: %d (%s)",
goto fail;
cookie = 0;
- ret = send_and_recv_msgs(drv, msg, cookie_handler, &cookie, NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, cookie_handler, &cookie, NULL, NULL,
+ NULL);
msg = NULL;
if (ret) {
wpa_printf(MSG_DEBUG, "nl80211: Frame command failed: ret=%d "
return;
}
- ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
if (ret)
wpa_printf(MSG_DEBUG, "nl80211: wait cancel failed: ret=%d "
"(%s)", ret, strerror(-ret));
}
cookie = 0;
- ret = send_and_recv_msgs(drv, msg, cookie_handler, &cookie, NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, cookie_handler, &cookie, NULL, NULL,
+ NULL);
if (ret == 0) {
wpa_printf(MSG_DEBUG, "nl80211: Remain-on-channel cookie "
"0x%llx for freq=%u MHz duration=%u",
return -1;
}
- ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
if (ret == 0)
return 0;
wpa_printf(MSG_DEBUG, "nl80211: Failed to cancel remain-on-channel: "
nla_nest_end(msg, bands);
- ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
if (ret) {
wpa_printf(MSG_DEBUG, "nl80211: Set TX rates failed: ret=%d "
"(%s)", ret, strerror(-ret));
return;
}
- ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
if (ret) {
wpa_printf(MSG_ERROR,
"nl80211: remove link (%d) failed. ret=%d (%s)",
}
nla_nest_end(msg, cqm);
- return send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ return send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
}
struct nl_msg *msg;
msg = nl80211_drv_msg(drv, 0, NL80211_CMD_GET_INTERFACE);
- return send_and_recv_msgs(drv, msg, get_channel_width, sig, NULL, NULL);
+ return send_and_recv_msgs(drv, msg, get_channel_width, sig, NULL, NULL,
+ NULL);
}
msg = nl80211_drv_msg(drv, NLM_F_DUMP, NL80211_CMD_GET_SURVEY);
return send_and_recv_msgs(drv, msg, get_links_noise, mlo_sig,
- NULL, NULL);
+ NULL, NULL, NULL);
}
msg = nl80211_drv_msg(drv, 0, NL80211_CMD_GET_INTERFACE);
return send_and_recv_msgs(drv, msg, get_links_channel_width, mlo_sig,
- NULL, NULL);
+ NULL, NULL, NULL);
}
return -ENOBUFS;
}
- return send_and_recv_msgs(bss->drv, msg, NULL, NULL, NULL, NULL);
+ return send_and_recv_msgs(bss->drv, msg, NULL, NULL, NULL, NULL, NULL);
}
msg = nl80211_bss_msg(bss, 0, NL80211_CMD_FLUSH_PMKSA);
if (!msg)
return -ENOBUFS;
- return send_and_recv_msgs(bss->drv, msg, NULL, NULL, NULL, NULL);
+ return send_and_recv_msgs(bss->drv, msg, NULL, NULL, NULL, NULL, NULL);
}
do {
wpa_printf(MSG_DEBUG, "nl80211: Fetch survey data");
err = send_and_recv_msgs(drv, msg, survey_handler,
- survey_results, NULL, NULL);
+ survey_results, NULL, NULL, NULL);
} while (err > 0);
if (err)
nla_nest_end(msg, replay_nested);
- ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
if (ret == -EOPNOTSUPP) {
wpa_printf(MSG_DEBUG,
"nl80211: Driver does not support rekey offload");
return;
}
- ret = send_and_recv_msgs(drv, msg, cookie_handler, &cookie, NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, cookie_handler, &cookie, NULL, NULL,
+ NULL);
if (ret < 0) {
wpa_printf(MSG_DEBUG, "nl80211: Client probe request for "
MACSTR " failed: ret=%d (%s)",
return -ENOBUFS;
}
- ret = send_and_recv_msgs(bss->drv, msg, NULL, NULL, NULL, NULL);
+ ret = send_and_recv_msgs(bss->drv, msg, NULL, NULL, NULL, NULL, NULL);
if (ret < 0) {
wpa_printf(MSG_DEBUG,
"nl80211: Setting PS state %s failed: %d (%s)",
return -1;
}
- ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
if (ret == 0)
return 0;
wpa_printf(MSG_DEBUG, "nl80211: Failed to start radar detection: "
}
nla_nest_end(msg, params);
- return send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ return send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
#else /* CONFIG_DRIVER_NL80211_QCA */
wpa_printf(MSG_ERROR,
"nl80211: Setting TX link for TDLS Discovery Response not supported");
nla_put(msg, NL80211_ATTR_IE, len, buf))
goto fail;
- return send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ return send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
fail:
nlmsg_free(msg);
return -ENOBUFS;
}
- res = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ res = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
wpa_printf(MSG_DEBUG, "nl80211: TDLS_OPER: oper=%d mac=" MACSTR
" --> res=%d (%s)", nl80211_oper, MAC2STR(peer), res,
strerror(-res));
return ret;
}
- return send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ return send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
}
return -ENOBUFS;
}
- return send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ return send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
}
#endif /* CONFIG TDLS */
return -ENOBUFS;
}
- ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
if (ret) {
wpa_printf(MSG_DEBUG, "nl80211: update_ft_ies failed "
"err=%d (%s)", ret, strerror(-ret));
return -ENOBUFS;
}
- ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
if (ret) {
wpa_printf(MSG_DEBUG,
"nl80211: update_dh_ie failed err=%d (%s)",
nl80211_cmd(drv, msg, 0, NL80211_CMD_GET_REG) &&
nla_put_u32(msg, NL80211_ATTR_WIPHY, drv->wiphy_idx) == 0) {
if (send_and_recv_msgs(drv, msg, nl80211_get_country,
- alpha2, NULL, NULL) == 0 &&
+ alpha2, NULL, NULL, NULL) == 0 &&
alpha2[0]) {
res = os_snprintf(pos, end - pos, "country=%s\n",
alpha2);
goto fail;
nla_nest_end(msg, beacon_csa);
- ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
if (ret) {
wpa_printf(MSG_DEBUG, "nl80211: switch_channel failed err=%d (%s)",
ret, strerror(-ret));
}
nla_nest_end(msg, beacon_cca);
- ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
if (ret) {
wpa_printf(MSG_DEBUG,
"nl80211: switch_color failed err=%d (%s)",
return -ENOBUFS;
}
- ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
if (ret)
wpa_printf(MSG_DEBUG, "nl80211: add_ts failed err=%d (%s)",
ret, strerror(-ret));
return -ENOBUFS;
}
- ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
if (ret)
wpa_printf(MSG_DEBUG, "nl80211: del_ts failed err=%d (%s)",
ret, strerror(-ret));
ret = send_and_recv_msgs_owner(drv, msg,
get_connect_handle(bss), 0,
cmd_reply_handler, buf,
- NULL, NULL);
+ NULL, NULL, NULL);
if (ret)
wpa_printf(MSG_DEBUG, "nl80211: command failed err=%d",
ret);
goto fail;
ret = send_and_recv_msgs(drv, msg, vendor_reply_handler, buf,
- NULL, NULL);
+ NULL, NULL, NULL);
if (ret)
wpa_printf(MSG_DEBUG, "nl80211: vendor command failed err=%d",
ret);
return -ENOBUFS;
}
- ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
if (ret)
wpa_printf(MSG_DEBUG, "nl80211: Setting QoS Map failed");
msg = nl80211_drv_msg(drv, 0, NL80211_CMD_GET_WOWLAN);
ret = send_and_recv_msgs(drv, msg, get_wowlan_handler, &wowlan_enabled,
- NULL, NULL);
+ NULL, NULL, NULL);
if (ret) {
wpa_printf(MSG_DEBUG, "nl80211: Getting wowlan status failed");
return 0;
nla_nest_end(msg, wowlan_triggers);
- ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
if (ret)
wpa_printf(MSG_DEBUG, "nl80211: Setting wowlan failed");
}
nla_nest_end(msg, params);
- return send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ return send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
}
}
nla_nest_end(msg, params);
- return send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ return send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
}
nla_nest_end(msg, nlbssids);
nla_nest_end(msg, params);
- return send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ return send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
fail:
nlmsg_free(msg);
}
nla_nest_end(msg, params);
- return send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ return send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
}
#endif /* CONFIG_DRIVER_NL80211_QCA */
if (nl80211_put_mesh_config(msg, ¶ms->conf) < 0)
goto fail;
- ret = send_and_recv_msgs_connect_handle(drv, msg, bss, 1);
+ ret = send_and_recv_msgs_connect_handle(drv, msg, bss, 1, NULL);
msg = NULL;
if (ret) {
wpa_printf(MSG_DEBUG, "nl80211: mesh join failed: ret=%d (%s)",
wpa_printf(MSG_DEBUG, "nl80211: mesh leave (ifindex=%d)", drv->ifindex);
msg = nl80211_drv_msg(drv, 0, NL80211_CMD_LEAVE_MESH);
- ret = send_and_recv_msgs_connect_handle(drv, msg, bss, 0);
+ ret = send_and_recv_msgs_connect_handle(drv, msg, bss, 0, NULL);
if (ret) {
wpa_printf(MSG_DEBUG, "nl80211: mesh leave failed: ret=%d (%s)",
ret, strerror(-ret));
return -ENOBUFS;
}
- ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
if (ret) {
wpa_printf(MSG_DEBUG, "nl80211: mesh link probe to " MACSTR
" failed: ret=%d (%s)",
params->vht_enabled, params->eht_enabled, params->ch_width,
params->edmg_enabled);
- ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
if (ret) {
wpa_printf(MSG_DEBUG,
"nl80211: Failed to invoke driver ACS function: %s",
}
nla_nest_end(msg, data);
- ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
if (ret) {
wpa_printf(MSG_DEBUG,
"nl80211: Driver setband function failed: %s",
if (freq_list)
os_memset(freq_list, 0, *num * sizeof(struct weighted_pcl));
ret = send_and_recv_msgs(drv, msg, preferred_freq_info_handler, ¶m,
- NULL, NULL);
+ NULL, NULL, NULL);
if (ret) {
wpa_printf(MSG_ERROR,
"%s: err in send_and_recv_msgs", __func__);
}
nla_nest_end(msg, params);
- ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
msg = NULL;
if (ret) {
wpa_printf(MSG_ERROR, "%s: err in send_and_recv_msgs",
goto fail;
nla_nest_end(msg, container);
- ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
msg = NULL;
if (ret) {
wpa_printf(MSG_DEBUG,
return -1;
}
- return send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ return send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
}
nla_nest_end(msg, params);
- ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
msg = NULL;
if (ret) {
wpa_printf(MSG_ERROR,
ret = send_and_recv_msgs(drv, msg,
nl80211_get_bss_transition_status_handler,
- info, NULL, NULL);
+ info, NULL, NULL, NULL);
msg = NULL;
if (ret) {
wpa_printf(MSG_ERROR,
nla_nest_end(msg, attr);
- ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
msg = NULL;
if (ret) {
wpa_printf(MSG_ERROR,
nla_nest_end(msg, nlpeers);
nla_nest_end(msg, attr);
- return send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ return send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
fail:
nlmsg_free(msg);
}
nla_nest_end(msg, attr);
- ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
if (ret)
wpa_printf(MSG_DEBUG,
"nl80211: Set secure ranging context failed: ret=%d (%s)",
params->hw_mode, params->ht_enabled, params->ht40_enabled,
params->vht_enabled, params->ch_width);
- ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
if (ret) {
wpa_printf(MSG_ERROR,
"nl80211: BRCM Failed to invoke driver ACS function: %s",
nl80211_put_fils_connect_params(drv, params, msg))
goto fail;
- ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
msg = NULL;
if (ret)
wpa_dbg(drv->ctx, MSG_DEBUG,
(params->bssid &&
nla_put(msg, NL80211_ATTR_BSSID, ETH_ALEN, params->bssid)))
goto fail;
- ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
msg = NULL;
if (ret) {
wpa_printf(MSG_DEBUG,
bss->added_if_into_bridge = 0;
}
- ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
msg = NULL;
if (ret && val && nl80211_get_4addr(bss) == 1) {
wpa_printf(MSG_DEBUG,
return -ENOBUFS;
}
- ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+ ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL, NULL);
if (ret) {
wpa_printf(MSG_DEBUG, "nl80211: add link failed. ret=%d (%s)",
ret, strerror(-ret));