📄 os_misc.c
字号:
/*
* File : os_misc.c
*/
#include "os_headers.h"
#include "os_macros.h"
#include "shimd.h"
unsigned long current;
extern wlan_private *wlanpriv;
int event_type_size[] = {
IW_EV_LCP_LEN, /* IW_HEADER_TYPE_NULL */
0,
IW_EV_CHAR_LEN, /* IW_HEADER_TYPE_CHAR */
0,
IW_EV_UINT_LEN, /* IW_HEADER_TYPE_UINT */
IW_EV_FREQ_LEN, /* IW_HEADER_TYPE_FREQ */
IW_EV_ADDR_LEN, /* IW_HEADER_TYPE_ADDR */
0,
IW_EV_POINT_LEN, /* Without variable payload */
IW_EV_PARAM_LEN, /* IW_HEADER_TYPE_PARAM */
IW_EV_QUAL_LEN, /* IW_HEADER_TYPE_QUAL */
};
static const struct iw_ioctl_description standard_ioctl[] = {
/* SIOCSIWCOMMIT */
{ IW_HEADER_TYPE_NULL, 0, 0, 0, 0, 0},
/* SIOCGIWNAME */
{ IW_HEADER_TYPE_CHAR, 0, 0, 0, 0, IW_DESCR_FLAG_DUMP},
/* SIOCSIWNWID */
{ IW_HEADER_TYPE_PARAM, 0, 0, 0, 0, IW_DESCR_FLAG_EVENT},
/* SIOCGIWNWID */
{ IW_HEADER_TYPE_PARAM, 0, 0, 0, 0, IW_DESCR_FLAG_DUMP},
/* SIOCSIWFREQ */
{ IW_HEADER_TYPE_FREQ, 0, 0, 0, 0, IW_DESCR_FLAG_EVENT},
/* SIOCGIWFREQ */
{ IW_HEADER_TYPE_FREQ, 0, 0, 0, 0, IW_DESCR_FLAG_DUMP},
/* SIOCSIWMODE */
{ IW_HEADER_TYPE_UINT, 0, 0, 0, 0, IW_DESCR_FLAG_EVENT},
/* SIOCGIWMODE */
{ IW_HEADER_TYPE_UINT, 0, 0, 0, 0, IW_DESCR_FLAG_DUMP},
/* SIOCSIWSENS */
{ IW_HEADER_TYPE_PARAM, 0, 0, 0, 0, 0},
/* SIOCGIWSENS */
{ IW_HEADER_TYPE_PARAM, 0, 0, 0, 0, 0},
/* SIOCSIWRANGE */
{ IW_HEADER_TYPE_NULL, 0, 0, 0, 0, 0},
/* SIOCGIWRANGE */
{ IW_HEADER_TYPE_POINT, 0, 1, 0, 0, IW_DESCR_FLAG_DUMP},//sizeof(struct iw_range), IW_DESCR_FLAG_DUMP},
/* SIOCSIWPRIV */
{ IW_HEADER_TYPE_NULL, 0, 0, 0, 0, 0},
/* SIOCGIWPRIV (handled directly by us) */
{ IW_HEADER_TYPE_NULL, 0, 0, 0, 0, 0},
/* SIOCSIWSTATS */
{ IW_HEADER_TYPE_NULL, 0, 0, 0, 0, 0},
/* SIOCGIWSTATS (handled directly by us) */
{ IW_HEADER_TYPE_NULL, 0, 0, 0, 0, IW_DESCR_FLAG_DUMP},
/* SIOCSIWSPY */
{ IW_HEADER_TYPE_POINT, 0, 0, 0, 0}, //sizeof(struct sockaddr), 0, IW_MAX_SPY, 0},
/* SIOCGIWSPY */
{ IW_HEADER_TYPE_POINT, 0, 0, 0, 0},
//{ IW_HEADER_TYPE_POINT, 0, (sizeof(struct sockaddr) + sizeof(struct iw_quality)), 0, IW_MAX_GET_SPY, 0},
/* -- hole -- */
{ IW_HEADER_TYPE_NULL, 0, 0, 0, 0, 0},
/* -- hole -- */
{ IW_HEADER_TYPE_NULL, 0, 0, 0, 0, 0},
/* SIOCSIWAP */
{ IW_HEADER_TYPE_ADDR, 0, 0, 0, 0, 0},
/* SIOCGIWAP */
{ IW_HEADER_TYPE_ADDR, 0, 0, 0, 0, IW_DESCR_FLAG_DUMP},
/* -- hole -- */
{ IW_HEADER_TYPE_NULL, 0, 0, 0, 0, 0},
/* SIOCGIWAPLIST */
{ IW_HEADER_TYPE_POINT, 0, 0, 0, 0},
//{ IW_HEADER_TYPE_POINT, 0, (sizeof(struct sockaddr) + sizeof(struct iw_quality)), 0, IW_MAX_AP, 0},
/* SIOCSIWSCAN */
{ IW_HEADER_TYPE_PARAM, 0, 0, 0, 0, 0},
/* SIOCGIWSCAN */
{ IW_HEADER_TYPE_POINT, 0, 1, 0, IW_SCAN_MAX_DATA, 0},
/* SIOCSIWESSID */
{ IW_HEADER_TYPE_POINT, 0, 1, 0, IW_ESSID_MAX_SIZE + 1, IW_DESCR_FLAG_EVENT},
/* SIOCGIWESSID */
{ IW_HEADER_TYPE_POINT, 0, 1, 0, IW_ESSID_MAX_SIZE + 1, IW_DESCR_FLAG_DUMP},
/* SIOCSIWNICKN */
{ IW_HEADER_TYPE_POINT, 0, 1, 0, IW_ESSID_MAX_SIZE + 1, 0},
/* SIOCGIWNICKN */
{ IW_HEADER_TYPE_POINT, 0, 1, 0, IW_ESSID_MAX_SIZE + 1, 0},
/* -- hole -- */
{ IW_HEADER_TYPE_NULL, 0, 0, 0, 0, 0},
/* -- hole -- */
{ IW_HEADER_TYPE_NULL, 0, 0, 0, 0, 0},
/* SIOCSIWRATE */
{ IW_HEADER_TYPE_PARAM, 0, 0, 0, 0, 0},
/* SIOCGIWRATE */
{ IW_HEADER_TYPE_PARAM, 0, 0, 0, 0, 0},
/* SIOCSIWRTS */
{ IW_HEADER_TYPE_PARAM, 0, 0, 0, 0, 0},
/* SIOCGIWRTS */
{ IW_HEADER_TYPE_PARAM, 0, 0, 0, 0, 0},
/* SIOCSIWFRAG */
{ IW_HEADER_TYPE_PARAM, 0, 0, 0, 0, 0},
/* SIOCGIWFRAG */
{ IW_HEADER_TYPE_PARAM, 0, 0, 0, 0, 0},
/* SIOCSIWTXPOW */
{ IW_HEADER_TYPE_PARAM, 0, 0, 0, 0, 0},
/* SIOCGIWTXPOW */
{ IW_HEADER_TYPE_PARAM, 0, 0, 0, 0, 0},
/* SIOCSIWRETRY */
{ IW_HEADER_TYPE_PARAM, 0, 0, 0, 0, 0},
/* SIOCGIWRETRY */
{ IW_HEADER_TYPE_PARAM, 0, 0, 0, 0, 0},
/* SIOCSIWENCODE */
{ IW_HEADER_TYPE_POINT, 0, 1, 0, IW_ENCODING_TOKEN_MAX, IW_DESCR_FLAG_EVENT | IW_DESCR_FLAG_RESTRICT},
/* SIOCGIWENCODE */
{ IW_HEADER_TYPE_POINT, 0, 1, 0, IW_ENCODING_TOKEN_MAX, IW_DESCR_FLAG_DUMP | IW_DESCR_FLAG_RESTRICT},
/* SIOCSIWPOWER */
{ IW_HEADER_TYPE_PARAM, 0, 0, 0, 0, 0},
/* SIOCGIWPOWER */
{ IW_HEADER_TYPE_PARAM, 0, 0, 0, 0, 0},
};
static const int standard_ioctl_num = (sizeof(standard_ioctl) /
sizeof(struct iw_ioctl_description));
static const struct iw_ioctl_description standard_event[] = {
/* IWEVTXDROP */
{ IW_HEADER_TYPE_ADDR, 0, 0, 0, 0, 0},
/* IWEVQUAL */
{ IW_HEADER_TYPE_QUAL, 0, 0, 0, 0, 0},
/* IWEVCUSTOM */
{ IW_HEADER_TYPE_POINT, 0, 1, 0, IW_CUSTOM_MAX, 0},
/* IWEVREGISTERED */
{ IW_HEADER_TYPE_ADDR, 0, 0, 0, 0, 0},
/* IWEVEXPIRED */
{ IW_HEADER_TYPE_ADDR, 0, 0, 0, 0, 0},
};
static const int standard_event_num = (sizeof(standard_event) /
sizeof(struct iw_ioctl_description));
/* return net_device structure to SHIMD*/
struct net_device *wlan_get_net_dev()
{
return wlanpriv->wlan_dev.netdev;
}
void creat_del_evnt_flags(u8 set_reset)
{
if (!set_reset) {
tx_event_flags_delete(&wlanpriv->adapter->scan_q);
}
}
int wlan_get_scan(struct net_device *dev, struct iw_request_info *info,
struct iw_point *dwrq, struct SCAN_SSID_IE *scan_res)
{
int i, min_aps;
wlan_private *priv = dev->priv;
wlan_adapter *Adapter = priv->adapter;
ENTER();
min_aps = (dwrq->length < Adapter->ulNumOfBSSIDs) ?
dwrq->length : Adapter->ulNumOfBSSIDs;
for(i = 0; i < min_aps; i++)
{
scan_res[i].ssid_len = Adapter->BSSIDList[i].Ssid.SsidLength;
memcpy(scan_res[i].SSID, Adapter->BSSIDList[i].Ssid.Ssid,
Adapter->BSSIDList[i].Ssid.SsidLength);
memcpy(scan_res[i].BSSID, Adapter->BSSIDList[i].MacAddress,
ETH_ALEN);
memcpy(&scan_res[i].Capability, &Adapter->BSSIDList[i].Cap,sizeof(IEEEtypes_CapInfo_t));
//here copy the WPA_IE info into the structure
#ifdef WPA
memcpy(scan_res[i].WPA_IE, Adapter->BSSIDList[i].wpa_supplicant.Wpa_ie, 40);
scan_res[i].wpa_ie_len = Adapter->BSSIDList[i].wpa_supplicant.Wpa_ie_len;
#endif
}
dwrq->length = i;
LEAVE();
return 0;
}
int wlan_extscan_ioctl(wlan_private *priv,WLAN_802_11_SSID Ext_Scan_SSID )
{
SendSpecificScan(priv, &Ext_Scan_SSID);
LEAVE();
return 0;
}
int wlan_do_ioctl(struct net_device *dev, struct ifreq *req, int i)
{
return 0;
}
void os_free_tx_packet(wlan_private *priv)
{
char *pktBuf;
u32 pktLen, flags;
wlan_adapter *Adapter = priv->adapter;
/*
* we set the CurrentTxSkb = NULL before we indicate that
* the TX is complete. This fixes a problem where we have a high
* number of dropped tx packets. The dropped tx packets were being
* caused because the next tx was done in the context of the
* WlanShimDTxPktSent callup before the currentTxSkb had been
* NULLED out. Since CurrentTxSkb was non-null, the tx was dropped.
*/
spin_lock_irqsave(&Adapter->CurrentTxLock, flags);
pktBuf = Adapter->CurrentTxSkb->data;
pktLen = Adapter->CurrentTxSkb->len;
Adapter->CurrentTxSkb = NULL;
spin_unlock_irqrestore(&Adapter->CurrentTxLock, flags);
WlanShimDTxPktSent(pktBuf, pktLen);
PRINTK1("Skb Freed $$\n");
}
int CopyMulticastAddrs(wlan_adapter *Adapter, struct net_device *dev)
{
int i;
for (i = 0; i < dev->mc_count; i++) {
memcpy(&Adapter->MulticastList[i], dev->list[i], ETH_ALEN);
}
return i;
}
#ifdef WPA
int wlan_setwpaie_ioctl(wlan_private *priv, char* wpaie, int wpaie_len)
{
wlan_adapter *Adapter = priv->adapter;
int ret;
ENTER();
if(wpaie_len){
memcpy(Adapter->Wpa_ie, wpaie, wpaie_len);
Adapter->Wpa_ie_len = wpaie_len;
}else{
memset(Adapter->Wpa_ie, 0, sizeof(Adapter->Wpa_ie));
Adapter->Wpa_ie_len = wpaie_len;
Adapter->SecInfo.WPAEnabled = FALSE;
}
if (Adapter->Wpa_ie[0] == WPA_IE){
Adapter->SecInfo.WPAEnabled = TRUE;
}else {
Adapter->SecInfo.WPAEnabled = FALSE;
}
/* enable/disable RSN in firmware if WPA is enabled/disabled
* depending on variable Adapter->SecInfo.WPAEnabled is set or not
*/
ret = PrepareAndSendCommand(priv, HostCmd_CMD_802_11_ENABLE_RSN,
HostCmd_ACT_SET, HostCmd_OPTION_USE_INT
| HostCmd_OPTION_WAITFORRSP
, 0, HostCmd_PENDING_ON_NONE, NULL);
LEAVE();
return ret;
}
#endif
void wireless_send_event(struct net_device * dev,
unsigned int cmd,
union iwreq_data * wrqu,
char * extra)
{
const struct iw_ioctl_description * descr = NULL;
struct iw_event* event;
int extra_len = 0;
int event_len;
int hdr_len;
unsigned cmd_index;
printk("!!! wireless_send_event cmd = %#x !!!\n", cmd);
/* Get the description of the IOCTL */
if(cmd <= SIOCIWLAST) {
cmd_index = cmd - SIOCIWFIRST;
if(cmd_index < standard_ioctl_num)
descr = &(standard_ioctl[cmd_index]);
} else {
cmd_index = cmd - IWEVFIRST;
if(cmd_index < standard_event_num)
descr = &(standard_event[cmd_index]);
}
/* Don't accept unknown events */
if(descr == NULL) {
/* Note : we don't return an error to the driver, because
* the driver would not know what to do about it. It can't
* return an error to the user, because the event is not
* initiated by a user request.
* The best the driver could do is to log an error message.
* We will do it ourselves instead...
printk( "%s (WE) : Invalid/Unknown Wireless Event (0x%04X)\n",
dev->name, cmd);
*/
printk( "OS_MISC.c:Invalid/Unknown Wireless Event \n");
return;
}
/* Check extra parameters and set extra_len */
if(descr->header_type == IW_HEADER_TYPE_POINT) {
/* Check if number of token fits within bounds */
if(wrqu->data.length > descr->max_tokens) {
printk( " (WE) : Wireless Event too big ()\n");
return;
}
if(wrqu->data.length < descr->min_tokens) {
printk( " (WE) : Wireless Event too small ()\n");
return;
}
/* Calculate extra_len - extra is NULL for restricted events */
if(extra != NULL)
extra_len = wrqu->data.length * descr->token_size;
}
/* Total length of the event */
hdr_len = event_type_size[descr->header_type];
event_len = hdr_len + extra_len;
event = getMemory(event_len, SCRATCHALLOC);
/* Fill event */
event->len = event_len;
event->cmd = cmd;
memcpy(&event->u, wrqu, hdr_len - IW_EV_LCP_LEN);
if(extra != NULL)
memcpy(((char *)event) + hdr_len, extra, extra_len);
printk("CALLING wpa_driver_wext_event_wireless event_len = %d!!!!!\n", event_len);
#ifdef WPA
wpa_driver_wext_event_wireless(NULL, event, event_len);
#endif
agFree(event);
return; /* Always success, I guess */
}
struct net_device *init_etherdev(struct net_device * dev, int y)
{
printk(" allocation enter priv size %d %d\n", y, sizeof(wlan_private));
dev = (struct net_device *) AGMALLOC(sizeof(struct net_device), SCRATCHALLOC);
printk(" dev->priv allocation \n");
printk(" before memset wlanpriv %p\n", wlanpriv);
memset(dev ,0,sizeof(struct net_device));
printk(" between memset \n");
wlanpriv = (wlan_private *) AGMALLOC(sizeof(wlan_private),SCRATCHALLOC);
memset(wlanpriv ,0,sizeof(wlan_private));
dev->priv = wlanpriv;
printk(" After memset \n");
return(dev);
}
struct sk_buff * dev_alloc_skb( u32 len)
{
struct sk_buff *skb;
skb = (struct sk_buff *) AGMALLOC(sizeof(struct sk_buff), SCRATCHALLOC);
skb->data = (u8 *) AGMALLOC(len, SCRATCHALLOC);
INIT_LIST_HEAD(skb);
skb->tail=skb->data;
skb->len=len;
return skb;
}
void os_carrier_on(wlan_private *priv)
{
}
void os_carrier_off(wlan_private *priv)
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -