Ejemplo n.º 1
0
int proc_get_survey_info(struct seq_file *m, void *v)
{
	struct net_device *dev = m->private;
	struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev);
	struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
	struct __queue	*queue	= &(pmlmepriv->scanned_queue);
	struct wlan_network	*pnetwork = NULL;
	struct list_head	*plist, *phead;
	s32 notify_signal;
	s16 notify_noise = 0;
	u16  index = 0;

	critical_enter_bh(&(pmlmepriv->scanned_queue.lock));
	phead = get_list_head(queue);
	plist = phead ? get_next(phead) : NULL;
	plist = get_next(phead);
	if ((!phead) || (!plist)) {
		critical_exit_bh(&(pmlmepriv->scanned_queue.lock));
		return 0;
	}

	DBG_871X_SEL_NL(m, "%5s  %-17s  %3s  %-3s  %-4s  %-4s  %5s  %s\n","index", "bssid", "ch", "RSSI", "SdBm", "Noise", "age", "ssid");
	while (1)
	{
		if (phead == plist)
			break;

		pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);
                if (!pnetwork)
			break;

		if (check_fwstate(pmlmepriv, _FW_LINKED) == true &&
			is_same_network(&pmlmepriv->cur_network.network, &pnetwork->network, 0)) {
			notify_signal = translate_percentage_to_dbm(padapter->recvpriv.signal_strength);//dbm
		} else {
			notify_signal = translate_percentage_to_dbm(pnetwork->network.PhyInfo.SignalStrength);//dbm
		}

		#if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR)
		rtw_hal_get_odm_var(padapter, HAL_ODM_NOISE_MONITOR,&(pnetwork->network.Configuration.DSConfig), &(notify_noise));
		#endif

		DBG_871X_SEL_NL(m, "%5d  "MAC_FMT"  %3d  %3d  %4d  %4d  %5d  %s\n",
			++index,
			MAC_ARG(pnetwork->network.MacAddress),
			pnetwork->network.Configuration.DSConfig,
			(int)pnetwork->network.Rssi,
			notify_signal,
			notify_noise,
			jiffies_to_msecs(jiffies - pnetwork->last_scanned),
			//translate_percentage_to_dbm(pnetwork->network.PhyInfo.SignalStrength),
			pnetwork->network.Ssid.Ssid);
		plist = get_next(plist);
	}
	critical_exit_bh(&(pmlmepriv->scanned_queue.lock));

	return 0;
}
int proc_get_survey_info(struct seq_file *m, void *v)
{
	_irqL irqL;
	struct net_device *dev = m->private;
	_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
	struct mlme_priv	*pmlmepriv = &(padapter->mlmepriv);
	_queue	*queue	= &(pmlmepriv->scanned_queue);
	struct wlan_network	*pnetwork = NULL;
	_list	*plist, *phead;
	s32 notify_signal;
	u16  index = 0;

	_enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);	
	phead = get_list_head(queue);
	plist = get_next(phead);
	if ((!phead) || (!plist))
		return 0;

	DBG_871X_SEL_NL(m, "%5s  %-17s  %3s  %-3s  %-4s  %5s  %s\n","index", "bssid", "ch", "dBm", "SdBm", "age", "ssid");
	while(1)
	{
		if (rtw_end_of_queue_search(phead,plist)== _TRUE)
			break;

		pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);
                if (!pnetwork)
			break;
	
		if ( check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE &&
			is_same_network(&pmlmepriv->cur_network.network, &pnetwork->network, 0)) {
			notify_signal = translate_percentage_to_dbm(padapter->recvpriv.signal_strength);//dbm
		} else {
			notify_signal = translate_percentage_to_dbm(pnetwork->network.PhyInfo.SignalStrength);//dbm
		}
	
		DBG_871X_SEL_NL(m, "%5d  "MAC_FMT"  %3d  %3d  %4d  %5d  %s\n", 
			++index,
			MAC_ARG(pnetwork->network.MacAddress), 
			pnetwork->network.Configuration.DSConfig,
			(int)pnetwork->network.Rssi,
			notify_signal,
			rtw_get_passing_time_ms((u32)pnetwork->last_scanned),
			//translate_percentage_to_dbm(pnetwork->network.PhyInfo.SignalStrength),
			pnetwork->network.Ssid.Ssid);
		plist = get_next(plist);
	}
	_exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);

	return 0;
}
Ejemplo n.º 3
0
static void update_current_network(struct _adapter *adapter,
				   struct ndis_wlan_bssid_ex *pnetwork)
{
	struct mlme_priv *pmlmepriv = &adapter->mlmepriv;

