diff --git a/hostapd/main.c b/hostapd/main.c index a9d7da5..2457f95 100644 --- a/hostapd/main.c +++ b/hostapd/main.c @@ -412,7 +412,7 @@ static int hostapd_global_run(struct hapd_interfaces *ifaces, int daemonize, static void show_version(void) { fprintf(stderr, - "hostapd v" VERSION_STR "\n" + "hostapd v" VERSION_STR " for Realtek rtl871xdrv\n" "User space daemon for IEEE 802.11 AP management,\n" "IEEE 802.1X/WPA/WPA2/EAP/RADIUS Authenticator\n" "Copyright (c) 2002-2014, Jouni Malinen " diff --git a/src/ap/beacon.c b/src/ap/beacon.c index 2a4acf2..20d7451 100644 --- a/src/ap/beacon.c +++ b/src/ap/beacon.c @@ -810,6 +810,11 @@ int ieee802_11_build_ap_params(struct hostapd_data *hapd, #ifdef CONFIG_IEEE80211N tailpos = hostapd_eid_ht_capabilities(hapd, tailpos); tailpos = hostapd_eid_ht_operation(hapd, tailpos); + + //DRIVER_RTW ADD + if(hapd->iconf->ieee80211n) + hapd->conf->wmm_enabled = 1; + #endif /* CONFIG_IEEE80211N */ tailpos = hostapd_eid_ext_capab(hapd, tailpos); diff --git a/src/ap/hw_features.c b/src/ap/hw_features.c index 4e66d1b..620f246 100644 --- a/src/ap/hw_features.c +++ b/src/ap/hw_features.c @@ -712,7 +712,10 @@ static int ieee80211n_check_40mhz(struct hostapd_iface *iface) iface->num_ht40_scan_tries = 1; eloop_cancel_timeout(ap_ht40_scan_retry, iface, NULL); eloop_register_timeout(1, 0, ap_ht40_scan_retry, iface, NULL); - return 1; + + //DRIVER_RTW Modify + //return -1; + return 0;//ignore this error } if (ret < 0) { diff --git a/src/drivers/driver_bsd.c b/src/drivers/driver_bsd.c index ca64d5c..05606f0 100644 --- a/src/drivers/driver_bsd.c +++ b/src/drivers/driver_bsd.c @@ -47,6 +47,12 @@ #include "l2_packet/l2_packet.h" +#ifdef HOSTAPD +#ifdef CONFIG_SUPPORT_RTW_DRIVER +#define RTW_BSD_HOSTAPD_SET_BEACON (1100) +#endif +#endif + struct bsd_driver_data { struct hostapd_data *hapd; /* back pointer */ @@ -792,6 +798,296 @@ handle_read(void *ctx, const u8 *src_addr, const u8 *buf, size_t len) drv_event_eapol_rx(drv->hapd, src_addr, buf, len); } +#ifdef CONFIG_SUPPORT_RTW_DRIVER +static int rtw_set_beacon_ops(void *priv, const u8 *head, size_t head_len, + const u8 *tail, size_t tail_len, int dtim_period, + int beacon_int) +{ + int ret=0; + u8 *pbuf; + size_t sz; + struct bsd_driver_data *drv = priv; + + if((head_len<24) ||(!head)) + return -1; + + sz = head_len+tail_len - 24; // 24 = wlan hdr + + printf("%s, beacon_sz=%d\n", __func__, sz); + + pbuf = os_zalloc(sz); + if (pbuf == NULL) { + return -ENOMEM; + } + + os_memcpy(pbuf, (head+24), (head_len-24));// 24=beacon header len. + + os_memcpy(&pbuf[head_len-24], tail, tail_len); + + ret = set80211var(drv, RTW_BSD_HOSTAPD_SET_BEACON, pbuf, sz); + + os_free(pbuf); + + return ret; + +} + +static struct hostapd_hw_modes *rtw_get_hw_feature_data_ops( + void *priv, u16 *num_modes, u16 *flags) +{ + +#define MAX_NUM_CHANNEL (14) +#define MAX_NUM_CHANNEL_5G (24) + + struct hostapd_hw_modes *modes; + size_t i; + int k; + + printf("%s\n", __func__); + + *num_modes = 3; + *flags = 0; + + modes = os_zalloc(*num_modes * sizeof(struct hostapd_hw_modes)); + if (modes == NULL) + return NULL; + + //.1 + modes[0].mode = HOSTAPD_MODE_IEEE80211G; + modes[0].num_channels = MAX_NUM_CHANNEL; + modes[0].num_rates = 12; + modes[0].channels = + os_zalloc(MAX_NUM_CHANNEL * sizeof(struct hostapd_channel_data)); + modes[0].rates = os_zalloc(modes[0].num_rates * sizeof(int)); + if (modes[0].channels == NULL || modes[0].rates == NULL) + goto fail; + for (i = 0; i < MAX_NUM_CHANNEL; i++) { + modes[0].channels[i].chan = i + 1; + modes[0].channels[i].freq = 2412 + 5 * i; + modes[0].channels[i].flag = 0; + if (i >= 13) + modes[0].channels[i].flag = HOSTAPD_CHAN_DISABLED; + } + modes[0].rates[0] = 10; + modes[0].rates[1] = 20; + modes[0].rates[2] = 55; + modes[0].rates[3] = 110; + modes[0].rates[4] = 60; + modes[0].rates[5] = 90; + modes[0].rates[6] = 120; + modes[0].rates[7] = 180; + modes[0].rates[8] = 240; + modes[0].rates[9] = 360; + modes[0].rates[10] = 480; + modes[0].rates[11] = 540; + + + //.2 + modes[1].mode = HOSTAPD_MODE_IEEE80211B; + modes[1].num_channels = MAX_NUM_CHANNEL; + modes[1].num_rates = 4; + modes[1].channels = + os_zalloc(MAX_NUM_CHANNEL * sizeof(struct hostapd_channel_data)); + modes[1].rates = os_zalloc(modes[1].num_rates * sizeof(int)); + if (modes[1].channels == NULL || modes[1].rates == NULL) + goto fail; + for (i = 0; i < MAX_NUM_CHANNEL; i++) { + modes[1].channels[i].chan = i + 1; + modes[1].channels[i].freq = 2412 + 5 * i; + modes[1].channels[i].flag = 0; + if (i >= 11) + modes[1].channels[i].flag = HOSTAPD_CHAN_DISABLED; + } + modes[1].rates[0] = 10; + modes[1].rates[1] = 20; + modes[1].rates[2] = 55; + modes[1].rates[3] = 110; + + + //.3 + modes[2].mode = HOSTAPD_MODE_IEEE80211A; +#ifdef CONFIG_DRIVER_RTL_DFS + modes[2].num_channels = MAX_NUM_CHANNEL_5G; +#else /* CONFIG_DRIVER_RTL_DFS */ + modes[2].num_channels = 9; +#endif /* CONFIG_DRIVER_RTL_DFS */ + + modes[2].num_rates = 8; + modes[2].channels = os_zalloc(modes[2].num_channels * sizeof(struct hostapd_channel_data)); + modes[2].rates = os_zalloc(modes[2].num_rates * sizeof(int)); + if (modes[2].channels == NULL || modes[2].rates == NULL) + goto fail; + + + k = 0; + // 5G band1 Channel: 36, 40, 44, 48 + for (i=0; i < 4; i++) { + modes[2].channels[k].chan = 36+(i*4); + modes[2].channels[k].freq = 5180+(i*20); + modes[2].channels[k].flag = 0; + k++; + } + +#ifdef CONFIG_DRIVER_RTL_DFS + // 5G band2 Channel: 52, 56, 60, 64 + for (i=0; i < 4; i++) { + modes[2].channels[k].chan = 52+(i*4); + modes[2].channels[k].freq = 5260+(i*20); + modes[2].channels[k].flag = 0; + k++; + } + + // 5G band3 Channel: 100, 104, 108. 112, 116, 120, 124, 128, 132, 136, 140 + for (i=0; i < 11; i++) { + modes[2].channels[k].chan = 100+(i*4); + modes[2].channels[k].freq = 5500+(i*20); + modes[2].channels[k].flag = 0; + k++; + } +#endif /* CONFIG_DRIVER_RTL_DFS */ + + // 5G band4 Channel: 149, 153, 157, 161, 165 + for (i=0; i < 5; i++) { + modes[2].channels[k].chan = 149+(i*4); + modes[2].channels[k].freq = 5745+(i*20); + modes[2].channels[k].flag = 0; + k++; + } + + modes[2].rates[0] = 60; + modes[2].rates[1] = 90; + modes[2].rates[2] = 120; + modes[2].rates[3] = 180; + modes[2].rates[4] = 240; + modes[2].rates[5] = 360; + modes[2].rates[6] = 480; + modes[2].rates[7] = 540; + + + // +#if 0 +#define HT_CAP_INFO_LDPC_CODING_CAP ((u16) BIT(0)) +#define HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET ((u16) BIT(1)) +#define HT_CAP_INFO_SMPS_MASK ((u16) (BIT(2) | BIT(3))) +#define HT_CAP_INFO_SMPS_STATIC ((u16) 0) +#define HT_CAP_INFO_SMPS_DYNAMIC ((u16) BIT(2)) +#define HT_CAP_INFO_SMPS_DISABLED ((u16) (BIT(2) | BIT(3))) +#define HT_CAP_INFO_GREEN_FIELD ((u16) BIT(4)) +#define HT_CAP_INFO_SHORT_GI20MHZ ((u16) BIT(5)) +#define HT_CAP_INFO_SHORT_GI40MHZ ((u16) BIT(6)) +#define HT_CAP_INFO_TX_STBC ((u16) BIT(7)) +#define HT_CAP_INFO_RX_STBC_MASK ((u16) (BIT(8) | BIT(9))) +#define HT_CAP_INFO_RX_STBC_1 ((u16) BIT(8)) +#define HT_CAP_INFO_RX_STBC_12 ((u16) BIT(9)) +#define HT_CAP_INFO_RX_STBC_123 ((u16) (BIT(8) | BIT(9))) +#define HT_CAP_INFO_DELAYED_BA ((u16) BIT(10)) +#define HT_CAP_INFO_MAX_AMSDU_SIZE ((u16) BIT(11)) +#define HT_CAP_INFO_DSSS_CCK40MHZ ((u16) BIT(12)) +#define HT_CAP_INFO_PSMP_SUPP ((u16) BIT(13)) +#define HT_CAP_INFO_40MHZ_INTOLERANT ((u16) BIT(14)) +#define HT_CAP_INFO_LSIG_TXOP_PROTECT_SUPPORT ((u16) BIT(15)) +#endif + + //HOSTAPD_MODE_IEEE80211G + modes[0].ht_capab = HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET|HT_CAP_INFO_SHORT_GI20MHZ| + HT_CAP_INFO_SHORT_GI40MHZ|HT_CAP_INFO_MAX_AMSDU_SIZE|HT_CAP_INFO_DSSS_CCK40MHZ; + + modes[0].mcs_set[0]= 0xff; + modes[0].mcs_set[1]= 0xff; + + //HOSTAPD_MODE_IEEE80211B + modes[1].ht_capab = 0; + + //HOSTAPD_MODE_IEEE80211A + modes[2].ht_capab = modes[0].ht_capab; + + modes[2].mcs_set[0]= 0xff; + modes[2].mcs_set[1]= 0xff; + + return modes; + +fail: + if (modes) { + for (i = 0; i < *num_modes; i++) { + os_free(modes[i].channels); + os_free(modes[i].rates); + } + os_free(modes); + } + + return NULL; + +} + +#if 0 +#define IEEE80211_FC0_TYPE_MASK 0x0c +#define IEEE80211_FC0_TYPE_SHIFT 2 +#define IEEE80211_FC0_TYPE_MGT 0x00 +#define IEEE80211_FC0_TYPE_CTL 0x04 +#define IEEE80211_FC0_TYPE_DATA 0x08 +#define IEEE80211_FC0_SUBTYPE_MASK 0xf0 +#define IEEE80211_FC0_SUBTYPE_SHIFT 4 +#define IEEE80211_FC0_SUBTYPE_ASSOC_REQ 0x00 +#define IEEE80211_FC0_SUBTYPE_ASSOC_RESP 0x10 +#define IEEE80211_FC0_SUBTYPE_REASSOC_REQ 0x20 +#define IEEE80211_FC0_SUBTYPE_REASSOC_RESP 0x30 +#define IEEE80211_FC0_SUBTYPE_PROBE_REQ 0x40 +#define IEEE80211_FC0_SUBTYPE_PROBE_RESP 0x50 +#define IEEE80211_FC0_SUBTYPE_BEACON 0x80 +#define IEEE80211_FC0_SUBTYPE_ATIM 0x90 +#define IEEE80211_FC0_SUBTYPE_DISASSOC 0xa0 +#define IEEE80211_FC0_SUBTYPE_AUTH 0xb0 +#define IEEE80211_FC0_SUBTYPE_DEAUTH 0xc0 +#define IEEE80211_FC0_SUBTYPE_ACTION 0xd0 +#define IEEE80211_FC0_SUBTYPE_ACTION_NOACK 0xe0 + +#define IEEE80211_APPIE_WPA (IEEE80211_FC0_TYPE_MGT | IEEE80211_FC0_SUBTYPE_BEACON | \ + IEEE80211_FC0_SUBTYPE_PROBE_RESP) + +#endif + +#define RTW_IEEE80211_APPIE_BEACON (IEEE80211_FC0_TYPE_MGT|IEEE80211_FC0_SUBTYPE_BEACON) +#define RTW_IEEE80211_APPIE_PROBE_RESP (IEEE80211_FC0_TYPE_MGT|IEEE80211_FC0_SUBTYPE_PROBE_RESP) +#define RTW_IEEE80211_APPIE_ASSOC_RESP (IEEE80211_FC0_TYPE_MGT|IEEE80211_FC0_SUBTYPE_ASSOC_RESP) + + +static int rtw_set_wps_assoc_resp_ie(void *priv, const void *ie, size_t len) +{ + return bsd_set80211(priv, IEEE80211_IOC_APPIE, RTW_IEEE80211_APPIE_ASSOC_RESP, + ie, len); +} + +static int rtw_set_wps_beacon_ie(void *priv, const void *ie, size_t len) +{ + return bsd_set80211(priv, IEEE80211_IOC_APPIE, RTW_IEEE80211_APPIE_BEACON, + ie, len); +} + +static int rtw_set_wps_probe_resp_ie(void *priv, const void *ie, size_t len) +{ + return bsd_set80211(priv, IEEE80211_IOC_APPIE, RTW_IEEE80211_APPIE_PROBE_RESP, + ie, len); +} + +static int rtw_set_ap_wps_ie_ops(void *priv, const struct wpabuf *beacon, + const struct wpabuf *proberesp, const struct wpabuf *assocresp) +{ + if (rtw_set_wps_assoc_resp_ie(priv, assocresp ? wpabuf_head(assocresp) : NULL, + assocresp ? wpabuf_len(assocresp) : 0)) + return -1; + + if (rtw_set_wps_beacon_ie(priv, beacon ? wpabuf_head(beacon) : NULL, + beacon ? wpabuf_len(beacon) : 0)) + return -1; + + return rtw_set_wps_probe_resp_ie(priv, + proberesp ? wpabuf_head(proberesp) : NULL, + proberesp ? wpabuf_len(proberesp): 0); + +} +#endif + + static void * bsd_init(struct hostapd_data *hapd, struct wpa_init_params *params) { @@ -844,6 +1140,12 @@ bsd_init(struct hostapd_data *hapd, struct wpa_init_params *params) goto bad; } +#ifdef CONFIG_SUPPORT_RTW_DRIVER + /* mark up after init */ + if (bsd_ctrl_iface(drv, 1) < 0) + goto bad; +#endif + return drv; bad: if (drv->sock_xmit != NULL) @@ -1282,6 +1584,15 @@ wpa_driver_bsd_event_receive(int sock, void *ctx, void *sock_ctx) event.interface_status.ifname); wpa_supplicant_event(ctx, EVENT_INTERFACE_STATUS, &event); } + else{ + os_strlcpy(event.interface_status.ifname, drv->ifname, + sizeof(event.interface_status.ifname)); + event.interface_status.ievent = EVENT_INTERFACE_ADDED; + wpa_printf(MSG_DEBUG, "RTM_IFINFO: Interface '%s' UP", + event.interface_status.ifname); + wpa_supplicant_event(ctx, EVENT_INTERFACE_STATUS, &event); + } + break; } } @@ -1594,7 +1905,52 @@ wpa_driver_bsd_get_capa(void *priv, struct wpa_driver_capa *capa) } #endif /* HOSTAPD */ - +#ifdef CONFIG_SUPPORT_RTW_DRIVER +const struct wpa_driver_ops wpa_driver_bsd_ops = { + .name = "bsd", + .desc = "BSD 802.11 support", +#ifdef HOSTAPD + .hapd_init = bsd_init, + .hapd_deinit = bsd_deinit, + .set_privacy = bsd_set_privacy,//del ? + .get_seqnum = bsd_get_seqnum,//del ? + .flush = bsd_flush, + .read_sta_data = bsd_read_sta_driver_data,//del ? + .sta_disassoc = bsd_sta_disassoc, + .sta_deauth = bsd_sta_deauth, + .get_hw_feature_data = rtw_get_hw_feature_data_ops,//add + //.sta_remove = rtl871x_sta_remove_ops,//add + .set_beacon = rtw_set_beacon_ops, //add + .set_ap_wps_ie = rtw_set_ap_wps_ie_ops,//add +#else /* HOSTAPD */ + .init = wpa_driver_bsd_init, + .deinit = wpa_driver_bsd_deinit, + .get_bssid = wpa_driver_bsd_get_bssid, + .get_ssid = wpa_driver_bsd_get_ssid, + .set_countermeasures = wpa_driver_bsd_set_countermeasures, + .scan2 = wpa_driver_bsd_scan, + .get_scan_results2 = wpa_driver_bsd_get_scan_results2, + .deauthenticate = wpa_driver_bsd_deauthenticate, + .disassociate = wpa_driver_bsd_disassociate, + .associate = wpa_driver_bsd_associate, + .get_capa = wpa_driver_bsd_get_capa, + .set_freq = bsd_set_freq, //only for wpa_supplicant + .set_ieee8021x = bsd_set_ieee8021x,//only for wpa_supplicant + .hapd_set_ssid = bsd_set_ssid,//only for wpa_supplicant + .hapd_get_ssid = bsd_get_ssid,//only for wpa_supplicant + .sta_set_flags = bsd_set_sta_authorized, //only for wpa_supplicant + .set_generic_elem = bsd_set_opt_ie, //only for wpa_supplicant +#endif /* HOSTAPD */ + //.set_freq = bsd_set_freq, //only for wpa_supplicant + .set_key = bsd_set_key, + //.set_ieee8021x = bsd_set_ieee8021x, //only for wpa_supplicant + //.hapd_set_ssid = bsd_set_ssid, //only for wpa_supplicant + //.hapd_get_ssid = bsd_get_ssid, //only for wpa_supplicant + .hapd_send_eapol = bsd_send_eapol, //only for wpa_supplicant + //.sta_set_flags = bsd_set_sta_authorized, //only for wpa_supplicant + //.set_generic_elem = bsd_set_opt_ie, //only for wpa_supplicant +}; +#else const struct wpa_driver_ops wpa_driver_bsd_ops = { .name = "bsd", .desc = "BSD 802.11 support", @@ -1629,3 +1985,4 @@ const struct wpa_driver_ops wpa_driver_bsd_ops = { .hapd_send_eapol = bsd_send_eapol, .set_generic_elem = bsd_set_opt_ie, }; +#endif diff --git a/src/drivers/driver_wext.c b/src/drivers/driver_wext.c index e5734bd..80f073d 100644 --- a/src/drivers/driver_wext.c +++ b/src/drivers/driver_wext.c @@ -990,6 +990,38 @@ void wpa_driver_wext_scan_timeout(void *eloop_ctx, void *timeout_ctx) wpa_supplicant_event(timeout_ctx, EVENT_SCAN_RESULTS, NULL); } +//added for wps2.0 @20110519 +static int wpa_driver_wext_set_probe_req_ie(struct wpa_driver_wext_data *drv, const u8 *extra_ies, + size_t extra_ies_len) +{ + unsigned char *pbuf; + struct iwreq iwr; + int ret = 0; + + pbuf = os_malloc(extra_ies_len); + os_memset(pbuf, 0, extra_ies_len); + + os_memset(&iwr, 0, sizeof(iwr)); + os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ); + + os_memcpy(pbuf, extra_ies, extra_ies_len); + + iwr.u.data.pointer = (caddr_t)pbuf; + iwr.u.data.length = extra_ies_len; + iwr.u.data.flags = 0x8766;//magic number + + if (ioctl(drv->ioctl_sock, SIOCSIWPRIV, &iwr) < 0) { + perror("ioctl[SIOCSIWMLME]"); + ret = -1; + } + + if(pbuf) + os_free(pbuf); + + return ret; + +} + /** * wpa_driver_wext_scan - Request the driver to initiate scan @@ -1012,6 +1044,10 @@ int wpa_driver_wext_scan(void *priv, struct wpa_driver_scan_params *params) return -1; } + //added for wps2.0 @20110519 + wpa_driver_wext_set_probe_req_ie(drv, params->extra_ies, + params->extra_ies_len); + os_memset(&iwr, 0, sizeof(iwr)); os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ); @@ -2315,6 +2351,28 @@ static const char * wext_get_radio_name(void *priv) return drv->phyname; } +// Aries 20120120, append rssi information at the end of "status" command +int wext_signal_poll(void *priv, struct wpa_signal_info *signal_info) +{ + struct wpa_driver_wext_data *drv = priv; + struct iwreq iwr; + struct iw_statistics stat; + int ret = 0; + + os_memset(&iwr, 0, sizeof(iwr)); + os_memset(&stat, 0, sizeof(stat)); + os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ); + iwr.u.data.pointer = (caddr_t) &stat; + iwr.u.data.length = sizeof(struct iw_statistics); + iwr.u.data.flags = 1; + if (ioctl(drv->ioctl_sock, SIOCGIWSTATS, &iwr) < 0) { + perror("ioctl[SIOCGIWSTATS] fail\n"); + ret = -1; + } + signal_info->current_signal = stat.qual.level; + signal_info->current_noise = stat.qual.noise; + return ret; +} const struct wpa_driver_ops wpa_driver_wext_ops = { .name = "wext", diff --git a/src/drivers/drivers.c b/src/drivers/drivers.c index d0e42ec..d413c00 100644 --- a/src/drivers/drivers.c +++ b/src/drivers/drivers.c @@ -51,6 +51,9 @@ extern struct wpa_driver_ops wpa_driver_atheros_ops; /* driver_atheros.c */ #ifdef CONFIG_DRIVER_NONE extern struct wpa_driver_ops wpa_driver_none_ops; /* driver_none.c */ #endif /* CONFIG_DRIVER_NONE */ +#ifdef CONFIG_DRIVER_RTW +extern struct wpa_driver_ops wpa_driver_rtw_ops; /* driver_rtw.c */ +#endif /* CONFIG_DRIVER_RTW */ struct wpa_driver_ops *wpa_drivers[] = @@ -94,5 +97,8 @@ struct wpa_driver_ops *wpa_drivers[] = #ifdef CONFIG_DRIVER_NONE &wpa_driver_none_ops, #endif /* CONFIG_DRIVER_NONE */ +#ifdef CONFIG_DRIVER_RTW + &wpa_driver_rtw_ops, +#endif /* CONFIG_DRIVER_RTW */ NULL }; diff --git a/src/drivers/drivers.mak b/src/drivers/drivers.mak index 7e175f4..b5881db 100644 --- a/src/drivers/drivers.mak +++ b/src/drivers/drivers.mak @@ -58,6 +58,10 @@ DRV_CFLAGS += -DCONFIG_DRIVER_BSD DRV_OBJS += ../src/drivers/driver_bsd.o CONFIG_L2_FREEBSD=y CONFIG_DNET_PCAP=y +ifdef CONFIG_SUPPORT_RTW_DRIVER +DRV_CFLAGS += -DCONFIG_SUPPORT_RTW_DRIVER -DCONFIG_DRIVER_RTL_DFS +NEED_AP_MLME=y +endif endif ifdef CONFIG_DRIVER_OPENBSD @@ -74,6 +78,17 @@ DRV_OBJS += ../src/drivers/driver_test.o NEED_AP_MLME=y endif +ifdef CONFIG_DRIVER_RTW +#CFLAGS += -DCONFIG_DRIVER_RTL +#OBJS += driver_rtl.o +DRV_AP_CFLAGS += -DCONFIG_DRIVER_RTW -DCONFIG_DRIVER_RTL_DFS +DRV_AP_OBJS += ../src/drivers/driver_rtw.o +CONFIG_L2_PACKET=linux +NEED_NETLINK=y +NEED_LINUX_IOCTL=y +NEED_AP_MLME=y +endif + ifdef CONFIG_DRIVER_NONE DRV_CFLAGS += -DCONFIG_DRIVER_NONE DRV_OBJS += ../src/drivers/driver_none.o diff --git a/src/eap_peer/eap_wsc.c b/src/eap_peer/eap_wsc.c index 23e9823..173e71d 100644 --- a/src/eap_peer/eap_wsc.c +++ b/src/eap_peer/eap_wsc.c @@ -566,8 +566,13 @@ send_msg: r = eap_wsc_build_msg(data, ret, id); if (data->state == FAIL && ret->methodState == METHOD_DONE) { /* Use reduced client timeout for WPS to avoid long wait */ +#if 0 /* Aries add, 2012/06/12, extend timeout for AP IOT */ + if (sm->ClientTimeout > 4) + sm->ClientTimeout = 4; +#else if (sm->ClientTimeout > 2) sm->ClientTimeout = 2; +#endif } return r; } diff --git a/src/wps/wps.c b/src/wps/wps.c index 648cfd1..0a74d0c 100644 --- a/src/wps/wps.c +++ b/src/wps/wps.c @@ -320,11 +320,15 @@ int wps_is_addr_authorized(const struct wpabuf *msg, const u8 *addr, if (wps_parse_msg(msg, &attr) < 0) return 0; + return is_selected_pin_registrar(&attr); +// Marked by Albert 2011/11/17 +// Some APs won't carry the AuthorizedMACs in the probe response. +// So, skip this check will speed up the process to find the current AP out for WPS handshake. +/* if (!attr.version2 && ver1_compat) { /* * Version 1.0 AP - AuthorizedMACs not used, so revert back to * old mechanism of using SelectedRegistrar. - */ return is_selected_pin_registrar(&attr); } @@ -341,6 +345,7 @@ int wps_is_addr_authorized(const struct wpabuf *msg, const u8 *addr, } return 0; +*/ } diff --git a/src/wps/wps_registrar.c b/src/wps/wps_registrar.c index b917e6b..4738fd5 100644 --- a/src/wps/wps_registrar.c +++ b/src/wps/wps_registrar.c @@ -589,9 +589,10 @@ static int wps_build_probe_config_methods(struct wps_registrar *reg, * These are the methods that the AP supports as an Enrollee for adding * external Registrars. */ - methods = reg->wps->config_methods & ~WPS_CONFIG_PUSHBUTTON; - methods &= ~(WPS_CONFIG_VIRT_PUSHBUTTON | - WPS_CONFIG_PHY_PUSHBUTTON); + methods = reg->wps->config_methods; + //methods = reg->wps->config_methods & ~WPS_CONFIG_PUSHBUTTON; + //methods &= ~(WPS_CONFIG_VIRT_PUSHBUTTON | + // WPS_CONFIG_PHY_PUSHBUTTON); wpa_printf(MSG_DEBUG, "WPS: * Config Methods (%x)", methods); wpabuf_put_be16(msg, ATTR_CONFIG_METHODS); wpabuf_put_be16(msg, 2);