1214501Srpaulo/* 2214501Srpaulo * Wi-Fi Protected Setup - UPnP AP functionality 3214501Srpaulo * Copyright (c) 2009, Jouni Malinen <j@w1.fi> 4214501Srpaulo * 5252726Srpaulo * This software may be distributed under the terms of the BSD license. 6252726Srpaulo * See README for more details. 7214501Srpaulo */ 8214501Srpaulo 9214501Srpaulo#include "includes.h" 10214501Srpaulo 11214501Srpaulo#include "common.h" 12214501Srpaulo#include "eloop.h" 13214501Srpaulo#include "uuid.h" 14214501Srpaulo#include "wps_i.h" 15214501Srpaulo#include "wps_upnp.h" 16214501Srpaulo#include "wps_upnp_i.h" 17214501Srpaulo 18214501Srpaulo 19214501Srpaulostatic void upnp_er_set_selected_timeout(void *eloop_ctx, void *timeout_ctx) 20214501Srpaulo{ 21214501Srpaulo struct subscription *s = eloop_ctx; 22252726Srpaulo struct wps_registrar *reg = timeout_ctx; 23214501Srpaulo wpa_printf(MSG_DEBUG, "WPS: SetSelectedRegistrar from ER timed out"); 24214501Srpaulo s->selected_registrar = 0; 25252726Srpaulo wps_registrar_selected_registrar_changed(reg); 26214501Srpaulo} 27214501Srpaulo 28214501Srpaulo 29214501Srpauloint upnp_er_set_selected_registrar(struct wps_registrar *reg, 30214501Srpaulo struct subscription *s, 31214501Srpaulo const struct wpabuf *msg) 32214501Srpaulo{ 33214501Srpaulo struct wps_parse_attr attr; 34214501Srpaulo 35214501Srpaulo wpa_hexdump_buf(MSG_MSGDUMP, "WPS: SetSelectedRegistrar attributes", 36214501Srpaulo msg); 37252726Srpaulo if (wps_validate_upnp_set_selected_registrar(msg) < 0) 38252726Srpaulo return -1; 39214501Srpaulo 40214501Srpaulo if (wps_parse_msg(msg, &attr) < 0) 41214501Srpaulo return -1; 42214501Srpaulo 43214501Srpaulo s->reg = reg; 44252726Srpaulo eloop_cancel_timeout(upnp_er_set_selected_timeout, s, reg); 45214501Srpaulo 46252726Srpaulo os_memset(s->authorized_macs, 0, sizeof(s->authorized_macs)); 47214501Srpaulo if (attr.selected_registrar == NULL || *attr.selected_registrar == 0) { 48214501Srpaulo wpa_printf(MSG_DEBUG, "WPS: SetSelectedRegistrar: Disable " 49214501Srpaulo "Selected Registrar"); 50214501Srpaulo s->selected_registrar = 0; 51214501Srpaulo } else { 52214501Srpaulo s->selected_registrar = 1; 53214501Srpaulo s->dev_password_id = attr.dev_password_id ? 54214501Srpaulo WPA_GET_BE16(attr.dev_password_id) : DEV_PW_DEFAULT; 55214501Srpaulo s->config_methods = attr.sel_reg_config_methods ? 56214501Srpaulo WPA_GET_BE16(attr.sel_reg_config_methods) : -1; 57252726Srpaulo if (attr.authorized_macs) { 58252726Srpaulo int count = attr.authorized_macs_len / ETH_ALEN; 59252726Srpaulo if (count > WPS_MAX_AUTHORIZED_MACS) 60252726Srpaulo count = WPS_MAX_AUTHORIZED_MACS; 61252726Srpaulo os_memcpy(s->authorized_macs, attr.authorized_macs, 62252726Srpaulo count * ETH_ALEN); 63252726Srpaulo } else if (!attr.version2) { 64252726Srpaulo#ifdef CONFIG_WPS2 65252726Srpaulo wpa_printf(MSG_DEBUG, "WPS: Add broadcast " 66252726Srpaulo "AuthorizedMACs for WPS 1.0 ER"); 67252726Srpaulo os_memset(s->authorized_macs, 0xff, ETH_ALEN); 68252726Srpaulo#endif /* CONFIG_WPS2 */ 69252726Srpaulo } 70214501Srpaulo eloop_register_timeout(WPS_PBC_WALK_TIME, 0, 71252726Srpaulo upnp_er_set_selected_timeout, s, reg); 72214501Srpaulo } 73214501Srpaulo 74214501Srpaulo wps_registrar_selected_registrar_changed(reg); 75214501Srpaulo 76214501Srpaulo return 0; 77214501Srpaulo} 78214501Srpaulo 79214501Srpaulo 80252726Srpaulovoid upnp_er_remove_notification(struct wps_registrar *reg, 81252726Srpaulo struct subscription *s) 82214501Srpaulo{ 83214501Srpaulo s->selected_registrar = 0; 84252726Srpaulo eloop_cancel_timeout(upnp_er_set_selected_timeout, s, reg); 85252726Srpaulo if (reg) 86252726Srpaulo wps_registrar_selected_registrar_changed(reg); 87214501Srpaulo} 88