ramips: add mt7615_dbdc driver 80211k 80211v 80211r 80211w and wps support

* 增加mt7615_dbdc闭源驱动对80211k 80211v 80211r 80211w的支持

* 增加对mtkiappd的支持
This commit is contained in:
nanchuci 2022-06-23 13:26:03 +08:00 committed by GitHub
parent 1512bd83a2
commit 1c4829d56a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 5265 additions and 8 deletions

View File

@ -5,8 +5,9 @@
# Copyright (c) 2013, Hoowa <hoowa.sun@gmail.com>
# Copyright (c) 2015-2017, GuoGuo <gch981213@gmail.com>
# Copyright (c) 2020, jjm2473 <jjm2473@gmail.com>
# Copyright (c) 2022, nanchuci <nanchuci023@gmail.com>
#
# netifd config script for MT7615 DBDC mode.
# netifd config script for MT7615/MT7915 DBDC mode.
#
# 嘿,对着屏幕的哥们,为了表示对原作者辛苦工作的尊重,任何引用跟借用都不允许你抹去所有作者的信息,请保留这段话。
#
@ -68,7 +69,10 @@ drv_mt_dbdc_init_device_config() {
drv_mt_dbdc_init_iface_config() {
config_add_boolean disabled
config_add_string mode bssid ssid encryption
config_add_boolean hidden isolate doth ieee80211k
config_add_boolean hidden isolate doth ieee80211v
config_add_boolean hidden isolate doth ieee80211r
config_add_boolean hidden isolate doth ieee80211w
config_add_string key key1 key2 key3 key4
config_add_string wps
config_add_string pin
@ -97,7 +101,7 @@ mt_dbdc_ap_vif_pre_config() {
local name="$1"
json_select config
json_get_vars disabled encryption key key1 key2 key3 key4 ssid mode wps pin isolate doth hidden disassoc_low_ack rssiassoc ieee80211r macfilter
json_get_vars disabled encryption key key1 key2 key3 key4 ssid mode wps pin isolate doth hidden disassoc_low_ack rssiassoc ieee80211k ieee80211v ieee80211r ieee80211w macfilter
json_get_values maclist maclist
json_select ..
[ "$disabled" == "1" ] && return
@ -192,7 +196,7 @@ mt_dbdc_ap_vif_pre_config() {
mt_cmd echo "Interface $ifname now up."
mt_cmd iwpriv $ifname set NoForwarding=${isolate:-0}
mt_cmd iwpriv $ifname set IEEE80211H=${doth:-0}
if [ "$wps" == "pbc" ] && [ "$encryption" != "none" ]; then
if [ "$wps" == "pbc" ] || [ "$wps" == "pin" ] && [ "$encryption" != "none" ]; then
echo "Enable WPS for ${ifname}."
mt_cmd iwpriv $ifname set WscConfMode=4
mt_cmd iwpriv $ifname set WscConfStatus=2
@ -203,7 +207,10 @@ mt_dbdc_ap_vif_pre_config() {
fi
[ -n "$disassoc_low_ack" ] && [ "$disassoc_low_ack" != "0" ] && mt_cmd iwpriv $ifname set KickStaRssiLow=$disassoc_low_ack
[ -n "$rssiassoc" ] && [ "$rssiassoc" != "0" ] && mt_cmd iwpriv $ifname set AssocReqRssiThres=$rssiassoc
[ -n "$ieee80211k" ] && [ "$ieee80211k" != "0" ] && mt_cmd iwpriv $ifname set rrmenable=1
[ -n "$ieee80211v" ] && [ "$ieee80211v" != "0" ] && mt_cmd iwpriv $ifname set wnmenable=1
[ -n "$ieee80211r" ] && [ "$ieee80211r" != "0" ] && mt_cmd iwpriv $ifname set ftenable=1
[ -n "$ieee80211w" ] && [ "$ieee80211w" != "0" ] && mt_cmd iwpriv $ifname set pmfenable=1
}
mt_dbdc_wds_vif_pre_config() {
@ -272,7 +279,7 @@ mt_dbdc_ap_vif_post_config() {
local name="$1"
json_select config
json_get_vars disabled encryption key key1 key2 key3 key4 ssid mode wps pin isolate doth hidden disassoc_low_ack rssiassoc ieee80211r
json_get_vars disabled encryption key key1 key2 key3 key4 ssid mode wps pin isolate doth hidden disassoc_low_ack rssiassoc ieee80211k ieee80211v ieee80211r ieee80211w
json_select ..
[ "$disabled" == "1" ] && return
@ -532,6 +539,10 @@ MacAddress=${macaddr}
CountryRegion=${countryregion:-5}
CountryRegionABand=${countryregion_a:-7}
CountryCode=${country:-CN}
RRMEnable=${RRMEnable:-0};${RRMEnable:-0};${RRMEnable:-0};${RRMEnable:-0}
WNMEnable=${WNMEnable:-0};${WNMEnable:-0};${WNMEnable:-0};${WNMEnable:-0}
FTEnable=${FTEnable:-0};${FTEnable:-0};${FTEnable:-0};${FTEnable:-0}
PMFenable=${PMFenable:-0};${PMFenable:-0};${PMFenable:-0};${PMFenable:-0}
WirelessMode=${WirelessMode}
G_BAND_256QAM=1
FixedTxMode=
@ -547,8 +558,8 @@ BFBACKOFFenable=0
CalCacheApply=0
DisableOLBC=0
BGProtection=0
TxAntenna=
RxAntenna=
TxAntenna=${TxAntenna:-2};${TxAntenna:-2};${TxAntenna:-4};${TxAntenna:-4}
RxAntenna=${RxAntenna:-2};${RxAntenna:-2};${RxAntenna:-4};${RxAntenna:-4}
TxPreamble=1
RTSThreshold=${rts:-2347}
FragThreshold=${frag:-2346}
@ -677,8 +688,8 @@ VHT_STBC=${tx_stbc:-1}
VHT_BW_SIGNAL=0
VHT_DisallowNonVHT=${VHT_DisallowNonVHT:-0}
VHT_LDPC=${ldpc:-1}
#HT_TxStream=2
#HT_RxStream=2
HT_TxStream=2;2;2;2
HT_RxStream=2;2;2;2
HT_PROTECT=0
HT_DisallowTKIP=${HT_DisallowTKIP:-0}
HT_BSSCoexistence=${HT_CE:-1}

View File

@ -0,0 +1,56 @@
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
include $(TOPDIR)/rules.mk
PKG_NAME:=mtkiappd
PKG_VERSION:=1
PKG_RELEASE:=1
PKG_CONFIG_DEPENDS := \
CONFIG_MTK_CHIP_MT7615E_DBDC \
CONFIG_PACKAGE_mtkiappd_DUAL_BAND
include $(INCLUDE_DIR)/package.mk
define Package/mtkiappd
SECTION:=net
CATEGORY:=Network
TITLE:=MTK 802.11f supporting daemon
DEPENDS:=@TARGET_ramips
SUBMENU:=Wireless
endef
define Package/mtkiappd/description
Mtkiappd is an optional user space component for MT76xx SoftAP driver.
endef
define Package/mtkiappd/config
config PACKAGE_mtkiappd_DUAL_BAND
bool "dual band"
depends on MTK_CHIP_MT7615E
default y if TARGET_ramips_mt7621_DEVICE_phicomm_k2p
default y if TARGET_ramips_mt7621_DEVICE_raisecom_msg1500-x-00
default n
endef
ifeq ($(CONFIG_PACKAGE_mtkiappd_DUAL_BAND),y)
WIRELESS_IOCTL_PARAM:=-wi ra0 -wi rax0
else
WIRELESS_IOCTL_PARAM:=-wi ra0
endif
define Package/mtkiappd/install
$(INSTALL_DIR) $(1)/usr/sbin
$(INSTALL_DIR) $(1)/etc/init.d
$(INSTALL_DIR) $(1)/usr/share/mtkiappd
$(INSTALL_BIN) $(PKG_BUILD_DIR)/mtkiappd $(1)/usr/sbin/
$(INSTALL_BIN) ./files/mtkiappd.sh $(1)/etc/init.d/mtkiappd
sed -i 's/WIRELESS_IOCTL_PARAM/$(WIRELESS_IOCTL_PARAM)/' $(1)/etc/init.d/mtkiappd
$(INSTALL_DATA) ./files/firewall.include $(1)/usr/share/mtkiappd/
endef
$(eval $(call BuildPackage,mtkiappd))

View File

@ -0,0 +1,49 @@
mtkiappd - user space daemon supported 802.11f protocol
for RTxxxx a/b/g/n SoftAP driver, Ralink Technology, Corp.
=================================================================
This is the README file for the 802.11f/802.11r/802.11k daemon - mtkiappd,
which comes with RTxxxx SoftAP driver.
I. Introduction
=================================================================
mtkiappd is an optional user space component for RTxxxx SoftAP driver.
II. 802.11f features in mtkiappd
=================================================================
IEEE Std 802.11F-2003 is a standard for inter-access point protocol(IAPP).
It can handle issues on multi-verder access point interoperability.
There are three major topics which 802.11f supported,
1. ADD-notify
2. MOVE-notify
3. CACHE-notify
mtkiappd only supports ADD-notify in current phase due to lack of support from radius server
There are three major topics which 802.11r supported,
1. Key Distribution Protocol
There are three major topics which 802.11k supported,
1. Neighbor Report
Some ethernet card needs special configuration to support multicasting.
Make sure your ethernet card support multicasting
III. How to start mtkiappd
=================================================================
Note: the broadcast/netmask address of all AP must be the same.
1. If you want to debug mtkiappd, add CFLAGS with DBG.
2. If you want to extend wifi control interface,
modify "MAX_WIFI_COUNT" in rtmpiapp.h. (default setting is 2)
3. First we need to compile the source code using 'make' command
4. Load RTxxxx SoftAP driver - ex: rt2860ap.ko
5. Manually start mtkiappd, type $mtkiappd
6. For wifi multi-interface, type $mtkiappd -wi ra0 -wi rai0
IV. Reference
IEEE Std 802.11F-2003, IEEE802.11r, IEEE802.11k

View File

@ -0,0 +1,2 @@
-A INPUT -i br-lan -p tcp --dport 3517 -j ACCEPT
-A INPUT -i br-lan -p udp --dport 3517 -j ACCEPT

View File

@ -0,0 +1,12 @@
#!/bin/sh
uci -q batch <<-EOT
delete firewall.mtkiappd
set firewall.mtkiappd=include
set firewall.mtkiappd.type=restore
set firewall.mtkiappd.path=/usr/share/mtkiappd/firewall.include
set firewall.mtkiappd.reload=1
commit firewall
EOT
exit 0

View File

@ -0,0 +1,20 @@
#!/bin/sh /etc/rc.common
START=99
STOP=01
USE_PROCD=1
start_service() {
procd_open_instance mtkiappd
procd_set_param command /usr/sbin/mtkiappd -e br-lan WIRELESS_IOCTL_PARAM
procd_set_param respawn
procd_set_param netdev br-lan
procd_set_param netdev ra0
procd_close_instance
}
reload_service() {
stop
start
}

View File

@ -0,0 +1,10 @@
OBJS = rtmpiapp.o mt_iapp_util.o
# If you want to debug daemon, uncomment following line
# CFLAGS += -ggdb3 -DDBG
mtkiappd: $(OBJS)
$(CC) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS)
clean:
rm -f core *.o mtkiappd

View File

@ -0,0 +1,128 @@
/****************************************************************************
* Ralink Tech Inc.
* Taiwan, R.O.C.
*
* (c) Copyright 2002, Ralink Technology, Inc.
*
* All rights reserved. Ralink's source code is an unpublished work and the
* use of a copyright notice does not imply otherwise. This source code
* contains confidential trade secret material of Ralink Tech. Any attemp
* or participation in deciphering, decoding, reverse engineering or in any
* way altering the source code is stricitly prohibited, unless the prior
* written consent of Ralink Technology, Inc. is obtained.
***************************************************************************/
/****************************************************************************
Abstract:
All related IEEE802.11f IAPP + IEEE802.11r IAPP extension.
***************************************************************************/
#ifndef __IAPP_DEF_H__
#define __IAPP_DEF_H__
/* Some Notes */
#define IAPP_DS_LINK_LOST
/*
When an AP continues to accept associations without a link to the DS,
it is a black hole in the WLAN, where STAs associate and cannot
communicate with anything beyond the APs BSS. When an AP loses its link
to the DS, it should cease transmitting Beacons, disassociate all
associated stations, and cease responding to Probe Request,
Authentication, and Association Request frames.
*/
/* Local use file */
#define PROC_NET_ARP_PATH "/proc/net/arp"
#define IAPP_PID_BACKUP_FILE "/var/run/mtkiappd.pid"
/* Definition of IAPP */
#define IAPP_DAEMON_VERSION "v1.1.0"
#define IAPP_VERSION 0
//#define IAPP_MULTICAST_ADDR "224.0.1.178" /* used in
// ADD-req frame*/ #define IAPP_MULTICAST_ADDR
//"192.168.15.255" /* used in ADD-req frame*/
/*
The UDP Port parameter is the UDP port number to be opened for the IAPP
for transmission and reception of IAPP packets.
*/
#define IAPP_UDP_PORT 3517 /* used in UDP connection */
/*
The TCP Port parameter is the TCP port number that the IAPP entity opens
to listen for new IAPP TCP connections from the IAPP entities of other
APs.
*/
#define IAPP_TCP_PORT 3517 /* used in TCP connection */
/* Message type */
#define IAPP_ETH_PRO 0xEEEE
#define IAPPMSGQUEID 1
#define RADIUSMSGQUEID 2
#define RRB_ETH_PRO 0x890D
/* Message subtype */
#define IAPP_OPEN_SERVICE_REQ 0
#define IAPP_OPEN_SERVICE_RSP 1
#define IAPP_CLOSE_SERVICE_REQ 2
#define IAPP_SIGNAL_REQ 3
#define IAPP_SET_OID_REQ 4
#define IAPP_QUERY_OID_REQ 5
#define IAPP_QUERY_OID_RSP 6
/* Definition of signal */
#define IAPP_SIG_NONE 0
#define IAPP_SIG_ASSOCIATION 1
#define IAPP_SIG_REASSOCIATION 2
#define IAPP_SIG_TERMINATE 3
/* Definition of IAPP command */ /* reference to IEEE802.11f page 50 */
#define IAPP_CMD_ADD_NOTIFY 0 /* ADD-notify */
#define IAPP_CMD_MOVE_NOTIFY 1 /* MOVE-notify */
#define IAPP_CMD_MOVE_RESPONSE 2 /* MOVE-response */
#define IAPP_CMD_SEND_SECURITY_BLOCK 3 /* Send-Security-Block */
#define IAPP_CMD_ACK_SECURITY_BLOCK 4 /* ACK-Security-Block */
#define IAPP_CMD_CACHE_NOTIFY 5 /* CACHE-notify */
#define IAPP_CMD_CACHE_RESPONSE 6 /* CACHE-response */
#define IAPP_CMD_FT_SEND_SECURITY_BLOCK \
50 /* proprietary FT Send-Security-Block */
#define IAPP_CMD_FT_ACK_SECURITY_BLOCK \
51 /* proprietary FT ACK-Security-Block */
#define IAPP_CMD_INFO_BROADCAST 60 /* proprietary INFO broadcast */
#define IAPP_CMD_INFO_REQUEST 61 /* proprietary INFO request */
#define IAPP_CMD_INFO_RESPONSE 62 /* proprietary INFO response */
#define IAPP_CMD_SECURITY_MONITOR 128 /* proprietary, for SM broadcast */
/* Definition of event log */
#define IAPP_MAX_SIZE_OF_EVENT_LOG 1024
/* Definition of general */
#define IAPP_SELECT_TIMEOUT 5 /* unit: second */
#define IAPP_MAX_RCV_PKT_SIZE 1600
#define IAPP_MAX_RCV_PKT_SIZE_SAFE 100
#define IAPP_IP_HEADER_OFFSET 14 /* skip MAC header */
#define IAPP_IP_PROTO_OFFSET 9
#define IAPP_IP_PROTO_UDP 17
#define IAPP_UDP_DST_PORT_OFFSET (20 + 2)
#define IAPP_MAC_IP_UDP_LEN (14 + 20 + 8)
/* 16 for extra 8B encryption & 8B-align, other 16B for safe */
#define IAPP_SECURITY_EXTEND_LEN 32
#define IAPP_IN
#define IAPP_OUT
#define IAPP_INOUT
#endif /* __IAPP_DEF_H__ */
/* End of iapp_def.h */

View File

@ -0,0 +1,234 @@
/****************************************************************************
* Ralink Tech Inc.
* Taiwan, R.O.C.
*
* (c) Copyright 2002, Ralink Technology, Inc.
*
* All rights reserved. Ralink's source code is an unpublished work and the
* use of a copyright notice does not imply otherwise. This source code
* contains confidential trade secret material of Ralink Tech. Any attemp
* or participation in deciphering, decoding, reverse engineering or in any
* way altering the source code is stricitly prohibited, unless the prior
* written consent of Ralink Technology, Inc. is obtained.
***************************************************************************/
/****************************************************************************
Abstract:
All related IEEE802.11f IAPP + IEEE802.11r/11k IAPP extension.
***************************************************************************/
/* Include */
#include "iappdefs.h"
#include "rt_config.h"
#include "rt_typedef.h"
#include "rtmpiapp.h"
VOID os_alloc_mem(UCHAR *pAd, UCHAR **ppMem, UINT32 Size) {
*ppMem = (UCHAR *)malloc(Size);
}
VOID os_free_mem(UCHAR *pAd, VOID *pMem) { free(pMem); }
BOOLEAN mt_iapp_get_wifi_iface_mac(RTMP_IAPP *pCtrlBK) {
#ifdef IAPP_OS_LINUX
INT idx;
for (idx = 0; idx < pCtrlBK->IfNameWlanCount; idx++) {
struct ifreq ReqIf;
NdisZeroMemory(pCtrlBK->IfNameWlanMAC[idx], ETH_ALEN);
NdisCopyMemory(ReqIf.ifr_name, pCtrlBK->IfNameWlanIoctl[idx], IFNAMSIZ);
/* get mac address of the interface */
if (ioctl(pCtrlBK->SocketIoctl, SIOCGIFHWADDR, &ReqIf) < 0) {
DBGPRINT(RT_DEBUG_ERROR,
("iapp> %s - Fail to get MAC of IfName[%d]: %s\n", __FUNCTION__,
idx, pCtrlBK->IfNameWlanIoctl[idx]));
return FALSE;
} else {
NdisCopyMemory(pCtrlBK->IfNameWlanMAC[idx],
&ReqIf.ifr_ifru.ifru_hwaddr.sa_data[0], ETH_ALEN);
DBGPRINT(RT_DEBUG_OFF, ("iapp> %s - IfName[%d]: %s\n", __FUNCTION__, idx,
pCtrlBK->IfNameWlanIoctl[idx]));
IAPP_HEX_DUMP("MAC", pCtrlBK->IfNameWlanMAC[idx], ETH_ALEN);
}
}
return TRUE;
#else
return FALSE;
#endif
}
INT32 mt_iapp_find_ifidx_by_mac(RTMP_IAPP *pCtrlBK, UCHAR *WifiMAC) {
INT32 idx = 0;
if (WifiMAC == NULL) {
DBGPRINT(RT_DEBUG_OFF, ("iapp> %s - WifiMAC is null.\n", __FUNCTION__));
return -1;
}
if (pCtrlBK->IfNameWlanCount < MAX_WIFI_COUNT) {
DBGPRINT(RT_DEBUG_OFF,
("iapp> %s - pCtrlBK->IfNameWlanCount (%d) is less than %d.\n",
__FUNCTION__, pCtrlBK->IfNameWlanCount, MAX_WIFI_COUNT));
}
for (idx = 0; idx < MAX_WIFI_COUNT; idx++) {
if (NdisCompareMemory(WifiMAC, pCtrlBK->IfNameWlanMAC[idx], ETH_ALEN) ==
0) {
return idx;
}
}
return -1;
}
VOID mt_iapp_set_daemon_information(RTMP_IAPP *pCtrlBK, pid_t *pPidAuth) {
INT32 ComLen = 0;
INT32 idx = 0;
for (idx = 0; idx < pCtrlBK->IfNameWlanCount; idx++) {
ComLen = sizeof(INT32);
IAPP_IOCTL_TO_WLAN(pCtrlBK, RT_IOCTL_IAPP, pPidAuth, &ComLen, idx,
RT_SET_IAPP_PID | OID_GET_SET_TOGGLE);
#ifdef FT_KDP_KEY_FROM_DAEMON
ComLen = strlen(pCtrlBK->CommonKey);
IAPP_IOCTL_TO_WLAN(pCtrlBK, RT_IOCTL_IAPP, pCtrlBK->CommonKey, &ComLen, idx,
RT_FT_KEY_SET | OID_GET_SET_TOGGLE);
#endif /* FT_KDP_KEY_FROM_DAEMON */
}
return;
}
VOID mt_iapp_ft_client_table_init(RTMP_IAPP *pCtrlBK) {
INT i;
NdisZeroMemory(&pCtrlBK->SelfFtStaTable, sizeof(pCtrlBK->SelfFtStaTable));
for (i = 0; i < HASH_TABLE_SIZE; i++)
pCtrlBK->SelfFtStaTable.hash[i] = NULL;
return;
}
FT_CLIENT_INFO *mt_iapp_ft_client_look_up(FT_CLIENT_TABLE *pFtTable,
UCHAR *pAddr) {
ULONG HashIdx;
FT_CLIENT_INFO *ft_entry = NULL;
HashIdx = MAC_ADDR_HASH_INDEX(pAddr);
ft_entry = pFtTable->hash[HashIdx];
while (ft_entry) {
if (NdisCompareMemory(ft_entry->sta_mac, pAddr, ETH_ALEN) == 0)
break;
else
ft_entry = ft_entry->next;
}
return ft_entry;
}
FT_CLIENT_INFO *mt_iapp_ft_client_insert(FT_CLIENT_TABLE *pFtTable,
UCHAR *pStaAddr, UCHAR *pApAddr,
INT32 ApIfIdx) {
UCHAR HashIdx;
INT idx = 0;
FT_CLIENT_INFO *ft_entry = NULL;
FT_CLIENT_INFO *current_ft_entry = NULL;
ft_entry = mt_iapp_ft_client_look_up(pFtTable, pStaAddr);
if (ft_entry) {
/* Update information */
if (pApAddr)
NdisCopyMemory(ft_entry->ap_mac, pApAddr, ETH_ALEN);
ft_entry->if_idx = ApIfIdx;
ft_entry->used = 1;
return ft_entry;
}
if (pFtTable->ft_sta_table_size >= MAX_NUM_OF_CLIENT) {
DBGPRINT(RT_DEBUG_ERROR,
("iapp> %s - FT client table is full. (FtStaTableSize=%d)\n",
__FUNCTION__, pFtTable->ft_sta_table_size));
return NULL;
}
for (idx = 0; idx < MAX_NUM_OF_CLIENT; idx++) {
ft_entry = &pFtTable->ft_sta_info[idx];
if (ft_entry->used)
continue;
if (pStaAddr)
NdisCopyMemory(ft_entry->sta_mac, pStaAddr, ETH_ALEN);
if (pApAddr)
NdisCopyMemory(ft_entry->ap_mac, pApAddr, ETH_ALEN);
ft_entry->if_idx = ApIfIdx;
ft_entry->used = 1;
break;
}
pFtTable->ft_sta_table_size++;
HashIdx = MAC_ADDR_HASH_INDEX(pStaAddr);
ft_entry->hash_idx = HashIdx;
if (pFtTable->hash[HashIdx] == NULL)
pFtTable->hash[HashIdx] = ft_entry;
else {
current_ft_entry = pFtTable->hash[HashIdx];
while (current_ft_entry->next != NULL)
current_ft_entry = current_ft_entry->next;
current_ft_entry->next = ft_entry;
}
return ft_entry;
}
VOID mt_iapp_ft_client_delete(FT_CLIENT_TABLE *pFtTable, UCHAR *pStaAddr) {
UCHAR HashIdx = 0xFF;
FT_CLIENT_INFO *ft_entry = NULL;
FT_CLIENT_INFO *hash_ft_entry = NULL;
FT_CLIENT_INFO *pre_hash_ft_entry = NULL;
ft_entry = mt_iapp_ft_client_look_up(pFtTable, pStaAddr);
if (ft_entry == NULL) {
DBGPRINT(
RT_DEBUG_TRACE,
("iapp> %s - cannot find this entry (%02x:%02x:%02x:%02x:%02x:%02x)\n",
__FUNCTION__, pStaAddr[0], pStaAddr[1], pStaAddr[2], pStaAddr[3],
pStaAddr[4], pStaAddr[5]));
return;
}
ft_entry->used = 0;
NdisZeroMemory(ft_entry->ap_mac, ETH_ALEN);
NdisZeroMemory(ft_entry->sta_mac, ETH_ALEN);
ft_entry->if_idx = -1;
HashIdx = ft_entry->hash_idx;
hash_ft_entry = pFtTable->hash[HashIdx];
pre_hash_ft_entry = NULL;
if (hash_ft_entry != NULL) {
/* update Hash list*/
do {
if (hash_ft_entry == ft_entry) {
if (pre_hash_ft_entry == NULL)
pFtTable->hash[HashIdx] = ft_entry->next;
else
pre_hash_ft_entry->next = ft_entry->next;
break;
}
pre_hash_ft_entry = hash_ft_entry;
hash_ft_entry = hash_ft_entry->next;
} while (hash_ft_entry);
}
pFtTable->ft_sta_table_size--;
}
INT32 mt_iapp_find_ifidx_by_sta_mac(FT_CLIENT_TABLE *pFtTable, UCHAR *pStaMAC) {
FT_CLIENT_INFO *ft_entry = NULL;
ft_entry = mt_iapp_ft_client_look_up(pFtTable, pStaMAC);
if (ft_entry)
return ft_entry->if_idx;
else
return -1;
}
/* End of mt_iapp_util.c */

View File

@ -0,0 +1,187 @@
/****************************************************************************
* Ralink Tech Inc.
* Taiwan, R.O.C.
*
* (c) Copyright 2002, Ralink Technology, Inc.
*
* All rights reserved. Ralink's source code is an unpublished work and the
* use of a copyright notice does not imply otherwise. This source code
* contains confidential trade secret material of Ralink Tech. Any attemp
* or participation in deciphering, decoding, reverse engineering or in any
* way altering the source code is stricitly prohibited, unless the prior
* written consent of Ralink Technology, Inc. is obtained.
***************************************************************************/
/****************************************************************************
Abstract:
All related IEEE802.11f IAPP + IEEE802.11r IAPP extension.
***************************************************************************/
#ifndef __RT_CONFIG_H__
#define __RT_CONFIG_H__
/* Include Kernel file */
#include <arpa/inet.h>
#include <fcntl.h>
#include <linux/if.h>
#include <linux/if_packet.h>
#include <linux/wireless.h>
#include <net/if_arp.h>
#include <netdb.h>
#include <netinet/if_ether.h>
#include <netinet/in.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/types.h>
#include "rt_typedef.h"
/* Definition of OID to RALINK AP driver */
#define OID_GET_SET_TOGGLE 0x8000
#define RT_QUERY_SIGNAL_CONTEXT 0x0402
#define RT_SET_IAPP_PID 0x0404
#define RT_SET_APD_PID 0x0405
#define RT_SET_DEL_MAC_ENTRY 0x0406
#define RT_QUERY_EVENT_TABLE 0x0407
#define RT_SET_FT_STATION_NOTIFY 0x0408
#define RT_SET_FT_KEY_REQ 0x0409
#define RT_SET_FT_KEY_RSP 0x040a
#define RT_FT_KEY_SET 0x040b
#define RT_FT_DATA_ENCRYPT 0x040c
#define RT_FT_DATA_DECRYPT 0x040d
#define RT_FT_NEIGHBOR_REPORT 0x040e
#define RT_FT_NEIGHBOR_REQUEST 0x040f
#define RT_FT_NEIGHBOR_RESPONSE 0x0410
#define RT_FT_ACTION_FORWARD 0x0411
/* File path */
// #define MSG_FILE "/etc/wireless/mt7615/mtkiappd.dat"
#define EVENT_LOG_FILE "/var/log/mtkiappd.log"
/* ReDefinition */
#define NdisZeroMemory(__Dst, __Len) memset(__Dst, 0, __Len)
#define NdisFillMemory(__Dst, __Len, __Val) memset(__Dst, __Val, __Len)
#define NdisMoveMemory(__Dst, __Src, __Len) memmove(__Dst, __Src, __Len)
#define NdisCopyMemory(__Dst, __Src, __Len) memcpy(__Dst, __Src, __Len)
#define NdisCompareMemory(__Dst, __Src, __Len) memcmp(__Dst, __Src, __Len)
VOID os_alloc_mem(UCHAR *pAd, UCHAR **ppMem, UINT32 Size);
VOID os_free_mem(UCHAR *pAd, VOID *pMem);
/* Debug flag */
#define RT_DEBUG_OFF 0
#define RT_DEBUG_ERROR 1
#define RT_DEBUG_WARN 2
#define RT_DEBUG_TRACE 3
#define RT_DEBUG_INFO 4
#define NIC_DBG_STRING (" ")
#ifdef DBG
#define DBGPRINT(Level, Fmt) \
{ \
if (Level <= RTDebugLevel) { \
printf Fmt; \
} \
}
#else
/* no debug information */
#define DBGPRINT(Level, Fmt)
#endif
#define MAX_NUM_OF_EVENT 30 /* entry # in EVENT table */
typedef struct _RT_802_11_EVENT_LOG {
ULONG SystemTime; /* timestammp (jiffies) */
UCHAR TriggerAddr[ETH_ALEN];
UCHAR DetectorAddr[ETH_ALEN];
UINT16 Event; /* EVENT_xxx */
} RT_802_11_EVENT_LOG, *PRT_802_11_EVENT_LOG;
typedef struct _RT_802_11_EVENT_TABLE {
ULONG Num;
RT_802_11_EVENT_LOG Log[MAX_NUM_OF_EVENT];
} RT_802_11_EVENT_TABLE, *PRT_802_11_EVENT_TABLE;
#define PACKED __attribute__((packed))
typedef struct PACKED _FT_KDP_EVT_HEADER {
UINT32 EventLen;
UINT32 PeerIpAddr;
} FT_KDP_EVT_HEADER;
typedef struct PACKED _RT_SIGNAL_STRUC {
VOID *pNext; /* point to next signal */
UINT16 Sequence;
UCHAR MacAddr[ETH_ALEN];
UCHAR CurrAPAddr[ETH_ALEN];
#define FT_KDP_SIG_NOTHING 0x00 /* no signal */
#define FT_KDP_SIG_IAPP_ASSOCIATION 0x01 /* A station has associated */
#define FT_KDP_SIG_IAPP_REASSOCIATION 0x02 /* A station has re-associated */
#define FT_KDP_SIG_TERMINATE 0x03 /* terminate the daemon */
#define FT_KDP_SIG_FT_ASSOCIATION 0x50 /* A FT station has associated */
#define FT_KDP_SIG_FT_REASSOCIATION 0x51 /* A FT station has re-associated */
#define FT_KDP_SIG_KEY_TIMEOUT 0x52 /* PMK-R1 KEY Timeout */
#define FT_KDP_SIG_KEY_REQ 0x53 /* Request PMK-R1 KEY from R0KH */
#define FT_KDP_SIG_ACTION 0x54 /* Forward FT Action frame to DS */
#define FT_KDP_SIG_AP_INFO_REQ 0x70 /* request neighbor AP info. */
#define FT_KDP_SIG_AP_INFO_RSP 0x71 /* response my AP info. */
/* FT KDP internal use */
#define FT_KDP_SIG_KEY_REQ_AUTO 0xA0 /* Request PMK-R1 KEY from R0KH */
#define FT_KDP_SIG_KEY_RSP_AUTO 0xA1 /* Response PMK-R1 KEY to R1KH */
#define FT_KDP_SIG_INFO_BROADCAST 0xB0 /* broadcast our AP information */
#define FT_KSP_SIG_DEBUG_TRACE 0xC0 /* enable debug flag to TRACE */
UCHAR Sig;
UCHAR MacAddrSa[ETH_ALEN];
/* IEEE80211R_SUPPORT */
/* the first 6B are FT_KDP_EVT_HEADER */
/*
For FT_KDP_SIG_NOTHING: nothing
For FT_KDP_SIG_IAPP_ASSOCIATION:nothing
For FT_KDP_SIG_REASSOCIATION: nothing
For FT_KDP_SIG_TERMINATE: nothing
For FT_KDP_SIG_FT_ASSOCIATION: nothing
FT_KDP_SIG_FT_REASSOCIATION: nothing
For FT_KDP_SIG_KEY_TIMEOUT: it is
For FT_KDP_SIG_KEY_REQ_AUTO: it is FT_KDP_EVT_KEY_REQ
For FT_KDP_SIG_KEY_RSP_AUTO: it is FT_KDP_SIG_KEY_RSP
*/
UCHAR Reserved[3]; /* let Content address four-byte align */
UCHAR Content[1024]; /* signal content */
#define RT_SIGNAL_STRUC_HDR_SIZE (sizeof(RT_SIGNAL_STRUC) - 1024)
} RT_SIGNAL_STRUC, *PRT_SIGNAL_STRUC;
static INT32 RTDebugLevel = RT_DEBUG_ERROR;
#endif /* __RT_CONFIG_H__ */
/* End of rt_config.h */

View File

@ -0,0 +1,22 @@
#ifndef __RT_TYPEDEF_H__
#define __RT_TYPEDEF_H__
#include <stdint.h>
typedef enum _BOOLEAN { FALSE = 0, TRUE = 1 } BOOLEAN;
typedef char CHAR;
typedef int INT;
typedef int INT32;
typedef int16_t INT16;
typedef uint8_t UCHAR;
typedef uint16_t UINT16;
typedef uint32_t UINT;
typedef uint32_t ULONG;
typedef uint32_t UINT32;
typedef void VOID;
typedef void *PVOID;
#endif

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,580 @@
/****************************************************************************
* Ralink Tech Inc.
* Taiwan, R.O.C.
*
* (c) Copyright 2002, Ralink Technology, Inc.
*
* All rights reserved. Ralink's source code is an unpublished work and the
* use of a copyright notice does not imply otherwise. This source code
* contains confidential trade secret material of Ralink Tech. Any attemp
* or participation in deciphering, decoding, reverse engineering or in any
* way altering the source code is stricitly prohibited, unless the prior
* written consent of Ralink Technology, Inc. is obtained.
***************************************************************************/
/****************************************************************************
Abstract:
All related IEEE802.11f IAPP + IEEE802.11r IAPP extension.
***************************************************************************/
#ifndef __RTMP_IAPP_H__
#define __RTMP_IAPP_H__
#include "rt_config.h"
#include "rt_typedef.h"
#define IAPP_OS_LINUX
//#define IAPP_OS_VXWORKS
/*
IAPP issues:
1. Lack of fast roaming support, particularly required for voice;
2. Only supports use of RADIUS (in a non-standard way);
*/
/*
Three levels of support for ESS formation are possible with the IAPP
capabilities described here:
Level 1: no administrative or security support;
Level 2: support for dynamic mapping of BSSID to IP addresses; and
Level 3: support for encryption and authentication of IAPP messages.
Level 1 support can be achieved by configuring each AP in the ESS with
the BSSID to IP address mapping for all other APs in the ESS. This may
be acceptable for a small ESS.
Many ESS providers will need levels 2 or 3, which require RADIUS
support.
*/
/*
Note with RALINK driver:
1. OID to RALINK AP driver;
2. RT_SIGNAL_STRUC
3. IAPP daemon must be run after br-lan & ra0 built up.
*/
/* ---------------------------- User Definition ------------------------ */
#define FT_KDP_FUNC_SOCK_COMM /* use socket to communicate with driver */
#define FT_KDP_FUNC_PKT_ENCRYPT /* do encryption for each IAPP packet */
#define FT_KDP_SELECT_TIMEOUT /* use timeout to wait for any packet */
#define FT_KDP_KEY_FROM_DAEMON /* key is set in daemon */
#define FT_KDP_DEFAULT_IF_ETH "br-lan"
#define FT_KDP_DEFAULT_IF_WLAN \
"br-lan" /* used to receive command from WLAN \
*/
#define FT_KDP_DEFAULT_IF_WLAN_IOCTL "ra0" /* ioctl command to WLAN */
/*
Inter-AP communications present opportunities to an attacker.
The attacker can use IAPP or forged 802.11 MAC management frames as a
Denial-of-Service (DoS) attack against a STA state in its AP.
It can capture MOVE packets to gather information on the STA that is
roaming. It can act as a rogue AP in the ESS.
If use RADIUS server, the IAPP entity sends the RADIUS Initiate-Request
and receives the RADIUS Initiate-Accept or Initiate-Reject.
If the Initiate-Accept is received, then the IAPP entity initializes
its data structures, functions, and protocols. If an Initiate-Reject
is received, the IAPP does not start.
The RADIUS servers provide two functions, mapping the BSSID of an AP to
its IP address on the DSM and distribution of keys to the APs to allow
the encryption of the communications between the APs.
The function of mapping the BSSID of an AP to its IP address on the DSM
can also be accomplished by local configuration information or the IETF
Inverse Address Resolution Protocol (RFC 2390:1998).
We don't support RADIUS server so we use a fixed PSK key to encrypt.
*/
#define FT_KDP_DEFAULT_PTK "zpxrjs9uo2kvbuqo"
#ifdef IAPP_OS_LINUX
#define RT_IOCTL_IAPP (SIOCIWFIRSTPRIV + 0x01)
#endif // IAPP_OS_LINUX //
#ifdef IAPP_OS_VXWORKS
#define PF_PACKET AF_INET
#define RT_IOCTL_IAPP VX_RT_PRIV_IOCTL
#define FT_KDP_WLAN_NAME "ra"
#define FT_KDP_WLAN_UNIT 0
#define FT_KDP_ETH_NAME "eth" /* must not use mirror */
#define FT_KDP_BR_ETH_IF_NUM 2 /* eth0 and eth1 */
#define FT_KDP_BR_NAME "mirror"
#define FT_KDP_BR_UNIT 0
#endif // IAPP_OS_VXWORKS //
#define HASH_TABLE_SIZE 128
#define MAX_NUM_OF_CLIENT 64
#define MAC_ADDR_HASH(Addr) \
(Addr[0] ^ Addr[1] ^ Addr[2] ^ Addr[3] ^ Addr[4] ^ Addr[5])
#define MAC_ADDR_HASH_INDEX(Addr) (MAC_ADDR_HASH(Addr) & (HASH_TABLE_SIZE - 1))
/* ---------------------------- MACRO Definition ---------------------------- */
#define IAPP_LITTLE_ENDIAN /* __BIG_ENDIAN */
#ifdef IAPP_LITTLE_ENDIAN
#define SWAP_16(x) \
((UINT16)((((UINT16)(x) & (UINT16)0x00ffU) << 8) | \
(((UINT16)(x) & (UINT16)0xff00U) >> 8)))
#else
#define SWAP_16(x) x
#endif
/* 16 for extra 8B encryption & 8B-align */
#define IAPP_PKT_ALLOCATE(__pPkt, __Len) \
IAPP_MEM_ALLOC(__pPkt, __Len + IAPP_SECURITY_EXTEND_LEN)
#define IAPP_PKT_ZERO(__pPkt, __Len) \
IAPP_MEM_ZERO(__pPkt, __Len + IAPP_SECURITY_EXTEND_LEN)
#define IAPP_MEM_ALLOC(__pMem, __Size) \
{ \
os_alloc_mem(NULL, (UCHAR **)(&__pMem), __Size); \
IAPP_MemAllocNum++; \
}
#define IAPP_MEM_FREE(__Mem) \
{ \
os_free_mem(NULL, __Mem); \
IAPP_MemFreeNum++; \
}
/* calculate the size to the multiple of 8 */
#define IAPP_ENCRYPTED_DATA_SIZE_CAL(__LenOfAction) \
if ((__LenOfAction)&0x07) \
(__LenOfAction) += 8 - ((__LenOfAction)&0x07); \
__LenOfAction += 8;
#define IAPP_MEM_ZERO(__Dst, __Len) NdisZeroMemory(__Dst, __Len)
#define IAPP_MEM_FILL(__Dst, __Val, __Len) NdisFillMemory(__Dst, __Len, __Val)
#define IAPP_MEM_MOVE(__Dst, __Src, __Len) NdisMoveMemory(__Dst, __Src, __Len)
#define IAPP_HEX_DUMP(__pPrompt, __pBuf, __Len) \
IAPP_HexDump((CHAR *)__pPrompt, (CHAR *)__pBuf, __Len)
#define IAPP_IOCTL_TO_WLAN(__pCtrlBK, __Param, __pData, __pLen, __ApIdx, \
__Flags) \
{ \
IAPP_IoctlToWLAN(__pCtrlBK, __Param, (CHAR *)(__pData), (INT32 *)(__pLen), \
__ApIdx, __Flags); \
}
/* ---------------------------- Structure Definition ------------------------ */
/*
IAPP supports three protocol sequences.
One is initiated by invoking the IAPP-ADD.request after the APME
receives an MLME-ASSOCIATE.indication.
The second is initiated by invoking the IAPPMOVE.request after the APME
receives an MLME-REASSOCIATE.indication.
The third is initiated by invoking the IAPP-CACHE.request to cache
context in neighboring APs to facilitate fast roaming.
*/
/* event log */
#define FT_IP_ADDRESS_SIZE 4
/* IAPP header in the frame body, 6B */
typedef struct PACKED _RT_IAPP_HEADER {
UCHAR Version; /* indicates the protocol version of the IAPP */
UCHAR Command; /* ADD-notify, MOVE-notify, etc. */
UINT16 Identifier; /* aids in matching requests and responses */
UINT16 Length; /* indicates the length of the entire packet */
} RT_IAPP_HEADER;
/* IAPP Action Frame */
/* ADD notify frame */
typedef struct PACKED _RT_IAPP_ADD_NOTIFY {
RT_IAPP_HEADER IappHeader;
/* the number of octets in the MAC Address */
UCHAR AddressLen;
/* should be sent with a value of zero */
#define FT_KDP_ADD_NOTIFY_RSVD_11R_SUPPORT 0x01
UCHAR Rsvd;
/* the MAC address of the STA that has associated */
UCHAR MacAddr[ETH_ALEN];
/* the integer value of the sequence number of the association request frame
*/
/*
The 802.11 sequence number may be an ambiguous indication of the most
recent association. But, this information may be useful to an
algorithm making a determination of the location of the most recent
association of a STA.
*/
UINT16 Sequence;
} RT_IAPP_ADD_NOTIFY;
/* MOVE requset frame */
typedef struct PACKED _RT_IAPP_MOVE_NOTIFY {
RT_IAPP_HEADER IappHeader;
/* the number of octets in the MAC Address */
UCHAR AddressLen;
/* should be sent with a value of zero */
UCHAR Rsvd;
/* the MAC address of the STA that has associated */
UCHAR MacAddr[ETH_ALEN];
/* the integer value of the sequence number of the association request frame
*/
UINT16 Sequence;
/* indicates the number of octets in the Context Block field, always 0 */
UINT16 LenOfContextBlock;
} RT_IAPP_MOVE_NOTIFY;
/* MOVE response frame */
typedef struct PACKED _RT_IAPP_MOVE_RSP {
RT_IAPP_HEADER IappHeader;
/* the number of octets in the MAC Address */
UCHAR AddressLen;
#define IAPP_MOVE_RSP_STATUS_SUCCESS 0
#define IAPP_MOVE_RSP_STATUS_DENY 1
#define IAPP_MOVE_RSP_STATUS_STALE 2
/* 0 Successful, 1 Move denied, 2 Stale move */
/*
FAIL indicates that a RADIUS Access-Reject was received in response
to the RADIUS Access-Request sent to the RADUS server to look up the
IP address of the Old AP. (not use the IP in the MOVE-notify frame)
*/
UCHAR Status;
/* the MAC address of the STA that has associated */
UCHAR MacAddr[ETH_ALEN];
/* the integer value of the sequence number of the association request frame
*/
UINT16 Sequence;
/* indicates the number of octets in the Context Block field, always 0 */
UINT16 LenOfContextBlock;
} RT_IAPP_MOVE_RSP;
/* SEND-SECURITY-BLOCK frame */
typedef struct PACKED _RT_IAPP_SEND_SECURITY_BLOCK {
RT_IAPP_HEADER IappHeader;
/* first 8 bytes of the ACK nonce */
#define IAPP_SB_INIT_VEC_SIZE 8
UCHAR InitVec[8];
/* indicates the number of octets in the Security Block field */
UINT16 Length;
/*
Contains the security information being forwarded from the
RADIUS Server through the new AP to the old AP.
*/
UCHAR SB[0];
} RT_IAPP_SEND_SECURITY_BLOCK;
/* no use */
typedef struct PACKED _RT_IAPP_ACK_SECURITY_BLOCK {
RT_IAPP_HEADER IappHeader;
/* copied from the Date/Time stamp */
UCHAR InitVec[8];
/*
Content of the New-AP-ACK-Authenticator information element that
the old AP received in the Security Block.
*/
UCHAR NewApAckAuth[48];
} RT_IAPP_ACK_SECURITY_BLOCK;
/* private frame */
typedef struct PACKED _RT_IAPP_INFORMATION {
#define IAPP_INFO_TYPE_BC 0
#define IAPP_INFO_TYPE_REQ 1
#define IAPP_INFO_TYPE_RSP 2
#define IAPP_INFO_TYPE_MAX_NUM 3
RT_IAPP_HEADER IappHeader;
/* indicates the number of octets in the Information Block field */
UINT16 Length;
/* contains the AP information being forwarded */
UCHAR IB[0];
} RT_IAPP_INFORMATION;
typedef struct PACKED _RT_IAPP_SECURITY_MONITOR {
RT_IAPP_HEADER IappHeader;
RT_802_11_EVENT_TABLE EvtTab;
} RT_IAPP_SECURITY_MONITOR, *PRT_IAPP_SECURITY_MONITOR;
/* Event structure between daemon and driver */
#define FT_KDP_EVT_HEADER_SIZE sizeof(FT_KDP_EVT_HEADER)
typedef struct _OID_REQ {
INT32 OID;
INT32 Len;
CHAR Buf[0];
} OID_REQ, *POID_REQ;
typedef struct _MSG_BUF {
INT32 MsgType;
INT32 MsgSubType;
CHAR Buf[1024];
} MSG_BUF, *PMSG_BUF;
/* Layer 2 Update frame to switch/bridge */
typedef struct PACKED _FT_ETH_HEADER {
UCHAR DA[ETH_ALEN];
UCHAR SA[ETH_ALEN];
UINT16 Len;
} FT_ETH_HEADER;
/* For any Layer2 devices, e.g., bridges, switches and other APs, the frame
can update their forwarding tables with the correct port to reach the new
location of the STA */
typedef struct PACKED _RT_IAPP_L2_UPDATE_FRAME {
FT_ETH_HEADER ETH;
UCHAR DSAP; /* must be NULL */
UCHAR SSAP; /* must be NULL */
UCHAR Control; /* reference to IEEE Std 802.2 */
UCHAR XIDInfo[3]; /* reference to IEEE Std 802.2 */
} RT_IAPP_L2_UPDATE_FRAME, *PRT_IAPP_L2_UPDATE_FRAME;
/* RRB protocol */
typedef struct PACKED _FT_RRB_FRAME {
/* ethernet header */
FT_ETH_HEADER ETH;
/* shall be set to 1 */
#define FT_RRB_FRAME_TYPE 1
UCHAR RemoteFrameType;
/* 0 for Remote Request, and to 1 for Remote Response */
UCHAR FTPacketType;
/* the length in octets of the FT Action Frame field */
UINT16 FTActionLength;
/* the BSSID of the current AP */
UCHAR ApAddress[ETH_ALEN];
/*
The contents of the FT Action frame, from the Category field to the
end of the Action Frame body.
*/
#define FT_RRB_HEADER_SIZE (sizeof(FT_RRB_FRAME))
UCHAR FTActionFrame[0];
} FT_RRB_FRAME;
typedef struct _FT_CLIENT_INFO {
struct _FT_CLIENT_INFO *next;
INT if_idx;
UCHAR sta_mac[ETH_ALEN];
UCHAR ap_mac[ETH_ALEN];
UCHAR used;
UCHAR hash_idx;
} FT_CLIENT_INFO;
typedef struct _FT_CLIENT_TABLE {
FT_CLIENT_INFO *hash[HASH_TABLE_SIZE];
FT_CLIENT_INFO ft_sta_info[MAX_NUM_OF_CLIENT];
INT32 ft_sta_table_size;
} FT_CLIENT_TABLE;
/* IAPP control block */
#define IAPP_ENCRYPT_KEY_MAX_SIZE 64
#define MAX_WIFI_COUNT 2
typedef struct _RTMP_IAPP {
CHAR IfNameEth[IFNAMSIZ]; /* ethernet interface name */
CHAR IfNameWlan[IFNAMSIZ]; /* wireless interface name */
CHAR IfNameWlanIoctl[MAX_WIFI_COUNT][IFNAMSIZ]; /* wireless interface name */
UCHAR IfNameWlanMAC[MAX_WIFI_COUNT][ETH_ALEN]; /* wireless interface name */
INT32 IfNameWlanCount;
BOOLEAN FlgIsTerminated; /* if terminate IAPP daemon */
struct in_addr AddrOwn; /* IP address of ethernet interface */
struct in_addr AddrNetmask; /* netmask of ethernet interface */
struct in_addr AddrBroadcast; /* broadcast address of ethernet interface */
BOOLEAN FlgIsRcvRunning; /* if rcv handler is running */
INT32 SocketUdpSend; /* used to send/rcv IAPP multicast frame */
INT32 SocketTcpRcv; /* used to rcv unicast frame from a peer */
INT32 SocketRawBr; /* used to send bridge L2 frame */
INT32 SocketIoctl; /* used to ioctl() to WLAN driver */
INT32 SocketRawRRB; /* used in RRB RAW protocol */
#ifdef FT_KDP_FUNC_SOCK_COMM
INT32 SocketRawDrv; /* used to receive message from driver */
#endif // FT_KDP_FUNC_SOCK_COMM //
#ifndef FT_KDP_FUNC_SOCK_COMM
#ifdef IAPP_OS_LINUX
#define FT_KDP_PIPE_ID_READ 0
#define FT_KDP_PIPE_ID_WRITE 1
INT32 PipeRawDrv[2]; /* used to receive message from driver */
#endif // IAPP_OS_LINUX //
#endif // FT_KDP_FUNC_SOCK_COMM //
#ifdef IAPP_OS_VXWORKS
VOID *pBcCookie[FT_KDP_BR_ETH_IF_NUM]; /* for bridge L2 frame */
VOID *pDrvCookieTo; /* for ioctl to WLAN driver */
VOID *pDrvCookieFrom; /* for ioctl from WLAN driver */
VOID *pRrbCookieTo[FT_KDP_BR_ETH_IF_NUM]; /* used in RRB protocol */
VOID *pRrbCookieFrom; /* for ioctl from WLAN driver */
#define IAPP_KDP_PIPE_DRV "/pipe/IAPP_Drv"
#define IAPP_KDP_PIPE_ETH "/pipe/IAPP_Eth"
#endif // IAPP_OS_VXWORKS //
#ifdef IAPP_EVENT_LOG
INT32 MsgId;
BOOLEAN FlgIsMsgReady;
#endif // IAPP_EVENT_LOG //
pid_t PID; /* IAPP task PID */
UINT16 PacketIdentifier; /* used in IAPP frame identifier */
#ifdef FT_KDP_FUNC_PKT_ENCRYPT
/* common key, ASCII, the last byte must be 0x00 */
CHAR CommonKey[IAPP_ENCRYPT_KEY_MAX_SIZE + 1];
#endif // FT_KDP_FUNC_PKT_ENCRYPT //
FT_CLIENT_TABLE SelfFtStaTable;
} RTMP_IAPP, *PRTMP_IAPP;
/* key information */
#define FT_IP_ADDRESS_SIZE 4
#define FT_NONCE_SIZE 8
#define FT_KDP_WPA_NAME_MAX_SIZE 16
#define FT_KDP_R0KHID_MAX_SIZE 48
#define FT_KDP_R1KHID_MAX_SIZE 6
#define FT_KDP_S1KHID_MAX_SIZE 6
#define FT_KDP_PMKR1_MAX_SIZE 32 /* 256-bit key */
#define FT_R1KH_ENTRY_TABLE_SIZE 64
#define FT_R1KH_ENTRY_HASH_TABLE_SIZE FT_R1KH_ENTRY_TABLE_SIZE
typedef struct PACKED _FT_KDP_PMK_KEY_INFO {
UCHAR R0KHID[FT_KDP_R0KHID_MAX_SIZE];
UCHAR R0KHIDLen;
UCHAR PMKR0Name[FT_KDP_WPA_NAME_MAX_SIZE]; /* an ID that names the PMK-R0 */
UCHAR R1KHID[FT_KDP_R1KHID_MAX_SIZE];
UCHAR S1KHID[FT_KDP_S1KHID_MAX_SIZE];
/* reserved field */
UCHAR RSV[4];
} FT_KDP_PMK_KEY_INFO;
typedef struct PACKED _FT_KDP_EVT_KEY_ELM {
/* must be 65535, Proprietary Information */
#define FT_KDP_ELM_ID_PRI 65535
UINT16 ElmId;
#define FT_KDP_ELM_PRI_LEN (sizeof(FT_KDP_EVT_KEY_ELM) - 4)
UINT16 ElmLen;
/* must be 0x00 0x0E 0x2E, RALINK */
#define FT_KDP_ELM_PRI_OUI_0 0x00
#define FT_KDP_ELM_PRI_OUI_1 0x0E
#define FT_KDP_ELM_PRI_OUI_2 0x2E
#define FT_KDP_ELM_PRI_OUI_SIZE 3
UCHAR OUI[3];
/* station MAC */
UCHAR MacAddr[ETH_ALEN];
UCHAR RSV[3];
/* used in request */
FT_KDP_PMK_KEY_INFO KeyInfo;
/* used in response */
UCHAR PMKR1Name[FT_KDP_WPA_NAME_MAX_SIZE]; /* an ID that names the PMK-R1 */
UCHAR PMKR1[FT_KDP_PMKR1_MAX_SIZE]; /* PMK R1 Key */
UCHAR R0KH_MAC[ETH_ALEN]; /* MAC of R0KH */
/*
During a Fast BSS Transition a non-AP STA shall negotiate the same
pairwise cipher suite with Target APs as was negotiated in the FT
Initial Mobility Domain association. The target AP shall verify
that the same pairwise cipher suite selector is used, using the
pairwise cipher suite selector value in the PMK-R1 SA received from
the R0KH.
*/
UCHAR PairwisChipher[4];
UCHAR AkmSuite[4];
UINT32 KeyLifeTime;
UINT32 ReassocDeadline;
} FT_KDP_EVT_KEY_ELM;
/* ---------------------------- API Definition ------------------------ */
VOID IAPP_HexDump(CHAR *pPromptStr, CHAR *pSrcBufVA, UINT32 SrcBufLen);
BOOLEAN IAPP_IoctlToWLAN(RTMP_IAPP *pCtrlBK, INT32 Param, CHAR *pData,
INT32 *pDataLen, UCHAR ApIdx, INT32 Flags);
BOOLEAN mt_iapp_get_wifi_iface_mac(RTMP_IAPP *pCtrlBK);
INT32 mt_iapp_find_ifidx_by_mac(RTMP_IAPP *pCtrlBK, UCHAR *WifiMAC);
VOID mt_iapp_set_daemon_information(RTMP_IAPP *pCtrlBK, pid_t *pPidAuth);
VOID mt_iapp_ft_client_table_init(RTMP_IAPP *pCtrlBK);
FT_CLIENT_INFO *mt_iapp_ft_client_look_up(FT_CLIENT_TABLE *pFtTable,
UCHAR *pAddr);
FT_CLIENT_INFO *mt_iapp_ft_client_insert(FT_CLIENT_TABLE *pFtTable,
UCHAR *pStaAddr, UCHAR *pApAddr,
INT32 ApIfIdx);
VOID mt_iapp_ft_client_delete(FT_CLIENT_TABLE *pFtTable, UCHAR *pStaAddr);
INT32 mt_iapp_find_ifidx_by_sta_mac(FT_CLIENT_TABLE *pFtTable, UCHAR *pStaMAC);
#endif /* __RTMP_IAPP_H__ */
/* End of rtmp_iapp.h */