isl_ioctl.c
来自「Linux Kernel 2.6.9 for OMAP1710」· C语言 代码 · 共 2,270 行 · 第 1/5 页
C
2,270 行
*/ case DOT11_OID_DEAUTHENTICATEEX: send_formatted_event(priv, "DeAuthenticate request", mlme, 0); break; case DOT11_OID_AUTHENTICATEEX: handle_request(priv, mlme, oid); send_formatted_event(priv, "Authenticate request", mlme, 1); break; case DOT11_OID_DISASSOCIATEEX: send_formatted_event(priv, "Disassociate request", mlme, 0); break; case DOT11_OID_ASSOCIATEEX: handle_request(priv, mlme, oid); send_formatted_event(priv, "Associate request", mlme, 1); break; case DOT11_OID_REASSOCIATEEX: handle_request(priv, mlme, oid); send_formatted_event(priv, "Reassociate request", mlme, 1); break; default: return -EINVAL; } return 0;}/* * Process a device trap. This is called via schedule_work(), outside of * interrupt context, no locks held. */voidprism54_process_trap(void *data){ struct islpci_mgmtframe *frame = data; struct net_device *ndev = frame->ndev; enum oid_num_t n = mgt_oidtonum(frame->header->oid); if (n != OID_NUM_LAST) prism54_process_trap_helper(netdev_priv(ndev), n, frame->data); islpci_mgt_release(frame);}intprism54_set_mac_address(struct net_device *ndev, void *addr){ islpci_private *priv = netdev_priv(ndev); int ret; if (ndev->addr_len != 6) return -EINVAL; ret = mgt_set_request(priv, GEN_OID_MACADDRESS, 0, &((struct sockaddr *) addr)->sa_data); if (!ret) memcpy(priv->ndev->dev_addr, &((struct sockaddr *) addr)->sa_data, 6); return ret;}intprism54_set_wpa(struct net_device *ndev, struct iw_request_info *info, __u32 * uwrq, char *extra){ islpci_private *priv = netdev_priv(ndev); down_write(&priv->mib_sem); priv->wpa = *uwrq; if (priv->wpa) { u32 l = DOT11_MLME_EXTENDED; mgt_set(priv, DOT11_OID_MLMEAUTOLEVEL, &l); } /* restart the card with new level. Needed ? */ mgt_commit(priv); up_write(&priv->mib_sem); return 0;}intprism54_get_wpa(struct net_device *ndev, struct iw_request_info *info, __u32 * uwrq, char *extra){ islpci_private *priv = netdev_priv(ndev); *uwrq = priv->wpa; return 0;}intprism54_set_prismhdr(struct net_device *ndev, struct iw_request_info *info, __u32 * uwrq, char *extra){ islpci_private *priv = netdev_priv(ndev); priv->monitor_type = (*uwrq ? ARPHRD_IEEE80211_PRISM : ARPHRD_IEEE80211); if (priv->iw_mode == IW_MODE_MONITOR) priv->ndev->type = priv->monitor_type; return 0;}intprism54_get_prismhdr(struct net_device *ndev, struct iw_request_info *info, __u32 * uwrq, char *extra){ islpci_private *priv = netdev_priv(ndev); *uwrq = (priv->monitor_type == ARPHRD_IEEE80211_PRISM); return 0;}intprism54_debug_oid(struct net_device *ndev, struct iw_request_info *info, __u32 * uwrq, char *extra){ islpci_private *priv = netdev_priv(ndev); priv->priv_oid = *uwrq; printk("%s: oid 0x%08X\n", ndev->name, *uwrq); return 0;}intprism54_debug_get_oid(struct net_device *ndev, struct iw_request_info *info, struct iw_point *data, char *extra){ islpci_private *priv = netdev_priv(ndev); struct islpci_mgmtframe *response = NULL; int ret = -EIO; printk("%s: get_oid 0x%08X\n", ndev->name, priv->priv_oid); data->length = 0; if (islpci_get_state(priv) >= PRV_STATE_INIT) { ret = islpci_mgt_transaction(priv->ndev, PIMFOR_OP_GET, priv->priv_oid, extra, 256, &response); printk("%s: ret: %i\n", ndev->name, ret); if (ret || !response || response->header->operation == PIMFOR_OP_ERROR) { if (response) { islpci_mgt_release(response); } printk("%s: EIO\n", ndev->name); ret = -EIO; } if (!ret) { data->length = response->header->length; memcpy(extra, response->data, data->length); islpci_mgt_release(response); printk("%s: len: %i\n", ndev->name, data->length); } } return ret;}intprism54_debug_set_oid(struct net_device *ndev, struct iw_request_info *info, struct iw_point *data, char *extra){ islpci_private *priv = netdev_priv(ndev); struct islpci_mgmtframe *response = NULL; int ret = 0, response_op = PIMFOR_OP_ERROR; printk("%s: set_oid 0x%08X\tlen: %d\n", ndev->name, priv->priv_oid, data->length); if (islpci_get_state(priv) >= PRV_STATE_INIT) { ret = islpci_mgt_transaction(priv->ndev, PIMFOR_OP_SET, priv->priv_oid, extra, data->length, &response); printk("%s: ret: %i\n", ndev->name, ret); if (ret || !response || response->header->operation == PIMFOR_OP_ERROR) { if (response) { islpci_mgt_release(response); } printk("%s: EIO\n", ndev->name); ret = -EIO; } if (!ret) { response_op = response->header->operation; printk("%s: response_op: %i\n", ndev->name, response_op); islpci_mgt_release(response); } } return (ret ? ret : -EINPROGRESS);}static intprism54_set_spy(struct net_device *ndev, struct iw_request_info *info, union iwreq_data *uwrq, char *extra){ islpci_private *priv = netdev_priv(ndev); u32 u, oid = OID_INL_CONFIG; down_write(&priv->mib_sem); mgt_get(priv, OID_INL_CONFIG, &u); if ((uwrq->data.length == 0) && (priv->spy_data.spy_number > 0)) /* disable spy */ u &= ~INL_CONFIG_RXANNEX; else if ((uwrq->data.length > 0) && (priv->spy_data.spy_number == 0)) /* enable spy */ u |= INL_CONFIG_RXANNEX; mgt_set(priv, OID_INL_CONFIG, &u); mgt_commit_list(priv, &oid, 1); up_write(&priv->mib_sem); return iw_handler_set_spy(ndev, info, uwrq, extra);}static const iw_handler prism54_handler[] = { (iw_handler) prism54_commit, /* SIOCSIWCOMMIT */ (iw_handler) prism54_get_name, /* SIOCGIWNAME */ (iw_handler) NULL, /* SIOCSIWNWID */ (iw_handler) NULL, /* SIOCGIWNWID */ (iw_handler) prism54_set_freq, /* SIOCSIWFREQ */ (iw_handler) prism54_get_freq, /* SIOCGIWFREQ */ (iw_handler) prism54_set_mode, /* SIOCSIWMODE */ (iw_handler) prism54_get_mode, /* SIOCGIWMODE */ (iw_handler) prism54_set_sens, /* SIOCSIWSENS */ (iw_handler) prism54_get_sens, /* SIOCGIWSENS */ (iw_handler) NULL, /* SIOCSIWRANGE */ (iw_handler) prism54_get_range, /* SIOCGIWRANGE */ (iw_handler) NULL, /* SIOCSIWPRIV */ (iw_handler) NULL, /* SIOCGIWPRIV */ (iw_handler) NULL, /* SIOCSIWSTATS */ (iw_handler) NULL, /* SIOCGIWSTATS */ prism54_set_spy, /* SIOCSIWSPY */ iw_handler_get_spy, /* SIOCGIWSPY */ iw_handler_set_thrspy, /* SIOCSIWTHRSPY */ iw_handler_get_thrspy, /* SIOCGIWTHRSPY */ (iw_handler) prism54_set_wap, /* SIOCSIWAP */ (iw_handler) prism54_get_wap, /* SIOCGIWAP */ (iw_handler) NULL, /* -- hole -- */ (iw_handler) NULL, /* SIOCGIWAPLIST depreciated */ (iw_handler) prism54_set_scan, /* SIOCSIWSCAN */ (iw_handler) prism54_get_scan, /* SIOCGIWSCAN */ (iw_handler) prism54_set_essid, /* SIOCSIWESSID */ (iw_handler) prism54_get_essid, /* SIOCGIWESSID */ (iw_handler) prism54_set_nick, /* SIOCSIWNICKN */ (iw_handler) prism54_get_nick, /* SIOCGIWNICKN */ (iw_handler) NULL, /* -- hole -- */ (iw_handler) NULL, /* -- hole -- */ (iw_handler) prism54_set_rate, /* SIOCSIWRATE */ (iw_handler) prism54_get_rate, /* SIOCGIWRATE */ (iw_handler) prism54_set_rts, /* SIOCSIWRTS */ (iw_handler) prism54_get_rts, /* SIOCGIWRTS */ (iw_handler) prism54_set_frag, /* SIOCSIWFRAG */ (iw_handler) prism54_get_frag, /* SIOCGIWFRAG */ (iw_handler) prism54_set_txpower, /* SIOCSIWTXPOW */ (iw_handler) prism54_get_txpower, /* SIOCGIWTXPOW */ (iw_handler) prism54_set_retry, /* SIOCSIWRETRY */ (iw_handler) prism54_get_retry, /* SIOCGIWRETRY */ (iw_handler) prism54_set_encode, /* SIOCSIWENCODE */ (iw_handler) prism54_get_encode, /* SIOCGIWENCODE */ (iw_handler) NULL, /* SIOCSIWPOWER */ (iw_handler) NULL, /* SIOCGIWPOWER */};/* The low order bit identify a SET (0) or a GET (1) ioctl. */#define PRISM54_RESET SIOCIWFIRSTPRIV#define PRISM54_GET_POLICY SIOCIWFIRSTPRIV+1#define PRISM54_SET_POLICY SIOCIWFIRSTPRIV+2#define PRISM54_GET_MAC SIOCIWFIRSTPRIV+3#define PRISM54_ADD_MAC SIOCIWFIRSTPRIV+4#define PRISM54_DEL_MAC SIOCIWFIRSTPRIV+6#define PRISM54_KICK_MAC SIOCIWFIRSTPRIV+8#define PRISM54_KICK_ALL SIOCIWFIRSTPRIV+10#define PRISM54_GET_WPA SIOCIWFIRSTPRIV+11#define PRISM54_SET_WPA SIOCIWFIRSTPRIV+12#define PRISM54_DBG_OID SIOCIWFIRSTPRIV+14#define PRISM54_DBG_GET_OID SIOCIWFIRSTPRIV+15#define PRISM54_DBG_SET_OID SIOCIWFIRSTPRIV+16#define PRISM54_GET_OID SIOCIWFIRSTPRIV+17#define PRISM54_SET_OID_U32 SIOCIWFIRSTPRIV+18#define PRISM54_SET_OID_STR SIOCIWFIRSTPRIV+20#define PRISM54_SET_OID_ADDR SIOCIWFIRSTPRIV+22#define PRISM54_GET_PRISMHDR SIOCIWFIRSTPRIV+23#define PRISM54_SET_PRISMHDR SIOCIWFIRSTPRIV+24#define IWPRIV_SET_U32(n,x) { n, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "s_"x }#define IWPRIV_SET_SSID(n,x) { n, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | 1, 0, "s_"x }#define IWPRIV_SET_ADDR(n,x) { n, IW_PRIV_TYPE_ADDR | IW_PRIV_SIZE_FIXED | 1, 0, "s_"x }#define IWPRIV_GET(n,x) { n, 0, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | PRIV_STR_SIZE, "g_"x }#define IWPRIV_U32(n,x) IWPRIV_SET_U32(n,x), IWPRIV_GET(n,x)#define IWPRIV_SSID(n,x) IWPRIV_SET_SSID(n,x), IWPRIV_GET(n,x)#define IWPRIV_ADDR(n,x) IWPRIV_SET_ADDR(n,x), IWPRIV_GET(n,x)/* Note : limited to 128 private ioctls (wireless tools 26) */static const struct iw_priv_args prism54_private_args[] = {/*{ cmd, set_args, get_args, name } */ {PRISM54_RESET, 0, 0, "reset"}, {PRISM54_GET_PRISMHDR, 0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "get_prismhdr"}, {PRISM54_SET_PRISMHDR, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "set_prismhdr"}, {PRISM54_GET_POLICY, 0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getPolicy"}, {PRISM54_SET_POLICY, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "setPolicy"}, {PRISM54_GET_MAC, 0, IW_PRIV_TYPE_ADDR | 64, "getMac"}, {PRISM54_ADD_MAC, IW_PRIV_TYPE_ADDR | IW_PRIV_SIZE_FIXED | 1, 0, "addMac"}, {PRISM54_DEL_MAC, IW_PRIV_TYPE_ADDR | IW_PRIV_SIZE_FIXED | 1, 0, "delMac"}, {PRISM54_KICK_MAC, IW_PRIV_TYPE_ADDR | IW_PRIV_SIZE_FIXED | 1, 0, "kickMac"}, {PRISM54_KICK_ALL, 0, 0, "kickAll"}, {PRISM54_GET_WPA, 0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "get_wpa"}, {PRISM54_SET_WPA, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "set_wpa"}, {PRISM54_DBG_OID, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "dbg_oid"}, {PRISM54_DBG_GET_OID, 0, IW_PRIV_TYPE_BYTE | 256, "dbg_get_oid"}, {PRISM54_DBG_SET_OID, IW_PRIV_TYPE_BYTE | 256, 0, "dbg_set_oid"}, /* --- sub-ioctls handlers --- */ {PRISM54_GET_OID, 0, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | PRIV_STR_SIZE, ""}, {PRISM54_SET_OID_U32, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, ""}, {PRISM54_SET_OID_STR, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | 1, 0, ""}, {PRISM54_SET_OID_ADDR, IW_PRIV_TYPE_ADDR | IW_PRIV_SIZE_FIXED | 1, 0, ""}, /* --- sub-ioctls definitions --- */ IWPRIV_ADDR(GEN_OID_MACADDRESS, "addr"), IWPRIV_GET(GEN_OID_LINKSTATE, "linkstate"), IWPRIV_U32(DOT11_OID_BSSTYPE, "bsstype"), IWPRIV_ADDR(DOT11_OID_BSSID, "bssid"), IWPRIV_U32(DOT11_OID_STATE, "state"), IWPRIV_U32(DOT11_OID_AID, "aid"), IWPRIV_SSID(DOT11_OID_SSIDOVERRIDE, "ssidoverride"), IWPRIV_U32(DOT11_OID_MEDIUMLIMIT, "medlimit"), IWPRIV_U32(DOT11_OID_BEACONPERIOD, "beacon"), IWPRIV_U32(DOT11_OID_DTIMPERIOD, "dtimperiod"), IWPRIV_U32(DOT11_OID_AUTHENABLE, "authenable"), IWPRIV_U32(DOT11_OID_PRIVACYINVOKED, "privinvok"), IWPRIV_U32(DOT11_OID_EXUNENCRYPTED, "exunencrypt"), IWPRIV_U32(DOT11_OID_REKEYTHRESHOLD, "rekeythresh"), IWPRIV_U32(DOT11_OID_MAXTXLIFETIME, "maxtxlife"), IWPRIV_U32(DOT11_OID_MAXRXLIFETIME, "maxrxlife"), IWPRIV_U32(DOT11_OID_ALOFT_FIXEDRATE, "fixedrate"), IWPRIV_U32(DOT11_OID_MAXFRAMEBURST, "frameburst"), IWPRIV_U32(DOT11_OID_PSM, "psm"), IWPRIV_U32(DOT11_OID_BRIDGELOCAL, "bridge"), IWPRIV_U32(DOT11_OID_CLIENTS, "clients"), IWPRIV_U32(DOT11_OID_CLIENTSASSOCIATED, "clientassoc"), IWPRIV_U32(DOT11_OID_DOT1XENABLE, "dot1xenable"), IWPRIV_U32(DOT11_OID_ANTENNARX, "rxant"), IWPRIV_U32(DOT11_OID_ANTENNATX, "txant"), IWPRIV_U32(DOT11_OID_ANTENNADIVERSITY, "antdivers"), IWPRIV_U32(DOT11_OID_EDTHRESHOLD, "edthresh"), IWPRIV_U32(DOT11_OID_PREAMBLESETTINGS, "preamble"), IWPRIV_GET(DOT11_OID_RATES, "rates"), IWPRIV_U32(DOT11_OID_OUTPUTPOWER, ".11outpower"), IWPRIV_GET(DOT11_OID_SUPPORTEDRATES, "supprates"), IWPRIV_GET(DOT11_OID_SUPPORTEDFREQUENCIES, "suppfreq"), IWPRIV_U32(DOT11_OID_NOISEFLOOR, "noisefloor"), IWPRIV_GET(DOT11_OID_FREQUENCYACTIVITY, "freqactivity"), IWPRIV_U32(DOT11_OID_NONERPPROTECTION, "nonerpprotec"), IWPRIV_U32(DOT11_OID_PROFILES, "profile"), IWPRIV_GET(DOT11_OID_EXTENDEDRATES, "extrates"), IWPRIV_U32(DOT11_OID_MLMEAUTOLEVEL, "mlmelevel"), IWPRIV_GET(DOT11_OID_BSSS, "bsss"), IWPRIV_GET(DOT11_OID_BSSLIST, "bsslist"), IWPRIV_U32(OID_INL_MODE, "mode"), IWPRIV_U32(OID_INL_CONFIG, "config"), IWPRIV_U32(OID_INL_DOT11D_CONFORMANCE, ".11dconform"), IWPRIV_GET(OID_INL_PHYCAPABILITIES, "phycapa"), IWPRIV_U32(OID_INL_OUTPUTPOWER, "outpower"),};static const iw_handler prism54_private_handler[] = { (iw_handler) prism54_reset, (iw_handler) prism54_get_policy, (iw_handler) prism54_set_policy, (iw_handler) prism54_get_mac, (iw_handler) prism54_add_mac, (iw_handler) NULL, (iw_handler) prism54_del_mac, (iw_handler) NULL, (iw_handler) prism54_kick_mac, (iw_handler) NULL, (iw_handler) prism54_kick_all, (iw_handler) prism54_get_wpa, (iw_handler) prism54_set_wpa, (iw_handler) NULL, (iw_handler) prism54_debug_oid, (iw_handler) prism54_debug_get_oid, (iw_handler) prism54_debug_set_oid, (iw_handler) prism54_get_oid, (iw_handler) prism54_set_u32, (iw_handler) NULL, (iw_handler) prism54_set_raw, (iw_handler) NULL, (iw_handler) prism54_set_raw, (iw_handler) prism54_get_prismhdr, (iw_handler) prism54_set_prismhdr,};const struct iw_handler_def prism54_handler_def = { .num_standard = sizeof (prism54_handler) / sizeof (iw_handler), .num_private = sizeof (prism54_private_handler) / sizeof (iw_handler), .num_private_args = sizeof (prism54_private_args) / sizeof (struct iw_priv_args), .standard = (iw_handler *) prism54_handler, .private = (iw_handler *) prism54_private_handler, .private_args = (struct iw_priv_args *) prism54_private_args, .spy_offset = offsetof(islpci_private, spy_data),};/* For ioctls that don't work with the new API */intprism54_ioctl(struct net_device *ndev, struct ifreq *rq, int cmd){ return -EOPNOTSUPP;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?