	if (is_same_network(&(pmlmepriv->cur_network.network), pnetwork)) {
		update_network(&(pmlmepriv->cur_network.network),
			       pnetwork, adapter);
		r8712_update_protection(adapter,
			       (pmlmepriv->cur_network.network.IEs) +
			       sizeof(struct NDIS_802_11_FIXED_IEs),
			       pmlmepriv->cur_network.network.IELength);
	}
}
Ejemplo n.º 4
0
static void update_network(struct ndis_wlan_bssid_ex *dst,
			   struct ndis_wlan_bssid_ex *src,
			   struct _adapter *padapter)
{
	u32 last_evm = 0, tmpVal;

	if (check_fwstate(&padapter->mlmepriv, _FW_LINKED) &&
	    is_same_network(&(padapter->mlmepriv.cur_network.network), src)) {
		if (padapter->recvpriv.signal_qual_data.total_num++ >=
		    PHY_LINKQUALITY_SLID_WIN_MAX) {
			padapter->recvpriv.signal_qual_data.total_num =
				   PHY_LINKQUALITY_SLID_WIN_MAX;
			last_evm = padapter->recvpriv.signal_qual_data.
				   elements[padapter->recvpriv.
				   signal_qual_data.index];
			padapter->recvpriv.signal_qual_data.total_val -=
				 last_evm;
		}
		padapter->recvpriv.signal_qual_data.total_val += src->Rssi;

		padapter->recvpriv.signal_qual_data.
			  elements[padapter->recvpriv.signal_qual_data.
			  index++] = src->Rssi;
		if (padapter->recvpriv.signal_qual_data.index >=
		    PHY_LINKQUALITY_SLID_WIN_MAX)
			padapter->recvpriv.signal_qual_data.index = 0;
		/* <1> Showed on UI for user, in percentage. */
		tmpVal = padapter->recvpriv.signal_qual_data.total_val /
			 padapter->recvpriv.signal_qual_data.total_num;
		padapter->recvpriv.signal = (u8)tmpVal;

		src->Rssi = padapter->recvpriv.signal;
	} else
		src->Rssi = (src->Rssi + dst->Rssi) / 2;
	memcpy((u8 *)dst, (u8 *)src, r8712_get_ndis_wlan_bssid_ex_sz(src));
}
Ejemplo n.º 5
0
int main(int argc, char **argv)
{
	if (argc < 5) {
		printf("Usage: %s <tunN> <port> <secret> options...\n"
				"\n"
				"Options:\n"
				"  -m <MTU> for the maximum transmission unit\n"
				"  -a <address/prefix-length> for the private address\n"
				"  -r <address/prefix-length> for the forwarding route\n"
				"  -d <address> for the domain name server\n"
				"  -s <domain> for the search domain\n"
				"\n"
				"Note that TUN interface needs to be configured properly\n"
				"BEFORE running this program. For more information, please\n"
				"read the comments in the source code.\n\n", argv[0]);
		exit(1);
	}

	strcpy(_hi_secret, argv[3]);
	memcpy(_ll_argv, argv, argc * sizeof(argv[0]));
	_ll_argc = argc;

	// Wait for a tunnel.
	int tunnel;
	int dirty = 0;
	time_t lastup = time(NULL);

	// Get TUN interface.
	int interface = get_interface(argv[1]);

	do {
		int maxfd;
		int count;
		fd_set readfds;
		struct timeval timeout;

		dirty = 0;
		lastup = time(NULL);
		tunnel = get_tunnel(argv[2]);

		maxfd = (tunnel > interface? tunnel: interface);
		for (; ; ) {
			FD_ZERO(&readfds);
			FD_SET(tunnel, &readfds);
			FD_SET(interface, &readfds);

			timeout.tv_sec = 1;
			timeout.tv_usec = 0;
			count = select(maxfd + 1, &readfds, NULL, NULL, &timeout);

			if (count == -1) {
				fprintf(stderr, "select error %s\n", strerror(errno));
				exit(-1);
			}

			if (count > 0) {
				int length;
				int tunnel_prepare;
				int interface_prepare;

				struct sockaddr from;
				unsigned char packet[2048];
				socklen_t fromlen = sizeof(from);

				tunnel_prepare = FD_ISSET(tunnel, &readfds);
				interface_prepare = FD_ISSET(interface, &readfds);

				do {
					if (tunnel_prepare) {
						length = recvfrom(tunnel, packet, sizeof(packet), MSG_DONTWAIT, &from, &fromlen);

						tunnel_prepare = 0;
						if (length > 0) {
							tunnel_prepare = 1;
							if (length > LEN_PADDING + (int)sizeof(struct ipv4_info) && packet[LEN_PADDING]) {
								int len = length - LEN_PADDING;
								const unsigned char *adj = packet + LEN_PADDING;

								if (is_same_network(adj, len)) {
									/* route packet to other device. */
									dispatch_packet(tunnel, adj, len, &from, fromlen);
								} else {
									/* dispatch to tun device. */
									write(interface, adj, len);
								}

								lastup = time(NULL);
								dirty = 1;
							} else if (length > LEN_PADDING) {
								int len = length - LEN_PADDING;
								const unsigned char *adj = packet + LEN_PADDING;
								fprintf(stderr, "recvfrom %d %d %d\n", length, fromlen, from.sa_family);
								packet[length] = 0;
								handshake_packet(tunnel, adj, len, &from, fromlen);
								lastup = time(NULL);
								dirty = 1;
							}
						}
					}

					if (interface_prepare) {
						length = read(interface, packet, sizeof(packet));

						interface_prepare = 0;
						if (length > (int)sizeof(struct ipv4_info)) {
							interface_prepare = 1;
							dispatch_packet(tunnel, packet, length, NULL, 0);
						}
					}

				} while (tunnel_prepare || interface_prepare);

				continue;
			}

			if (dirty && lastup + 60 < time(NULL)) {
				fprintf(stderr, "idle for long time, try to recreate interface\n");
				break;
			}
		}

		close(tunnel);

	} while (true);

	close(interface);

	return 0;
}
Ejemplo n.º 6
0
/*
Caller must hold pmlmepriv->lock first.
*/
static void update_scanned_network(struct _adapter *adapter,
			    struct ndis_wlan_bssid_ex *target)
{
	struct list_head *plist, *phead;

