static void wps_er_http_put_message_cb(void *ctx, struct http_client *c, enum http_client_event event) { struct wps_er_ap *ap = ctx; struct wpabuf *reply; char *msg = NULL; switch (event) { case HTTP_CLIENT_OK: wpa_printf(MSG_DEBUG, "WPS ER: PutMessage OK"); reply = http_client_get_body(c); if (reply == NULL) break; msg = os_zalloc(wpabuf_len(reply) + 1); if (msg == NULL) break; os_memcpy(msg, wpabuf_head(reply), wpabuf_len(reply)); break; case HTTP_CLIENT_FAILED: case HTTP_CLIENT_INVALID_REPLY: case HTTP_CLIENT_TIMEOUT: wpa_printf(MSG_DEBUG, "WPS ER: PutMessage failed"); if (ap->wps) { wps_deinit(ap->wps); ap->wps = NULL; } break; } http_client_free(ap->http); ap->http = NULL; if (msg) { struct wpabuf *buf; enum http_reply_code ret; buf = xml_get_base64_item(msg, "NewOutMessage", &ret); os_free(msg); if (buf == NULL) { wpa_printf(MSG_DEBUG, "WPS ER: Could not extract " "NewOutMessage from PutMessage response"); wps_deinit(ap->wps); ap->wps = NULL; return; } wps_er_ap_process(ap, buf); wpabuf_free(buf); } }
static void wps_er_ap_learn_m1(struct wps_er_ap *ap, struct wpabuf *m1) { struct wps_config cfg; if (ap->wps) { wpa_printf(MSG_DEBUG, "WPS ER: Protocol run already in " "progress with this AP"); return; } os_memset(&cfg, 0, sizeof(cfg)); cfg.wps = ap->er->wps; cfg.registrar = 1; ap->wps = wps_init(&cfg); if (ap->wps == NULL) return; ap->wps->ap_settings_cb = wps_er_ap_settings_cb; ap->wps->ap_settings_cb_ctx = ap; wps_er_ap_process(ap, m1); }