一、
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);
}