int wps_er_set_config(struct wps_er *er, const u8 *uuid, const struct wps_credential *cred) { struct wps_er_ap *ap; if (er == NULL) return -1; ap = wps_er_ap_get(er, NULL, uuid); if (ap == NULL) { wpa_printf(MSG_DEBUG, "WPS ER: AP not found for set config " "request"); return -1; } os_free(ap->ap_settings); ap->ap_settings = os_malloc(sizeof(*cred)); if (ap->ap_settings == NULL) return -1; os_memcpy(ap->ap_settings, cred, sizeof(*cred)); ap->ap_settings->cred_attr = NULL; wpa_printf(MSG_DEBUG, "WPS ER: Updated local AP settings based set " "config request"); return 0; }
int wps_er_learn(struct wps_er *er, const u8 *uuid, const u8 *pin, size_t pin_len) { struct wps_er_ap *ap; if (er == NULL) return -1; ap = wps_er_ap_get(er, NULL, uuid); if (ap == NULL) { wpa_printf(MSG_DEBUG, "WPS ER: AP not found for learn " "request"); return -1; } if (ap->wps) { wpa_printf(MSG_DEBUG, "WPS ER: Pending operation ongoing " "with the AP - cannot start learn"); return -1; } if (wps_er_send_get_device_info(ap, wps_er_ap_learn_m1) < 0) return -1; er->skip_set_sel_reg = 1; wps_registrar_add_pin(er->wps->registrar, NULL, uuid, pin, pin_len, 0); er->skip_set_sel_reg = 0; return 0; }
int wps_er_pbc(struct wps_er *er, const u8 *uuid, const u8 *addr) { int res; struct wps_er_ap *ap; if (er == NULL || er->wps == NULL) return -1; if (wps_registrar_pbc_overlap(er->wps->registrar, NULL, NULL)) { wpa_printf(MSG_DEBUG, "WPS ER: PBC overlap - do not start PBC " "mode"); return -2; } if (uuid) ap = wps_er_ap_get(er, NULL, uuid, NULL); else ap = NULL; if (ap == NULL) { struct wps_er_sta *sta = NULL; dl_list_for_each(ap, &er->ap, struct wps_er_ap, list) { sta = wps_er_sta_get(ap, addr, uuid); if (sta) { uuid = ap->uuid; break; } } if (sta == NULL) return -3; /* Unknown UUID */ } if (ap->ap_settings == NULL) { wpa_printf(MSG_DEBUG, "WPS ER: AP settings not known"); return -4; } er->set_sel_reg_uuid_filter = uuid; res = wps_registrar_button_pushed(er->wps->registrar, NULL); er->set_sel_reg_uuid_filter = NULL; if (res) return -1; return 0; }
struct wpabuf * wps_er_nfc_config_token(struct wps_er *er, const u8 *uuid, const u8 *addr) { struct wps_er_ap *ap; if (er == NULL) return NULL; ap = wps_er_ap_get(er, NULL, uuid, addr); if (ap == NULL) return NULL; if (ap->ap_settings == NULL) { wpa_printf(MSG_DEBUG, "WPS ER: No settings known for the " "selected AP"); return NULL; } return wps_er_config_token_from_cred(er->wps, ap->ap_settings); }
int wps_er_ap_cache_settings(struct wps_er *er, struct in_addr *addr) { struct wps_er_ap *ap; struct wps_er_ap_settings *settings; ap = wps_er_ap_get(er, addr, NULL); if (ap == NULL || ap->ap_settings == NULL) return -1; settings = wps_er_ap_get_settings(er, ap->uuid); if (!settings) { settings = os_zalloc(sizeof(*settings)); if (settings == NULL) return -1; os_memcpy(settings->uuid, ap->uuid, WPS_UUID_LEN); dl_list_add(&er->ap_settings, &settings->list); } os_memcpy(&settings->ap_settings, ap->ap_settings, sizeof(struct wps_credential)); return 0; }
int wps_er_config(struct wps_er *er, const u8 *uuid, const u8 *addr, const u8 *pin, size_t pin_len, const struct wps_credential *cred) { struct wps_er_ap *ap; if (er == NULL) return -1; ap = wps_er_ap_get(er, NULL, uuid, addr); if (ap == NULL) { wpa_printf(MSG_DEBUG, "WPS ER: AP not found for config " "request"); return -1; } if (uuid == NULL) uuid = ap->uuid; if (ap->wps) { wpa_printf(MSG_DEBUG, "WPS ER: Pending operation ongoing " "with the AP - cannot start config"); return -1; } os_free(ap->ap_settings); ap->ap_settings = os_malloc(sizeof(*cred)); if (ap->ap_settings == NULL) return -1; os_memcpy(ap->ap_settings, cred, sizeof(*cred)); ap->ap_settings->cred_attr = NULL; if (wps_er_send_get_device_info(ap, wps_er_ap_config_m1) < 0) return -1; er->skip_set_sel_reg = 1; wps_registrar_add_pin(er->wps->registrar, NULL, uuid, pin, pin_len, 0); er->skip_set_sel_reg = 0; return 0; }
void wps_er_ap_add(struct wps_er *er, const u8 *uuid, struct in_addr *addr, const char *location, int max_age) { struct wps_er_ap *ap; ap = wps_er_ap_get(er, addr, uuid); if (ap) { /* Update advertisement timeout */ eloop_cancel_timeout(wps_er_ap_timeout, er, ap); eloop_register_timeout(max_age, 0, wps_er_ap_timeout, er, ap); return; } ap = os_zalloc(sizeof(*ap)); if (ap == NULL) return; dl_list_init(&ap->sta); ap->er = er; ap->id = ++er->next_ap_id; ap->location = os_strdup(location); if (ap->location == NULL) { os_free(ap); return; } dl_list_add(&er->ap, &ap->list); ap->addr.s_addr = addr->s_addr; os_memcpy(ap->uuid, uuid, WPS_UUID_LEN); eloop_register_timeout(max_age, 0, wps_er_ap_timeout, er, ap); wpa_printf(MSG_DEBUG, "WPS ER: Added AP entry for %s (%s)", inet_ntoa(ap->addr), ap->location); /* Fetch device description */ ap->http = http_client_url(ap->location, NULL, 10000, wps_er_http_dev_desc_cb, ap); }