ar6302网卡数据包 与 wifi帧格式 分析

一、

WMSG_HTC_PACKET_ISR:

   htc->EndPoint[(  (HTC_PACKET*)(msg_htc.data))->Endpoint-1].rx_isr(

                     htc->EndPoint[((HTC_PACKET*)(msg_htc.data))->Endpoint-1].rx_ctt, 

                     (HTC_PACKET*)(msg_htc.data)); /* Call back */

{//

    /* 0:WMI_CONTROL_SVC, 1:WMI_DATA_VO_SVC, 2:WMI_DATA_VI_SVC,
     * 3:WMI_DATA_BE_SVC, 4:WMI_DATA_BK_SVC */
    HTC_ENDPOINT EndPoint[  HTC_EP_COUNT];        /* end points but HTC control */


                connect.rx_isr = wmi_ctrl_isr;          /* for WMI control message */
connect.service_id = WMI_CONTROL_SVC;   /* WMI control service */


connect.rx_isr = wmi_data_isr;          /* for WMI data message */
connect.service_id = WMI_DATA_BE_SVC;   /* best-effort service */


                connect.rx_isr = wmi_data_isr;          /* for WMI data message */
connect.service_id = WMI_DATA_BK_SVC;   /* best-effort service */


                connect.rx_isr = wmi_data_isr;          /* for WMI data message */
connect.service_id = WMI_DATA_VI_SVC;   /* best-effort service */


                connect.rx_isr = wmi_data_isr;          /* for WMI data message */
connect.service_id = WMI_DATA_VO_SVC;   /* best-effort service */

}//


{//

A_STATUS htc_connect_service(HTC_HANDLE h_htc,
                                HTC_SERVICE_CONNECT_REQ *connect_req,
                                HTC_SERVICE_CONNECT_RESP *connect_resp)

{

HTC_ENDPOINT_ID assigned_ep = ENDPOINT_MAX;

(1) HTC_CTRL_RSVD_SVC          assigned_ep = ENDPOINT_0;

(2)status = htc_issue_send(htc,tx_packet,0); assigned_ep = (HTC_ENDPOINT_ID) resp_msg.ep_id;

这里解释了对 htc->EndPoint 这个5个数组的解释。

p_ep = &htc->EndPoint[assigned_ep-1];

        connect_resp->ep_id       = assigned_ep;
        connect_resp->mac_msg_len = max_msg_size;

        p_ep->ServiceID  = connect_req->service_id; /* marks it in use */
        p_ep->max_msg_len = max_msg_size;            /* message length */
        p_ep->rx_isr      = connect_req->rx_isr;     /* CALLBACK function */
        p_ep->rx_ctt      = connect_req->context;    /* CALLBACK context */

}

}//


二、

wmi_data_isr

void wmi_data_isr(void *ctt, HTC_PACKET *packet)

{

WMI_DATA_HDR *dhdr = (WMI_DATA_HDR *)packet->pBuffer;

typedef struct {
    char      rssi;
    unsigned char     info;               /* usage of 'info' field(8-bit):
                                     *  b1:b0       - WMI_MSG_TYPE
                                     *  b4:b3:b2    - UP(tid)
                                     *  b5          - Used in AP mode. More-data in tx dir, PS in rx.
                                     *  b7:b6       -  Dot3 header(0),
                                     *                 Dot11 Header(1),
                                     *                 ACL data(2)
                                     */


    unsigned short    info2;              /* usage of 'info2' field(16-bit):
                                     * b11:b0       - seq_no
                                     * b12          - A-MSDU?
                                     * b15:b13      - META_DATA_VERSION 0 - 7
                                     */
    unsigned short    info3;        /* b3:b2:b1:b0  - device id
                                     */
} WMI_DATA_HDR;


===============================================================

        meta_type = WMI_DATA_HDR_GET_META(dhdr);
        containsDot11Hdr = WMI_DATA_HDR_GET_DOT11(dhdr);

===============================================================


A_STATUS
wmi_dot11_hdr_remove(HTC_PACKET *packet)

{

    datap = packet->pBuffer;


    pwh = (struct ieee80211_frame *)datap;
    type = pwh->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
    subtype = pwh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK;

/*
 * generic definitions for IEEE 802.11 frames
 */
struct ieee80211_frame {
unsigned char    i_fc[2];
unsigned char    i_dur[2];
unsigned char    i_addr1[IEEE80211_ADDR_LEN];
unsigned char    i_addr2[IEEE80211_ADDR_LEN];
unsigned char    i_addr3[IEEE80211_ADDR_LEN];
unsigned char    i_seq[2];
    /* possibly followed by addr4[IEEE80211_ADDR_LEN]; */
    /* see below */
};


    llcHdr = (ATH_LLC_SNAP_HDR *)(datap);
    macHdr.typeOrLen = llcHdr->etherType;
    memset(macHdr.dstMac, 0, sizeof(macHdr.dstMac));
    memset(macHdr.srcMac, 0, sizeof(macHdr.srcMac));

typedef  struct {
    unsigned char     dsap;
    unsigned char     ssap;
    unsigned char     cntl;
    unsigned char     orgCode[3];
    unsigned short    etherType;
}  ATH_LLC_SNAP_HDR;

}


A_STATUS
wmi_dot3_2_dix(HTC_PACKET *packet)

{

ATH_MAC_HDR     macHdr;

 memcpy(&macHdr, packet->pBuffer, 14);

/*
 * Data Path
 */
typedef  struct {
    unsigned char     dstMac[ATH_MAC_LEN];
    unsigned char     srcMac[ATH_MAC_LEN];
    unsigned short    typeOrLen;
}  ATH_MAC_HDR;


}


ethernetif_input(&netif, packet);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值