From 12da7d3751c8b7bd088587c8323123019680efff Mon Sep 17 00:00:00 2001 From: Viktor Mladenovski Date: Tue, 21 Jun 2011 17:51:15 +0200 Subject: Flashing procedure stops at different stages Adds fix for retransmission in LCM transport layer ST-Ericsson ID: 325725 ST-Ericsson FOSS-OUT ID: STETL-FOSS-OUT-10204 Change-Id: Ie6b32dcf6bf7b3023237920204e3c55ac0624a79 --- lcmodule/source/LCM.rc | 4 +-- .../source/bulk_protocol.c | 32 ++++++++++++--------- .../source/a2_header.c | 4 +-- .../source/protrom_header.c | 12 ++++---- .../source/r15_header.c | 8 +++--- .../source/r15_network_layer.c | 6 ++-- .../config/ces_commands_c.xsl | 8 +++++- .../source/r15_family.c | 4 ++- lcmodule/win_binaries/LCM.dll | Bin 81920 -> 81920 bytes source/LCDriver.rc | 4 +-- source/config/commands_h.xsl | 2 +- source/utilities/BulkHandler.h | 5 ++-- source/utilities/CaptiveThreadObject.cpp | 3 +- source/utilities/MemMappedFile.cpp | 10 +++++-- source/utilities/MemMappedFile.h | 2 +- win_binaries/LCDriver_CNH1606432.dll | Bin 172032 -> 172032 bytes 16 files changed, 62 insertions(+), 42 deletions(-) diff --git a/lcmodule/source/LCM.rc b/lcmodule/source/LCM.rc index 15b65cb..0ec9c41 100644 --- a/lcmodule/source/LCM.rc +++ b/lcmodule/source/LCM.rc @@ -69,7 +69,7 @@ BEGIN BEGIN BLOCK "040904b0" BEGIN - VALUE "Comments", "Build date: 2011-05-18" + VALUE "Comments", "Build date: 2011-05-30" VALUE "CompanyName", "ST Ericsson AB" VALUE "FileDescription", "LCM Dynamic Link Library" VALUE "FileVersion", "1,0,0,1" @@ -78,7 +78,7 @@ BEGIN VALUE "OriginalFilename", "LCM.dll" VALUE "PrivateBuild", "http://gerrit.lud.stericsson.com/gerrit/21155" VALUE "ProductName", "CXA1104507 Loader Communication Module" - VALUE "ProductVersion", "Test Version" + VALUE "ProductVersion", "P1L" END END BLOCK "VarFileInfo" diff --git a/lcmodule/source/cnh1605204_ldr_transport_layer/source/bulk_protocol.c b/lcmodule/source/cnh1605204_ldr_transport_layer/source/bulk_protocol.c index 173bb5b..5727d4e 100644 --- a/lcmodule/source/cnh1605204_ldr_transport_layer/source/bulk_protocol.c +++ b/lcmodule/source/cnh1605204_ldr_transport_layer/source/bulk_protocol.c @@ -50,7 +50,16 @@ extern Measurement_t *Measurement_p; #endif +typedef struct { + TL_BulkVectorList_t *BulkVector_p; + uint32 ChunkId; + uint8* ChunksList_p; +} TL_RetransmissionRequest_t; + +static TL_RetransmissionRequest_t RetransmissionRequest; + static void R15_Bulk_ReadChunkCallBack(Communication_t *Communication_p, const void *const Timer_p, const void *const Data_p); +static void R15_Bulk_ReadDataChunkCallBack(Communication_t *Communication_p, const void *const Timer_p, const void *const Data_p); static void R15_Bulk_RetransmitChunks_CallBack(const Communication_t *const Communication_p, const void *const Timer_p, const void *const Data_p); static ErrorCode_e R15_Bulk_Process_Read(Communication_t *Communication_p, TL_BulkVectorList_t *BulkVector_p, PacketMeta_t *Packet_p); static ErrorCode_e R15_Bulk_SendReadRequest(Communication_t *Communication_p, TL_BulkVectorList_t *BulkVector_p, uint32 Chunks, void *ChunksList_p, void *CallBack_p); @@ -763,16 +772,14 @@ static ErrorCode_e R15_Bulk_Process_Read(Communication_t *Communication_p, TL_Bu } else if (VECTOR_MISSING_CHUNK == ChunkReceivedStatus) { ReturnValue = R15_Bulk_SendReadRequest(Communication_p, BulkVector_p, ChunkId, ChunksList, NULL); } else { // Chunks are received in order - R15_TRANSPORT(Communication_p)->BulkHandle.TimerKey = R15_Bulk_GetTimerChunkRetransmision(Communication_p, R15_TIMEOUTS(Communication_p)->TBDR, (HandleFunction_t)R15_Bulk_ReadChunkCallBack); + RetransmissionRequest.BulkVector_p = BulkVector_p; + RetransmissionRequest.ChunkId = ChunkId; + RetransmissionRequest.ChunksList_p = ChunksList; + R15_TRANSPORT(Communication_p)->BulkHandle.TimerKey = R15_Bulk_GetTimerChunkRetransmision(Communication_p, R15_TIMEOUTS(Communication_p)->TBDR, (HandleFunction_t)R15_Bulk_ReadDataChunkCallBack); } break; - case SEND_BULK_ACK: //TODO: check this state. look like unused state!!! - R15_Bulk_GetListOfReceivedChunks(BulkVector_p, &ChunkId, ChunksList); - ReturnValue = R15_Bulk_SendReadRequest(Communication_p, BulkVector_p, ChunkId, ChunksList, NULL); - break; - default: BulkVector_p->State = BULK_IDLE_STATE; ReturnValue = E_INVALID_BULK_PROTOCOL_STATE; @@ -921,11 +928,6 @@ static ErrorCode_e R15_Bulk_SendReadRequest(Communication_t *Communication_p, TL } else { Param.Time = R15_TIMEOUTS(Communication_p)->TBDR; // Receiving chunks - if (Chunks != 0) { - VERIFY(NULL != ChunksList_p, E_INVALID_INPUT_PARAMETERS); - Param.Payload_p = ChunksList_p; - } - VERIFY(NULL != CallBack_p, E_INVALID_INPUT_PARAMETERS); //lint --e(611) Param.TimerCallBackFn_p = (HandleFunction_t)CallBack_p; @@ -1062,6 +1064,11 @@ static void R15_Bulk_ReadChunkCallBack(Communication_t *Communication_p, const v (void)QUEUE((Communication_p), FifoEnqueue_Fn)(OBJECT_QUEUE(Communication_p), Communication_p->Outbound_p, (void *)Data_p); } +static void R15_Bulk_ReadDataChunkCallBack(Communication_t *Communication_p, const void *const Timer_p, const void *const Data_p) +{ + (void)R15_Bulk_SendReadRequest(Communication_p, RetransmissionRequest.BulkVector_p, RetransmissionRequest.ChunkId, RetransmissionRequest.ChunksList_p, NULL); +} + static void R15_Bulk_RetransmitChunks_CallBack(const Communication_t *const Communication_p, const void *const Timer_p, const void *const Data_p) { /* set all chunks for retransmision . Max retransmision is 3. */ @@ -1122,8 +1129,7 @@ static TL_BulkVectorStatus_t R15_Bulk_GetVectorStatus(TL_BulkVectorList_t *BulkV for (ChunkCounter = 0; ChunkCounter < BulkVector_p->Buffers; ChunkCounter++) { Packet_p = BulkVector_p->Entries[ChunkCounter].Buffer_p; - if (Packet_p == NULL || - !(CHECK_PACKET_FLAGS(Packet_p, BUF_ACK_READY) || CHECK_PACKET_FLAGS(Packet_p, BUF_ACKNOWLEDGED))) { + if (Packet_p == NULL || !(CHECK_PACKET_FLAGS(Packet_p, BUF_ACK_READY) || CHECK_PACKET_FLAGS(Packet_p, BUF_ACKNOWLEDGED))) { Status = VECTOR_NOT_COMPLETE; } else { if (Status == VECTOR_NOT_COMPLETE) { diff --git a/lcmodule/source/cnh1605205_ldr_network_layer/source/a2_header.c b/lcmodule/source/cnh1605205_ldr_network_layer/source/a2_header.c index 7b7631b..fd48503 100644 --- a/lcmodule/source/cnh1605205_ldr_network_layer/source/a2_header.c +++ b/lcmodule/source/cnh1605205_ldr_network_layer/source/a2_header.c @@ -163,8 +163,8 @@ boolean A2_IsReceivedHeader(A2_Inbound_t *In_p) return TRUE; } else { In_p->ReqData = StartHeaderInBuffer; - TmpPointer_p = (uint8 *)((uint32)In_p->Target_p + StartHeaderInBuffer); - memcpy(In_p->Target_p, (uint8 *)TmpPointer_p, A2_HEADER_LENGTH - StartHeaderInBuffer); + TmpPointer_p = In_p->Target_p + StartHeaderInBuffer; + memcpy(In_p->Target_p, TmpPointer_p, A2_HEADER_LENGTH - StartHeaderInBuffer); In_p->ReqBuffOffset = A2_HEADER_LENGTH - StartHeaderInBuffer; } } else { diff --git a/lcmodule/source/cnh1605205_ldr_network_layer/source/protrom_header.c b/lcmodule/source/cnh1605205_ldr_network_layer/source/protrom_header.c index eab4a6a..8ac6f7b 100644 --- a/lcmodule/source/cnh1605205_ldr_network_layer/source/protrom_header.c +++ b/lcmodule/source/cnh1605205_ldr_network_layer/source/protrom_header.c @@ -100,6 +100,7 @@ uint32 Protrom_GetPacketLength(const Protrom_Header_t *Header_p) boolean Protrom_IsValidHeader(const void *Data_p) { uint8 *Temp_p = (uint8 *)Data_p; + uint16 ProtromVal = 0; if (PROTROM_HEADER_PATTERN != *Temp_p) { return FALSE; @@ -121,7 +122,8 @@ boolean Protrom_IsValidHeader(const void *Data_p) return FALSE; } - if (*(uint16 *)(Temp_p + 5) < 1) { + ProtromVal = (Temp_p[6] << 8) | Temp_p[5]; + if (ProtromVal < 1) { return FALSE; } @@ -148,8 +150,8 @@ boolean Protrom_IsReceivedHeader(Protrom_Inbound_t *In_p) if (PROTROM_HEADER_PATTERN_CANDIDATE == Res) { /* call for receiving the rest bytes in header */ In_p->ReqData = StartHeaderInBuffer + PROTROM_HEADER_LENGTH - In_p->RecData; - TmpPointer_p = (uint8 *)((uint32)In_p->Target_p + StartHeaderInBuffer); - memcpy(In_p->Target_p, (uint8 *)TmpPointer_p, In_p->RecData - StartHeaderInBuffer); + TmpPointer_p = In_p->Target_p + StartHeaderInBuffer; + memcpy(In_p->Target_p, TmpPointer_p, In_p->RecData - StartHeaderInBuffer); In_p->ReqBuffOffset = In_p->RecData - StartHeaderInBuffer; } else { if (PROTROM_HEADER_PATTERN_MATCH == Res) { @@ -158,8 +160,8 @@ boolean Protrom_IsReceivedHeader(Protrom_Inbound_t *In_p) return TRUE; } else { In_p->ReqData = StartHeaderInBuffer + PROTROM_HEADER_LENGTH - In_p->RecData; - TmpPointer_p = (uint8 *)((uint32)In_p->Target_p + StartHeaderInBuffer); - memcpy(In_p->Target_p, (uint8 *)TmpPointer_p, In_p->RecData - StartHeaderInBuffer); + TmpPointer_p = In_p->Target_p + StartHeaderInBuffer; + memcpy(In_p->Target_p, TmpPointer_p, In_p->RecData - StartHeaderInBuffer); In_p->ReqBuffOffset = In_p->RecData - StartHeaderInBuffer; } } else { diff --git a/lcmodule/source/cnh1605205_ldr_network_layer/source/r15_header.c b/lcmodule/source/cnh1605205_ldr_network_layer/source/r15_header.c index 8058506..be504e5 100644 --- a/lcmodule/source/cnh1605205_ldr_network_layer/source/r15_header.c +++ b/lcmodule/source/cnh1605205_ldr_network_layer/source/r15_header.c @@ -209,8 +209,8 @@ boolean R15_IsReceivedHeader(R15_Inbound_t *In_p) if (HEADER_PATTERN_CANDIDATE == Res) { /* call for receiving the rest bytes in header */ In_p->ReqData = StartHeaderInBuffer + ALIGNED_HEADER_LENGTH - In_p->RecData; - TmpPointer_p = (uint8 *)((uint32)In_p->Target_p + StartHeaderInBuffer); - memcpy(In_p->Target_p, (uint8 *)TmpPointer_p, In_p->RecData - StartHeaderInBuffer); + TmpPointer_p = In_p->Target_p + StartHeaderInBuffer; + memcpy(In_p->Target_p, TmpPointer_p, In_p->RecData - StartHeaderInBuffer); In_p->ReqBuffOffset = In_p->RecData - StartHeaderInBuffer; } else { if (HEADER_PATTERN_MATCH == Res) { @@ -219,8 +219,8 @@ boolean R15_IsReceivedHeader(R15_Inbound_t *In_p) return TRUE; } else { In_p->ReqData = StartHeaderInBuffer + ALIGNED_HEADER_LENGTH - In_p->RecData; - TmpPointer_p = (uint8 *)((uint32)In_p->Target_p + StartHeaderInBuffer); - memcpy(In_p->Target_p, (uint8 *)TmpPointer_p, In_p->RecData - StartHeaderInBuffer); + TmpPointer_p = In_p->Target_p + StartHeaderInBuffer; + memcpy(In_p->Target_p, TmpPointer_p, In_p->RecData - StartHeaderInBuffer); In_p->ReqBuffOffset = In_p->RecData - StartHeaderInBuffer; } } else { diff --git a/lcmodule/source/cnh1605205_ldr_network_layer/source/r15_network_layer.c b/lcmodule/source/cnh1605205_ldr_network_layer/source/r15_network_layer.c index 3b3a2fc..bc18821 100644 --- a/lcmodule/source/cnh1605205_ldr_network_layer/source/r15_network_layer.c +++ b/lcmodule/source/cnh1605205_ldr_network_layer/source/r15_network_layer.c @@ -40,7 +40,7 @@ extern Measurement_t *Measurement_p; #endif -static PacketMeta_t PacketMetaInfo[COMMAND_BUFFER_COUNT + BULK_BUFFER_COUNT] = {0}; /* Packet Meta Info vector*/ +static PacketMeta_t PacketMetaInfo[COMMAND_BUFFER_COUNT + BULK_BUFFER_COUNT] ; /* Packet Meta Info vector*/ /******************************************************************************* * Declaration of file local functions @@ -429,7 +429,7 @@ uint32 R15_Network_CreateUniqueKey(const PacketMeta_t *const Packet_p, const uin uint32 Key = Packet_p->Header.Protocol; if (Key == PROTO_COMMAND) { - return((Key << 16) | *(Packet_p->ExtendedHeader_p) & MASK_CLR_STATE); + return((Key << 16) | (*(Packet_p->ExtendedHeader_p) & MASK_CLR_STATE)); } else { return ((Key << 16) | ((*(Packet_p->ExtendedHeader_p) & 0x00FF) << 8) | ExternalKey); } @@ -685,7 +685,7 @@ static ErrorCode_e R15_Network_ReceiveExtendedHeader(Communication_t *Communicat SET_INBOUND(In_p, RECEIVE_PAYLOAD, Aligned_Size); } else { -#ifdef DISABLE_SECURITY +#ifdef SKIP_PAYLOAD_VERIFICATION SET_PACKET_FLAGS(In_p->Packet_p, PACKET_RX_STATE_MASK, BUF_RX_READY); (void)QUEUE(Communication_p, FifoEnqueue_Fn)(OBJECT_QUEUE(Communication_p), Communication_p->Inbound_p, In_p->Packet_p); #else diff --git a/lcmodule/source/cnh1606344_ldr_communication_module/config/ces_commands_c.xsl b/lcmodule/source/cnh1606344_ldr_communication_module/config/ces_commands_c.xsl index 4ab37c4..20025c4 100644 --- a/lcmodule/source/cnh1606344_ldr_communication_module/config/ces_commands_c.xsl +++ b/lcmodule/source/cnh1606344_ldr_communication_module/config/ces_commands_c.xsl @@ -17,13 +17,19 @@ - + + +#ifdef DISABLE_SECURITY + { NULL, _Repeat, , 1 }, + +#endif + diff --git a/lcmodule/source/cnh1606344_ldr_communication_module/source/r15_family.c b/lcmodule/source/cnh1606344_ldr_communication_module/source/r15_family.c index baf1d7a..bf9c24a 100644 --- a/lcmodule/source/cnh1606344_ldr_communication_module/source/r15_family.c +++ b/lcmodule/source/cnh1606344_ldr_communication_module/source/r15_family.c @@ -45,11 +45,13 @@ ErrorCode_e R15_Family_Init(Communication_t *Communication_p) #ifndef CFG_ENABLE_LOADER_TYPE Communication_p->CurrentFamilyHash = HASH_NONE; #else -#ifdef DISABLE_SECURITY + +#ifdef SKIP_PAYLOAD_VERIFICATION Communication_p->CurrentFamilyHash = HASH_NONE; #else Communication_p->CurrentFamilyHash = HASH_SHA256; #endif + #endif R15_NETWORK(Communication_p)->Inbound.StopTransfer = FALSE; diff --git a/lcmodule/win_binaries/LCM.dll b/lcmodule/win_binaries/LCM.dll index fdc0ab1..a4d916b 100755 Binary files a/lcmodule/win_binaries/LCM.dll and b/lcmodule/win_binaries/LCM.dll differ diff --git a/source/LCDriver.rc b/source/LCDriver.rc index ec7b73a..de492cd 100644 --- a/source/LCDriver.rc +++ b/source/LCDriver.rc @@ -81,7 +81,7 @@ BEGIN BEGIN BLOCK "000904b0" BEGIN - VALUE "Comments", "Build date: 2011-05-18" + VALUE "Comments", "Build date: 2011-05-30" VALUE "CompanyName", "STEricsson AB" VALUE "FileDescription", "LCDriver Dynamic Link Library" VALUE "FileVersion", "1, 0, 0, 1" @@ -90,7 +90,7 @@ BEGIN VALUE "OriginalFilename", "LCDriver_CNH1606432.dll" VALUE "PrivateBuild", "http://gerrit.lud.stericsson.com/gerrit/21155" VALUE "ProductName", "CXC 173 0865, LCDriver DLL" - VALUE "ProductVersion", "Test Version" + VALUE "ProductVersion", "P1K" END END BLOCK "VarFileInfo" diff --git a/source/config/commands_h.xsl b/source/config/commands_h.xsl index 36a2356..431a046 100644 --- a/source/config/commands_h.xsl +++ b/source/config/commands_h.xsl @@ -39,9 +39,9 @@ public: } protected: - CLCDriverMethods* lcdMethods_; CmdResult* cmdResult_; LcmInterface* lcmInterface_; + CLCDriverMethods* lcdMethods_; }; #endif /* _COMMANDS_H_ */ diff --git a/source/utilities/BulkHandler.h b/source/utilities/BulkHandler.h index 71147ab..b441a67 100644 --- a/source/utilities/BulkHandler.h +++ b/source/utilities/BulkHandler.h @@ -56,14 +56,15 @@ public: void HandleCommandRequest(uint16 session, uint32 chunkSize, uint64 offset, uint32 length, bool acknowledge); private: CLCDriverMethods *m_Methods; + CSemaphoreQueue m_ReceiveQueue; Buffers *m_pBuffers; LcmInterface *m_pLcmInterface; Logger *m_pLogger; BulkState m_State; + CThreadWrapper *m_pFileWriteThread; TL_BulkVectorList_t *m_pBulkVector; std::string m_sFilePath; - CSemaphoreQueue m_ReceiveQueue; - CThreadWrapper *m_pFileWriteThread; + private: void HandleReadRequest(uint16 session, uint32 chunkSize, uint64 offset, uint32 length); void HandleWriteRequest(uint16 session, uint32 chunkSize, uint64 offset, uint32 length); diff --git a/source/utilities/CaptiveThreadObject.cpp b/source/utilities/CaptiveThreadObject.cpp index e9eb472..052bbce 100644 --- a/source/utilities/CaptiveThreadObject.cpp +++ b/source/utilities/CaptiveThreadObject.cpp @@ -17,11 +17,10 @@ CCaptiveThreadObject::CCaptiveThreadObject() : IsDying(0), -#pragma warning(disable: 4355) // 'this' used before initialized but ok as thread starts in inactive state Thread(ThreadEntry, this) { } -#pragma warning(default: 4355) + CCaptiveThreadObject::~CCaptiveThreadObject() { diff --git a/source/utilities/MemMappedFile.cpp b/source/utilities/MemMappedFile.cpp index 287c5b9..8d5905d 100644 --- a/source/utilities/MemMappedFile.cpp +++ b/source/utilities/MemMappedFile.cpp @@ -71,7 +71,10 @@ int MemMappedFile::LoadFileData(const char *path) return FILE_OPENING_ERROR; } - size_ = ::GetFileSize(handle_, NULL); + uint64 SizeHigh = 0; + + size_ = ::GetFileSize(handle_, (LPDWORD)&SizeHigh); + size_ = (SizeHigh << 32) | size_; if (0 == size_) { return 0; @@ -113,8 +116,9 @@ int MemMappedFile::LoadFileData(const char *path) size_ = fileStat.st_size; - mappedData_ = static_cast(mmap(0, size_, PROT_READ, MAP_PRIVATE | MAP_POPULATE, descriptor_, 0)); - + /* alway return MAP_FAILED to prevent memory consumption */ + mappedData_ = (uint8 *)MAP_FAILED; //static_cast(mmap(0, size_, PROT_READ, MAP_PRIVATE /*| MAP_POPULATE*/, descriptor_, 0)); + if (MAP_FAILED != mappedData_) { isMapped_ = true; } else { diff --git a/source/utilities/MemMappedFile.h b/source/utilities/MemMappedFile.h index 8cc63f5..7995365 100644 --- a/source/utilities/MemMappedFile.h +++ b/source/utilities/MemMappedFile.h @@ -27,9 +27,9 @@ private: std::string path_; uint64 size_; bool isMapped_; - uint32 alignmentLength_; uint8 *mappedData_; int error_; + uint32 alignmentLength_; #ifdef _WIN32 HANDLE handle_; HANDLE memmap_; diff --git a/win_binaries/LCDriver_CNH1606432.dll b/win_binaries/LCDriver_CNH1606432.dll index 826f5f5..eacaa01 100755 Binary files a/win_binaries/LCDriver_CNH1606432.dll and b/win_binaries/LCDriver_CNH1606432.dll differ -- cgit v1.2.3