u16_t zfTxGenWlanHeader(zdev_t* dev, zbuf_t* buf, u16_t* header, u16_t seq, u8_t flag, u16_t plusLen, u16_t minusLen, u16_t port, u16_t* da, u16_t* sa, u8_t up, u16_t *micLen, u16_t* snap, u16_t snapLen, struct aggControl *aggControl) { u16_t len; u16_t macCtrl; u32_t phyCtrl; u16_t hlen = 16; u16_t icvLen = 0; u16_t wdsPortId; u16_t vap = 0; u16_t mcs = 0; u16_t mt = 0; u8_t qosType; u8_t b1, b2; u16_t wdsPort; u8_t encExemptionActionType; u16_t rateProbingFlag = 0; u8_t tkipFrameOffset = 0; #ifdef ZM_ENABLE_IBSS_WPA2PSK u8_t res, peerIdx; u8_t userIdx=0; u16_t *iv16; u32_t *iv32; #endif zmw_get_wlan_dev(dev); /* Generate WLAN header */ /* Frame control */ header[4] = 0x0008 | (flag<<8); /* Duration */ header[5] = 0x0000; if (wd->wlanMode == ZM_MODE_INFRASTRUCTURE) { /* ToDS bit */ header[4] |= 0x0100; /*Sometimes we wake up to tx/rx but AP still think we are sleeping, so still need to set this bit*/ if ( zfPowerSavingMgrIsSleeping(dev) || wd->sta.psMgr.tempWakeUp == 1 ) { header[4] |= 0x1000; } /* Address 1 = BSSID */ header[6] = wd->sta.bssid[0]; header[7] = wd->sta.bssid[1]; header[8] = wd->sta.bssid[2]; /* Address 3 = DA */ header[12] = da[0]; header[13] = da[1]; header[14] = da[2]; } else if (wd->wlanMode == ZM_MODE_PSEUDO) { /* Address 1 = DA */ header[6] = da[0]; header[7] = da[1]; header[8] = da[2]; /* Address 3 = 00:00:00:00:00:00 */ header[12] = 0; header[13] = 0; header[14] = 0; /* PSEUDO test : WDS */ if (wd->enableWDS) { /* ToDS and FromDS bit */ header[4] |= 0x0300; /* Address 4 = SA */ header[16] = 0; header[17] = 0; header[18] = 0; hlen = 19; } } else if (wd->wlanMode == ZM_MODE_IBSS) { /* Address 1 = DA */ header[6] = da[0]; header[7] = da[1]; header[8] = da[2]; /* Address 3 = BSSID */ header[12] = wd->sta.bssid[0]; header[13] = wd->sta.bssid[1]; header[14] = wd->sta.bssid[2]; #ifdef ZM_ENABLE_IBSS_WPA2PSK zmw_enter_critical_section(dev); res = zfStaFindOppositeByMACAddr(dev, da, &peerIdx); if(res == 0) // Find opposite in our OppositeInfo Structure ! { userIdx = peerIdx; } zmw_leave_critical_section(dev); #endif } else if (wd->wlanMode == ZM_MODE_AP) { if (port < 0x20) /* AP mode */ { /* FromDS bit */ header[4] |= 0x0200; /* Address 1 = DA */ header[6] = da[0]; header[7] = da[1]; header[8] = da[2]; /* Address 3 = SA */ header[12] = sa[0]; header[13] = sa[1]; header[14] = sa[2]; if (port < ZM_MAX_AP_SUPPORT) { vap = port; header[14] += (vap<<8); } } else /* WDS port */ { /* ToDS and FromDS bit */ header[4] |= 0x0300; wdsPortId = port - 0x20; /* Address 1 = RA */ header[6] = wd->ap.wds.macAddr[wdsPortId][0]; header[7] = wd->ap.wds.macAddr[wdsPortId][1]; header[8] = wd->ap.wds.macAddr[wdsPortId][2]; /* Address 3 = DA */ header[12] = da[0]; header[13] = da[1]; header[14] = da[2]; /* Address 4 = SA */ header[16] = sa[0]; header[17] = sa[1]; header[18] = sa[2]; hlen = 19; } } /* else if (wd->wlanMode == ZM_MODE_AP) */ /* Address 2 = TA */ header[9] = wd->macAddr[0]; header[10] = wd->macAddr[1]; #ifdef ZM_VAPMODE_MULTILE_SSID header[11] = wd->macAddr[2]; //Multiple SSID #else header[11] = wd->macAddr[2] + (vap<<8); //VAP #endif if ( (wd->wlanMode == ZM_MODE_IBSS) && (wd->XLinkMode) ) { header[9] = sa[0]; header[10] = sa[1]; header[11] = sa[2]; } /* Sequence Control */ header[15] = seq; if (wd->wlanMode == ZM_MODE_AP) { zfApGetStaTxRateAndQosType(dev, da, &phyCtrl, &qosType, &rateProbingFlag); mt = (u16_t)(phyCtrl & 0x3); mcs = (u16_t)((phyCtrl >> 16) & 0x3f); #if 1 //zfApGetStaQosType(dev, da, &qosType); /* if DA == WME STA */ if (qosType == 1) { /* QoS data */ header[4] |= 0x0080; /* QoS Control */ header[hlen] = up; hlen += 1; } #endif }
u16_t zfTxGenWlanHeader(zdev_t* dev, zbuf_t* buf, u16_t* header, u16_t seq, u8_t flag, u16_t plusLen, u16_t minusLen, u16_t port, u16_t* da, u16_t* sa, u8_t up, u16_t *micLen, u16_t* snap, u16_t snapLen, struct aggControl *aggControl) { u16_t len; u16_t macCtrl; u32_t phyCtrl; u16_t hlen = 16; u16_t icvLen = 0; u16_t wdsPortId; u16_t vap = 0; u16_t mcs = 0; u16_t mt = 0; u8_t qosType; u8_t b1, b2; u16_t wdsPort; u8_t encExemptionActionType; u16_t rateProbingFlag = 0; u8_t tkipFrameOffset = 0; #ifdef ZM_ENABLE_IBSS_WPA2PSK u8_t res, peerIdx; u8_t userIdx=0; u16_t *iv16; u32_t *iv32; #endif zmw_get_wlan_dev(dev); header[4] = 0x0008 | (flag<<8); header[5] = 0x0000; if (wd->wlanMode == ZM_MODE_INFRASTRUCTURE) { header[4] |= 0x0100; if ( zfPowerSavingMgrIsSleeping(dev) || wd->sta.psMgr.tempWakeUp == 1 ) { header[4] |= 0x1000; } header[6] = wd->sta.bssid[0]; header[7] = wd->sta.bssid[1]; header[8] = wd->sta.bssid[2]; header[12] = da[0]; header[13] = da[1]; header[14] = da[2]; } else if (wd->wlanMode == ZM_MODE_PSEUDO) { header[6] = da[0]; header[7] = da[1]; header[8] = da[2]; header[12] = 0; header[13] = 0; header[14] = 0; if (wd->enableWDS) { header[4] |= 0x0300; header[16] = 0; header[17] = 0; header[18] = 0; hlen = 19; } } else if (wd->wlanMode == ZM_MODE_IBSS) { header[6] = da[0]; header[7] = da[1]; header[8] = da[2]; header[12] = wd->sta.bssid[0]; header[13] = wd->sta.bssid[1]; header[14] = wd->sta.bssid[2]; #ifdef ZM_ENABLE_IBSS_WPA2PSK zmw_enter_critical_section(dev); res = zfStaFindOppositeByMACAddr(dev, da, &peerIdx); if(res == 0) { userIdx = peerIdx; } zmw_leave_critical_section(dev); #endif } else if (wd->wlanMode == ZM_MODE_AP) { if (port < 0x20) { header[4] |= 0x0200; header[6] = da[0]; header[7] = da[1]; header[8] = da[2]; header[12] = sa[0]; header[13] = sa[1]; header[14] = sa[2]; if (port < ZM_MAX_AP_SUPPORT) { vap = port; header[14] += (vap<<8); } } else { header[4] |= 0x0300; wdsPortId = port - 0x20; header[6] = wd->ap.wds.macAddr[wdsPortId][0]; header[7] = wd->ap.wds.macAddr[wdsPortId][1]; header[8] = wd->ap.wds.macAddr[wdsPortId][2]; header[12] = da[0]; header[13] = da[1]; header[14] = da[2]; header[16] = sa[0]; header[17] = sa[1]; header[18] = sa[2]; hlen = 19; } } header[9] = wd->macAddr[0]; header[10] = wd->macAddr[1]; #ifdef ZM_VAPMODE_MULTILE_SSID header[11] = wd->macAddr[2]; #else header[11] = wd->macAddr[2] + (vap<<8); #endif if ( (wd->wlanMode == ZM_MODE_IBSS) && (wd->XLinkMode) ) { header[9] = sa[0]; header[10] = sa[1]; header[11] = sa[2]; } header[15] = seq; if (wd->wlanMode == ZM_MODE_AP) { zfApGetStaTxRateAndQosType(dev, da, &phyCtrl, &qosType, &rateProbingFlag); mt = (u16_t)(phyCtrl & 0x3); mcs = (u16_t)((phyCtrl >> 16) & 0x3f); #if 1 if (qosType == 1) { header[4] |= 0x0080; header[hlen] = up; hlen += 1; } #endif }