⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cardif_linux_wext.c

📁 Linux上的802.1x 的supplicant的实现。很多supplicant程序都是基于它开发的
💻 C
📖 第 1 页 / 共 4 页
字号:
  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 + -