move nlmsg_free into nl send_and_recv
Simplify resource cleanup and return handling for all callers of nl send_and_recv.
This commit is contained in:
parent
7b4e386057
commit
619c40d5be
@ -243,37 +243,38 @@ static int nl80211_send_and_recv(struct nl_sock *nl,
|
|||||||
nl_valid_cb valid_cb,
|
nl_valid_cb valid_cb,
|
||||||
void *data)
|
void *data)
|
||||||
{
|
{
|
||||||
int result;
|
struct nl_cb *cb;
|
||||||
struct nl_cb* cb;
|
int result = -1;
|
||||||
|
|
||||||
/* Clone netlink callback */
|
/* Clone netlink callback */
|
||||||
cb = nl_cb_clone(nl_cb);
|
cb = nl_cb_clone(nl_cb);
|
||||||
if (!cb) {
|
if (!cb)
|
||||||
return -1;
|
goto out;
|
||||||
}
|
|
||||||
|
|
||||||
/* Complete send message */
|
/* Complete send message */
|
||||||
result = nl_send_auto_complete(nl, msg);
|
result = nl_send_auto_complete(nl, msg);
|
||||||
if (result < 0) {
|
if (result < 0)
|
||||||
nl_cb_put(cb);
|
goto out;
|
||||||
return -1;
|
|
||||||
}
|
result = 1;
|
||||||
|
|
||||||
/* Customize message callback */
|
/* Customize message callback */
|
||||||
nl_cb_err(cb, NL_CB_CUSTOM, nl80211_error_handler, &result);
|
nl_cb_err(cb, NL_CB_CUSTOM, nl80211_error_handler, &result);
|
||||||
nl_cb_set(cb, NL_CB_FINISH, NL_CB_CUSTOM, nl80211_finish_handler, &result);
|
nl_cb_set(cb, NL_CB_FINISH, NL_CB_CUSTOM, nl80211_finish_handler, &result);
|
||||||
nl_cb_set(cb, NL_CB_ACK, NL_CB_CUSTOM, nl80211_ack_handler, &result);
|
nl_cb_set(cb, NL_CB_ACK, NL_CB_CUSTOM, nl80211_ack_handler, &result);
|
||||||
|
|
||||||
if (valid_cb) {
|
if (valid_cb)
|
||||||
nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, valid_cb, data);
|
nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, valid_cb, data);
|
||||||
}
|
|
||||||
|
|
||||||
result = 1;
|
|
||||||
while (result > 0) {
|
while (result > 0) {
|
||||||
nl_recvmsgs(nl, cb);
|
int r = nl_recvmsgs(nl, cb);
|
||||||
|
if (r < 0)
|
||||||
|
log_printf(LOG_INFO, "nl80211: %s->nl_recvmsgs failed: %d", __func__, r);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
nl_cb_put(cb);
|
nl_cb_put(cb);
|
||||||
|
nlmsg_free(msg);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -350,14 +351,11 @@ static int nl80211_get_multicast_id(struct nl80211_global_handle* globalhandle,
|
|||||||
|
|
||||||
/* */
|
/* */
|
||||||
result = nl80211_send_and_recv_msg(globalhandle, msg, cb_family_handler, &resource);
|
result = nl80211_send_and_recv_msg(globalhandle, msg, cb_family_handler, &resource);
|
||||||
if (!result) {
|
if (!result)
|
||||||
result = resource.id;
|
result = resource.id;
|
||||||
} else {
|
else
|
||||||
log_printf(LOG_ERR, "Unable get multicast id, error code: %d", result);
|
log_printf(LOG_ERR, "Unable get multicast id, error code: %d", result);
|
||||||
}
|
|
||||||
|
|
||||||
/* */
|
|
||||||
nlmsg_free(msg);
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -413,12 +411,9 @@ static int nl80211_wlan_set_type(struct wifi_wlan* wlan, uint32_t type) {
|
|||||||
|
|
||||||
/* */
|
/* */
|
||||||
result = nl80211_wlan_send_and_recv_msg(wlan, msg, NULL, NULL);
|
result = nl80211_wlan_send_and_recv_msg(wlan, msg, NULL, NULL);
|
||||||
if (result) {
|
if (result)
|
||||||
log_printf(LOG_ERR, "Unable set type, error code: %d", result);
|
log_printf(LOG_ERR, "Unable set type, error code: %d", result);
|
||||||
}
|
|
||||||
|
|
||||||
/* */
|
|
||||||
nlmsg_free(msg);
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -455,8 +450,6 @@ static uint32_t nl80211_wlan_get_type(struct wifi_wlan* wlan) {
|
|||||||
type = NL80211_IFTYPE_UNSPECIFIED;
|
type = NL80211_IFTYPE_UNSPECIFIED;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
|
||||||
nlmsg_free(msg);
|
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -519,14 +512,11 @@ static int nl80211_device_changefrequency(struct wifi_device* device, struct wif
|
|||||||
|
|
||||||
/* Set wifi frequency */
|
/* Set wifi frequency */
|
||||||
result = nl80211_send_and_recv_msg(devicehandle->globalhandle, msg, NULL, NULL);
|
result = nl80211_send_and_recv_msg(devicehandle->globalhandle, msg, NULL, NULL);
|
||||||
if (!result) {
|
if (!result)
|
||||||
log_printf(LOG_INFO, "Change %s frequency %d", wlan->virtname, (int)freq->frequency);
|
log_printf(LOG_INFO, "Change %s frequency %d", wlan->virtname, (int)freq->frequency);
|
||||||
} else {
|
else
|
||||||
log_printf(LOG_ERR, "Unable set frequency %d, error code: %d", (int)freq->frequency, result);
|
log_printf(LOG_ERR, "Unable set frequency %d, error code: %d", (int)freq->frequency, result);
|
||||||
}
|
|
||||||
|
|
||||||
/* */
|
|
||||||
nlmsg_free(msg);
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -604,8 +594,9 @@ static int nl80211_wlan_valid_handler(struct nl_msg* msg, void* arg) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
static int nl80211_wlan_registerframe(struct wifi_wlan* wlan, uint16_t type, const uint8_t* match, int lengthmatch) {
|
static int nl80211_wlan_registerframe(struct wifi_wlan* wlan, uint16_t type,
|
||||||
int result;
|
const uint8_t* match, int lengthmatch)
|
||||||
|
{
|
||||||
struct nl_msg* msg;
|
struct nl_msg* msg;
|
||||||
struct nl80211_wlan_handle* wlanhandle = (struct nl80211_wlan_handle*)wlan->handle;
|
struct nl80211_wlan_handle* wlanhandle = (struct nl80211_wlan_handle*)wlan->handle;
|
||||||
|
|
||||||
@ -619,11 +610,7 @@ static int nl80211_wlan_registerframe(struct wifi_wlan* wlan, uint16_t type, con
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Destroy virtual device */
|
/* Destroy virtual device */
|
||||||
result = nl80211_send_and_recv(wlanhandle->nl, wlanhandle->nl_cb, msg, NULL, NULL);
|
return nl80211_send_and_recv(wlanhandle->nl, wlanhandle->nl_cb, msg, NULL, NULL);
|
||||||
|
|
||||||
/* */
|
|
||||||
nlmsg_free(msg);
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
@ -640,12 +627,9 @@ static int nl80211_global_destroy_virtdevice(struct nl80211_global_handle* globa
|
|||||||
|
|
||||||
/* Destroy virtual device */
|
/* Destroy virtual device */
|
||||||
result = nl80211_send_and_recv_msg(globalhandle, msg, NULL, NULL);
|
result = nl80211_send_and_recv_msg(globalhandle, msg, NULL, NULL);
|
||||||
if (result) {
|
if (result)
|
||||||
log_printf(LOG_ERR, "Unable destroy interface, error code: %d", result);
|
log_printf(LOG_ERR, "Unable destroy interface, error code: %d", result);
|
||||||
}
|
|
||||||
|
|
||||||
/* */
|
|
||||||
nlmsg_free(msg);
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -710,8 +694,6 @@ static void nl80211_global_destroy_all_virtdevice(struct nl80211_global_handle*
|
|||||||
log_printf(LOG_ERR, "Unable retrieve virtual device info, error code: %d", result);
|
log_printf(LOG_ERR, "Unable retrieve virtual device info, error code: %d", result);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
|
||||||
nlmsg_free(msg);
|
|
||||||
capwap_list_free(list);
|
capwap_list_free(list);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -744,7 +726,6 @@ static wifi_wlan_handle nl80211_wlan_create(struct wifi_device* device, struct w
|
|||||||
|
|
||||||
/* */
|
/* */
|
||||||
result = nl80211_send_and_recv_msg(devicehandle->globalhandle, msg, NULL, NULL);
|
result = nl80211_send_and_recv_msg(devicehandle->globalhandle, msg, NULL, NULL);
|
||||||
nlmsg_free(msg);
|
|
||||||
|
|
||||||
/* Check interface */
|
/* Check interface */
|
||||||
if (result || !wifi_iface_index(wlan->virtname)) {
|
if (result || !wifi_iface_index(wlan->virtname)) {
|
||||||
@ -883,11 +864,8 @@ static int nl80211_wlan_setbeacon(struct wifi_wlan* wlan) {
|
|||||||
|
|
||||||
/* Start AP */
|
/* Start AP */
|
||||||
result = nl80211_wlan_send_and_recv_msg(wlan, msg, NULL, NULL);
|
result = nl80211_wlan_send_and_recv_msg(wlan, msg, NULL, NULL);
|
||||||
if (result) {
|
if (result)
|
||||||
log_printf(LOG_ERR, "Unable set beacon, error code: %d", result);
|
log_printf(LOG_ERR, "Unable set beacon, error code: %d", result);
|
||||||
}
|
|
||||||
|
|
||||||
nlmsg_free(msg);
|
|
||||||
|
|
||||||
/* Configure AP */
|
/* Configure AP */
|
||||||
if (!result) {
|
if (!result) {
|
||||||
@ -920,13 +898,10 @@ static int nl80211_wlan_setbeacon(struct wifi_wlan* wlan) {
|
|||||||
|
|
||||||
/* */
|
/* */
|
||||||
result = nl80211_wlan_send_and_recv_msg(wlan, msg, NULL, NULL);
|
result = nl80211_wlan_send_and_recv_msg(wlan, msg, NULL, NULL);
|
||||||
if (!result) {
|
if (!result)
|
||||||
wlan->flags |= WIFI_WLAN_SET_BEACON;
|
wlan->flags |= WIFI_WLAN_SET_BEACON;
|
||||||
} else {
|
else
|
||||||
log_printf(LOG_ERR, "Unable set BSS, error code: %d", result);
|
log_printf(LOG_ERR, "Unable set BSS, error code: %d", result);
|
||||||
}
|
|
||||||
|
|
||||||
nlmsg_free(msg);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
@ -1038,11 +1013,9 @@ static void nl80211_wlan_stopap(struct wifi_wlan* wlan) {
|
|||||||
/* */
|
/* */
|
||||||
if (wlan->flags & WIFI_WLAN_SET_BEACON) {
|
if (wlan->flags & WIFI_WLAN_SET_BEACON) {
|
||||||
msg = nl80211_wlan_msg(wlan, 0, NL80211_CMD_STOP_AP);
|
msg = nl80211_wlan_msg(wlan, 0, NL80211_CMD_STOP_AP);
|
||||||
if (msg) {
|
if (msg)
|
||||||
/* Stop AP */
|
/* Stop AP */
|
||||||
nl80211_wlan_send_and_recv_msg(wlan, msg, NULL, NULL);
|
nl80211_wlan_send_and_recv_msg(wlan, msg, NULL, NULL);
|
||||||
nlmsg_free(msg);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Disable interface */
|
/* Disable interface */
|
||||||
@ -1120,13 +1093,10 @@ static int nl80211_wlan_sendframe(struct wifi_wlan* wlan, uint8_t* frame, int le
|
|||||||
/* Send frame */
|
/* Send frame */
|
||||||
cookie = 0;
|
cookie = 0;
|
||||||
result = nl80211_wlan_send_and_recv_msg(wlan, msg, cb_wlan_send_frame, &cookie);
|
result = nl80211_wlan_send_and_recv_msg(wlan, msg, cb_wlan_send_frame, &cookie);
|
||||||
if (result) {
|
if (result)
|
||||||
log_printf(LOG_DEBUG, "nl80211: Frame command failed: ret=%d "
|
log_printf(LOG_DEBUG, "nl80211: Frame command failed: ret=%d "
|
||||||
"(%s) (freq=%u wait=%u)", result, strerror(-result),
|
"(%s) (frequency=%u duration=%u)", result, strerror(-result),
|
||||||
frequency, duration);
|
frequency, duration);
|
||||||
}
|
|
||||||
|
|
||||||
nlmsg_free(msg);
|
|
||||||
|
|
||||||
wlanhandle->last_cookie = (result || no_wait_ack ? 0 : cookie);
|
wlanhandle->last_cookie = (result || no_wait_ack ? 0 : cookie);
|
||||||
return result;
|
return result;
|
||||||
@ -1236,20 +1206,19 @@ int nl80211_station_authorize(struct wifi_wlan* wlan, struct wifi_station* stati
|
|||||||
|
|
||||||
/* */
|
/* */
|
||||||
result = nl80211_wlan_send_and_recv_msg(wlan, msg, NULL, NULL);
|
result = nl80211_wlan_send_and_recv_msg(wlan, msg, NULL, NULL);
|
||||||
if (result) {
|
switch (result) {
|
||||||
if (result == -EEXIST) {
|
case -EEXIST:
|
||||||
result = 0;
|
result = 0;
|
||||||
} else {
|
/* FALL THROUGH */
|
||||||
log_printf(LOG_ERR, "Unable to authorized station, error code: %d", result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* */
|
case 0:
|
||||||
if (!result)
|
|
||||||
log_printf(LOG_INFO, "Authorized station: " MACSTR, MAC2STR(station->address));
|
log_printf(LOG_INFO, "Authorized station: " MACSTR, MAC2STR(station->address));
|
||||||
|
break;
|
||||||
|
|
||||||
/* */
|
default:
|
||||||
nlmsg_free(msg);
|
log_printf(LOG_ERR, "Unable to authorized station, error code: %d", result);
|
||||||
|
break;
|
||||||
|
}
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
out_err:
|
out_err:
|
||||||
@ -1276,20 +1245,19 @@ int nl80211_station_deauthorize(struct wifi_wlan* wlan, const uint8_t* address)
|
|||||||
|
|
||||||
/* */
|
/* */
|
||||||
result = nl80211_wlan_send_and_recv_msg(wlan, msg, NULL, NULL);
|
result = nl80211_wlan_send_and_recv_msg(wlan, msg, NULL, NULL);
|
||||||
if (result) {
|
switch (result) {
|
||||||
if (result == -ENOENT) {
|
case -ENOENT:
|
||||||
result = 0;
|
result = 0;
|
||||||
} else {
|
/* FALL THROUGH */
|
||||||
log_printf(LOG_ERR, "Unable delete station, error code: %d", result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* */
|
case 0:
|
||||||
if (!result)
|
|
||||||
log_printf(LOG_INFO, "Deauthorize station: " MACSTR, MAC2STR(address));
|
log_printf(LOG_INFO, "Deauthorize station: " MACSTR, MAC2STR(address));
|
||||||
|
break;
|
||||||
|
|
||||||
/* */
|
default:
|
||||||
nlmsg_free(msg);
|
log_printf(LOG_ERR, "Unable delete station, error code: %d", result);
|
||||||
|
break;
|
||||||
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1351,7 +1319,6 @@ static int cb_nl80211_station_data(struct nl_msg *msg, void *arg)
|
|||||||
static int nl80211_station_data(struct wifi_wlan *wlan, const uint8_t *address,
|
static int nl80211_station_data(struct wifi_wlan *wlan, const uint8_t *address,
|
||||||
struct nl80211_station_data *data)
|
struct nl80211_station_data *data)
|
||||||
{
|
{
|
||||||
int result;
|
|
||||||
struct nl_msg* msg;
|
struct nl_msg* msg;
|
||||||
|
|
||||||
ASSERT(wlan != NULL);
|
ASSERT(wlan != NULL);
|
||||||
@ -1368,11 +1335,7 @@ static int nl80211_station_data(struct wifi_wlan *wlan, const uint8_t *address,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
result = nl80211_wlan_send_and_recv_msg(wlan, msg, cb_nl80211_station_data, data);
|
return nl80211_wlan_send_and_recv_msg(wlan, msg, cb_nl80211_station_data, data);
|
||||||
|
|
||||||
/* */
|
|
||||||
nlmsg_free(msg);
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
@ -1460,7 +1423,6 @@ int nl80211_device_init(wifi_global_handle handle, struct wifi_device* device) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
nlmsg_free(msg);
|
|
||||||
capwap_list_free(list);
|
capwap_list_free(list);
|
||||||
if (!devicehandle) {
|
if (!devicehandle) {
|
||||||
return -1;
|
return -1;
|
||||||
@ -1851,13 +1813,11 @@ static int nl80211_device_getcapability(struct wifi_device* device, struct wifi_
|
|||||||
|
|
||||||
/* Retrieve physical device capability */
|
/* Retrieve physical device capability */
|
||||||
capability->device = device;
|
capability->device = device;
|
||||||
result = nl80211_send_and_recv_msg(devicehandle->globalhandle, msg, cb_get_phydevice_capability, capability);
|
result = nl80211_send_and_recv_msg(devicehandle->globalhandle, msg,
|
||||||
if (result) {
|
cb_get_phydevice_capability, capability);
|
||||||
|
if (result)
|
||||||
log_printf(LOG_ERR, "Unable retrieve physical device capability, error code: %d", result);
|
log_printf(LOG_ERR, "Unable retrieve physical device capability, error code: %d", result);
|
||||||
}
|
|
||||||
|
|
||||||
/* */
|
|
||||||
nlmsg_free(msg);
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1958,7 +1918,6 @@ static int nl80211_device_settxqueue(struct wifi_device* device, int queue, int
|
|||||||
if (result)
|
if (result)
|
||||||
log_printf(LOG_ERR, "Unable set TX Queue, error code: %d", result);
|
log_printf(LOG_ERR, "Unable set TX Queue, error code: %d", result);
|
||||||
|
|
||||||
nlmsg_free(msg);
|
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
out_err:
|
out_err:
|
||||||
|
Loading…
Reference in New Issue
Block a user