📄 ray_cs.c
字号:
memcpy_toio(&ptx->var, data + ETH_HLEN, len - ETH_HLEN); return 0 - ETH_HLEN; } /* TBD do other frame types */} /* end translate_frame *//*===========================================================================*/static void ray_build_header(ray_dev_t *local, struct tx_msg __iomem *ptx, UCHAR msg_type, unsigned char *data){ writeb(PROTOCOL_VER | msg_type, &ptx->mac.frame_ctl_1);/*** IEEE 802.11 Address field assignments ************* TODS FROMDS addr_1 addr_2 addr_3 addr_4Adhoc 0 0 dest src (terminal) BSSID N/AAP to Terminal 0 1 dest AP(BSSID) source N/ATerminal to AP 1 0 AP(BSSID) src (terminal) dest N/AAP to AP 1 1 dest AP src AP dest source *******************************************************/ if (local->net_type == ADHOC) { writeb(0, &ptx->mac.frame_ctl_2); memcpy_toio(ptx->mac.addr_1, ((struct ethhdr *)data)->h_dest, 2 * ADDRLEN); memcpy_toio(ptx->mac.addr_3, local->bss_id, ADDRLEN); } else /* infrastructure */ { if (local->sparm.b4.a_acting_as_ap_status) { writeb(FC2_FROM_DS, &ptx->mac.frame_ctl_2); memcpy_toio(ptx->mac.addr_1, ((struct ethhdr *)data)->h_dest, ADDRLEN); memcpy_toio(ptx->mac.addr_2, local->bss_id, 6); memcpy_toio(ptx->mac.addr_3, ((struct ethhdr *)data)->h_source, ADDRLEN); } else /* Terminal */ { writeb(FC2_TO_DS, &ptx->mac.frame_ctl_2); memcpy_toio(ptx->mac.addr_1, local->bss_id, ADDRLEN); memcpy_toio(ptx->mac.addr_2, ((struct ethhdr *)data)->h_source, ADDRLEN); memcpy_toio(ptx->mac.addr_3, ((struct ethhdr *)data)->h_dest, ADDRLEN); } }} /* end encapsulate_frame *//*===========================================================================*/static void netdev_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info){ strcpy(info->driver, "ray_cs");}static struct ethtool_ops netdev_ethtool_ops = { .get_drvinfo = netdev_get_drvinfo,};/*====================================================================*//*------------------------------------------------------------------*//* * Wireless Handler : get protocol name */static int ray_get_name(struct net_device *dev, struct iw_request_info *info, char *cwrq, char *extra){ strcpy(cwrq, "IEEE 802.11-FH"); return 0;}/*------------------------------------------------------------------*//* * Wireless Handler : set frequency */static int ray_set_freq(struct net_device *dev, struct iw_request_info *info, struct iw_freq *fwrq, char *extra){ ray_dev_t *local = (ray_dev_t *)dev->priv; int err = -EINPROGRESS; /* Call commit handler */ /* Reject if card is already initialised */ if(local->card_status != CARD_AWAITING_PARAM) return -EBUSY; /* Setting by channel number */ if ((fwrq->m > USA_HOP_MOD) || (fwrq->e > 0)) err = -EOPNOTSUPP; else local->sparm.b5.a_hop_pattern = fwrq->m; return err;} /*------------------------------------------------------------------*//* * Wireless Handler : get frequency */static int ray_get_freq(struct net_device *dev, struct iw_request_info *info, struct iw_freq *fwrq, char *extra){ ray_dev_t *local = (ray_dev_t *)dev->priv; fwrq->m = local->sparm.b5.a_hop_pattern; fwrq->e = 0; return 0;}/*------------------------------------------------------------------*//* * Wireless Handler : set ESSID */static int ray_set_essid(struct net_device *dev, struct iw_request_info *info, struct iw_point *dwrq, char *extra){ ray_dev_t *local = (ray_dev_t *)dev->priv; /* Reject if card is already initialised */ if(local->card_status != CARD_AWAITING_PARAM) return -EBUSY; /* Check if we asked for `any' */ if(dwrq->flags == 0) { /* Corey : can you do that ? */ return -EOPNOTSUPP; } else { /* Check the size of the string */ if(dwrq->length > IW_ESSID_MAX_SIZE + 1) { return -E2BIG; } /* Set the ESSID in the card */ memset(local->sparm.b5.a_current_ess_id, 0, IW_ESSID_MAX_SIZE); memcpy(local->sparm.b5.a_current_ess_id, extra, dwrq->length); } return -EINPROGRESS; /* Call commit handler */}/*------------------------------------------------------------------*//* * Wireless Handler : get ESSID */static int ray_get_essid(struct net_device *dev, struct iw_request_info *info, struct iw_point *dwrq, char *extra){ ray_dev_t *local = (ray_dev_t *)dev->priv; /* Get the essid that was set */ memcpy(extra, local->sparm.b5.a_current_ess_id, IW_ESSID_MAX_SIZE); extra[IW_ESSID_MAX_SIZE] = '\0'; /* Push it out ! */ dwrq->length = strlen(extra) + 1; dwrq->flags = 1; /* active */ return 0;}/*------------------------------------------------------------------*//* * Wireless Handler : get AP address */static int ray_get_wap(struct net_device *dev, struct iw_request_info *info, struct sockaddr *awrq, char *extra){ ray_dev_t *local = (ray_dev_t *)dev->priv; memcpy(awrq->sa_data, local->bss_id, ETH_ALEN); awrq->sa_family = ARPHRD_ETHER; return 0;}/*------------------------------------------------------------------*//* * Wireless Handler : set Bit-Rate */static int ray_set_rate(struct net_device *dev, struct iw_request_info *info, struct iw_param *vwrq, char *extra){ ray_dev_t *local = (ray_dev_t *)dev->priv; /* Reject if card is already initialised */ if(local->card_status != CARD_AWAITING_PARAM) return -EBUSY; /* Check if rate is in range */ if((vwrq->value != 1000000) && (vwrq->value != 2000000)) return -EINVAL; /* Hack for 1.5 Mb/s instead of 2 Mb/s */ if((local->fw_ver == 0x55) && /* Please check */ (vwrq->value == 2000000)) local->net_default_tx_rate = 3; else local->net_default_tx_rate = vwrq->value/500000; return 0;}/*------------------------------------------------------------------*//* * Wireless Handler : get Bit-Rate */static int ray_get_rate(struct net_device *dev, struct iw_request_info *info, struct iw_param *vwrq, char *extra){ ray_dev_t *local = (ray_dev_t *)dev->priv; if(local->net_default_tx_rate == 3) vwrq->value = 2000000; /* Hum... */ else vwrq->value = local->net_default_tx_rate * 500000; vwrq->fixed = 0; /* We are in auto mode */ return 0;}/*------------------------------------------------------------------*//* * Wireless Handler : set RTS threshold */static int ray_set_rts(struct net_device *dev, struct iw_request_info *info, struct iw_param *vwrq, char *extra){ ray_dev_t *local = (ray_dev_t *)dev->priv; int rthr = vwrq->value; /* Reject if card is already initialised */ if(local->card_status != CARD_AWAITING_PARAM) return -EBUSY; /* if(wrq->u.rts.fixed == 0) we should complain */ if(vwrq->disabled) rthr = 32767; else { if((rthr < 0) || (rthr > 2347)) /* What's the max packet size ??? */ return -EINVAL; } local->sparm.b5.a_rts_threshold[0] = (rthr >> 8) & 0xFF; local->sparm.b5.a_rts_threshold[1] = rthr & 0xFF; return -EINPROGRESS; /* Call commit handler */}/*------------------------------------------------------------------*//* * Wireless Handler : get RTS threshold */static int ray_get_rts(struct net_device *dev, struct iw_request_info *info, struct iw_param *vwrq, char *extra){ ray_dev_t *local = (ray_dev_t *)dev->priv; vwrq->value = (local->sparm.b5.a_rts_threshold[0] << 8) + local->sparm.b5.a_rts_threshold[1]; vwrq->disabled = (vwrq->value == 32767); vwrq->fixed = 1; return 0;}/*------------------------------------------------------------------*//* * Wireless Handler : set Fragmentation threshold */static int ray_set_frag(struct net_device *dev, struct iw_request_info *info, struct iw_param *vwrq, char *extra){ ray_dev_t *local = (ray_dev_t *)dev->priv; int fthr = vwrq->value; /* Reject if card is already initialised */ if(local->card_status != CARD_AWAITING_PARAM) return -EBUSY; /* if(wrq->u.frag.fixed == 0) should complain */ if(vwrq->disabled) fthr = 32767; else { if((fthr < 256) || (fthr > 2347)) /* To check out ! */ return -EINVAL; } local->sparm.b5.a_frag_threshold[0] = (fthr >> 8) & 0xFF; local->sparm.b5.a_frag_threshold[1] = fthr & 0xFF; return -EINPROGRESS; /* Call commit handler */}/*------------------------------------------------------------------*//* * Wireless Handler : get Fragmentation threshold */static int ray_get_frag(struct net_device *dev, struct iw_request_info *info, struct iw_param *vwrq, char *extra){ ray_dev_t *local = (ray_dev_t *)dev->priv; vwrq->value = (local->sparm.b5.a_frag_threshold[0] << 8) + local->sparm.b5.a_frag_threshold[1]; vwrq->disabled = (vwrq->value == 32767); vwrq->fixed = 1; return 0;}/*------------------------------------------------------------------*//* * Wireless Handler : set Mode of Operation */static int ray_set_mode(struct net_device *dev, struct iw_request_info *info, __u32 *uwrq, char *extra){ ray_dev_t *local = (ray_dev_t *)dev->priv; int err = -EINPROGRESS; /* Call commit handler */ char card_mode = 1; /* Reject if card is already initialised */ if(local->card_status != CARD_AWAITING_PARAM) return -EBUSY; switch (*uwrq) { case IW_MODE_ADHOC: card_mode = 0; // Fall through case IW_MODE_INFRA: local->sparm.b5.a_network_type = card_mode; break; default: err = -EINVAL; } return err;}/*------------------------------------------------------------------*//* * Wireless Handler : get Mode of Operation */static int ray_get_mode(struct net_device *dev, struct iw_request_info *info, __u32 *uwrq, char *extra){ ray_dev_t *local = (ray_dev_t *)dev->priv; if(local->sparm.b5.a_network_type) *uwrq = IW_MODE_INFRA; else *uwrq = IW_MODE_ADHOC; return 0;}/*------------------------------------------------------------------*//* * Wireless Handler : get range info
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -