summaryrefslogtreecommitdiff
path: root/lcmodule/source/cnh1605204_ldr_transport_layer/source/r15_transport_layer.c
diff options
context:
space:
mode:
Diffstat (limited to 'lcmodule/source/cnh1605204_ldr_transport_layer/source/r15_transport_layer.c')
-rw-r--r--lcmodule/source/cnh1605204_ldr_transport_layer/source/r15_transport_layer.c309
1 files changed, 309 insertions, 0 deletions
diff --git a/lcmodule/source/cnh1605204_ldr_transport_layer/source/r15_transport_layer.c b/lcmodule/source/cnh1605204_ldr_transport_layer/source/r15_transport_layer.c
new file mode 100644
index 0000000..d55395c
--- /dev/null
+++ b/lcmodule/source/cnh1605204_ldr_transport_layer/source/r15_transport_layer.c
@@ -0,0 +1,309 @@
+/*******************************************************************************
+ * Copyright (C) ST-Ericsson SA 2011
+ * License terms: 3-clause BSD license
+ ******************************************************************************/
+/**
+ * @addtogroup ldr_communication_serv
+ * @{
+ * @addtogroup r15_family
+ * @{
+ * @addtogroup ldr_transport_layer
+ * @{
+ */
+
+/*******************************************************************************
+ * Includes
+ ******************************************************************************/
+#include "c_system.h"
+#include "r_r15_transport_layer.h"
+#include <stdlib.h>
+#include <string.h>
+#include "r_basicdefinitions.h"
+#include "t_time_utilities.h"
+#include "r_debug.h"
+#include "r_debug_macro.h"
+#include "r_r15_header.h"
+#include "r_command_protocol.h"
+#include "r_bulk_protocol.h"
+#include "r_r15_network_layer.h"
+#include "r_r15_family.h"
+#include "r_communication_service.h"
+#include "t_security_algorithms.h"
+
+/*******************************************************************************
+ * Declaration of file local functions
+ ******************************************************************************/
+static Timer_t *TimerSet(PacketMeta_t *Packet_p, const SendData_LP_t *const InputData_p, Communication_t *Communication_p);
+static void R15_Transport_OutHashCallback(const void *const Data_p, uint32 Length, const uint8 *const Hash_p, void *Param_p);
+
+/*******************************************************************************
+ * File scope types, constants and variables
+ ******************************************************************************/
+
+/*******************************************************************************
+ * Definition of external functions
+ ******************************************************************************/
+
+/*
+ * Initializes the transport layer for R15 protocol family.
+ *
+ * @param [in] Communication_p Communication module context.
+ *
+ * @retval E_SUCCESS After successful execution.
+ * @retval E_FAILED_TO_INIT_TL Unsuccessful initialization.
+ * @retval E_ALLOCATE_FAILED Failed to allocate memory space.
+ */
+ErrorCode_e R15_Transport_Initialize(const Communication_t *const Communication_p)
+{
+ int VectorCounter;
+
+ /* Iintialize the session counters for command protocol*/
+ R15_TRANSPORT(Communication_p)->SessionStateIn = 0;
+ R15_TRANSPORT(Communication_p)->SessionStateOut = 0;
+
+ /* Iintialize the session counter for bulk protocol*/
+ R15_TRANSPORT(Communication_p)->BulkSessionCounter = 0;
+
+ /* initialize the default timeouts */
+ R15_TIMEOUTS(Communication_p)->TCACK = ACK_TIMEOUT_IN_MS;
+ R15_TIMEOUTS(Communication_p)->TBCR = BULK_COMMAND_RECEIVING_TIMEOUT;
+ R15_TIMEOUTS(Communication_p)->TBDR = BULK_DATA_RECEIVING_TIMEOUT;
+
+ for (VectorCounter = 0; VectorCounter < MAX_BULK_TL_PROCESSES; VectorCounter++) {
+ R15_TRANSPORT(Communication_p)->BulkVectorList[VectorCounter].Status = BULK_SESSION_IDLE;
+ }
+
+ memset(&(R15_TRANSPORT(Communication_p)->PreviousBulkVector), 0x00, sizeof(TL_BulkVectorList_t));
+ R15_TRANSPORT(Communication_p)->BulkHandle.BulkVector_p = NULL;
+
+ return E_SUCCESS;
+}
+
+/*
+ * Shut Down the transport layer for R15 protocol family.
+ *
+ * @param [in] Communication_p Communication module context.
+
+ * @retval E_SUCCESS After successful execution.
+ */
+ErrorCode_e R15_Transport_Shutdown(const Communication_t *const Communication_p)
+{
+ return E_SUCCESS;
+}
+
+/*
+ * Handles all registered TL processes for R15 protocol family.
+ *
+ * @param [in] Communication_p Communication module context.
+ *
+ * @retval E_SUCCESS After successful execution.
+ */
+ErrorCode_e R15_Transport_Poll(Communication_t *Communication_p)
+{
+ ErrorCode_e ReturnValue = E_GENERAL_FATAL_ERROR;
+#ifndef CFG_ENABLE_LOADER_TYPE
+ PacketMeta_t *Packet_p = NULL;
+
+ ReturnValue = R15_Network_ReceiverHandler(Communication_p);
+ VERIFY(E_SUCCESS == ReturnValue, ReturnValue);
+
+ ReturnValue = R15_Network_TransmiterHandler(Communication_p);
+ VERIFY(E_SUCCESS == ReturnValue, ReturnValue);
+#endif
+
+ if (BULK_SESSION_IDLE != Do_R15_Bulk_GetStatusSession(R15_TRANSPORT(Communication_p)->BulkHandle.BulkVector_p)) {
+ ReturnValue = R15_Bulk_Process_Write(Communication_p, R15_TRANSPORT(Communication_p)->BulkHandle.BulkVector_p);
+ VERIFY(E_SUCCESS == ReturnValue, ReturnValue);
+ }
+
+ ReturnValue = R15_NETWORK(Communication_p)->Outbound.LCM_Error;
+ VERIFY(E_SUCCESS == ReturnValue, ReturnValue);
+
+#ifndef CFG_ENABLE_LOADER_TYPE
+
+ while ((Packet_p = (PacketMeta_t *)QUEUE(Communication_p, FifoDequeue_Fn)(OBJECT_QUEUE(Communication_p), Communication_p->Inbound_p)) != NULL) {
+ switch (Packet_p->Header.Protocol) {
+ case PROTO_BULK:
+ return R15_Bulk_Process(Communication_p, Packet_p);
+ case PROTO_COMMAND:
+ return R15_Command_Process(Communication_p, Packet_p);
+ default:
+ return E_SUCCESS;
+ }
+ }
+
+#endif
+
+ErrorExit:
+ return ReturnValue;
+}
+
+
+/*
+ * Function for sending packet in R15 protocol family.
+ *
+ * @param [in] Communication_p Communication module context.
+ * @param [in] InputDataIn_p Pointer to the input data.
+ *
+ * @retval E_SUCCESS After successful execution.
+ * @retval E_FAILED_TO_ALLOCATE_COMM_BUFFER Failed to allocate communication
+ * buffer.
+ */
+ErrorCode_e R15_Transport_Send(Communication_t *Communication_p, void *InputDataIn_p)
+{
+ PacketMeta_t *Packet_p;
+ SendData_LP_t *InputData_p = (SendData_LP_t *)InputDataIn_p;
+
+ if (InputData_p->Header_p->Protocol == BULK_PROTOCOL && (((BulkExtendedHeader_t *)InputData_p->ExtendedHeader_p)->TypeFlags & MASK_BULK_COMMAND_SELECT) == CMD_BULK_DATA) {
+ Packet_p = R15_Network_PacketAllocate(Communication_p, BULK_BUFFER_SIZE);
+ } else {
+ Packet_p = R15_Network_PacketAllocate(Communication_p, COMMAND_BUFFER_SIZE);
+ }
+
+ if (NULL == Packet_p) {
+ A_(printf("r15_transport_layer.c (%d): ** Failed to get available buffers! **\n", __LINE__);)
+ return E_FAILED_TO_ALLOCATE_COMM_BUFFER;
+ }
+
+ Packet_p->Resend = 0;
+ Packet_p->CallBack_p = NULL;
+
+ Packet_p->Timer_p = TimerSet(Packet_p, InputData_p, Communication_p);
+ Packet_p->Header = *InputData_p->Header_p;
+ /* serialize and calculate extended header */
+ Packet_p->ExtendedHeader_p = Packet_p->Buffer_p + HEADER_OFFSET_IN_BUFFER + ALIGNED_HEADER_LENGTH;
+ R15_SerializeExtendedHeader(Packet_p->ExtendedHeader_p, InputData_p->Header_p->Protocol, InputData_p->ExtendedHeader_p, &(Packet_p->Header.ExtendedHeaderChecksum));
+ if (Packet_p->Header.ExtendedHeaderLength == COMMAND_EXTENDED_HEADER_LENGTH) {
+ Packet_p->Payload_p = Packet_p->Buffer_p + HEADER_OFFSET_IN_BUFFER + ALIGNED_HEADER_LENGTH + ALIGNED_COMMAND_EXTENDED_HEADER_LENGTH;
+ } else {
+ Packet_p->Payload_p = Packet_p->Buffer_p + HEADER_OFFSET_IN_BUFFER + ALIGNED_HEADER_LENGTH + ALIGNED_BULK_EXTENDED_HEADER_LENGTH;
+ }
+ if (NULL != InputData_p->Payload_p) {
+ /* setup payload for calculation */
+ memcpy(Packet_p->Payload_p, InputData_p->Payload_p, Packet_p->Header.PayloadLength);
+
+ /* Calculate Payload CRC */
+ Packet_p->Communication_p = Communication_p;
+
+ if (HASH_NONE != Packet_p->Header.Flags) {
+ Communication_p->HashDevice_p->Calculate(OBJECT_HASH(Communication_p),
+ (HashType_e)Packet_p->Header.Flags,
+ (void *)Packet_p->Payload_p, Packet_p->Header.PayloadLength,
+ Packet_p->Hash, (HashCallback_t)R15_Transport_OutHashCallback,
+ (void *)Packet_p);
+ } else {
+ SET_PACKET_FLAGS(Packet_p, PACKET_CRC_STATE_MASK, BUF_PAYLOAD_CRC_CALCULATED);
+ memset(&Packet_p->Header.PayloadChecksum, 0x0, sizeof(uint32));
+ R15_SerializeHeader(Packet_p->Buffer_p + HEADER_OFFSET_IN_BUFFER, &Packet_p->Header);
+
+ (void)QUEUE(Packet_p->Communication_p, FifoEnqueue_Fn)(OBJECT_QUEUE(Packet_p->Communication_p), Packet_p->Communication_p->Outbound_p, Packet_p);
+ }
+ } else {
+ R15_SerializeHeader(Packet_p->Buffer_p + HEADER_OFFSET_IN_BUFFER, &Packet_p->Header);
+
+ (void)QUEUE(Communication_p, FifoEnqueue_Fn)(OBJECT_QUEUE(Communication_p), Communication_p->Outbound_p, Packet_p);
+ }
+
+ return E_SUCCESS;
+}
+
+/*
+ * Function for setting the timeouts in the R15 protocol family.
+ *
+ * @param [in] Communication_p Communication module context.
+ * @param [in] TimeoutData_p Pointer to the input data with all timeouts.
+ *
+ * @retval E_SUCCESS After successful execution.
+ */
+ErrorCode_e R15_SetProtocolTimeouts(Communication_t *Communication_p, void *TimeoutData_p)
+{
+ ErrorCode_e ReturnValue = E_INVALID_INPUT_PARAMETERS;
+ R15_Timeouts_t *NewTimeoutData_p = (R15_Timeouts_t *)TimeoutData_p;
+ VERIFY(NULL != TimeoutData_p, E_INVALID_INPUT_PARAMETERS);
+
+ R15_TIMEOUTS(Communication_p)->TCACK = NewTimeoutData_p->TCACK;
+ R15_TIMEOUTS(Communication_p)->TBCR = NewTimeoutData_p->TBCR;
+ R15_TIMEOUTS(Communication_p)->TBDR = NewTimeoutData_p->TBDR;
+ ReturnValue = E_SUCCESS;
+
+ErrorExit:
+ return ReturnValue;
+}
+
+/*
+ * Function for getting the timeouts in the R15 protocol family.
+ *
+ * @param [in] Communication_p Communication module context.
+ * @param [out] TimeoutData_p Return all defined timeouts.
+ *
+ * @retval E_SUCCESS After successful execution.
+ */
+ErrorCode_e R15_GetProtocolTimeouts(Communication_t *Communication_p, void *TimeoutData_p)
+{
+ ErrorCode_e ReturnValue = E_INVALID_INPUT_PARAMETERS;
+ VERIFY(NULL != TimeoutData_p, E_INVALID_INPUT_PARAMETERS);
+
+ ((R15_Timeouts_t *)TimeoutData_p)->TCACK = R15_TIMEOUTS(Communication_p)->TCACK;
+ ((R15_Timeouts_t *)TimeoutData_p)->TBCR = R15_TIMEOUTS(Communication_p)->TBCR;
+ ((R15_Timeouts_t *)TimeoutData_p)->TBDR = R15_TIMEOUTS(Communication_p)->TBDR;
+ ReturnValue = E_SUCCESS;
+
+ErrorExit:
+ return ReturnValue;
+}
+
+
+/*
+ * Callback function for handling calculated data.
+ *
+ * @param [in] Data_p Pointer to the data buffer for calculation.
+ * @param [in] Length Length of the data for calculation.
+ * @param [out] Hash_p Pointer to buffer with calculated hash.
+ * @param [in] Param_p Pointer to extra parameters.
+ *
+ * @return none.
+ */
+static void R15_Transport_OutHashCallback(const void *const Data_p, uint32 Length, const uint8 *const Hash_p, void *Param_p)
+{
+ PacketMeta_t *Packet_p = (PacketMeta_t *)Param_p;
+
+ SET_PACKET_FLAGS(Packet_p, PACKET_CRC_STATE_MASK, BUF_PAYLOAD_CRC_CALCULATED);
+ memcpy(&Packet_p->Header.PayloadChecksum, Hash_p, sizeof(uint32));
+ R15_SerializeHeader(Packet_p->Buffer_p + HEADER_OFFSET_IN_BUFFER, &Packet_p->Header);
+
+ (void)QUEUE(Packet_p->Communication_p, FifoEnqueue_Fn)(OBJECT_QUEUE(Packet_p->Communication_p), Packet_p->Communication_p->Outbound_p, Packet_p);
+}
+
+/*
+ * Function for Timer setting.
+ *
+ * @param [in] Packet_p Pointer to the R15 packet meta data.
+ * @param [in] InputData_p Pointer to the input parameters with settings.
+ * @param [in] Communication_p Communication module context.
+ *
+ * @return none.
+ */
+static Timer_t *TimerSet(PacketMeta_t *Packet_p, const SendData_LP_t *const InputData_p, Communication_t *Communication_p)
+{
+ Timer_t *Timer_p = NULL;
+
+ if (InputData_p->Time > 0) {
+ Timer_p = (Timer_t *)malloc(sizeof(Timer_t));
+
+ if (NULL == Timer_p) {
+ return NULL;
+ }
+
+ /* timer data */
+ Timer_p->Time = InputData_p->Time;
+ Timer_p->PeriodicalTime = 0;
+ Timer_p->HandleFunction_p = (HandleFunction_t)(InputData_p->TimerCallBackFn_p);
+ Timer_p->Data_p = (void *)Packet_p;
+ Timer_p->Param_p = (void *)Communication_p;
+ }
+
+ return Timer_p;
+}
+/** @} */
+/** @} */
+/** @} */