/** * aniAsfPacketGet8 * * FUNCTION: * Reads a ANI_U8 out of the packet and returns it. The packet's head * is advanced and its length decremented by the appropriate length. * All network to host byte order translation is also taken care of. * * @param packet the packet to read from * @param val the value to fill in * * @return ANI_OK if the operation succeeds */ int aniAsfPacketGet8(tAniPacket *packet, v_U8_t *val) { if (packet == NULL) return ANI_E_NULL_VALUE; if (val == NULL) return ANI_E_NULL_VALUE; if (packet->len < 1) return ANI_E_SHORT_PACKET; *val = *(packet->head); aniAsfPacketTruncateFromFront(packet, 1); return ANI_OK; }
/** * aniAsfPacketGetN * * Returns N bytes from the packet and moves the head of the packet * beyond those bytes. * * @param packet the packet to read from * @param n the number of bytes to read * @param bytesPtr is set to the start of the octets * * @return ANI_OK if the operation succeeds; ANI_E_SHORT_PACKET if the * packet does not have n bytes. */ int aniAsfPacketGetN(tAniPacket *packet, int n, v_U8_t **bytesPtr) { int retVal; v_U8_t *bytes = NULL; if (packet == NULL) return ANI_E_NULL_VALUE; retVal = aniAsfPacketGetBytes(packet, &bytes); if (retVal < n) return ANI_E_SHORT_PACKET; aniAsfPacketTruncateFromFront(packet, n); *bytesPtr = bytes; return ANI_OK; }
/** * aniAsfPacketGet16 * * FUNCTION: * Reads a ANI_U16 out of the packet and returns it. The packet's head * is advanced and its length decremented by the appropriate length. * All network to host byte order translation is also taken care of. * * @param packet the packet to read from * @param val the value to fill in * * @return ANI_OK if the operation succeeds */ int aniAsfPacketGet16(tAniPacket *packet, v_U16_t *val) { v_U8_t u16Arr[2]; if (packet == NULL) return ANI_E_NULL_VALUE; if (val == NULL) return ANI_E_NULL_VALUE; if (packet->len < 2) return ANI_E_SHORT_PACKET; u16Arr[0] = packet->head[0]; u16Arr[1] = packet->head[1]; *val = vos_be16_to_cpu( *(v_U16_t *)u16Arr ); aniAsfPacketTruncateFromFront(packet, 2); return ANI_OK; }
/** * aniAsfPacketGet32 * * FUNCTION: * Reads a ANI_U32 out of the packet and returns it. The packet's head * is advanced and its length decremented by the appropriate length. * All network to host byte order translation is also taken care of. * * @param packet the packet to read from * @param val the value to fill in * * @return ANI_OK if the operation succeeds */ int aniAsfPacketGet32(tAniPacket *packet, v_U32_t *val) { v_U8_t u32Arr[4]; if (packet == NULL) return ANI_E_NULL_VALUE; if (val == NULL) return ANI_E_NULL_VALUE; if (packet->len < 4) return ANI_E_SHORT_PACKET; //packet is in network order, make sure it is align u32Arr[0] = packet->head[0]; u32Arr[1] = packet->head[1]; u32Arr[2] = packet->head[2]; u32Arr[3] = packet->head[3]; *val = vos_be32_to_cpu( *(v_U32_t *)u32Arr ); aniAsfPacketTruncateFromFront(packet, 4); return ANI_OK; }
static int parseRsnKeyDesc(tAniPacket *packet, tAniEapolRsnKeyDesc **rsnDescPtr) { int retVal = ANI_OK; int len; v_U8_t *bytes; tAniEapolRsnKeyDesc *rsnDesc = NULL; do { aniAsfPacketTruncateFromFront(packet, 1); // Desc-Type rsnDesc = (tAniEapolRsnKeyDesc *) vos_mem_malloc( sizeof(tAniEapolRsnKeyDesc) ); if (rsnDesc == NULL) { VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, "Supp could not malloc EAPOL-Key Descriptor for RSN\n"); retVal = ANI_E_MALLOC_FAILED; break; } retVal = parseRsnKeyInfo(packet, &rsnDesc->info); if (retVal != ANI_OK) break; retVal = aniAsfPacketGet16(packet, &rsnDesc->keyLen); if (retVal != ANI_OK) { break; } len = sizeof(rsnDesc->replayCounter); retVal = aniAsfPacketGetN(packet, len, &bytes); if (retVal != ANI_OK) { break; } vos_mem_copy(rsnDesc->replayCounter, bytes, len); len = sizeof(rsnDesc->keyNonce); retVal = aniAsfPacketGetN(packet, len, &bytes); if (retVal != ANI_OK) { break; } vos_mem_copy(rsnDesc->keyNonce, bytes, len); len = sizeof(rsnDesc->keyIv); retVal = aniAsfPacketGetN(packet, len, &bytes); if (retVal != ANI_OK) { break; } vos_mem_copy(rsnDesc->keyIv, bytes, len); len = sizeof(rsnDesc->keyRecvSeqCounter); retVal = aniAsfPacketGetN(packet, len, &bytes); if (retVal != ANI_OK) { break; } vos_mem_copy(rsnDesc->keyRecvSeqCounter, bytes, len); len = sizeof(rsnDesc->keyId); retVal = aniAsfPacketGetN(packet, len, &bytes); if (retVal != ANI_OK) { break; } vos_mem_copy(rsnDesc->keyId, bytes, len); len = sizeof(rsnDesc->keyMic); retVal = aniAsfPacketGetN(packet, len, &bytes); if (retVal != ANI_OK) { break; } vos_mem_copy(rsnDesc->keyMic, bytes, len); retVal = aniAsfPacketGet16(packet, &rsnDesc->keyDataLen); if (retVal != ANI_OK) { break; } len = rsnDesc->keyDataLen; if (len > 0) { // We have a key retVal = aniAsfPacketGetN(packet, len, &bytes); if (retVal != ANI_OK) { break; } rsnDesc->keyData = (v_U8_t*)vos_mem_malloc(len); if (rsnDesc->keyData == NULL) { VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, "Could not allocate RSN key bytes!\n"); VOS_ASSERT( 0 ); retVal = ANI_E_MALLOC_FAILED; break; } vos_mem_copy(rsnDesc->keyData, bytes, len); } else { rsnDesc->keyData = NULL; } *rsnDescPtr = rsnDesc; }while( 0 ); if( !ANI_IS_STATUS_SUCCESS( retVal ) ) { vos_mem_free(rsnDesc); } return retVal; }