📄 cardif_linux_wext.c
字号:
if (!xsup_assert((network_data != NULL), "network_data != NULL", FALSE)) return XEBADCONFIG; if (network_data->wireless_ctrl == CTL_NO) { debug_printf(DEBUG_INT, "Config file has instructed us not to reset the" " key! Roaming may not work!!!\n"); return -1; } memset((struct iwreq *)&wrq, 0x00, sizeof(struct iwreq)); sockData = thisint->sockData; xsup_assert((sockData != NULL), "sockData != NULL", TRUE); if (sockData->sockInt <= 0) return XENOSOCK; Strncpy(wrq.ifr_name, thisint->intName, sizeof(wrq.ifr_name)); // We got some data, so see if we have encryption or not. wrq.u.encoding.flags = IW_ENCODE_DISABLED; wrq.u.encoding.length = 0; wrq.u.encoding.pointer = (caddr_t)NULL; rc = ioctl(sockData->sockInt, SIOCSIWENCODE, &wrq); if (rc < 0) { debug_printf(DEBUG_NORMAL, "Couldn't disable encryption!\n"); } else { debug_printf(DEBUG_INT, "Encryption disabled!\n"); } return rc;}/******************************************************************** * * Create the WPA2 Information Element. * ********************************************************************/int cardif_linux_wext_get_wpa2_ie(struct interface_data *thisint, char *iedata, int *ielen){ if (!xsup_assert((thisint != NULL), "thisint != NULL", FALSE)) return XEMALLOC; if (!xsup_assert((iedata != NULL), "iedata != NULL", FALSE)) return XEMALLOC; if (!xsup_assert((ielen != NULL), "ielen != NULL", FALSE)) return XEMALLOC;#if WIRELESS_EXT > 17 // Should we use capabilities here? wpa2_gen_ie(thisint, iedata, ielen); debug_printf(DEBUG_INT, "Setting WPA2 IE : "); debug_hex_printf(DEBUG_INT, (uint8_t *)iedata, *ielen); debug_printf(DEBUG_INT, "\n");#else debug_printf(DEBUG_NORMAL, "WPA2 isn't implemented in this version of the " "wireless extensions! Please upgrade to the latest version " "of wireless extensions, or specify the driver to use with the" " -D option!\n"); iedata = NULL; *ielen = 0;#endif return XENONE;}/**************************************************************************** * * Generate the WPA1 Information Element * ****************************************************************************/int cardif_linux_wext_get_wpa_ie(struct interface_data *thisint, char *iedata, int *ielen){ if (!xsup_assert((thisint != NULL), "thisint != NULL", FALSE)) return XEMALLOC; if (!xsup_assert((iedata != NULL), "iedata != NULL", FALSE)) return XEMALLOC; if (!xsup_assert((ielen != NULL), "ielen != NULL", FALSE)) return XEMALLOC;#if WIRELESS_EXT > 17 wpa_gen_ie(thisint, iedata); *ielen = 24; debug_printf(DEBUG_INT, "Setting WPA IE : "); debug_hex_printf(DEBUG_INT, (uint8_t *)iedata, *ielen); debug_printf(DEBUG_INT, "\n");#else debug_printf(DEBUG_NORMAL, "WPA isn't implemented in this version of the " "wireless extensions! Please upgrade to the latest version " "of wireless extensions, or specify the driver to use with the" " -D option!\n"); iedata = NULL; *ielen = 0;#endif return XENONE;}/************************************************************** * * Set encryption to open on the wireless card. * **************************************************************/int cardif_linux_wext_enc_open(struct interface_data *thisint){ int rc = 0; struct iwreq wrq; struct config_network *network_data; struct lin_sock_data *sockData; if (!xsup_assert((thisint != NULL), "thisint != NULL", FALSE)) return XEMALLOC; network_data = config_get_network_config(); if (!xsup_assert((network_data != NULL), "network_data != NULL", FALSE)) return XEMALLOC; if (network_data->wireless_ctrl == CTL_NO) { debug_printf(DEBUG_INT, "Config file has instructed us not to reset the " "key! Roaming may not work!!!\n"); return -1; } memset((struct iwreq *)&wrq, 0x00, sizeof(struct iwreq)); sockData = thisint->sockData; xsup_assert((sockData != NULL), "sockData != NULL", TRUE); if (sockData->sockInt <= 0) return XENOSOCK; Strncpy(wrq.ifr_name, thisint->intName, sizeof(wrq.ifr_name)); // We got some data, so see if we have encryption or not. wrq.u.encoding.flags = IW_ENCODE_OPEN; wrq.u.encoding.length = 0; wrq.u.encoding.pointer = (caddr_t)NULL; rc = ioctl(sockData->sockInt, SIOCSIWENCODE, &wrq); if (rc < 0) { debug_printf(DEBUG_NORMAL, "Couldn't disable encryption!\n"); } else { debug_printf(DEBUG_INT, "Encryption set to Open!\n"); } return rc;}/****************************************** * * Set a WEP key. Also, based on the index, we may change the transmit * key. * ******************************************/int cardif_linux_wext_set_WEP_key(struct interface_data *thisint, uint8_t *key, int keylen, int index){ int rc = 0; int settx = 0; struct iwreq wrq; struct config_network *network_data; struct lin_sock_data *sockData; char seq[6] = {0x00,0x00,0x00,0x00,0x00,0x00}; char addr[6] = {0xff,0xff,0xff,0xff,0xff,0xff}; if (!xsup_assert((thisint != NULL), "thisint != NULL", FALSE)) return XEMALLOC; if (index & 0x80) settx = 1;#if WIRELESS_EXT > 17 rc = cardif_linux_wext_set_key_ext(thisint, IW_ENCODE_ALG_WEP, addr, (index & 0x7f), settx, seq, 6, key, keylen); if (rc == XENONE) return rc;#endif debug_printf(DEBUG_INT, "Couldn't use extended key calls to set keys. \n"); debug_printf(DEBUG_INT, "Trying old method.\n"); network_data = config_get_network_config(); if (!xsup_assert((network_data != NULL), "network_data != NULL", FALSE)) return XEMALLOC; memset(&wrq, 0x00, sizeof(wrq)); if (!TEST_FLAG(thisint->flags, IS_WIRELESS)) { if ((cardif_int_is_wireless(thisint->intName) != TRUE) || (network_data->type == WIRED) || (network_data->wireless_ctrl == CTL_NO)) { debug_printf(DEBUG_NORMAL, "Interface isn't wireless, but an attempt" " to set a key was made!\n"); return XENOWIRELESS; } else { thisint->flags |= IS_WIRELESS; } } sockData = thisint->sockData; xsup_assert((sockData != NULL), "sockData != NULL", TRUE); if (sockData->sockInt <= 0) return XENOSOCK; Strncpy(wrq.ifr_name, thisint->intName, sizeof(wrq.ifr_name)); wrq.u.data.flags = ((index & 0x7f)+1); if (TEST_FLAG(thisint->flags, DONT_USE_TEMP)) wrq.u.data.flags |= IW_ENCODE_OPEN; else wrq.u.data.flags |= IW_ENCODE_OPEN | IW_ENCODE_TEMP; wrq.u.data.length = keylen; wrq.u.data.pointer = (caddr_t)key; if ((rc = ioctl(sockData->sockInt, SIOCSIWENCODE, &wrq)) < 0) { debug_printf(DEBUG_NORMAL, "Failed to set WEP key [%d], error %d : %s\n", (index & 0x7f) + 1, errno, strerror(errno)); rc = XENOKEYSUPPORT; } else { debug_printf(DEBUG_INT, "Successfully set WEP key [%d]\n", (index & 0x7f)+1); if (index & 0x80) { // This is a unicast key, use it for transmissions. Strncpy(wrq.ifr_name, thisint->intName, sizeof(wrq.ifr_name)); wrq.u.data.flags = (((index & 0x7f) + 1) & IW_ENCODE_INDEX) | IW_ENCODE_NOKEY; if (TEST_FLAG(thisint->flags, DONT_USE_TEMP)) wrq.u.data.flags |= IW_ENCODE_OPEN; else wrq.u.data.flags |= IW_ENCODE_OPEN | IW_ENCODE_TEMP; wrq.u.data.length = 0; wrq.u.data.pointer = (caddr_t)NULL; if (ioctl(sockData->sockInt, SIOCSIWENCODE, &wrq) < 0) { debug_printf(DEBUG_NORMAL, "Failed to set the WEP transmit key ID [%d]\n", (index & 0x7f)+1); rc = XENOKEYSUPPORT; } else { debug_printf(DEBUG_INT, "Successfully set the WEP transmit key [%d]\n", (index & 0x7f)+1); } } } return rc;}/********************************************************** * * Set the SSID of the wireless card. * **********************************************************/int cardif_linux_wext_set_ssid(struct interface_data *thisint, char *ssid_name){ struct iwreq iwr; struct lin_sock_data *sockData; char newssid[100]; if (!xsup_assert((thisint != NULL), "thisint != NULL", FALSE)) return XEGENERROR; if (!xsup_assert((ssid_name != NULL), "ssid_name != NULL", FALSE)) return XEGENERROR; memset(&iwr, 0x00, sizeof(iwr)); sockData = thisint->sockData; xsup_assert((sockData != NULL), "sockData != NULL", TRUE); if (sockData->sockInt <= 0) return XENOSOCK; if (!TEST_FLAG(thisint->flags, IS_WIRELESS)) { // We want to verify that the interface is in fact, not wireless, and // not that we are in a situation where the interface has just been // down. if (!TEST_FLAG(thisint->flags, WAS_DOWN)) return XENOWIRELESS; if (cardif_int_is_wireless(thisint->intName) == TRUE) { SET_FLAG(thisint->flags, IS_WIRELESS); } else { UNSET_FLAG(thisint->flags, IS_WIRELESS); } if (!TEST_FLAG(thisint->flags, IS_WIRELESS)) { UNSET_FLAG(thisint->flags, WAS_DOWN); } } // Specify the interface name we are asking about. Strncpy(iwr.ifr_name, thisint->intName, sizeof(iwr.ifr_name)); memset(newssid, 0x00, 100); strcpy(newssid, ssid_name); iwr.u.essid.pointer = (caddr_t) newssid; iwr.u.essid.length = strlen(newssid); // Starting in WE 21, we don't NULL terminate SSIDs we set. if (cardif_linux_rtnetlink_get_we_ver(thisint) < 21) iwr.u.essid.length++; iwr.u.essid.flags = 1; if (ioctl(sockData->sockInt, SIOCSIWESSID, &iwr) < 0) return XENOWIRELESS; // Allow us to correlate SSID set events. SET_FLAG(thisint->flags, SSID_SET); debug_printf(DEBUG_INT, "Requested SSID be set to '%s'\n", newssid); UNSET_FLAG(thisint->flags, WAS_DOWN); return XENONE;}/****************************************** * * Set the Broadcast SSID (MAC address) of the AP we are connected to. * ******************************************/int cardif_linux_wext_set_bssid(struct interface_data *intdata, uint8_t *bssid){ struct iwreq wrq; struct lin_sock_data *sockData; if (!xsup_assert((intdata != NULL), "intdata != NULL", FALSE)) return XEGENERROR; if (!xsup_assert((bssid != NULL), "bssid != NULL", FALSE)) return XEGENERROR; debug_printf(DEBUG_INT, "Setting BSSID : "); debug_hex_printf(DEBUG_INT, bssid, 6); sockData = intdata->sockData; xsup_assert((sockData != NULL), "sockData != NULL", TRUE); memset(&wrq, 0x00, sizeof(wrq)); Strncpy((char *)&wrq.ifr_name, intdata->intName, sizeof(wrq.ifr_name)); memcpy(&wrq.u.ap_addr.sa_data, bssid, 6); wrq.u.ap_addr.sa_family = ARPHRD_ETHER; if (ioctl(sockData->sockInt, SIOCSIWAP, &wrq) < 0) { // If we couldn't set the BSSID, it isn't the end of the world. The // driver just may not need it. debug_printf(DEBUG_NORMAL, "Error setting BSSID! We may not associate/" "authenticate correctly!\n"); return XESOCKOP; } return XENONE;}/****************************************** * * Get the Broadcast SSID (MAC address) of the Access Point we are connected * to. If this is not a wireless card, or the information is not available, * we should return an error. * ******************************************/int cardif_linux_wext_get_bssid(struct interface_data *thisint, char *bssid_dest){ struct iwreq iwr; struct lin_sock_data *sockData; if (!xsup_assert((thisint != NULL), "thisint != NULL", FALSE)) return XEMALLOC; if (!xsup_assert((bssid_dest != NULL), "bssid_dest != NULL", FALSE)) return XEMALLOC; // If we are a wired interface, don't bother. if (!TEST_FLAG(thisint->flags, IS_WIRELESS)) return XENONE; sockData = thisint->sockData; xsup_assert((sockData != NULL), "sockData != NULL", TRUE);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -