Lines Matching refs:gas

38 	struct gas_query *gas;  member
77 static void gas_query_tx_initial_req(struct gas_query *gas,
79 static int gas_query_new_dialog_token(struct gas_query *gas, const u8 *dst);
99 struct gas_query *gas; in gas_query_init() local
101 gas = os_zalloc(sizeof(*gas)); in gas_query_init()
102 if (gas == NULL) in gas_query_init()
105 gas->wpa_s = wpa_s; in gas_query_init()
106 dl_list_init(&gas->pending); in gas_query_init()
108 return gas; in gas_query_init()
137 struct gas_query *gas = query->gas; in gas_query_free() local
142 if (gas->work && gas->work->ctx == query) { in gas_query_free()
143 radio_work_done(gas->work); in gas_query_free()
144 gas->work = NULL; in gas_query_free()
154 static void gas_query_done(struct gas_query *gas, in gas_query_done() argument
158 wpa_msg(gas->wpa_s, MSG_INFO, GAS_QUERY_DONE "addr=" MACSTR in gas_query_done()
162 if (gas->current == query) in gas_query_done()
163 gas->current = NULL; in gas_query_done()
165 offchannel_send_action_done(gas->wpa_s); in gas_query_done()
166 eloop_cancel_timeout(gas_query_tx_comeback_timeout, gas, query); in gas_query_done()
167 eloop_cancel_timeout(gas_query_timeout, gas, query); in gas_query_done()
168 eloop_cancel_timeout(gas_query_rx_comeback_timeout, gas, query); in gas_query_done()
180 void gas_query_deinit(struct gas_query *gas) in gas_query_deinit() argument
184 if (gas == NULL) in gas_query_deinit()
187 dl_list_for_each_safe(query, next, &gas->pending, in gas_query_deinit()
189 gas_query_done(gas, query, GAS_QUERY_DELETED_AT_DEINIT); in gas_query_deinit()
191 os_free(gas); in gas_query_deinit()
196 gas_query_get_pending(struct gas_query *gas, const u8 *addr, u8 dialog_token) in gas_query_get_pending() argument
199 dl_list_for_each(q, &gas->pending, struct gas_query_pending, list) { in gas_query_get_pending()
227 struct gas_query *gas = wpa_s->gas; in gas_query_tx_status() local
230 if (gas->current == NULL) { in gas_query_tx_status()
237 query = gas->current; in gas_query_tx_status()
251 eloop_cancel_timeout(gas_query_timeout, gas, query); in gas_query_tx_status()
255 gas_query_timeout, gas, query); in gas_query_tx_status()
258 gas_query_timeout, gas, query); in gas_query_tx_status()
262 gas, query); in gas_query_tx_status()
265 gas_query_rx_comeback_timeout, gas, query); in gas_query_tx_status()
269 eloop_cancel_timeout(gas_query_timeout, gas, query); in gas_query_tx_status()
270 eloop_register_timeout(0, 0, gas_query_timeout, gas, query); in gas_query_tx_status()
285 static int gas_query_tx(struct gas_query *gas, struct gas_query_pending *query, in gas_query_tx() argument
288 int res, prot = pmf_in_use(gas->wpa_s, query->addr); in gas_query_tx()
303 if (gas->wpa_s->max_remain_on_chan && in gas_query_tx()
304 wait_time > gas->wpa_s->max_remain_on_chan) in gas_query_tx()
305 wait_time = gas->wpa_s->max_remain_on_chan; in gas_query_tx()
307 (!gas->wpa_s->conf->gas_address3 || in gas_query_tx()
308 (gas->wpa_s->current_ssid && in gas_query_tx()
309 gas->wpa_s->wpa_state >= WPA_ASSOCIATED && in gas_query_tx()
310 os_memcmp(query->addr, gas->wpa_s->bssid, ETH_ALEN) == 0))) in gas_query_tx()
315 res = offchannel_send_action(gas->wpa_s, query->freq, query->addr, in gas_query_tx()
326 static void gas_query_tx_comeback_req(struct gas_query *gas, in gas_query_tx_comeback_req() argument
334 gas_query_done(gas, query, GAS_QUERY_INTERNAL_ERROR); in gas_query_tx_comeback_req()
341 if (gas_query_tx(gas, query, req, wait_time) < 0) { in gas_query_tx_comeback_req()
344 gas_query_done(gas, query, GAS_QUERY_INTERNAL_ERROR); in gas_query_tx_comeback_req()
353 struct gas_query *gas = eloop_data; in gas_query_rx_comeback_timeout() local
360 if (gas->current != query || query->retry) in gas_query_rx_comeback_timeout()
362 dialog_token = gas_query_new_dialog_token(gas, query->addr); in gas_query_rx_comeback_timeout()
374 eloop_cancel_timeout(gas_query_tx_comeback_timeout, gas, query); in gas_query_rx_comeback_timeout()
375 eloop_cancel_timeout(gas_query_timeout, gas, query); in gas_query_rx_comeback_timeout()
376 gas_query_tx_initial_req(gas, query); in gas_query_rx_comeback_timeout()
382 struct gas_query *gas = eloop_data; in gas_query_tx_comeback_timeout() local
387 gas_query_tx_comeback_req(gas, query); in gas_query_tx_comeback_timeout()
391 static void gas_query_tx_comeback_req_delay(struct gas_query *gas, in gas_query_tx_comeback_req_delay() argument
398 offchannel_send_action_done(gas->wpa_s); in gas_query_tx_comeback_req_delay()
406 eloop_cancel_timeout(gas_query_tx_comeback_timeout, gas, query); in gas_query_tx_comeback_req_delay()
408 gas, query); in gas_query_tx_comeback_req_delay()
412 static void gas_query_rx_initial(struct gas_query *gas, in gas_query_rx_initial() argument
423 gas_query_done(gas, query, GAS_QUERY_INTERNAL_ERROR); in gas_query_rx_initial()
428 eloop_cancel_timeout(gas_query_timeout, gas, query); in gas_query_rx_initial()
430 gas_query_tx_comeback_req_delay(gas, query, comeback_delay); in gas_query_rx_initial()
436 gas_query_done(gas, query, GAS_QUERY_INTERNAL_ERROR); in gas_query_rx_initial()
440 gas_query_done(gas, query, GAS_QUERY_SUCCESS); in gas_query_rx_initial()
444 static void gas_query_rx_comeback(struct gas_query *gas, in gas_query_rx_comeback() argument
455 eloop_cancel_timeout(gas_query_rx_comeback_timeout, gas, query); in gas_query_rx_comeback()
463 gas_query_done(gas, query, GAS_QUERY_PEER_ERROR); in gas_query_rx_comeback()
472 gas_query_done(gas, query, GAS_QUERY_PEER_ERROR); in gas_query_rx_comeback()
475 gas_query_tx_comeback_req_delay(gas, query, comeback_delay); in gas_query_rx_comeback()
487 gas_query_done(gas, query, GAS_QUERY_PEER_ERROR); in gas_query_rx_comeback()
493 gas_query_done(gas, query, GAS_QUERY_INTERNAL_ERROR); in gas_query_rx_comeback()
498 gas_query_tx_comeback_req(gas, query); in gas_query_rx_comeback()
502 gas_query_done(gas, query, GAS_QUERY_SUCCESS); in gas_query_rx_comeback()
518 int gas_query_rx(struct gas_query *gas, const u8 *da, const u8 *sa, in gas_query_rx() argument
529 if (gas == NULL || len < 4) in gas_query_rx()
541 pmf = pmf_in_use(gas->wpa_s, sa); in gas_query_rx()
551 query = gas_query_get_pending(gas, sa, dialog_token); in gas_query_rx()
585 gas_query_done(gas, query, GAS_QUERY_FAILURE); in gas_query_rx()
643 gas_query_rx_comeback(gas, query, adv_proto, pos, resp_len, in gas_query_rx()
646 gas_query_rx_initial(gas, query, adv_proto, pos, resp_len, in gas_query_rx()
655 struct gas_query *gas = eloop_data; in gas_query_timeout() local
661 gas_query_done(gas, query, GAS_QUERY_TIMEOUT); in gas_query_timeout()
665 static int gas_query_dialog_token_available(struct gas_query *gas, in gas_query_dialog_token_available() argument
669 dl_list_for_each(q, &gas->pending, struct gas_query_pending, list) { in gas_query_dialog_token_available()
682 struct gas_query *gas = query->gas; in gas_query_start_cb() local
683 struct wpa_supplicant *wpa_s = gas->wpa_s; in gas_query_start_cb()
687 gas->work = NULL; in gas_query_start_cb()
688 gas_query_done(gas, query, GAS_QUERY_DELETED_AT_DEINIT); in gas_query_start_cb()
704 gas->work = work; in gas_query_start_cb()
705 gas_query_tx_initial_req(gas, query); in gas_query_start_cb()
709 static void gas_query_tx_initial_req(struct gas_query *gas, in gas_query_tx_initial_req() argument
712 if (gas_query_tx(gas, query, query->req, in gas_query_tx_initial_req()
716 gas_query_done(gas, query, GAS_QUERY_INTERNAL_ERROR); in gas_query_tx_initial_req()
719 gas->current = query; in gas_query_tx_initial_req()
724 gas_query_timeout, gas, query); in gas_query_tx_initial_req()
728 static int gas_query_new_dialog_token(struct gas_query *gas, const u8 *dst) in gas_query_new_dialog_token() argument
735 gas, dst, (next_start + dialog_token) % 256)) in gas_query_new_dialog_token()
746 static int gas_query_set_sa(struct gas_query *gas, in gas_query_set_sa() argument
749 struct wpa_supplicant *wpa_s = gas->wpa_s; in gas_query_set_sa()
764 if (wpa_s->conf->gas_rand_mac_addr == gas->last_rand_sa_type && in gas_query_set_sa()
765 gas->last_mac_addr_rand.sec != 0 && in gas_query_set_sa()
766 !os_reltime_expired(&now, &gas->last_mac_addr_rand, in gas_query_set_sa()
770 MACSTR, MAC2STR(gas->rand_addr)); in gas_query_set_sa()
771 os_memcpy(query->sa, gas->rand_addr, ETH_ALEN); in gas_query_set_sa()
776 random_mac_addr(gas->rand_addr) < 0) { in gas_query_set_sa()
782 random_mac_addr_keep_oui(gas->rand_addr) < 0) { in gas_query_set_sa()
789 MACSTR, MAC2STR(gas->rand_addr)); in gas_query_set_sa()
790 os_memcpy(query->sa, gas->rand_addr, ETH_ALEN); in gas_query_set_sa()
791 os_get_reltime(&gas->last_mac_addr_rand); in gas_query_set_sa()
792 gas->last_rand_sa_type = wpa_s->conf->gas_rand_mac_addr; in gas_query_set_sa()
809 int gas_query_req(struct gas_query *gas, const u8 *dst, int freq, in gas_query_req() argument
823 dialog_token = gas_query_new_dialog_token(gas, dst); in gas_query_req()
831 query->gas = gas; in gas_query_req()
832 if (gas_query_set_sa(gas, query)) { in gas_query_req()
843 dl_list_add(&gas->pending, &query->list); in gas_query_req()
847 wpa_msg(gas->wpa_s, MSG_INFO, GAS_QUERY_START "addr=" MACSTR in gas_query_req()
851 if (radio_add_work(gas->wpa_s, freq, "gas-query", 0, gas_query_start_cb, in gas_query_req()
862 int gas_query_stop(struct gas_query *gas, u8 dialog_token) in gas_query_stop() argument
866 dl_list_for_each(query, &gas->pending, struct gas_query_pending, list) { in gas_query_stop()
868 if (!gas->work) { in gas_query_stop()
875 radio_remove_pending_work(gas->wpa_s, query); in gas_query_stop()
877 gas_query_done(gas, query, GAS_QUERY_STOPPED); in gas_query_stop()