Lines Matching refs:context

40 static void chppSetRxState(struct ChppTransportState *context,
42 static size_t chppConsumePreamble(struct ChppTransportState *context,
44 static size_t chppConsumeHeader(struct ChppTransportState *context,
46 static size_t chppConsumePayload(struct ChppTransportState *context,
48 static size_t chppConsumeFooter(struct ChppTransportState *context,
50 static void chppAbortRxPacket(struct ChppTransportState *context);
53 struct ChppTransportState *context);
57 struct ChppTransportState *context);
59 static void chppSetResetComplete(struct ChppTransportState *context);
60 static void chppProcessResetAck(struct ChppTransportState *context);
61 static void chppProcessRxPacket(struct ChppTransportState *context);
62 static void chppProcessRxPayload(struct ChppTransportState *context);
63 static void chppClearRxDatagram(struct ChppTransportState *context);
64 static bool chppRxChecksumIsOk(const struct ChppTransportState *context);
66 const struct ChppTransportState *context);
67 static void chppRegisterRxAck(struct ChppTransportState *context);
69 static void chppEnqueueTxPacket(struct ChppTransportState *context,
73 struct ChppTransportState *context);
74 static void chppAddPayload(struct ChppTransportState *context);
76 size_t chppDequeueTxDatagram(struct ChppTransportState *context);
77 static void chppClearTxDatagramQueue(struct ChppTransportState *context);
78 static void chppTransportDoWork(struct ChppTransportState *context);
82 static bool chppEnqueueTxDatagram(struct ChppTransportState *context,
85 struct ChppTransportState *context);
87 static void chppResetTransportContext(struct ChppTransportState *context);
88 static void chppReset(struct ChppTransportState *context,
93 struct ChppTransportState *context);
108 static void chppSetRxState(struct ChppTransportState *context, in chppSetRxState() argument
112 context->rxStatus.state, newState, context->rxStatus.locInState); in chppSetRxState()
113 context->rxStatus.locInState = 0; in chppSetRxState()
114 context->rxStatus.state = newState; in chppSetRxState()
131 static size_t chppConsumePreamble(struct ChppTransportState *context, in chppConsumePreamble() argument
138 context->rxStatus.locInState < CHPP_PREAMBLE_LEN_BYTES) { in chppConsumePreamble()
139 size_t offset = context->rxStatus.locInState; in chppConsumePreamble()
143 context->rxStatus.locInState++; in chppConsumePreamble()
147 context->rxStatus.locInState = 1; in chppConsumePreamble()
151 context->rxStatus.locInState = 0; in chppConsumePreamble()
158 if (context->rxStatus.locInState == CHPP_PREAMBLE_LEN_BYTES) { in chppConsumePreamble()
160 context->rxStatus.packetStartTimeNs = chppGetCurrentTimeNs(); in chppConsumePreamble()
161 chppSetRxState(context, CHPP_STATE_HEADER); in chppConsumePreamble()
178 static size_t chppConsumeHeader(struct ChppTransportState *context, in chppConsumeHeader() argument
180 CHPP_ASSERT(context->rxStatus.locInState < in chppConsumeHeader()
183 len, (sizeof(struct ChppTransportHeader) - context->rxStatus.locInState)); in chppConsumeHeader()
184 memcpy(((uint8_t *)&context->rxHeader) + context->rxStatus.locInState, buf, in chppConsumeHeader()
186 context->rxStatus.locInState += bytesToCopy; in chppConsumeHeader()
188 if (context->rxStatus.locInState == sizeof(struct ChppTransportHeader)) { in chppConsumeHeader()
191 enum ChppTransportErrorCode headerCheckResult = chppRxHeaderCheck(context); in chppConsumeHeader()
195 context, CHPP_ATTR_AND_ERROR_TO_PACKET_CODE(CHPP_TRANSPORT_ATTR_NONE, in chppConsumeHeader()
197 chppSetRxState(context, CHPP_STATE_PREAMBLE); in chppConsumeHeader()
199 } else if (context->rxHeader.length == 0) { in chppConsumeHeader()
201 chppSetRxState(context, CHPP_STATE_FOOTER); in chppConsumeHeader()
207 if (context->rxDatagram.length == 0) { in chppConsumeHeader()
209 tempPayload = chppMalloc(context->rxHeader.length); in chppConsumeHeader()
213 chppRealloc(context->rxDatagram.payload, in chppConsumeHeader()
214 context->rxDatagram.length + context->rxHeader.length, in chppConsumeHeader()
215 context->rxDatagram.length); in chppConsumeHeader()
220 chppEnqueueTxPacket(context, CHPP_TRANSPORT_ERROR_OOM); in chppConsumeHeader()
221 chppSetRxState(context, CHPP_STATE_PREAMBLE); in chppConsumeHeader()
223 context->rxDatagram.payload = tempPayload; in chppConsumeHeader()
224 context->rxDatagram.length += context->rxHeader.length; in chppConsumeHeader()
225 chppSetRxState(context, CHPP_STATE_PAYLOAD); in chppConsumeHeader()
244 static size_t chppConsumePayload(struct ChppTransportState *context, in chppConsumePayload() argument
246 CHPP_ASSERT(context->rxStatus.locInState < context->rxHeader.length); in chppConsumePayload()
248 MIN(len, (context->rxHeader.length - context->rxStatus.locInState)); in chppConsumePayload()
249 memcpy(context->rxDatagram.payload + context->rxStatus.locInDatagram, buf, in chppConsumePayload()
251 context->rxStatus.locInDatagram += bytesToCopy; in chppConsumePayload()
252 context->rxStatus.locInState += bytesToCopy; in chppConsumePayload()
254 if (context->rxStatus.locInState == context->rxHeader.length) { in chppConsumePayload()
256 chppSetRxState(context, CHPP_STATE_FOOTER); in chppConsumePayload()
273 static size_t chppConsumeFooter(struct ChppTransportState *context, in chppConsumeFooter() argument
275 CHPP_ASSERT(context->rxStatus.locInState < in chppConsumeFooter()
278 len, (sizeof(struct ChppTransportFooter) - context->rxStatus.locInState)); in chppConsumeFooter()
279 memcpy(((uint8_t *)&context->rxFooter) + context->rxStatus.locInState, buf, in chppConsumeFooter()
282 context->rxStatus.locInState += bytesToCopy; in chppConsumeFooter()
283 if (context->rxStatus.locInState == sizeof(struct ChppTransportFooter)) { in chppConsumeFooter()
286 if (CHPP_TRANSPORT_GET_ERROR(context->rxHeader.packetCode) != in chppConsumeFooter()
290 context->rxHeader.length, context->rxHeader.seq, in chppConsumeFooter()
291 context->rxHeader.ackSeq, in chppConsumeFooter()
292 (uint8_t)CHPP_TRANSPORT_GET_ATTR(context->rxHeader.packetCode), in chppConsumeFooter()
293 (uint8_t)CHPP_TRANSPORT_GET_ERROR(context->rxHeader.packetCode), in chppConsumeFooter()
294 context->rxHeader.flags); in chppConsumeFooter()
298 context->rxHeader.length, context->rxHeader.seq, in chppConsumeFooter()
299 context->rxHeader.ackSeq, in chppConsumeFooter()
300 (uint8_t)CHPP_TRANSPORT_GET_ATTR(context->rxHeader.packetCode), in chppConsumeFooter()
301 (uint8_t)CHPP_TRANSPORT_GET_ERROR(context->rxHeader.packetCode), in chppConsumeFooter()
302 context->rxHeader.flags); in chppConsumeFooter()
305 if (CHPP_TRANSPORT_GET_ATTR(context->rxHeader.packetCode) == in chppConsumeFooter()
308 chppProcessTransportLoopbackRequest(context); in chppConsumeFooter()
311 } else if (CHPP_TRANSPORT_GET_ATTR(context->rxHeader.packetCode) == in chppConsumeFooter()
314 chppProcessTransportLoopbackResponse(context); in chppConsumeFooter()
317 } else if (!chppRxChecksumIsOk(context)) { in chppConsumeFooter()
319 context->rxHeader.seq, context->rxHeader.length); in chppConsumeFooter()
320 chppAbortRxPacket(context); in chppConsumeFooter()
321 chppEnqueueTxPacket(context, CHPP_TRANSPORT_ERROR_CHECKSUM); // NACK in chppConsumeFooter()
323 } else if (CHPP_TRANSPORT_GET_ATTR(context->rxHeader.packetCode) == in chppConsumeFooter()
326 context->rxHeader.seq, in chppConsumeFooter()
327 CHPP_TRANSPORT_GET_ERROR(context->rxHeader.packetCode)); in chppConsumeFooter()
328 chppMutexUnlock(&context->mutex); in chppConsumeFooter()
329 chppReset(context, CHPP_TRANSPORT_ATTR_RESET_ACK, in chppConsumeFooter()
331 chppMutexLock(&context->mutex); in chppConsumeFooter()
333 } else if (context->resetState == CHPP_RESET_STATE_PERMANENT_FAILURE) { in chppConsumeFooter()
336 context->rxHeader.seq, context->rxHeader.length); in chppConsumeFooter()
337 chppAbortRxPacket(context); in chppConsumeFooter()
339 } else if (CHPP_TRANSPORT_GET_ATTR(context->rxHeader.packetCode) == in chppConsumeFooter()
341 CHPP_LOGI("RX RESET-ACK packet. seq=%" PRIu8, context->rxHeader.seq); in chppConsumeFooter()
342 chppProcessResetAck(context); in chppConsumeFooter()
344 } else if (context->resetState == CHPP_RESET_STATE_RESETTING) { in chppConsumeFooter()
346 context->rxHeader.seq, context->rxHeader.length); in chppConsumeFooter()
347 chppAbortRxPacket(context); in chppConsumeFooter()
350 chppProcessRxPacket(context); in chppConsumeFooter()
354 chppSetRxState(context, CHPP_STATE_PREAMBLE); in chppConsumeFooter()
366 static void chppAbortRxPacket(struct ChppTransportState *context) { in chppAbortRxPacket() argument
370 switch (context->rxStatus.state) { in chppAbortRxPacket()
377 undoLen = context->rxHeader.length; in chppAbortRxPacket()
378 undoLoc = context->rxStatus.locInState; in chppAbortRxPacket()
383 undoLen = context->rxHeader.length; in chppAbortRxPacket()
384 undoLoc = context->rxHeader.length; in chppAbortRxPacket()
396 CHPP_ASSERT(context->rxDatagram.length >= undoLen); in chppAbortRxPacket()
397 CHPP_ASSERT(context->rxStatus.locInDatagram >= undoLoc); in chppAbortRxPacket()
398 context->rxDatagram.length -= undoLen; in chppAbortRxPacket()
399 context->rxStatus.locInDatagram -= undoLoc; in chppAbortRxPacket()
401 if (context->rxDatagram.length == 0) { in chppAbortRxPacket()
403 CHPP_FREE_AND_NULLIFY(context->rxDatagram.payload); in chppAbortRxPacket()
408 chppRealloc(context->rxDatagram.payload, context->rxDatagram.length, in chppAbortRxPacket()
409 context->rxDatagram.length + undoLen); in chppAbortRxPacket()
414 context->rxDatagram.payload = tempPayload; in chppAbortRxPacket()
419 chppSetRxState(context, CHPP_STATE_PREAMBLE); in chppAbortRxPacket()
429 struct ChppTransportState *context) { in chppProcessTransportLoopbackRequest() argument
430 if (context->txStatus.linkBusy) { in chppProcessTransportLoopbackRequest()
434 context->txStatus.linkBusy = true; in chppProcessTransportLoopbackRequest()
435 context->pendingTxPacket.length = 0; in chppProcessTransportLoopbackRequest()
436 context->pendingTxPacket.length += in chppProcessTransportLoopbackRequest()
437 chppAddPreamble(&context->pendingTxPacket.payload[0]); in chppProcessTransportLoopbackRequest()
440 (struct ChppTransportHeader *)&context->pendingTxPacket in chppProcessTransportLoopbackRequest()
441 .payload[context->pendingTxPacket.length]; in chppProcessTransportLoopbackRequest()
442 context->pendingTxPacket.length += sizeof(*txHeader); in chppProcessTransportLoopbackRequest()
444 *txHeader = context->rxHeader; in chppProcessTransportLoopbackRequest()
449 MIN(context->rxDatagram.length, CHPP_TRANSPORT_TX_MTU_BYTES); in chppProcessTransportLoopbackRequest()
450 chppAppendToPendingTxPacket(&context->pendingTxPacket, in chppProcessTransportLoopbackRequest()
451 context->rxDatagram.payload, payloadLen); in chppProcessTransportLoopbackRequest()
452 CHPP_FREE_AND_NULLIFY(context->rxDatagram.payload); in chppProcessTransportLoopbackRequest()
453 chppClearRxDatagram(context); in chppProcessTransportLoopbackRequest()
455 chppAddFooter(&context->pendingTxPacket); in chppProcessTransportLoopbackRequest()
458 txHeader->length, context->rxDatagram.length); in chppProcessTransportLoopbackRequest()
459 enum ChppLinkErrorCode error = chppSendPendingPacket(context); in chppProcessTransportLoopbackRequest()
462 chppLinkSendDoneCb(&context->linkParams, error); in chppProcessTransportLoopbackRequest()
475 struct ChppTransportState *context) { in chppProcessTransportLoopbackResponse() argument
476 if (context->transportLoopbackData.length != context->rxDatagram.length) { in chppProcessTransportLoopbackResponse()
478 context->rxDatagram.length, in chppProcessTransportLoopbackResponse()
479 context->transportLoopbackData.length - CHPP_PREAMBLE_LEN_BYTES - in chppProcessTransportLoopbackResponse()
482 context->loopbackResult = CHPP_APP_ERROR_INVALID_LENGTH; in chppProcessTransportLoopbackResponse()
484 } else if (memcmp(context->rxDatagram.payload, in chppProcessTransportLoopbackResponse()
485 context->transportLoopbackData.payload, in chppProcessTransportLoopbackResponse()
486 context->rxDatagram.length) != 0) { in chppProcessTransportLoopbackResponse()
488 context->rxDatagram.length); in chppProcessTransportLoopbackResponse()
489 context->loopbackResult = CHPP_APP_ERROR_INVALID_ARG; in chppProcessTransportLoopbackResponse()
492 context->loopbackResult = CHPP_APP_ERROR_NONE; in chppProcessTransportLoopbackResponse()
495 context->rxDatagram.length); in chppProcessTransportLoopbackResponse()
498 context->transportLoopbackData.length = 0; in chppProcessTransportLoopbackResponse()
499 CHPP_FREE_AND_NULLIFY(context->transportLoopbackData.payload); in chppProcessTransportLoopbackResponse()
500 CHPP_FREE_AND_NULLIFY(context->rxDatagram.payload); in chppProcessTransportLoopbackResponse()
501 chppClearRxDatagram(context); in chppProcessTransportLoopbackResponse()
510 static void chppSetResetComplete(struct ChppTransportState *context) { in chppSetResetComplete() argument
511 context->resetState = CHPP_RESET_STATE_NONE; in chppSetResetComplete()
512 context->resetCount = 0; in chppSetResetComplete()
513 chppConditionVariableSignal(&context->resetCondVar); in chppSetResetComplete()
522 static void chppProcessResetAck(struct ChppTransportState *context) { in chppProcessResetAck() argument
523 if (context->resetState == CHPP_RESET_STATE_NONE) { in chppProcessResetAck()
525 context->rxHeader.seq, context->rxHeader.packetCode); in chppProcessResetAck()
535 chppDatagramProcessDoneCb(context, context->rxDatagram.payload); in chppProcessResetAck()
536 chppClearRxDatagram(context); in chppProcessResetAck()
541 chppSetResetComplete(context); in chppProcessResetAck()
542 context->rxStatus.receivedPacketCode = context->rxHeader.packetCode; in chppProcessResetAck()
543 context->rxStatus.expectedSeq = context->rxHeader.seq + 1; in chppProcessResetAck()
544 chppRegisterRxAck(context); in chppProcessResetAck()
548 chppDatagramProcessDoneCb(context, context->rxDatagram.payload); in chppProcessResetAck()
549 chppClearRxDatagram(context); in chppProcessResetAck()
552 if (!context->appContext->isDiscoveryComplete) { in chppProcessResetAck()
553 chppMutexUnlock(&context->mutex); in chppProcessResetAck()
554 chppInitiateDiscovery(context->appContext); in chppProcessResetAck()
555 chppMutexLock(&context->mutex); in chppProcessResetAck()
557 chppEnqueueTxPacket(context, CHPP_TRANSPORT_ERROR_NONE); in chppProcessResetAck()
560 chppEnqueueTxPacket(context, CHPP_TRANSPORT_ERROR_NONE); in chppProcessResetAck()
564 chppMutexUnlock(&context->mutex); in chppProcessResetAck()
565 chppAppProcessReset(context->appContext); in chppProcessResetAck()
566 chppMutexLock(&context->mutex); in chppProcessResetAck()
574 static void chppProcessRxPacket(struct ChppTransportState *context) { in chppProcessRxPacket() argument
576 context->rxStatus.lastGoodPacketTimeMs = (uint32_t)(now / CHPP_NSEC_PER_MSEC); in chppProcessRxPacket()
577 context->rxStatus.receivedPacketCode = context->rxHeader.packetCode; in chppProcessRxPacket()
578 chppRegisterRxAck(context); in chppProcessRxPacket()
581 if (context->rxHeader.length > 0 && in chppProcessRxPacket()
582 context->rxHeader.seq != context->rxStatus.expectedSeq) { in chppProcessRxPacket()
587 if (context->txDatagramQueue.pending > 0 || in chppProcessRxPacket()
592 chppEnqueueTxPacket(context, CHPP_ATTR_AND_ERROR_TO_PACKET_CODE( in chppProcessRxPacket()
599 context->rxHeader.seq, context->rxStatus.expectedSeq, in chppProcessRxPacket()
600 context->rxHeader.length); in chppProcessRxPacket()
601 chppAbortRxPacket(context); in chppProcessRxPacket()
603 } else if (context->rxHeader.length > 0) { in chppProcessRxPacket()
605 chppProcessRxPayload(context); in chppProcessRxPacket()
615 static void chppProcessRxPayload(struct ChppTransportState *context) { in chppProcessRxPayload() argument
616 context->rxStatus.expectedSeq++; // chppProcessRxPacket() already confirms in chppProcessRxPayload()
621 if (context->rxHeader.flags & CHPP_TRANSPORT_FLAG_UNFINISHED_DATAGRAM) { in chppProcessRxPayload()
625 context->rxHeader.seq, context->rxHeader.length, in chppProcessRxPayload()
626 context->rxDatagram.length, context->rxStatus.expectedSeq); in chppProcessRxPayload()
634 chppMutexUnlock(&context->mutex); in chppProcessRxPayload()
635 chppAppProcessRxDatagram(context->appContext, context->rxDatagram.payload, in chppProcessRxPayload()
636 context->rxDatagram.length); in chppProcessRxPayload()
637 chppMutexLock(&context->mutex); in chppProcessRxPayload()
642 context->rxDatagram.length, context->rxHeader.seq, in chppProcessRxPayload()
643 context->rxHeader.length, context->rxStatus.expectedSeq, in chppProcessRxPayload()
644 context->txStatus.sentAckSeq); in chppProcessRxPayload()
645 chppClearRxDatagram(context); in chppProcessRxPayload()
649 chppEnqueueTxPacket(context, CHPP_TRANSPORT_ERROR_NONE); in chppProcessRxPayload()
661 static void chppClearRxDatagram(struct ChppTransportState *context) { in chppClearRxDatagram() argument
662 context->rxStatus.locInDatagram = 0; in chppClearRxDatagram()
663 context->rxDatagram.length = 0; in chppClearRxDatagram()
664 context->rxDatagram.payload = NULL; in chppClearRxDatagram()
674 static bool chppRxChecksumIsOk(const struct ChppTransportState *context) { in chppRxChecksumIsOk() argument
675 uint32_t crc = chppCrc32(0, (const uint8_t *)&context->rxHeader, in chppRxChecksumIsOk()
676 sizeof(context->rxHeader)); in chppRxChecksumIsOk()
679 &context->rxDatagram in chppRxChecksumIsOk()
680 .payload[context->rxStatus.locInDatagram - context->rxHeader.length], in chppRxChecksumIsOk()
681 context->rxHeader.length); in chppRxChecksumIsOk()
685 context->rxFooter.checksum, crc); in chppRxChecksumIsOk()
686 crc = context->rxFooter.checksum; in chppRxChecksumIsOk()
689 if (context->rxFooter.checksum != crc) { in chppRxChecksumIsOk()
692 context->rxFooter.checksum, crc, in chppRxChecksumIsOk()
693 (size_t)(context->rxHeader.length + in chppRxChecksumIsOk()
697 return (context->rxFooter.checksum == crc); in chppRxChecksumIsOk()
709 const struct ChppTransportState *context) { in chppRxHeaderCheck() argument
712 if (context->rxHeader.length > CHPP_TRANSPORT_RX_MTU_BYTES) { in chppRxHeaderCheck()
719 context->rxHeader.seq, context->rxStatus.expectedSeq, in chppRxHeaderCheck()
720 context->rxHeader.length, result); in chppRxHeaderCheck()
732 static void chppRegisterRxAck(struct ChppTransportState *context) { in chppRegisterRxAck() argument
733 uint8_t rxAckSeq = context->rxHeader.ackSeq; in chppRegisterRxAck()
735 if (context->rxStatus.receivedAckSeq != rxAckSeq) { in chppRegisterRxAck()
738 if ((uint8_t)(context->rxStatus.receivedAckSeq + 1) != rxAckSeq) { in chppRegisterRxAck()
740 context->rxStatus.receivedAckSeq, rxAckSeq); in chppRegisterRxAck()
746 context->rxStatus.receivedAckSeq, rxAckSeq, in chppRegisterRxAck()
747 context->txDatagramQueue.pending, context->txDatagramQueue.front, in chppRegisterRxAck()
748 context->txStatus.ackedLocInDatagram, in chppRegisterRxAck()
749 context->txDatagramQueue.datagram[context->txDatagramQueue.front] in chppRegisterRxAck()
752 context->rxStatus.receivedAckSeq = rxAckSeq; in chppRegisterRxAck()
753 if (context->txStatus.txAttempts > 1) { in chppRegisterRxAck()
755 context->rxHeader.seq, context->txStatus.txAttempts - 1); in chppRegisterRxAck()
757 context->txStatus.txAttempts = 0; in chppRegisterRxAck()
760 context->txStatus.ackedLocInDatagram += CHPP_TRANSPORT_TX_MTU_BYTES; in chppRegisterRxAck()
761 if (context->txStatus.ackedLocInDatagram >= in chppRegisterRxAck()
762 context->txDatagramQueue.datagram[context->txDatagramQueue.front] in chppRegisterRxAck()
766 context->txStatus.ackedLocInDatagram = 0; in chppRegisterRxAck()
767 context->txStatus.sentLocInDatagram = 0; in chppRegisterRxAck()
773 if (chppDequeueTxDatagram(context) == 0) { in chppRegisterRxAck()
774 context->txStatus.hasPacketsToSend = false; in chppRegisterRxAck()
800 static void chppEnqueueTxPacket(struct ChppTransportState *context, in chppEnqueueTxPacket() argument
802 context->txStatus.hasPacketsToSend = true; in chppEnqueueTxPacket()
803 context->txStatus.packetCodeToSend = packetCode; in chppEnqueueTxPacket()
809 chppNotifierSignal(&context->notifier, CHPP_TRANSPORT_SIGNAL_EVENT); in chppEnqueueTxPacket()
833 struct ChppTransportState *context) { in chppAddHeader() argument
835 (struct ChppTransportHeader *)&context->pendingTxPacket in chppAddHeader()
836 .payload[context->pendingTxPacket.length]; in chppAddHeader()
837 context->pendingTxPacket.length += sizeof(*txHeader); in chppAddHeader()
839 txHeader->packetCode = context->txStatus.packetCodeToSend; in chppAddHeader()
840 context->txStatus.packetCodeToSend = CHPP_ATTR_AND_ERROR_TO_PACKET_CODE( in chppAddHeader()
841 context->txStatus.packetCodeToSend, CHPP_TRANSPORT_ERROR_NONE); in chppAddHeader()
843 txHeader->ackSeq = context->rxStatus.expectedSeq; in chppAddHeader()
844 context->txStatus.sentAckSeq = txHeader->ackSeq; in chppAddHeader()
854 static void chppAddPayload(struct ChppTransportState *context) { in chppAddPayload() argument
856 (struct ChppTransportHeader *)&context->pendingTxPacket in chppAddPayload()
860 context->txDatagramQueue.datagram[context->txDatagramQueue.front].length - in chppAddPayload()
861 context->txStatus.ackedLocInDatagram; in chppAddPayload()
865 txHeader->seq, remainingBytes, context->txDatagramQueue.pending); in chppAddPayload()
879 &context->pendingTxPacket, in chppAddPayload()
880 context->txDatagramQueue.datagram[context->txDatagramQueue.front] in chppAddPayload()
882 context->txStatus.ackedLocInDatagram, in chppAddPayload()
885 context->txStatus.sentLocInDatagram = in chppAddPayload()
886 context->txStatus.ackedLocInDatagram + txHeader->length; in chppAddPayload()
914 size_t chppDequeueTxDatagram(struct ChppTransportState *context) { in chppDequeueTxDatagram() argument
915 if (context->txDatagramQueue.pending == 0) { in chppDequeueTxDatagram()
921 context->txDatagramQueue.front, in chppDequeueTxDatagram()
922 context->txDatagramQueue.datagram[context->txDatagramQueue.front] in chppDequeueTxDatagram()
924 context->txDatagramQueue.pending, in chppDequeueTxDatagram()
925 context->txDatagramQueue.pending - 1); in chppDequeueTxDatagram()
928 context->txDatagramQueue.datagram[context->txDatagramQueue.front] in chppDequeueTxDatagram()
930 context->txDatagramQueue.datagram[context->txDatagramQueue.front].length = in chppDequeueTxDatagram()
933 context->txDatagramQueue.pending--; in chppDequeueTxDatagram()
934 context->txDatagramQueue.front++; in chppDequeueTxDatagram()
935 context->txDatagramQueue.front %= CHPP_TX_DATAGRAM_QUEUE_LEN; in chppDequeueTxDatagram()
938 return context->txDatagramQueue.pending; in chppDequeueTxDatagram()
946 static void chppClearTxDatagramQueue(struct ChppTransportState *context) { in chppClearTxDatagramQueue() argument
947 while (context->txDatagramQueue.pending > 0) { in chppClearTxDatagramQueue()
948 chppDequeueTxDatagram(context); in chppClearTxDatagramQueue()
950 context->txStatus.hasPacketsToSend = false; in chppClearTxDatagramQueue()
966 static void chppTransportDoWork(struct ChppTransportState *context) { in chppTransportDoWork() argument
972 chppMutexLock(&context->mutex); in chppTransportDoWork()
974 if (context->txStatus.hasPacketsToSend && !context->txStatus.linkBusy) { in chppTransportDoWork()
977 context->txStatus.linkBusy = true; in chppTransportDoWork()
979 context->pendingTxPacket.length = 0; in chppTransportDoWork()
980 memset(&context->pendingTxPacket.payload, 0, CHPP_LINK_TX_MTU_BYTES); in chppTransportDoWork()
983 context->pendingTxPacket.length += in chppTransportDoWork()
984 chppAddPreamble(&context->pendingTxPacket.payload[0]); in chppTransportDoWork()
987 txHeader = chppAddHeader(context); in chppTransportDoWork()
990 if ((context->txDatagramQueue.pending > 0)) { in chppTransportDoWork()
997 txHeader->seq = context->rxStatus.receivedAckSeq; in chppTransportDoWork()
998 context->txStatus.sentSeq = txHeader->seq; in chppTransportDoWork()
1000 if (context->txStatus.txAttempts > CHPP_TRANSPORT_MAX_RETX && in chppTransportDoWork()
1001 context->resetState != CHPP_RESET_STATE_RESETTING) { in chppTransportDoWork()
1005 chppMutexUnlock(&context->mutex); in chppTransportDoWork()
1006 chppReset(context, CHPP_TRANSPORT_ATTR_RESET, in chppTransportDoWork()
1008 chppMutexLock(&context->mutex); in chppTransportDoWork()
1011 chppAddPayload(context); in chppTransportDoWork()
1012 context->txStatus.txAttempts++; in chppTransportDoWork()
1017 context->txStatus.hasPacketsToSend = false; in chppTransportDoWork()
1020 chppAddFooter(&context->pendingTxPacket); in chppTransportDoWork()
1026 context->txStatus.hasPacketsToSend, context->txStatus.linkBusy, in chppTransportDoWork()
1027 context->txDatagramQueue.pending, context->rxStatus.receivedAckSeq, in chppTransportDoWork()
1028 context->txStatus.sentSeq, context->rxStatus.state); in chppTransportDoWork()
1031 chppMutexUnlock(&context->mutex); in chppTransportDoWork()
1037 context->pendingTxPacket.length, txHeader->flags, in chppTransportDoWork()
1039 txHeader->length, context->txDatagramQueue.pending); in chppTransportDoWork()
1040 enum ChppLinkErrorCode error = chppSendPendingPacket(context); in chppTransportDoWork()
1046 chppLinkSendDoneCb(&context->linkParams, error); in chppTransportDoWork()
1051 timeoutResponse = chppTransportGetClientRequestTimeoutResponse(context); in chppTransportDoWork()
1057 chppAppProcessRxDatagram(context->appContext, (uint8_t *)timeoutResponse, in chppTransportDoWork()
1112 static bool chppEnqueueTxDatagram(struct ChppTransportState *context, in chppEnqueueTxDatagram() argument
1126 (uint8_t)(context->txDatagramQueue.pending + 1)); in chppEnqueueTxDatagram()
1133 header->command, (uint8_t)(context->txDatagramQueue.pending + 1)); in chppEnqueueTxDatagram()
1136 chppMutexLock(&context->mutex); in chppEnqueueTxDatagram()
1138 if (context->txDatagramQueue.pending >= CHPP_TX_DATAGRAM_QUEUE_LEN) { in chppEnqueueTxDatagram()
1143 (context->txDatagramQueue.front + context->txDatagramQueue.pending) % in chppEnqueueTxDatagram()
1145 context->txDatagramQueue.datagram[end].length = len; in chppEnqueueTxDatagram()
1146 context->txDatagramQueue.datagram[end].payload = buf; in chppEnqueueTxDatagram()
1147 context->txDatagramQueue.pending++; in chppEnqueueTxDatagram()
1149 if (context->txDatagramQueue.pending == 1) { in chppEnqueueTxDatagram()
1151 chppEnqueueTxPacket(context, packetCode); in chppEnqueueTxDatagram()
1157 chppMutexUnlock(&context->mutex); in chppEnqueueTxDatagram()
1172 struct ChppTransportState *context) { in chppSendPendingPacket() argument
1174 &context->linkParams, context->pendingTxPacket.payload, in chppSendPendingPacket()
1175 context->pendingTxPacket.length); in chppSendPendingPacket()
1177 context->txStatus.lastTxTimeNs = chppGetCurrentTimeNs(); in chppSendPendingPacket()
1187 static void chppResetTransportContext(struct ChppTransportState *context) { in chppResetTransportContext() argument
1188 memset(&context->rxStatus, 0, sizeof(struct ChppRxStatus)); in chppResetTransportContext()
1189 memset(&context->rxDatagram, 0, sizeof(struct ChppDatagram)); in chppResetTransportContext()
1191 memset(&context->txStatus, 0, sizeof(struct ChppTxStatus)); in chppResetTransportContext()
1192 memset(&context->txDatagramQueue, 0, sizeof(struct ChppTxDatagramQueue)); in chppResetTransportContext()
1194 context->txStatus.sentSeq = in chppResetTransportContext()
1196 context->resetState = CHPP_RESET_STATE_RESETTING; in chppResetTransportContext()
1271 struct ChppTransportState *context) { in chppTransportGetClientRequestTimeoutResponse() argument
1278 chppMutexLock(&context->mutex); in chppTransportGetClientRequestTimeoutResponse()
1280 if (context->appContext->nextRequestTimeoutNs <= chppGetCurrentTimeNs()) { in chppTransportGetClientRequestTimeoutResponse()
1285 clientIdx < context->appContext->registeredClientCount; clientIdx++) { in chppTransportGetClientRequestTimeoutResponse()
1288 context->appContext->registeredClients[clientIdx]->rRStateCount; in chppTransportGetClientRequestTimeoutResponse()
1291 &context->appContext->registeredClientStates[clientIdx] in chppTransportGetClientRequestTimeoutResponse()
1307 context->appContext->nextRequestTimeoutNs / CHPP_NSEC_PER_MSEC); in chppTransportGetClientRequestTimeoutResponse()
1308 chppClientRecalculateNextTimeout(context->appContext); in chppTransportGetClientRequestTimeoutResponse()
1322 context->appContext->registeredClientStates[timedOutClient] in chppTransportGetClientRequestTimeoutResponse()
1330 chppMutexUnlock(&context->mutex); in chppTransportGetClientRequestTimeoutResponse()
1394 bool chppRxDataCb(struct ChppTransportState *context, const uint8_t *buf, in chppRxDataCb() argument
1397 CHPP_NOT_NULL(context); in chppRxDataCb()
1399 chppMutexLock(&context->mutex); in chppRxDataCb()
1400 if (context->rxStatus.state != CHPP_STATE_PREAMBLE && in chppRxDataCb()
1402 context->rxStatus.packetStartTimeNs + CHPP_TRANSPORT_RX_TIMEOUT_NS) { in chppRxDataCb()
1404 chppAbortRxPacket(context); in chppRxDataCb()
1406 chppMutexUnlock(&context->mutex); in chppRxDataCb()
1409 context->rxStatus.state); in chppRxDataCb()
1411 context->rxStatus.lastDataTimeMs = (uint32_t)(now / CHPP_NSEC_PER_MSEC); in chppRxDataCb()
1412 context->rxStatus.numTotalDataBytes += len; in chppRxDataCb()
1416 chppMutexLock(&context->mutex); in chppRxDataCb()
1422 switch (context->rxStatus.state) { in chppRxDataCb()
1425 chppConsumePreamble(context, &buf[consumed], len - consumed); in chppRxDataCb()
1429 consumed += chppConsumeHeader(context, &buf[consumed], len - consumed); in chppRxDataCb()
1433 consumed += chppConsumePayload(context, &buf[consumed], len - consumed); in chppRxDataCb()
1437 consumed += chppConsumeFooter(context, &buf[consumed], len - consumed); in chppRxDataCb()
1441 CHPP_LOGE("Invalid RX state %" PRIu8, context->rxStatus.state); in chppRxDataCb()
1443 chppSetRxState(context, CHPP_STATE_PREAMBLE); in chppRxDataCb()
1446 chppMutexUnlock(&context->mutex); in chppRxDataCb()
1449 return (context->rxStatus.state == CHPP_STATE_PREAMBLE && in chppRxDataCb()
1450 context->rxStatus.locInState == 0); in chppRxDataCb()
1453 void chppRxPacketCompleteCb(struct ChppTransportState *context) { in chppRxPacketCompleteCb() argument
1454 chppMutexLock(&context->mutex); in chppRxPacketCompleteCb()
1455 if (context->rxStatus.state != CHPP_STATE_PREAMBLE) { in chppRxPacketCompleteCb()
1458 context->rxStatus.state, context->rxHeader.seq, in chppRxPacketCompleteCb()
1459 context->rxHeader.length); in chppRxPacketCompleteCb()
1460 chppAbortRxPacket(context); in chppRxPacketCompleteCb()
1461 chppEnqueueTxPacket(context, CHPP_TRANSPORT_ERROR_HEADER); // NACK in chppRxPacketCompleteCb()
1463 chppMutexUnlock(&context->mutex); in chppRxPacketCompleteCb()
1466 bool chppEnqueueTxDatagramOrFail(struct ChppTransportState *context, void *buf, in chppEnqueueTxDatagramOrFail() argument
1469 bool resetting = (context->resetState == CHPP_RESET_STATE_RESETTING); in chppEnqueueTxDatagramOrFail()
1476 context, CHPP_TRANSPORT_ERROR_NONE, buf, len)) { in chppEnqueueTxDatagramOrFail()
1491 void chppEnqueueTxErrorDatagram(struct ChppTransportState *context, in chppEnqueueTxErrorDatagram() argument
1493 bool resetting = (context->resetState == CHPP_RESET_STATE_RESETTING); in chppEnqueueTxErrorDatagram()
1512 chppEnqueueTxPacket(context, CHPP_ATTR_AND_ERROR_TO_PACKET_CODE( in chppEnqueueTxErrorDatagram()
1518 struct ChppTransportState *context) { in chppTransportGetTimeUntilNextDoWorkNs() argument
1520 uint64_t nextDoWorkTime = context->appContext->nextRequestTimeoutNs; in chppTransportGetTimeUntilNextDoWorkNs()
1522 if (context->txStatus.hasPacketsToSend || in chppTransportGetTimeUntilNextDoWorkNs()
1523 context->resetState == CHPP_RESET_STATE_RESETTING) { in chppTransportGetTimeUntilNextDoWorkNs()
1526 ((context->txStatus.lastTxTimeNs == 0) in chppTransportGetTimeUntilNextDoWorkNs()
1528 : context->txStatus.lastTxTimeNs)); in chppTransportGetTimeUntilNextDoWorkNs()
1545 void chppWorkThreadStart(struct ChppTransportState *context) { in chppWorkThreadStart() argument
1546 chppTransportSendReset(context, CHPP_TRANSPORT_ATTR_RESET, in chppWorkThreadStart()
1552 uint64_t timeout = chppTransportGetTimeUntilNextDoWorkNs(context); in chppWorkThreadStart()
1554 signals = chppNotifierGetSignal(&context->notifier); in chppWorkThreadStart()
1556 signals = chppNotifierWait(&context->notifier); in chppWorkThreadStart()
1558 signals = chppNotifierTimedWait(&context->notifier, timeout); in chppWorkThreadStart()
1561 } while (chppWorkThreadHandleSignal(context, signals)); in chppWorkThreadStart()
1564 bool chppWorkThreadHandleSignal(struct ChppTransportState *context, in chppWorkThreadHandleSignal() argument
1569 chppWorkMonitorPreProcess(&context->workMonitor); in chppWorkThreadHandleSignal()
1577 chppTransportDoWork(context); in chppWorkThreadHandleSignal()
1583 if (chppGetCurrentTimeNs() - context->txStatus.lastTxTimeNs >= in chppWorkThreadHandleSignal()
1586 context->txStatus.lastTxTimeNs / CHPP_NSEC_PER_MSEC); in chppWorkThreadHandleSignal()
1587 chppTransportDoWork(context); in chppWorkThreadHandleSignal()
1590 if ((context->resetState == CHPP_RESET_STATE_RESETTING) && in chppWorkThreadHandleSignal()
1591 (chppGetCurrentTimeNs() - context->resetTimeNs >= in chppWorkThreadHandleSignal()
1593 if (context->resetCount + 1 < CHPP_TRANSPORT_MAX_RESET) { in chppWorkThreadHandleSignal()
1595 context->resetCount++; in chppWorkThreadHandleSignal()
1596 chppReset(context, CHPP_TRANSPORT_ATTR_RESET, in chppWorkThreadHandleSignal()
1600 context->resetState = CHPP_RESET_STATE_PERMANENT_FAILURE; in chppWorkThreadHandleSignal()
1601 chppClearTxDatagramQueue(context); in chppWorkThreadHandleSignal()
1607 chppPlatformLinkDoWork(&context->linkParams, in chppWorkThreadHandleSignal()
1613 chppWorkMonitorPostProcess(&context->workMonitor); in chppWorkThreadHandleSignal()
1619 void chppWorkThreadStop(struct ChppTransportState *context) { in chppWorkThreadStop() argument
1620 chppNotifierSignal(&context->notifier, CHPP_TRANSPORT_SIGNAL_EXIT); in chppWorkThreadStop()
1629 struct ChppTransportState *context = in chppLinkSendDoneCb() local
1632 chppMutexLock(&context->mutex); in chppLinkSendDoneCb()
1634 context->txStatus.linkBusy = false; in chppLinkSendDoneCb()
1639 chppMutexUnlock(&context->mutex); in chppLinkSendDoneCb()
1642 void chppDatagramProcessDoneCb(struct ChppTransportState *context, in chppDatagramProcessDoneCb() argument
1644 UNUSED_VAR(context); in chppDatagramProcessDoneCb()
1649 uint8_t chppRunTransportLoopback(struct ChppTransportState *context, in chppRunTransportLoopback() argument
1654 context->loopbackResult = result; in chppRunTransportLoopback()
1658 context->loopbackResult = CHPP_APP_ERROR_UNSPECIFIED; in chppRunTransportLoopback()
1662 context->loopbackResult = result; in chppRunTransportLoopback()
1664 } else if (context->txStatus.linkBusy) { in chppRunTransportLoopback()
1666 context->loopbackResult = result; in chppRunTransportLoopback()
1668 } else if (context->transportLoopbackData.payload != NULL) { in chppRunTransportLoopback()
1670 context->loopbackResult = result; in chppRunTransportLoopback()
1672 } else if ((context->transportLoopbackData.payload = chppMalloc(len)) == in chppRunTransportLoopback()
1675 context->loopbackResult = result; in chppRunTransportLoopback()
1678 context->transportLoopbackData.length = len; in chppRunTransportLoopback()
1679 memcpy(context->transportLoopbackData.payload, buf, len); in chppRunTransportLoopback()
1681 context->txStatus.linkBusy = true; in chppRunTransportLoopback()
1682 context->pendingTxPacket.length = 0; in chppRunTransportLoopback()
1683 memset(&context->pendingTxPacket.payload, 0, CHPP_LINK_TX_MTU_BYTES); in chppRunTransportLoopback()
1684 context->pendingTxPacket.length += in chppRunTransportLoopback()
1685 chppAddPreamble(&context->pendingTxPacket.payload[0]); in chppRunTransportLoopback()
1688 (struct ChppTransportHeader *)&context->pendingTxPacket in chppRunTransportLoopback()
1689 .payload[context->pendingTxPacket.length]; in chppRunTransportLoopback()
1690 context->pendingTxPacket.length += sizeof(*txHeader); in chppRunTransportLoopback()
1697 chppAppendToPendingTxPacket(&context->pendingTxPacket, buf, payloadLen); in chppRunTransportLoopback()
1699 chppAddFooter(&context->pendingTxPacket); in chppRunTransportLoopback()
1703 context->pendingTxPacket.length, txHeader->length, len); in chppRunTransportLoopback()
1704 enum ChppLinkErrorCode error = chppSendPendingPacket(context); in chppRunTransportLoopback()
1708 chppLinkSendDoneCb(&context->linkParams, error); in chppRunTransportLoopback()
1712 CHPP_FREE_AND_NULLIFY(context->transportLoopbackData.payload); in chppRunTransportLoopback()
1713 context->transportLoopbackData.length = 0; in chppRunTransportLoopback()
1726 void chppTransportSendReset(struct ChppTransportState *context, in chppTransportSendReset() argument
1730 CHPP_ASSERT_LOG((context->txDatagramQueue.pending == 0 && in chppTransportSendReset()
1731 context->txDatagramQueue.front == 0), in chppTransportSendReset()
1759 chppSetResetComplete(context); in chppTransportSendReset()
1762 context->resetTimeNs = chppGetCurrentTimeNs(); in chppTransportSendReset()
1764 chppEnqueueTxDatagram(context, in chppTransportSendReset()