void wifi_close_supplicant_connection(const char *ifname) { char supp_status[PROPERTY_VALUE_MAX] = {'\0'}; int count = 50; /* wait at most 5 seconds to ensure init has stopped stupplicant */ if (is_primary_interface(ifname)) { wifi_close_sockets(PRIMARY); } else { /* p2p socket termination needs unblocking the monitor socket * STA connection does not need it since supplicant gets shutdown */ TEMP_FAILURE_RETRY(write(exit_sockets[SECONDARY][0], "T", 1)); wifi_close_sockets(SECONDARY); //closing p2p connection does not need a wait on //supplicant stop return; } while (count-- > 0) { if (property_get(supplicant_prop_name, supp_status, NULL)) { if (strcmp(supp_status, "stopped") == 0) return; } usleep(100000); } }
void wifi_close_supplicant_connection(const char *ifname) { char supp_status[PROPERTY_VALUE_MAX] = {'\0'}; int count = 50; /* wait at most 5 seconds to ensure init has stopped stupplicant */ ALOGD("%s: Closing supplicant connecting on %s", __func__, ifname); if (is_primary_interface(ifname)) { wifi_close_sockets(PRIMARY); } else { /* p2p socket termination needs unblocking the monitor socket * STA connection does not need it since supplicant gets shutdown */ TEMP_FAILURE_RETRY(write(exit_sockets[SECONDARY][0], "T", 1)); /* p2p sockets are closed after the monitor thread * receives the terminate on the exit socket */ ALOGI("close %s connection, directly return", ifname); return; } while (count-- > 0) { if (property_get(supplicant_prop_name, supp_status, NULL)) { if (strcmp(supp_status, "stopped") == 0) return; } ALOGE("wait for %s to be stopped time:%d", supplicant_prop_name, 50-count); usleep(100000); } }
int wifi_ctrl_recv(int index, char *reply, size_t *reply_len) { int res; int ctrlfd = wpa_ctrl_get_fd(monitor_conn[index]); struct pollfd rfds[2]; memset(rfds, 0, 2 * sizeof(struct pollfd)); rfds[0].fd = ctrlfd; rfds[0].events |= POLLIN; rfds[1].fd = exit_sockets[index][1]; rfds[1].events |= POLLIN; res = TEMP_FAILURE_RETRY(poll(rfds, 2, -1)); if (res < 0) { ALOGE("Error poll = %d", res); return res; } if (rfds[0].revents & POLLIN) { return wpa_ctrl_recv(monitor_conn[index], reply, reply_len); } else if (rfds[1].revents & POLLIN) { /* Close only the p2p sockets on receive side * see wifi_close_supplicant_connection() */ if (index == SECONDARY) { ALOGD("close sockets %d", index); wifi_close_sockets(index); } } return -2; }
int wifi_stop_supplicant(int p2p_supported) { char supp_status[PROPERTY_VALUE_MAX] = {'\0'}; int count = 50; /* wait at most 5 seconds for completion */ if (p2p_supported) { strcpy(supplicant_name, P2P_SUPPLICANT_NAME); strcpy(supplicant_prop_name, P2P_PROP_NAME); } else { strcpy(supplicant_name, SUPPLICANT_NAME); strcpy(supplicant_prop_name, SUPP_PROP_NAME); } wifi_close_sockets(); /* Check whether supplicant already stopped */ if (property_get(supplicant_prop_name, supp_status, NULL) && strcmp(supp_status, "stopped") == 0) { return 0; } property_set("ctl.stop", supplicant_name); sched_yield(); while (count-- > 0) { if (property_get(supplicant_prop_name, supp_status, NULL)) { if (strcmp(supp_status, "stopped") == 0) return 0; } usleep(100000); } ALOGE("Failed to stop supplicant"); return -1; }
void wifi_close_supplicant_connection() { char supp_status[PROPERTY_VALUE_MAX] = {'\0'}; int count = 50; /* wait at most 5 seconds to ensure init has stopped stupplicant */ wifi_close_sockets(); while (count-- > 0) { if (property_get(supplicant_prop_name, supp_status, NULL)) { if (strcmp(supp_status, "stopped") == 0) return; } usleep(100000); } }