652 lines
20 KiB
Diff
652 lines
20 KiB
Diff
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 <j@w1.fi> "
|
|
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);
|