| /* |
| * Copyright (c) 2007-2008 Atheros Communications Inc. |
| * |
| * Permission to use, copy, modify, and/or distribute this software for any |
| * purpose with or without fee is hereby granted, provided that the above |
| * copyright notice and this permission notice appear in all copies. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
| * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
| * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
| * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
| * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
| * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
| * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
| */ |
| /* */ |
| /* Module Name : wrap_ev.c */ |
| /* */ |
| /* Abstract */ |
| /* This module contains wrapper functions for events */ |
| /* */ |
| /* NOTES */ |
| /* Platform dependent. */ |
| /* */ |
| /************************************************************************/ |
| |
| #include "oal_dt.h" |
| #include "usbdrv.h" |
| |
| #include <linux/netlink.h> |
| #include <net/iw_handler.h> |
| |
| |
| /***** Management *****/ |
| u16_t zfLnxAuthNotify(zdev_t *dev, u16_t *macAddr) |
| { |
| return 0; |
| } |
| |
| u16_t zfLnxAsocNotify(zdev_t *dev, u16_t *macAddr, u8_t *body, u16_t bodySize, |
| u16_t port) |
| { |
| /* #ifdef ZM_HOSTAPD_SUPPORT */ |
| struct usbdrv_private *macp = dev->ml_priv; |
| union iwreq_data wreq; |
| u8_t *addr = (u8_t *) macAddr; |
| u16_t i, j; |
| |
| memset(&wreq, 0, sizeof(wreq)); |
| memcpy(wreq.addr.sa_data, macAddr, ETH_ALEN); |
| wreq.addr.sa_family = ARPHRD_ETHER; |
| printk(KERN_DEBUG "join_event of MAC: %02x:%02x:%02x:%02x:%02x:%02x\n", |
| addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]); |
| |
| for (i = 0; i < ZM_OAL_MAX_STA_SUPPORT; i++) { |
| for (j = 0; j < IEEE80211_ADDR_LEN; j++) { |
| if ((macp->stawpaie[i].wpa_macaddr[j] != 0) && |
| (macp->stawpaie[i].wpa_macaddr[j] != addr[j])) |
| break; |
| } |
| if (j == 6) |
| break; |
| } |
| if (i < ZM_OAL_MAX_STA_SUPPORT) { |
| /* |
| * printk("zfwAsocNotify - store wpa ie in macp, |
| * index = %d\n", i); |
| */ |
| memcpy(macp->stawpaie[i].wpa_macaddr, macAddr, |
| IEEE80211_ADDR_LEN); |
| memcpy(macp->stawpaie[i].wpa_ie, body, bodySize); |
| } |
| /* |
| * if(macp->cardSetting.BssType == INFRASTRUCTURE_BSS) { |
| * wireless_send_event(macp->device, SIOCGIWSCAN, &wreq, NULL); |
| * wireless_send_event(macp->device, SIOCGIWAP, &wreq, NULL); |
| * } |
| * else if(macp->cardSetting.BssType == AP_BSS) { |
| * if (port == 0) |
| * { |
| */ |
| wireless_send_event(dev, IWEVREGISTERED, &wreq, NULL); |
| /* |
| * } |
| * else |
| * { |
| * Check whether the VAP device is valid |
| * if (vap[port].dev != NULL) |
| * { |
| * wireless_send_event(vap[port].dev, |
| * IWEVREGISTERED, &wreq, NULL); |
| * } |
| * else |
| * { |
| * printk(KERN_ERR "Can' find a valid VAP device, |
| * port: %d\n", port); |
| * } |
| * } |
| * } |
| */ |
| /* #endif */ |
| |
| return 0; |
| } |
| |
| |
| /* Notification that a STA is disassociated from AP */ |
| /* AP mode only */ |
| u16_t zfLnxDisAsocNotify(zdev_t *dev, u8_t *macAddr, u16_t port) |
| { |
| union iwreq_data wreq; |
| u8_t *addr = (u8_t *) macAddr; |
| |
| memset(&wreq, 0, sizeof(wreq)); |
| memcpy(wreq.addr.sa_data, macAddr, ETH_ALEN); |
| wreq.addr.sa_family = ARPHRD_ETHER; |
| printk(KERN_DEBUG "zfwDisAsocNotify(), MAC: %02x:%02x:%02x:%02x:%02x:%02x\n", |
| addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]); |
| |
| |
| return 0; |
| } |
| |
| /* Notification that a STA is connect to AP */ |
| /* AP mode only */ |
| u16_t zfLnxApConnectNotify(zdev_t *dev, u8_t *macAddr, u16_t port) |
| { |
| union iwreq_data wreq; |
| u8_t *addr = (u8_t *) macAddr; |
| |
| memset(&wreq, 0, sizeof(wreq)); |
| memcpy(wreq.addr.sa_data, macAddr, ETH_ALEN); |
| wreq.addr.sa_family = ARPHRD_ETHER; |
| printk(KERN_DEBUG "zfwApConnectNotify(), MAC: %02x:%02x:%02x:%02x:%02x:%02x\n", |
| addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]); |
| |
| |
| return 0; |
| } |
| |
| |
| |
| void zfLnxConnectNotify(zdev_t *dev, u16_t status, u16_t *bssid) |
| { |
| union iwreq_data wreq; |
| u8_t *addr = (u8_t *) bssid; |
| struct usbdrv_private *macp = dev->ml_priv; |
| |
| if (bssid != NULL) { |
| memset(&wreq, 0, sizeof(wreq)); |
| if (status == ZM_STATUS_MEDIA_CONNECT) |
| memcpy(wreq.addr.sa_data, bssid, ETH_ALEN); |
| wreq.addr.sa_family = ARPHRD_ETHER; |
| |
| if (status == ZM_STATUS_MEDIA_CONNECT) { |
| #ifdef ZM_CONFIG_BIG_ENDIAN |
| printk(KERN_DEBUG "Connected to AP, MAC:" |
| "%02x:%02x:%02x:%02x:%02x:%02x\n", |
| addr[1], addr[0], addr[3], addr[2], |
| addr[5], addr[4]); |
| #else |
| printk(KERN_DEBUG "Connected to AP, MAC:" |
| "%02x:%02x:%02x:%02x:%02x:%02x\n", |
| addr[0], addr[1], addr[2], addr[3], |
| addr[4], addr[5]); |
| #endif |
| |
| netif_start_queue(dev); |
| } else if ((status == ZM_STATUS_MEDIA_DISCONNECT) || |
| (status == ZM_STATUS_MEDIA_DISABLED) || |
| (status == ZM_STATUS_MEDIA_CONNECTION_DISABLED) || |
| (status == ZM_STATUS_MEDIA_CONNECTION_RESET) || |
| (status == ZM_STATUS_MEDIA_RESET) || |
| (status == ZM_STATUS_MEDIA_DISCONNECT_DEAUTH) || |
| (status == ZM_STATUS_MEDIA_DISCONNECT_DISASOC) || |
| (status == ZM_STATUS_MEDIA_DISCONNECT_BEACON_MISS) || |
| (status == ZM_STATUS_MEDIA_DISCONNECT_NOT_FOUND) || |
| (status == ZM_STATUS_MEDIA_DISCONNECT_TIMEOUT)) { |
| printk(KERN_DEBUG "Disconnection Notify\n"); |
| |
| netif_stop_queue(dev); |
| } |
| |
| /* Save the connected status */ |
| macp->adapterState = status; |
| |
| if (zfiWlanQueryWlanMode(dev) == ZM_MODE_INFRASTRUCTURE) { |
| /*wireless_send_event(dev, SIOCGIWSCAN, &wreq, NULL);*/ |
| wireless_send_event(dev, SIOCGIWAP, &wreq, NULL); |
| } else if (zfiWlanQueryWlanMode(dev) == ZM_MODE_AP) { |
| /* |
| * if (port == 0) |
| * { |
| * wireless_send_event(dev, IWEVREGISTERED, |
| * &wreq, NULL); |
| * } |
| * else |
| * { |
| * Check whether the VAP device is valid |
| * if (vap[port].dev != NULL) |
| * { |
| * wireless_send_event(vap[port].dev, |
| * IWEVREGISTERED, &wreq, NULL); |
| * } |
| * else |
| * { |
| * printk(KERN_ERR "Can' find a valid VAP" |
| * " device, port: %d\n", port); |
| * } |
| * } |
| */ |
| } |
| } |
| /* return 0; */ |
| } |
| |
| void zfLnxScanNotify(zdev_t *dev, struct zsScanResult *result) |
| { |
| return; |
| } |
| |
| void zfLnxStatisticsNotify(zdev_t *dev, struct zsStastics *result) |
| { |
| return; |
| } |
| |
| /* void zfwMicFailureNotify(zdev_t *dev, u8_t *message, u16_t event) */ |
| void zfLnxMicFailureNotify(zdev_t *dev, u16_t *addr, u16_t status) |
| { |
| static const char *tag = "MLME-MICHAELMICFAILURE.indication"; |
| union iwreq_data wrqu; |
| char buf[128]; |
| |
| /* TODO: needed parameters: count, type, src address */ |
| /* |
| * snprintf(buf, sizeof(buf), "%s(%scast addr=%s)", tag, |
| * (status == ZM_MIC_GROUP_ERROR) ? "broad" : "uni", |
| * ether_sprintf((u8_t *)addr)); |
| */ |
| |
| if (zfiWlanQueryWlanMode(dev) == ZM_MODE_INFRASTRUCTURE) |
| strcpy(buf, tag); |
| |
| memset(&wrqu, 0, sizeof(wrqu)); |
| wrqu.data.length = strlen(buf); |
| wireless_send_event(dev, IWEVCUSTOM, &wrqu, buf); |
| } |
| |
| |
| void zfLnxApMicFailureNotify(zdev_t *dev, u8_t *addr, zbuf_t *buf) |
| { |
| union iwreq_data wreq; |
| |
| memset(&wreq, 0, sizeof(wreq)); |
| memcpy(wreq.addr.sa_data, addr, ETH_ALEN); |
| wreq.addr.sa_family = ARPHRD_ETHER; |
| printk(KERN_DEBUG "zfwApMicFailureNotify(), " |
| "MAC: %02x:%02x:%02x:%02x:%02x:%02x\n", |
| addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]); |
| |
| return; |
| } |
| /* |
| * status = 0 => partner lost |
| * = 1 => partner alive |
| * void zfwIbssPartnerNotify(zdev_t* dev, u8_t status) |
| */ |
| void zfLnxIbssPartnerNotify(zdev_t *dev, u16_t status, |
| struct zsPartnerNotifyEvent *event) |
| { |
| } |
| |
| void zfLnxMacAddressNotify(zdev_t *dev, u8_t *addr) |
| { |
| dev->dev_addr[0] = addr[0]; |
| dev->dev_addr[1] = addr[1]; |
| dev->dev_addr[2] = addr[2]; |
| dev->dev_addr[3] = addr[3]; |
| dev->dev_addr[4] = addr[4]; |
| dev->dev_addr[5] = addr[5]; |
| } |
| |
| void zfLnxSendCompleteIndication(zdev_t *dev, zbuf_t *buf) |
| { |
| } |
| |
| |
| void zfLnxRestoreBufData(zdev_t *dev, zbuf_t *buf) |
| { |
| |
| } |
| /* Leave an empty line below to remove warning message on some compiler */ |