CWBool CW80211AssembleIEMaxIdlePeriod(char * frame, int * offset, short int value) { char val=IE_TYPE_BSS_MAX_IDLE_PERIOD; CW_COPY_MEMORY(frame, &(val), IE_TYPE_LEN); (*offset) += IE_TYPE_LEN; val=300; CW_COPY_MEMORY((frame+IE_TYPE_LEN), &(val), IE_SIZE_LEN); (*offset) += IE_SIZE_LEN; /* unsigned int val; *pos++ = WLAN_EID_BSS_MAX_IDLE_PERIOD; *pos++ = 3; val = hapd->conf->ap_max_inactivity; if (val > 68000) val = 68000; val *= 1000; val /= 1024; if (val == 0) val = 1; if (val > 65535) val = 65535; WPA_PUT_LE16(pos, val); pos += 2; *pos++ = 0x00; // TODO: Protected Keep-Alive Required */ CW_COPY_MEMORY((frame+IE_TYPE_LEN+IE_SIZE_LEN), &(value), 1); (*offset) += 1; return CW_TRUE; }
CWBool CW80211AssembleIEDSSS(char * frame, int * offset, char value) { char val=IE_TYPE_DSSS; CW_COPY_MEMORY(frame, &(val), IE_TYPE_LEN); (*offset) += IE_TYPE_LEN; val=1; CW_COPY_MEMORY((frame+IE_TYPE_LEN), &(val), IE_SIZE_LEN); (*offset) += IE_SIZE_LEN; CW_COPY_MEMORY((frame+IE_TYPE_LEN+IE_SIZE_LEN), &(value), 1); (*offset) += 1; return CW_TRUE; }
CWBool CW80211ParseFrameIEAddr(char * frameReceived, int * offsetFrameReceived, unsigned char * addr) { CW_COPY_MEMORY(addr, frameReceived, ETH_ALEN); (*offsetFrameReceived) += ETH_ALEN; return CW_TRUE; }
CWBool CW80211AssembleIEAuthTransNum(char * frame, int * offset, short int value) { CW_COPY_MEMORY(frame, &(value), LEN_IE_AUTH_TRANS); (*offset) += LEN_IE_AUTH_TRANS; return CW_TRUE; }
/* ------------------ PARSE ---------------------- */ CWBool CW80211ParseFrameIEControl(char * frameReceived, int * offsetFrameReceived, short int * value) { CW_COPY_MEMORY(value,frameReceived, LEN_IE_FRAME_CONTROL); (*offsetFrameReceived) += LEN_IE_FRAME_CONTROL; return CW_TRUE; }
CWBool CW80211ParseFrameIECapability(char * frameReceived, int * offsetFrameReceived, short int * value) { CW_COPY_MEMORY(value,frameReceived, LEN_IE_CAPABILITY); (*offsetFrameReceived) += LEN_IE_CAPABILITY; return CW_TRUE; }
CWBool CW80211ParseFrameIEStatusCode(char * frameReceived, int * offsetFrameReceived, short int * value) { CW_COPY_MEMORY(value,frameReceived, LEN_IE_STATUS_CODE); (*offsetFrameReceived) += LEN_IE_STATUS_CODE; return CW_TRUE; }
CWBool CW80211ParseFrameIEAuthAlgo(char * frameReceived, int * offsetFrameReceived, short int * value) { CW_COPY_MEMORY(value,frameReceived, LEN_IE_AUTH_ALG); (*offsetFrameReceived) += LEN_IE_AUTH_ALG; return CW_TRUE; }
CWBool CW80211ParseFrameIEAuthTransaction(char * frameReceived, int * offsetFrameReceived, short int * value) { CW_COPY_MEMORY(value,frameReceived, LEN_IE_AUTH_TRANS); (*offsetFrameReceived) += LEN_IE_AUTH_TRANS; return CW_TRUE; }
CWBool CW80211AssembleIEStatusCode(char * frame, int * offset, short int value) { CW_COPY_MEMORY(frame, &(value), LEN_IE_STATUS_CODE); (*offset) += LEN_IE_STATUS_CODE; return CW_TRUE; }
CWBool CW80211ParseFrameIEReasonCode(char * frameReceived, int * offsetFrameReceived, short int * value) { CW_COPY_MEMORY(value,frameReceived, LEN_IE_REASON_CODE); (*offsetFrameReceived) += LEN_IE_REASON_CODE; return CW_TRUE; }
CWBool CW80211ParseFrameIEAssID(char * frameReceived, int * offsetFrameReceived, short int * value) { CW_COPY_MEMORY(value,frameReceived, LEN_IE_ASSOCIATION_ID); (*offsetFrameReceived) += LEN_IE_ASSOCIATION_ID; return CW_TRUE; }
CWBool CW80211ParseFrameIESeqCtrl(char * frameReceived, int * offsetFrameReceived, short int * value) { CW_COPY_MEMORY(value,frameReceived, LEN_IE_SEQ_CTRL); (*offsetFrameReceived) += LEN_IE_SEQ_CTRL; return CW_TRUE; }
CWBool CW80211ParseFrameIEDuration(char * frameReceived, int * offsetFrameReceived, short int * value) { CW_COPY_MEMORY(value,frameReceived, LEN_IE_DURATION); (*offsetFrameReceived) += LEN_IE_DURATION; return CW_TRUE; }
CWBool CW80211ParseFrameIEListenInterval(char * frameReceived, int * offsetFrameReceived, short int * value) { CW_COPY_MEMORY(value,frameReceived, LEN_IE_LISTEN_INTERVAL); (*offsetFrameReceived) += LEN_IE_LISTEN_INTERVAL; return CW_TRUE; }
//802.3 CWBool CW8023AssembleHdrLength(char * frame, int * offset, short int value) { CW_COPY_MEMORY(frame, &(value), 2); (*offset) += 2; return CW_TRUE; }
CWBool CW80211AssembleIECapability(char * frame, int * offset, short int value) { CW_COPY_MEMORY(frame, &(value), LEN_IE_CAPABILITY); (*offset) += LEN_IE_CAPABILITY; return CW_TRUE; }
// retrieves 8 bits from the message, increments the current offset in bytes. unsigned char CWProtocolRetrieve8(CWProtocolMessage *msgPtr) { unsigned char val; CW_COPY_MEMORY(&val, &((msgPtr->msg)[(msgPtr->offset)]), 1); (msgPtr->offset) += 1; return val; }
// retrieves 16 bits from the message, increments the current offset in bytes. unsigned short CWProtocolRetrieve16(CWProtocolMessage *msgPtr) { unsigned short val; CW_COPY_MEMORY(&val, &((msgPtr->msg)[(msgPtr->offset)]), 2); (msgPtr->offset) += 2; return ntohs(val); }
CWBool CW80211AssembleIESupportedRates(char * frame, int * offset, char * value, int numRates) { char val=IE_TYPE_SUPP_RATES; CW_COPY_MEMORY(frame, &(val), IE_TYPE_LEN); (*offset) += IE_TYPE_LEN; if(numRates <= 0) return CW_FALSE; CW_COPY_MEMORY((frame+IE_TYPE_LEN), &(numRates), IE_SIZE_LEN); (*offset) += IE_SIZE_LEN; CW_COPY_MEMORY((frame+IE_TYPE_LEN+IE_SIZE_LEN), value, numRates); (*offset) += numRates; return CW_TRUE; }
CWBool CW80211AssembleIESSID(char * frame, int * offset, char * value) { //Type unsigned char val=IE_TYPE_SSID; CW_COPY_MEMORY(frame, &(val), IE_TYPE_LEN); (*offset) += IE_TYPE_LEN; //len val=strlen(value); CW_COPY_MEMORY((frame+IE_TYPE_LEN), &(val), IE_SIZE_LEN); (*offset) += IE_SIZE_LEN; //value CW_COPY_MEMORY((frame+IE_TYPE_LEN+IE_SIZE_LEN), value, strlen(value)); (*offset) += strlen(value); return CW_TRUE; }
CWBool CW80211AssembleIEAssID(char * frame, int * offset, short int value) { value |= BIT(14); value |= BIT(15); CW_COPY_MEMORY(frame, &(value), LEN_IE_ASSOCIATION_ID); (*offset) += LEN_IE_ASSOCIATION_ID; return CW_TRUE; }
// retrieves 32 bits from the message, increments the current offset in bytes. unsigned int CWProtocolRetrieve32(CWProtocolMessage *msgPtr) { unsigned int val; CW_COPY_MEMORY(&val, &((msgPtr->msg)[(msgPtr->offset)]), 4); (msgPtr->offset) += 4; return ntohl(val); }
CWBool CW80211AssembleIEBeaconInterval(char * frame, int * offset, short int value) { short int val = htons(host_to_le16(value)); CW_COPY_MEMORY(frame, &(val), LEN_IE_BEACON_INT); (*offset) += LEN_IE_BEACON_INT; return CW_TRUE; }
/* FIXED LEN IE */ CWBool CW80211AssembleIEFrameControl(char * frame, int * offset, int frameType, int frameSubtype) { short int val = IEEE80211_FC(frameType, frameSubtype); CW_COPY_MEMORY(frame, &(val), LEN_IE_FRAME_CONTROL); (*offset) += LEN_IE_FRAME_CONTROL; return CW_TRUE; }
CWBool CW80211AssembleIESequenceNumber(char * frame, int * offset, int value) { short int val = htons(host_to_le16(value)); CW_COPY_MEMORY(frame, &(val), LEN_IE_SEQ_CTRL); (*offset) += LEN_IE_SEQ_CTRL; return CW_TRUE; }
CWBool CW80211AssembleIEDuration(char * frame, int * offset, int value) { short int val = htons(host_to_le16(value)); CW_COPY_MEMORY(frame, &(val), LEN_IE_DURATION); (*offset) += LEN_IE_DURATION; return CW_TRUE; }
/* * Receive a message, that can be fragmented. This is useful not only for the Join State */ CWBool CWReceiveMessage(CWProtocolMessage *msgPtr) { CWList fragments = NULL; int readBytes; char buf[CW_BUFFER_SIZE]; CWBool dataFlag = CW_FALSE; CW_REPEAT_FOREVER { CW_ZERO_MEMORY(buf, CW_BUFFER_SIZE); #ifdef CW_NO_DTLS char *pkt_buffer = NULL; CWLockSafeList(gPacketReceiveList); while (CWGetCountElementFromSafeList(gPacketReceiveList) == 0) CWWaitElementFromSafeList(gPacketReceiveList); pkt_buffer = (char*)CWRemoveHeadElementFromSafeListwithDataFlag(gPacketReceiveList, &readBytes,&dataFlag); CWUnlockSafeList(gPacketReceiveList); CW_COPY_MEMORY(buf, pkt_buffer, readBytes); CW_FREE_OBJECT(pkt_buffer); #else if(!CWSecurityReceive(gWTPSession, buf, CW_BUFFER_SIZE, &readBytes)) {return CW_FALSE;} #endif if(!CWProtocolParseFragment(buf, readBytes, &fragments, msgPtr, &dataFlag, NULL)) { if(CWErrorGetLastErrorCode() == CW_ERROR_NEED_RESOURCE) { // we need at least one more fragment continue; } else { // error CWErrorCode error; error=CWErrorGetLastErrorCode(); switch(error) { case CW_ERROR_SUCCESS: {CWDebugLog("ERROR: Success"); break;} case CW_ERROR_OUT_OF_MEMORY: {CWDebugLog("ERROR: Out of Memory"); break;} case CW_ERROR_WRONG_ARG: {CWDebugLog("ERROR: Wrong Argument"); break;} case CW_ERROR_INTERRUPTED: {CWDebugLog("ERROR: Interrupted"); break;} case CW_ERROR_NEED_RESOURCE: {CWDebugLog("ERROR: Need Resource"); break;} case CW_ERROR_COMUNICATING: {CWDebugLog("ERROR: Comunicating"); break;} case CW_ERROR_CREATING: {CWDebugLog("ERROR: Creating"); break;} case CW_ERROR_GENERAL: {CWDebugLog("ERROR: General"); break;} case CW_ERROR_OPERATION_ABORTED: {CWDebugLog("ERROR: Operation Aborted"); break;} case CW_ERROR_SENDING: {CWDebugLog("ERROR: Sending"); break;} case CW_ERROR_RECEIVING: {CWDebugLog("ERROR: Receiving"); break;} case CW_ERROR_INVALID_FORMAT: {CWDebugLog("ERROR: Invalid Format"); break;} case CW_ERROR_TIME_EXPIRED: {CWDebugLog("ERROR: Time Expired"); break;} case CW_ERROR_NONE: {CWDebugLog("ERROR: None"); break;} } CWDebugLog("~~~~~~"); return CW_FALSE; } } else break; // the message is fully reassembled } return CW_TRUE; }
CWBool CW80211AssembleIEAddr(char * frame, int * offset, char * value) { //Broadcast if(value == NULL) memset(frame, 0xff, ETH_ALEN); else CW_COPY_MEMORY(frame, value, ETH_ALEN); (*offset) += ETH_ALEN; return CW_TRUE; }
CWBool CW80211AssembleIEFrameControlData(char * frame, int * offset, int frameType, int frameSubtype, int toDS, int fromDS) { short int val = IEEE80211_FC(frameType, frameSubtype); if(toDS == 1) SETBIT(val,8); else CLEARBIT(val,8); if(fromDS == 1) SETBIT(val,9); else CLEARBIT(val,9); CW_COPY_MEMORY(frame, &(val), LEN_IE_FRAME_CONTROL); (*offset) += LEN_IE_FRAME_CONTROL; return CW_TRUE; }