|
@@ -10,7 +10,6 @@
|
|
#include <string.h>
|
|
#include <string.h>
|
|
|
|
|
|
|
|
|
|
-
|
|
|
|
/**
|
|
/**
|
|
* @brief create a secured packet and pass it to the shellmatta write function
|
|
* @brief create a secured packet and pass it to the shellmatta write function
|
|
*
|
|
*
|
|
@@ -24,30 +23,32 @@
|
|
static shellmatta_retCode_t shellmatta_transport_send(shellmatta_transport_layer_t *transportLayer,
|
|
static shellmatta_retCode_t shellmatta_transport_send(shellmatta_transport_layer_t *transportLayer,
|
|
shellmatta_transport_packet_t *packet)
|
|
shellmatta_transport_packet_t *packet)
|
|
{
|
|
{
|
|
- uint32_t checksum;
|
|
|
|
- char *rawPacketBuffer = (char*)packet;
|
|
|
|
|
|
+ uint32_t crc;
|
|
|
|
+ char *rawPacket = (char*)packet;
|
|
|
|
+ shellmatta_transport_header_t *header = &packet->header;
|
|
|
|
|
|
/** -# fill header */
|
|
/** -# fill header */
|
|
- packet->startOfHeader = SHELLMATTA_START_OF_HEADER;
|
|
|
|
- packet->protocolVersion = PROTOCOL_VERSION;
|
|
|
|
- packet->source = 0;
|
|
|
|
- packet->destination = 0;
|
|
|
|
- packet->sequenceH2S = transportLayer->sequenceH2S;
|
|
|
|
- packet->sequenceS2H = ++transportLayer->sequenceS2H;
|
|
|
|
|
|
+ header->startOfHeader = SHELLMATTA_TRANSPORT_START_OF_HEADER;
|
|
|
|
+ header->protocolVersion = SHELLMATTA_TRANSPORT_PROTOCOL_VERSION;
|
|
|
|
+ header->source = 0;
|
|
|
|
+ header->destination = 0;
|
|
|
|
+ header->sequenceH2S = transportLayer->sequenceH2S;
|
|
|
|
+ header->sequenceS2H = ++transportLayer->sequenceS2H;
|
|
|
|
|
|
- checksum = crc32Calc((char*) packet, SHELLMATTA_HEADER_LENGTH + packet->payloadLength);
|
|
|
|
|
|
+ crc = crc32Calc((char*) packet, SHELLMATTA_TRANSPORT_LENGTH_HEADER + header->payloadLength);
|
|
|
|
|
|
/* append crc to end of payload */
|
|
/* append crc to end of payload */
|
|
- rawPacketBuffer[SHELLMATTA_HEADER_LENGTH + packet->payloadLength] = (uint8_t)(checksum >> SHELLMATTA_SHIFT_BY_24);
|
|
|
|
- rawPacketBuffer[SHELLMATTA_HEADER_LENGTH + packet->payloadLength + SHELLMATTA_SHIFT_BY_1] = (uint8_t)(checksum >> SHELLMATTA_SHIFT_BY_16);
|
|
|
|
- rawPacketBuffer[SHELLMATTA_HEADER_LENGTH + packet->payloadLength + SHELLMATTA_SHIFT_BY_2] = (uint8_t)(checksum >> SHELLMATTA_SHIFT_BY_8);
|
|
|
|
- rawPacketBuffer[SHELLMATTA_HEADER_LENGTH + packet->payloadLength + SHELLMATTA_SHIFT_BY_3] = (uint8_t)(checksum);
|
|
|
|
|
|
+ rawPacket[SHELLMATTA_TRANSPORT_LENGTH_HEADER + header->payloadLength] = (uint8_t)(crc >> 24u);
|
|
|
|
+ rawPacket[SHELLMATTA_TRANSPORT_LENGTH_HEADER + header->payloadLength + 1u] = (uint8_t)(crc >> 16u);
|
|
|
|
+ rawPacket[SHELLMATTA_TRANSPORT_LENGTH_HEADER + header->payloadLength + 2u] = (uint8_t)(crc >> 8u);
|
|
|
|
+ rawPacket[SHELLMATTA_TRANSPORT_LENGTH_HEADER + header->payloadLength + 3u] = (uint8_t)(crc);
|
|
|
|
|
|
/* use original write function to send full buffer */
|
|
/* use original write function to send full buffer */
|
|
- return transportLayer->originalWrite((char*) rawPacketBuffer, SHELLMATTA_HEADER_LENGTH + packet->payloadLength + SHELLMATTA_LENGTH_CRC);
|
|
|
|
|
|
+ return transportLayer->writeFct((char*) rawPacket,
|
|
|
|
+ SHELLMATTA_TRANSPORT_LENGTH_STATIC +
|
|
|
|
+ header->payloadLength);
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
|
|
/**
|
|
/**
|
|
* @brief Initializes the transportLayerInst
|
|
* @brief Initializes the transportLayerInst
|
|
* @param[in, out] transportLayer transport layer instance to work on
|
|
* @param[in, out] transportLayer transport layer instance to work on
|
|
@@ -58,7 +59,7 @@ shellmatta_retCode_t shellmatta_transport_init( shellmatta_transport_layer_t
|
|
shellmatta_write_t writeFct)
|
|
shellmatta_write_t writeFct)
|
|
{
|
|
{
|
|
memset(transportLayer, 0u, sizeof(shellmatta_transport_layer_t));
|
|
memset(transportLayer, 0u, sizeof(shellmatta_transport_layer_t));
|
|
- transportLayer->originalWrite = writeFct;
|
|
|
|
|
|
+ transportLayer->writeFct = writeFct;
|
|
|
|
|
|
return SHELLMATTA_OK;
|
|
return SHELLMATTA_OK;
|
|
}
|
|
}
|
|
@@ -96,29 +97,38 @@ shellmatta_retCode_t shellmatta_transport_process(shellmatta_transport_layer_t
|
|
uint32_t *length)
|
|
uint32_t *length)
|
|
{
|
|
{
|
|
shellmatta_retCode_t ret = SHELLMATTA_BUSY;
|
|
shellmatta_retCode_t ret = SHELLMATTA_BUSY;
|
|
- char *rawPacketBuffer = (char*)&transportLayer->packetBuffer;
|
|
|
|
|
|
+ char *rawPacket = (char*)&transportLayer->inPacket;
|
|
|
|
+ shellmatta_transport_header_t *header = &transportLayer->inPacket.header;
|
|
shellmatta_transport_packet_int_t intPacket;
|
|
shellmatta_transport_packet_int_t intPacket;
|
|
uint32_t refCrc;
|
|
uint32_t refCrc;
|
|
|
|
|
|
switch (transportLayer->state)
|
|
switch (transportLayer->state)
|
|
{
|
|
{
|
|
- /* look for start of header */
|
|
|
|
|
|
+ /** -# look for start of header */
|
|
case SHELLMATTA_TRANSPORT_STATE_WAIT:
|
|
case SHELLMATTA_TRANSPORT_STATE_WAIT:
|
|
- /* if start of header is found, continue transport layer fsm */
|
|
|
|
- if (SHELLMATTA_START_OF_HEADER == byte)
|
|
|
|
|
|
+ /** -# if start of header is found, continue transport layer fsm */
|
|
|
|
+ if (SHELLMATTA_TRANSPORT_START_OF_HEADER == byte)
|
|
{
|
|
{
|
|
- memset(&transportLayer->packetBuffer, 0, sizeof(transportLayer->packetBuffer));
|
|
|
|
|
|
+ memset(&transportLayer->inPacket, 0, sizeof(transportLayer->inPacket));
|
|
transportLayer->headerIndex = 1u;
|
|
transportLayer->headerIndex = 1u;
|
|
transportLayer->payloadIndex = 0u;
|
|
transportLayer->payloadIndex = 0u;
|
|
transportLayer->crcIndex = 0u;
|
|
transportLayer->crcIndex = 0u;
|
|
- transportLayer->packetBuffer.startOfHeader = byte;
|
|
|
|
|
|
+ header->startOfHeader = byte;
|
|
transportLayer->state = SHELLMATTA_TRANSPORT_STATE_GET_HEADER;
|
|
transportLayer->state = SHELLMATTA_TRANSPORT_STATE_GET_HEADER;
|
|
}
|
|
}
|
|
|
|
+ else if((true == transportLayer->mandatory))
|
|
|
|
+ {
|
|
|
|
+ /** -# if transport layer is mandatory - throw away unrecognized bytes */
|
|
|
|
+ *data = transportLayer->inPacket.payload;
|
|
|
|
+ *length = 0;
|
|
|
|
+ transportLayer->active = true;
|
|
|
|
+ ret = SHELLMATTA_OK;
|
|
|
|
+ }
|
|
else
|
|
else
|
|
{
|
|
{
|
|
- /* just pass the payload as is */
|
|
|
|
- transportLayer->packetBuffer.payload[0] = byte;
|
|
|
|
- *data = transportLayer->packetBuffer.payload;
|
|
|
|
|
|
+ /** -# otherwise just pass the payload as is */
|
|
|
|
+ transportLayer->inPacket.payload[0] = byte;
|
|
|
|
+ *data = transportLayer->inPacket.payload;
|
|
*length = 1;
|
|
*length = 1;
|
|
transportLayer->active = false;
|
|
transportLayer->active = false;
|
|
ret = SHELLMATTA_OK;
|
|
ret = SHELLMATTA_OK;
|
|
@@ -127,13 +137,13 @@ shellmatta_retCode_t shellmatta_transport_process(shellmatta_transport_layer_t
|
|
|
|
|
|
case SHELLMATTA_TRANSPORT_STATE_GET_HEADER:
|
|
case SHELLMATTA_TRANSPORT_STATE_GET_HEADER:
|
|
|
|
|
|
- rawPacketBuffer[transportLayer->headerIndex] = byte;
|
|
|
|
|
|
+ rawPacket[transportLayer->headerIndex] = byte;
|
|
transportLayer->headerIndex ++;
|
|
transportLayer->headerIndex ++;
|
|
|
|
|
|
- if (transportLayer->headerIndex == SHELLMATTA_HEADER_LENGTH)
|
|
|
|
|
|
+ if (transportLayer->headerIndex == SHELLMATTA_TRANSPORT_LENGTH_HEADER)
|
|
{
|
|
{
|
|
//TODO check for errors in header data
|
|
//TODO check for errors in header data
|
|
- if (0u != transportLayer->packetBuffer.payloadLength)
|
|
|
|
|
|
+ if (0u != header->payloadLength)
|
|
{
|
|
{
|
|
transportLayer->state = SHELLMATTA_TRANSPORT_STATE_GET_PAYLOAD;
|
|
transportLayer->state = SHELLMATTA_TRANSPORT_STATE_GET_PAYLOAD;
|
|
}
|
|
}
|
|
@@ -148,10 +158,10 @@ shellmatta_retCode_t shellmatta_transport_process(shellmatta_transport_layer_t
|
|
/* read payload for previously read length of payload */
|
|
/* read payload for previously read length of payload */
|
|
case SHELLMATTA_TRANSPORT_STATE_GET_PAYLOAD:
|
|
case SHELLMATTA_TRANSPORT_STATE_GET_PAYLOAD:
|
|
|
|
|
|
- transportLayer->packetBuffer.payload[transportLayer->payloadIndex] = byte;
|
|
|
|
|
|
+ transportLayer->inPacket.payload[transportLayer->payloadIndex] = byte;
|
|
transportLayer->payloadIndex ++;
|
|
transportLayer->payloadIndex ++;
|
|
|
|
|
|
- if (transportLayer->payloadIndex >= transportLayer->packetBuffer.payloadLength)
|
|
|
|
|
|
+ if (transportLayer->payloadIndex >= header->payloadLength)
|
|
{
|
|
{
|
|
transportLayer->state = SHELLMATTA_TRANSPORT_STATE_GET_CRC;
|
|
transportLayer->state = SHELLMATTA_TRANSPORT_STATE_GET_CRC;
|
|
}
|
|
}
|
|
@@ -161,14 +171,14 @@ shellmatta_retCode_t shellmatta_transport_process(shellmatta_transport_layer_t
|
|
case SHELLMATTA_TRANSPORT_STATE_GET_CRC:
|
|
case SHELLMATTA_TRANSPORT_STATE_GET_CRC:
|
|
|
|
|
|
transportLayer->crcIndex ++;
|
|
transportLayer->crcIndex ++;
|
|
- transportLayer->packetBuffer.checksum |= ((uint8_t)byte << ((SHELLMATTA_LENGTH_CRC - transportLayer->crcIndex) * 8u));
|
|
|
|
|
|
+ transportLayer->inPacket.crc |= ((uint8_t)byte << ((SHELLMATTA_TRANSPORT_LENGTH_CRC - transportLayer->crcIndex) * 8u));
|
|
|
|
|
|
- if (transportLayer->crcIndex >= SHELLMATTA_LENGTH_CRC)
|
|
|
|
|
|
+ if (transportLayer->crcIndex >= SHELLMATTA_TRANSPORT_LENGTH_CRC)
|
|
{
|
|
{
|
|
- refCrc = crc32Calc(rawPacketBuffer, SHELLMATTA_HEADER_LENGTH + transportLayer->packetBuffer.payloadLength);
|
|
|
|
|
|
+ refCrc = crc32Calc(rawPacket, SHELLMATTA_TRANSPORT_LENGTH_HEADER + header->payloadLength);
|
|
|
|
|
|
/* if crc is correct, further handling of data depends on type of packet */
|
|
/* if crc is correct, further handling of data depends on type of packet */
|
|
- if (transportLayer->packetBuffer.checksum == refCrc)
|
|
|
|
|
|
+ if (transportLayer->inPacket.crc == refCrc)
|
|
{
|
|
{
|
|
|
|
|
|
transportLayer->active = true;
|
|
transportLayer->active = true;
|
|
@@ -176,19 +186,19 @@ shellmatta_retCode_t shellmatta_transport_process(shellmatta_transport_layer_t
|
|
/* crc is correct */
|
|
/* crc is correct */
|
|
transportLayer->sequenceH2S++;
|
|
transportLayer->sequenceH2S++;
|
|
|
|
|
|
- switch (transportLayer->packetBuffer.packetType)
|
|
|
|
|
|
+ switch (header->packetType)
|
|
{
|
|
{
|
|
case SHELLMATTA_TRANSPORT_PACKET_DATA:
|
|
case SHELLMATTA_TRANSPORT_PACKET_DATA:
|
|
/** return pointer to payload and length */
|
|
/** return pointer to payload and length */
|
|
- *data = (char*)&transportLayer->packetBuffer.payload;
|
|
|
|
- *length = transportLayer->packetBuffer.payloadLength;
|
|
|
|
|
|
+ *data = (char*)&transportLayer->inPacket.payload;
|
|
|
|
+ *length = header->payloadLength;
|
|
ret = SHELLMATTA_OK;
|
|
ret = SHELLMATTA_OK;
|
|
break;
|
|
break;
|
|
|
|
|
|
case SHELLMATTA_TRANSPORT_PACKET_SEQ_CNT_REQUEST:
|
|
case SHELLMATTA_TRANSPORT_PACKET_SEQ_CNT_REQUEST:
|
|
/* send out packet with no payload */
|
|
/* send out packet with no payload */
|
|
- intPacket.packetType = SHELLMATTA_TRANSPORT_PACKET_SEQ_CNT_RESPOND;
|
|
|
|
- intPacket.payloadLength = 0u;
|
|
|
|
|
|
+ intPacket.header.packetType = SHELLMATTA_TRANSPORT_PACKET_SEQ_CNT_RESPOND;
|
|
|
|
+ intPacket.header.payloadLength = 0u;
|
|
(void)shellmatta_transport_send(transportLayer, (shellmatta_transport_packet_t *)&intPacket);
|
|
(void)shellmatta_transport_send(transportLayer, (shellmatta_transport_packet_t *)&intPacket);
|
|
break;
|
|
break;
|
|
|
|
|
|
@@ -257,7 +267,8 @@ shellmatta_retCode_t shellmatta_transport_write(shellmatta_transport_layer_t *tr
|
|
{
|
|
{
|
|
shellmatta_retCode_t ret = SHELLMATTA_OK;
|
|
shellmatta_retCode_t ret = SHELLMATTA_OK;
|
|
uint32_t outPayloadLength = length;
|
|
uint32_t outPayloadLength = length;
|
|
- shellmatta_transport_packet_t *packet = &transportLayer->outputPacketBuffer;
|
|
|
|
|
|
+ shellmatta_transport_packet_t *packet = &transportLayer->outPacket;
|
|
|
|
+ shellmatta_transport_header_t *header = &transportLayer->outPacket.header;
|
|
|
|
|
|
/* handle data with length bigger than max length */
|
|
/* handle data with length bigger than max length */
|
|
uint32_t processedLength = 0u;
|
|
uint32_t processedLength = 0u;
|
|
@@ -269,7 +280,7 @@ shellmatta_retCode_t shellmatta_transport_write(shellmatta_transport_layer_t *tr
|
|
/* foot-controlled loop to send packets without payload length */
|
|
/* foot-controlled loop to send packets without payload length */
|
|
do
|
|
do
|
|
{
|
|
{
|
|
- piledUpPayload = transportLayer->outputPacketBuffer.payloadLength;
|
|
|
|
|
|
+ piledUpPayload = header->payloadLength;
|
|
|
|
|
|
/* compute length of next payload split */
|
|
/* compute length of next payload split */
|
|
restOfPayload = (outPayloadLength - processedLength);
|
|
restOfPayload = (outPayloadLength - processedLength);
|
|
@@ -279,20 +290,20 @@ shellmatta_retCode_t shellmatta_transport_write(shellmatta_transport_layer_t *tr
|
|
}
|
|
}
|
|
else
|
|
else
|
|
{
|
|
{
|
|
- splitLength = (restOfPayload + SHELLMATTA_HEADER_LENGTH + SHELLMATTA_LENGTH_CRC) % SHELLMATTA_TRANPORT_PAYLOAD_MAXLENGTH;
|
|
|
|
|
|
+ splitLength = (restOfPayload + SHELLMATTA_TRANSPORT_LENGTH_STATIC) % SHELLMATTA_TRANPORT_PAYLOAD_MAXLENGTH;
|
|
}
|
|
}
|
|
- splitPayloadLength = splitLength - SHELLMATTA_HEADER_LENGTH - SHELLMATTA_LENGTH_CRC;
|
|
|
|
|
|
+ splitPayloadLength = splitLength - SHELLMATTA_TRANSPORT_LENGTH_STATIC;
|
|
|
|
|
|
(void)memcpy(&packet->payload[piledUpPayload], &data[processedLength], splitPayloadLength);
|
|
(void)memcpy(&packet->payload[piledUpPayload], &data[processedLength], splitPayloadLength);
|
|
- packet->payloadLength += splitPayloadLength;
|
|
|
|
|
|
+ header->payloadLength += splitPayloadLength;
|
|
processedLength += splitPayloadLength;
|
|
processedLength += splitPayloadLength;
|
|
|
|
|
|
- if(packet->payloadLength >= SHELLMATTA_TRANPORT_PAYLOAD_MAXLENGTH)
|
|
|
|
|
|
+ if(header->payloadLength >= SHELLMATTA_TRANPORT_PAYLOAD_MAXLENGTH)
|
|
{
|
|
{
|
|
/** -# packet is full - send */
|
|
/** -# packet is full - send */
|
|
- packet->packetType = SHELLMATTA_TRANSPORT_PACKET_DATA;
|
|
|
|
- ret = shellmatta_transport_send(transportLayer, &transportLayer->outputPacketBuffer);
|
|
|
|
- transportLayer->outputPacketBuffer.payloadLength = 0u;
|
|
|
|
|
|
+ header->packetType = SHELLMATTA_TRANSPORT_PACKET_DATA;
|
|
|
|
+ ret = shellmatta_transport_send(transportLayer, packet);
|
|
|
|
+ header->payloadLength = 0u;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
while (processedLength < outPayloadLength);
|
|
while (processedLength < outPayloadLength);
|
|
@@ -308,13 +319,13 @@ shellmatta_retCode_t shellmatta_transport_write(shellmatta_transport_layer_t *tr
|
|
shellmatta_retCode_t shellmatta_transport_flush(shellmatta_transport_layer_t *transportLayer)
|
|
shellmatta_retCode_t shellmatta_transport_flush(shellmatta_transport_layer_t *transportLayer)
|
|
{
|
|
{
|
|
shellmatta_retCode_t ret = SHELLMATTA_OK;
|
|
shellmatta_retCode_t ret = SHELLMATTA_OK;
|
|
- shellmatta_transport_packet_t *packet = &transportLayer->outputPacketBuffer;
|
|
|
|
|
|
+ shellmatta_transport_packet_t *packet = &transportLayer->outPacket;
|
|
|
|
|
|
- if(0 != transportLayer->outputPacketBuffer.payloadLength)
|
|
|
|
|
|
+ if(0 != packet->header.payloadLength)
|
|
{
|
|
{
|
|
- packet->packetType = SHELLMATTA_TRANSPORT_PACKET_DATA;
|
|
|
|
- ret = shellmatta_transport_send(transportLayer, &transportLayer->outputPacketBuffer);
|
|
|
|
- packet->payloadLength = 0u;
|
|
|
|
|
|
+ packet->header.packetType = SHELLMATTA_TRANSPORT_PACKET_DATA;
|
|
|
|
+ ret = shellmatta_transport_send(transportLayer, &transportLayer->outPacket);
|
|
|
|
+ packet->header.payloadLength = 0u;
|
|
}
|
|
}
|
|
|
|
|
|
return ret;
|
|
return ret;
|