	u32 bssid_ex_sz;
	struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
	struct  __queue *queue = &pmlmepriv->scanned_queue;
	struct wlan_network *pnetwork = NULL;
	struct wlan_network *oldest = NULL;

	phead = get_list_head(queue);
	plist = get_next(phead);

	while (1) {
		if (end_of_queue_search(phead, plist) == true)
			break;

		pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);
		if (is_same_network(&pnetwork->network, target))
			break;
		if ((oldest == ((struct wlan_network *)0)) ||
		    time_after((unsigned long)oldest->last_scanned,
				(unsigned long)pnetwork->last_scanned))
			oldest = pnetwork;

		plist = get_next(plist);
	}


	/* If we didn't find a match, then get a new network slot to initialize
	 * with this beacon's information */
	if (end_of_queue_search(phead, plist) == true) {
		if (_queue_empty(&pmlmepriv->free_bss_pool) == true) {
			/* If there are no more slots, expire the oldest */
			pnetwork = oldest;
			target->Rssi = (pnetwork->network.Rssi +
					target->Rssi) / 2;
			memcpy(&pnetwork->network, target,
				r8712_get_ndis_wlan_bssid_ex_sz(target));
			pnetwork->last_scanned = jiffies;
		} else {
			/* Otherwise just pull from the free list */
			/* update scan_time */
			pnetwork = alloc_network(pmlmepriv);
			if (pnetwork == NULL)
				return;
			bssid_ex_sz = r8712_get_ndis_wlan_bssid_ex_sz(target);
			target->Length = bssid_ex_sz;
			memcpy(&pnetwork->network, target, bssid_ex_sz);
			list_insert_tail(&pnetwork->list, &queue->queue);
		}
	} else {
		/* we have an entry and we are going to update it. But
		 * this entry may be already expired. In this case we
		 * do the same as we found a new net and call the new_net
		 * handler
		 */
		update_network(&pnetwork->network, target, adapter);
		pnetwork->last_scanned = jiffies;
	}
}
Ejemplo n.º 7
0
int r8712_select_and_join_from_scan(struct mlme_priv *pmlmepriv)
{
	struct list_head *phead;
	unsigned char *dst_ssid, *src_ssid;
	struct _adapter *adapter;
	struct  __queue *queue = NULL;
	struct wlan_network *pnetwork = NULL;
	struct wlan_network *pnetwork_max_rssi = NULL;

	adapter = (struct _adapter *)pmlmepriv->nic_hdl;
	queue = &pmlmepriv->scanned_queue;
	phead = get_list_head(queue);
	pmlmepriv->pscanned = get_next(phead);
	while (1) {
		if (end_of_queue_search(phead, pmlmepriv->pscanned) == true) {
			if ((pmlmepriv->assoc_by_rssi == true) &&
			    (pnetwork_max_rssi != NULL)) {
				pnetwork = pnetwork_max_rssi;
				goto ask_for_joinbss;
			}
			return _FAIL;
		}
		pnetwork = LIST_CONTAINOR(pmlmepriv->pscanned,
					  struct wlan_network, list);
		if (pnetwork == NULL)
			return _FAIL;
		pmlmepriv->pscanned = get_next(pmlmepriv->pscanned);
		if (pmlmepriv->assoc_by_bssid == true) {
			dst_ssid = pnetwork->network.MacAddress;
			src_ssid = pmlmepriv->assoc_bssid;
			if (!memcmp(dst_ssid, src_ssid, ETH_ALEN)) {
				if (check_fwstate(pmlmepriv, _FW_LINKED)) {
					if (is_same_network(&pmlmepriv->
					    cur_network.network,
					    &pnetwork->network)) {
						_clr_fwstate_(pmlmepriv,
							_FW_UNDER_LINKING);
						/*r8712_indicate_connect again*/
						r8712_indicate_connect(adapter);
						return 2;
					}
					r8712_disassoc_cmd(adapter);
					r8712_ind_disconnect(adapter);
					r8712_free_assoc_resources(adapter);
				}
				goto ask_for_joinbss;
			}
		} else if (pmlmepriv->assoc_ssid.SsidLength == 0)
			goto ask_for_joinbss;
		dst_ssid = pnetwork->network.Ssid.Ssid;
		src_ssid = pmlmepriv->assoc_ssid.Ssid;
		if ((pnetwork->network.Ssid.SsidLength ==
		    pmlmepriv->assoc_ssid.SsidLength) &&
		    (!memcmp(dst_ssid, src_ssid,
		     pmlmepriv->assoc_ssid.SsidLength))) {
			if (pmlmepriv->assoc_by_rssi == true) {
				/* if the ssid is the same, select the bss
				 *  which has the max rssi*/
				if (pnetwork_max_rssi) {
					if (pnetwork->network.Rssi >
					    pnetwork_max_rssi->network.Rssi)
						pnetwork_max_rssi = pnetwork;
				} else
					pnetwork_max_rssi = pnetwork;
			} else if (is_desired_network(adapter, pnetwork)) {
				if (check_fwstate(pmlmepriv, _FW_LINKED)) {
					r8712_disassoc_cmd(adapter);
					r8712_free_assoc_resources(adapter);
				}
				goto ask_for_joinbss;
			}
		}
	}
	return _FAIL;
ask_for_joinbss:
	return r8712_joinbss_cmd(adapter, pnetwork);
}