Lines Matching refs:gas
38 struct gas_query *gas; member
78 static void gas_query_tx_initial_req(struct gas_query *gas,
80 static int gas_query_new_dialog_token(struct gas_query *gas, const u8 *dst);
100 struct gas_query *gas; in gas_query_init() local
102 gas = os_zalloc(sizeof(*gas)); in gas_query_init()
103 if (gas == NULL) in gas_query_init()
106 gas->wpa_s = wpa_s; in gas_query_init()
107 dl_list_init(&gas->pending); in gas_query_init()
109 return gas; in gas_query_init()
138 struct gas_query *gas = query->gas; in gas_query_free() local
143 if (gas->work && gas->work->ctx == query) { in gas_query_free()
144 radio_work_done(gas->work); in gas_query_free()
145 gas->work = NULL; in gas_query_free()
155 static void gas_query_done(struct gas_query *gas, in gas_query_done() argument
159 wpa_msg(gas->wpa_s, MSG_INFO, GAS_QUERY_DONE "addr=" MACSTR in gas_query_done()
163 if (gas->current == query) in gas_query_done()
164 gas->current = NULL; in gas_query_done()
166 offchannel_send_action_done(gas->wpa_s); in gas_query_done()
167 eloop_cancel_timeout(gas_query_tx_comeback_timeout, gas, query); in gas_query_done()
168 eloop_cancel_timeout(gas_query_timeout, gas, query); in gas_query_done()
169 eloop_cancel_timeout(gas_query_rx_comeback_timeout, gas, query); in gas_query_done()
181 void gas_query_deinit(struct gas_query *gas) in gas_query_deinit() argument
185 if (gas == NULL) in gas_query_deinit()
188 dl_list_for_each_safe(query, next, &gas->pending, in gas_query_deinit()
190 gas_query_done(gas, query, GAS_QUERY_DELETED_AT_DEINIT); in gas_query_deinit()
192 os_free(gas); in gas_query_deinit()
197 gas_query_get_pending(struct gas_query *gas, const u8 *addr, u8 dialog_token) in gas_query_get_pending() argument
200 dl_list_for_each(q, &gas->pending, struct gas_query_pending, list) { in gas_query_get_pending()
228 struct gas_query *gas = wpa_s->gas; in gas_query_tx_status() local
231 if (gas->current == NULL) { in gas_query_tx_status()
238 query = gas->current; in gas_query_tx_status()
252 eloop_cancel_timeout(gas_query_timeout, gas, query); in gas_query_tx_status()
256 gas_query_timeout, gas, query); in gas_query_tx_status()
259 gas_query_timeout, gas, query); in gas_query_tx_status()
263 gas, query); in gas_query_tx_status()
266 gas_query_rx_comeback_timeout, gas, query); in gas_query_tx_status()
270 eloop_cancel_timeout(gas_query_timeout, gas, query); in gas_query_tx_status()
271 eloop_register_timeout(0, 0, gas_query_timeout, gas, query); in gas_query_tx_status()
286 static int gas_query_tx(struct gas_query *gas, struct gas_query_pending *query, in gas_query_tx() argument
289 int res, prot = pmf_in_use(gas->wpa_s, query->addr); in gas_query_tx()
304 if (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()
306 wait_time = gas->wpa_s->max_remain_on_chan; in gas_query_tx()
308 (!gas->wpa_s->conf->gas_address3 || in gas_query_tx()
309 (gas->wpa_s->current_ssid && in gas_query_tx()
310 gas->wpa_s->wpa_state >= WPA_ASSOCIATED && in gas_query_tx()
311 os_memcmp(query->addr, gas->wpa_s->bssid, ETH_ALEN) == 0))) in gas_query_tx()
316 res = offchannel_send_action(gas->wpa_s, query->freq, query->addr, in gas_query_tx()
327 static void gas_query_tx_comeback_req(struct gas_query *gas, in gas_query_tx_comeback_req() argument
335 gas_query_done(gas, query, GAS_QUERY_INTERNAL_ERROR); in gas_query_tx_comeback_req()
342 if (gas_query_tx(gas, query, req, wait_time) < 0) { in gas_query_tx_comeback_req()
345 gas_query_done(gas, query, GAS_QUERY_INTERNAL_ERROR); in gas_query_tx_comeback_req()
354 struct gas_query *gas = eloop_data; in gas_query_rx_comeback_timeout() local
361 if (gas->current != query || query->retry) in gas_query_rx_comeback_timeout()
363 dialog_token = gas_query_new_dialog_token(gas, query->addr); in gas_query_rx_comeback_timeout()
375 eloop_cancel_timeout(gas_query_tx_comeback_timeout, gas, query); in gas_query_rx_comeback_timeout()
376 eloop_cancel_timeout(gas_query_timeout, gas, query); in gas_query_rx_comeback_timeout()
377 gas_query_tx_initial_req(gas, query); in gas_query_rx_comeback_timeout()
383 struct gas_query *gas = eloop_data; in gas_query_tx_comeback_timeout() local
388 gas_query_tx_comeback_req(gas, query); in gas_query_tx_comeback_timeout()
392 static void gas_query_tx_comeback_req_delay(struct gas_query *gas, in gas_query_tx_comeback_req_delay() argument
399 offchannel_send_action_done(gas->wpa_s); in gas_query_tx_comeback_req_delay()
407 eloop_cancel_timeout(gas_query_tx_comeback_timeout, gas, query); in gas_query_tx_comeback_req_delay()
409 gas, query); in gas_query_tx_comeback_req_delay()
413 static void gas_query_rx_initial(struct gas_query *gas, in gas_query_rx_initial() argument
424 gas_query_done(gas, query, GAS_QUERY_INTERNAL_ERROR); in gas_query_rx_initial()
429 eloop_cancel_timeout(gas_query_timeout, gas, query); in gas_query_rx_initial()
431 gas_query_tx_comeback_req_delay(gas, query, comeback_delay); in gas_query_rx_initial()
437 gas_query_done(gas, query, GAS_QUERY_INTERNAL_ERROR); in gas_query_rx_initial()
441 gas_query_done(gas, query, GAS_QUERY_SUCCESS); in gas_query_rx_initial()
445 static void gas_query_rx_comeback(struct gas_query *gas, in gas_query_rx_comeback() argument
456 eloop_cancel_timeout(gas_query_rx_comeback_timeout, gas, query); in gas_query_rx_comeback()
464 gas_query_done(gas, query, GAS_QUERY_PEER_ERROR); in gas_query_rx_comeback()
473 gas_query_done(gas, query, GAS_QUERY_PEER_ERROR); in gas_query_rx_comeback()
476 gas_query_tx_comeback_req_delay(gas, query, comeback_delay); in gas_query_rx_comeback()
488 gas_query_done(gas, query, GAS_QUERY_PEER_ERROR); in gas_query_rx_comeback()
494 gas_query_done(gas, query, GAS_QUERY_INTERNAL_ERROR); in gas_query_rx_comeback()
499 gas_query_tx_comeback_req(gas, query); in gas_query_rx_comeback()
503 gas_query_done(gas, query, GAS_QUERY_SUCCESS); in gas_query_rx_comeback()
519 int gas_query_rx(struct gas_query *gas, const u8 *da, const u8 *sa, in gas_query_rx() argument
530 if (gas == NULL || len < 4) in gas_query_rx()
542 pmf = pmf_in_use(gas->wpa_s, sa); in gas_query_rx()
552 query = gas_query_get_pending(gas, sa, dialog_token); in gas_query_rx()
586 gas_query_done(gas, query, GAS_QUERY_FAILURE); in gas_query_rx()
644 gas_query_rx_comeback(gas, query, adv_proto, pos, resp_len, in gas_query_rx()
647 gas_query_rx_initial(gas, query, adv_proto, pos, resp_len, in gas_query_rx()
656 struct gas_query *gas = eloop_data; in gas_query_timeout() local
662 gas_query_done(gas, query, GAS_QUERY_TIMEOUT); in gas_query_timeout()
666 static int gas_query_dialog_token_available(struct gas_query *gas, in gas_query_dialog_token_available() argument
670 dl_list_for_each(q, &gas->pending, struct gas_query_pending, list) { in gas_query_dialog_token_available()
683 struct gas_query *gas = query->gas; in gas_query_start_cb() local
684 struct wpa_supplicant *wpa_s = gas->wpa_s; in gas_query_start_cb()
688 gas->work = NULL; in gas_query_start_cb()
689 gas_query_done(gas, query, GAS_QUERY_DELETED_AT_DEINIT); in gas_query_start_cb()
708 gas->work = work; in gas_query_start_cb()
709 gas_query_tx_initial_req(gas, query); in gas_query_start_cb()
713 static void gas_query_tx_initial_req(struct gas_query *gas, in gas_query_tx_initial_req() argument
716 if (gas_query_tx(gas, query, query->req, in gas_query_tx_initial_req()
720 gas_query_done(gas, query, GAS_QUERY_INTERNAL_ERROR); in gas_query_tx_initial_req()
723 gas->current = query; in gas_query_tx_initial_req()
728 gas_query_timeout, gas, query); in gas_query_tx_initial_req()
732 static int gas_query_new_dialog_token(struct gas_query *gas, const u8 *dst) in gas_query_new_dialog_token() argument
746 if (gas_query_dialog_token_available(gas, dst, dialog_token)) in gas_query_new_dialog_token()
755 static int gas_query_set_sa(struct gas_query *gas, in gas_query_set_sa() argument
758 struct wpa_supplicant *wpa_s = gas->wpa_s; in gas_query_set_sa()
784 if (wpa_s->conf->gas_rand_mac_addr == gas->last_rand_sa_type && in gas_query_set_sa()
785 gas->last_mac_addr_rand.sec != 0 && in gas_query_set_sa()
786 !os_reltime_expired(&now, &gas->last_mac_addr_rand, in gas_query_set_sa()
790 MACSTR, MAC2STR(gas->rand_addr)); in gas_query_set_sa()
791 os_memcpy(query->sa, gas->rand_addr, ETH_ALEN); in gas_query_set_sa()
796 random_mac_addr(gas->rand_addr) < 0) { in gas_query_set_sa()
802 random_mac_addr_keep_oui(gas->rand_addr) < 0) { in gas_query_set_sa()
809 MACSTR, MAC2STR(gas->rand_addr)); in gas_query_set_sa()
810 os_memcpy(query->sa, gas->rand_addr, ETH_ALEN); in gas_query_set_sa()
811 os_get_reltime(&gas->last_mac_addr_rand); in gas_query_set_sa()
812 gas->last_rand_sa_type = wpa_s->conf->gas_rand_mac_addr; in gas_query_set_sa()
832 int gas_query_req(struct gas_query *gas, const u8 *dst, int freq, in gas_query_req() argument
846 dialog_token = gas_query_new_dialog_token(gas, dst); in gas_query_req()
854 query->gas = gas; in gas_query_req()
856 if (gas_query_set_sa(gas, query)) { in gas_query_req()
867 dl_list_add(&gas->pending, &query->list); in gas_query_req()
871 wpa_msg(gas->wpa_s, MSG_INFO, GAS_QUERY_START "addr=" MACSTR in gas_query_req()
875 if (radio_add_work(gas->wpa_s, freq, "gas-query", 0, gas_query_start_cb, in gas_query_req()
886 int gas_query_stop(struct gas_query *gas, u8 dialog_token) in gas_query_stop() argument
890 dl_list_for_each(query, &gas->pending, struct gas_query_pending, list) { in gas_query_stop()
892 if (!gas->work) { in gas_query_stop()
899 radio_remove_pending_work(gas->wpa_s, query); in gas_query_stop()
901 gas_query_done(gas, query, GAS_QUERY_STOPPED); in gas_query_stop()