static int wps_pb_find_next() { char *value, *next; int next_id; int max_id = wps_hal_led_wl_max(); char tmp[100]; char ifname[IFNAMSIZ]; char *wlnames; int target_id = -1; int target_instance = 0; int i, imax; imax = wps_get_ess_num(); refind: for (i = 0; i < imax; i++) { sprintf(tmp, "ess%d_led_id", i); value = wps_get_conf(tmp); if (value == NULL) continue; next_id = atoi(value); if ((next_id > pb_last_led_id) && (next_id <= max_id)) { if ((target_id == -1) || (next_id < target_id)) { /* Save the candidate */ target_id = next_id; target_instance = i; } } } /* A candidate found ? */ if (target_id == -1) { pb_last_led_id = -1; goto refind; } pb_last_led_id = target_id; /* Take the first wl interface */ sprintf(tmp, "ess%d_wlnames", target_instance); wlnames = wps_safe_get_conf(tmp); foreach(ifname, wlnames, next) { wps_strncpy(pb_ifname, ifname, sizeof(pb_ifname)); break; }
/* * Name : wpsenr_wksp_mainloop * Description : Main loop point for the WPS stack * Arguments : wpsenr_param_t *param - argument set * Return type : int */ static wpssta_wksp_t * wpssta_init(char *ifname) { wpssta_wksp_t *sta_wksp = NULL; int pbc = WPS_UI_PBC_SW; char start_ok = false; wps_ap_list_info_t *wpsaplist; char scan = false; char *val, *next; char op[6] = {0}; int oob = 0; int i, imax; int wps_action; char *env_ssid = NULL; char *env_sec = NULL; char *env_bssid = NULL; char *env_pin = NULL; #ifdef __CONFIG_WFI__ char *ui_env_pin = NULL; #endif /* __CONFIG_WFI__ */ char tmp[100]; char *wlnames, name[256]; TUTRACE((TUTRACE_INFO, "*********************************************\n")); TUTRACE((TUTRACE_INFO, "WPS - Enrollee App Broacom Corp.\n")); TUTRACE((TUTRACE_INFO, "Version: %s\n", MOD_VERSION_STR)); TUTRACE((TUTRACE_INFO, "*********************************************\n")); /* we need to specify the if name before anything else */ if (!ifname) { TUTRACE((TUTRACE_INFO, "no ifname exist!! return\n")); return 0; } /* WSC 2.0, support WPS V2 or not */ if (strcmp(wps_safe_get_conf("wps_version2"), "enabled") == 0) b_wps_version2 = true; wps_set_ifname(ifname); wps_osl_set_ifname(ifname); /* reset assoc_state in INIT state */ assoc_state = WPS_ASSOC_STATE_INIT; /* reset enroll_again */ enroll_again = false; /* Check whether scan needed */ val = wps_ui_get_env("wps_enr_scan"); if (val) scan = atoi(val); /* if scan requested : display and exit */ if (scan) { /* do scan and wait the scan results */ do_wps_scan(); while (get_wps_scan_results() == NULL) WpsSleep(1); /* use scan result to create ap list */ wpsaplist = create_aplist(); if (wpsaplist) { wpssta_display_aplist(wpsaplist); wps_get_aplist(wpsaplist, wpsaplist); TUTRACE((TUTRACE_INFO, "WPS Enabled AP list :\n")); wpssta_display_aplist(wpsaplist); } goto exit; } /* init workspace */ if ((sta_wksp = (wpssta_wksp_t *)alloc_init(sizeof(wpssta_wksp_t))) == NULL) { TUTRACE((TUTRACE_INFO, "Can not allocate memory for wps workspace...\n")); return NULL; } memset(sta_wksp, 0, sizeof(wpssta_wksp_t)); wps_action = atoi(wps_ui_get_env("wps_action")); /* Setup STA action */ if (wps_action == WPS_UI_ACT_STA_CONFIGAP || wps_action == WPS_UI_ACT_STA_GETAPCONFIG) { sta_wksp->mode = WPSM_STA_BUILTINREG; if (wps_action == WPS_UI_ACT_STA_CONFIGAP) sta_wksp->configap = true; } else sta_wksp->mode = WPSM_STA_ENROLL; val = wps_ui_get_env("wps_pbc_method"); if (val) pbc = atoi(val); /* Save maximum instance number, and probe if any wl interface */ imax = wps_get_ess_num(); for (i = 0; i < imax; i++) { sprintf(tmp, "ess%d_wlnames", i); wlnames = wps_safe_get_conf(tmp); foreach(name, wlnames, next) { if (!strcmp(name, ifname)) { sta_wksp->ess_id = i; goto found; } } } goto exit; found: /* Retrieve ENV */ if (pbc == WPS_UI_PBC_HW) { strcat(op, "pb"); } else { /* SW PBC */ if (atoi(wps_ui_get_env("wps_method")) == WPS_UI_METHOD_PBC) { strcat(op, "pb"); } else { /* PIN */ strcat(op, "pin"); env_pin = wps_get_conf("wps_device_pin"); env_sec = wps_ui_get_env("wps_enr_wsec"); if (env_sec[0] != 0) { wsec = atoi(env_sec); } env_ssid = wps_ui_get_env("wps_enr_ssid"); if (env_ssid[0] == 0) { TUTRACE((TUTRACE_ERR, "\n\nPlease specify ssid or use pbc method\n\n")); goto exit; } wps_strncpy(ssid, env_ssid, sizeof(ssid)); env_bssid = wps_ui_get_env("wps_enr_bssid"); if (env_bssid[0] == 0) { /* * WARNING : this "bssid" is used only to create an 802.1X socket. * * Normally, it should be the bssid of the AP we will associate to. * * Setting this manually means that we might be proceeding to * eapol exchange with a different AP than the one we are associated to, * which might work ... or not. * * When implementing an application, one might want to enforce association * with the AP with that particular BSSID. In case of multiple AP * on the ESS, this might not be stable with roaming enabled. */ ether_atoe(env_bssid, bssid); } #ifdef __CONFIG_WFI__ /* For WiFi-Invite session PIN */ ui_env_pin = wps_ui_get_env("wps_device_pin"); if (ui_env_pin[0] != '\0') env_pin = ui_env_pin; #endif /* __CONFIG_WFI__ */ if (sta_wksp->mode == WPSM_STA_BUILTINREG) { env_pin = wps_ui_get_env("wps_stareg_ap_pin"); if (wps_validate_pin(env_pin) == FALSE) { TUTRACE((TUTRACE_INFO, "Not a valid PIN [%s]\n", env_pin ? (char *)env_pin : "")); goto exit; } sprintf(tmp, "ess%d_wps_oob", sta_wksp->ess_id); val = wps_ui_get_env(tmp); if (strcmp(val, "enabled") == 0) oob = 1; } /* If we want to get AP config and the AP is unconfigured, * configure the AP directly */ if (sta_wksp->mode == WPSM_STA_BUILTINREG && sta_wksp->configap == false) { val = wps_ui_get_env("wps_scstate"); if (strcmp(val, "unconfigured") == 0) { sta_wksp->configap = true; TUTRACE((TUTRACE_INFO, "AP-%s is unconfigure, " "using our security settings to configre it.\n")); } } } } TUTRACE((TUTRACE_INFO, "pbc = %s, wpsenr param: ifname = %s, mode= %s, op = %s, sec = %s, " "ssid = %s, bssid = %s, pin = %s, oob = %s\n", (pbc == 1? "HW_PBC": "SW_PBC"), ifname, (sta_wksp->mode == WPSM_STA_BUILTINREG) ? "STA_REG" : "STA_ENR", op, (env_sec? (char *)env_sec : "NULL"), (env_ssid? (char *)env_ssid : "NULL"), (env_bssid? (char *)env_bssid : "NULL"), (env_pin? (char *)env_pin : "NULL"), (oob == 1? "Enabled": "Disabled"))); /* * setup device configuration for WPS * needs to be done before eventual scan for PBC. */ if (sta_wksp->mode == WPSM_STA_BUILTINREG) { if (wpssta_reg_config_init(sta_wksp, ifname, bssid, oob) != WPS_SUCCESS) { TUTRACE((TUTRACE_ERR, "wpssta_reg_config_init failed, exit.\n")); goto exit; } } else { if (wpssta_enr_config_init() != WPS_SUCCESS) { TUTRACE((TUTRACE_ERR, "wpssta_enr_config_init failed, exit.\n")); goto exit; } } /* if ssid specified, use it */ if (!strcmp(op, "pin")) { pin = env_pin; if (!pin) { pin = def_pin; TUTRACE((TUTRACE_ERR, "\n\nStation Pin not specified, use default Pin %s\n\n", def_pin)); } start_ok = true; /* WSC 2.0, Test Plan 5.1.1 step 8 must add wps ie to probe request */ if (b_wps_version2) add_wps_ie(NULL, 0, 0, b_wps_version2); } else { pin = NULL; wpsenr_osl_proc_states(WPS_FIND_PBC_AP); /* add wps ie to probe */ add_wps_ie(NULL, 0, TRUE, b_wps_version2); do_wps_scan(); assoc_state_time = get_current_time(); assoc_state = WPS_ASSOC_STATE_SCANNING; start_ok = false; } /* start WPS two minutes period at Finding a PBC AP or Associating with AP */ start_time = get_current_time(); if (start_ok) { /* clear current security setting */ wpsenr_osl_clear_wsec(); /* * join. If user_bssid is specified, it might not * match the actual associated AP. * An implementation might want to make sure * it associates to the same bssid. * There might be problems with roaming. */ wpssta_do_join(false); return sta_wksp; } else if (assoc_state == WPS_ASSOC_STATE_SCANNING) { return sta_wksp; } exit: wpssta_deinit(sta_wksp); return NULL; }