* Add SPDX identifier to source files
* Add license information to CBMC stub
* Fix spellcheck and the formatting
* Update version numbers and .md files for reelase
Co-authored-by: jasonpcarroll <23126711+jasonpcarroll@users.noreply.github.com>
* Modify check to send keep alive when no data is received
* Modify control flow to process keepalive.
* Fix formatting and increase coverage
* Remove unused mocked functions
* Update log messages
* Update the timout check in the send function
* Fix direction of check
* Allow processing of data in the buffer
* Fix formatting and unit-tests
* Update comment to clarify control flow
* Fix Disconnect CBMC proof and update size table
* Fix formatting and CBMC proofs
* Fix last CBMC proof
* Fix broken unit tests and add branch coverage
* Fix MISRA violations and add coverity readme
* Uncrustify
* Update coverity version number in the readme
* Update the timout check in the send function
* Fix direction of check
* Allow processing of data in the buffer
* Fix formatting and unit-tests
* Update comment to clarify control flow
* Fix Disconnect CBMC proof and update size table
* Fix formatting and CBMC proofs
* Fix last CBMC proof
* Fix broken unit tests and add branch coverage
* Update ci.yml (#197)
* Update ci.yml
* Add main branch in the CI YAML
* Add cancel callback API (#196)
* Add cancel callback command
* Update the function name
* Fix formatting
* Update memory estimates
* Add State to MQTT_ProcessLoop so that it can be called in a non-blocking manner (#198)
* Add stateful process-loop function
* Add extra checks; fix bugs and add description of functions
* Add index based stateful processloop
* Clean up
* Renamed functions to make them more coherent with their function
* Remove unused function declarations
* Fixed failing CI checks from previous commits except unit-test
* Fixed spell check and updated size-table
* Fix CBMC proofs
* Empty-Commit to trigger CBMC proofs
* Fix loop unwinding values in the Makefile
* Add upper bound on the buffer size of MQTT
* Increase minimum limit on buffer size to >0
* Add upper bound on the size of the buffer as well
* CBMC: Add memmove stub to accelerate coverage
The commit adds a stub for memmove accelerate CBMC coverage
calculation. Without this stub, coverage for `MQTT_ProcessLoop` and
`MQTT_ReceiveLoop` fails to converge (gets stuck generating the SAT
formula for the memmove in `receiveSingleIteration`). This stub
checks that src and dst are nonnull pointers and havocs dst.
* Fix formatting
Co-authored-by: Aniruddha Kanhere <ubuntu@ip-172-31-25-12.us-west-2.compute.internal>
Co-authored-by: Mark R. Tuttle <mrtuttle@amazon.com>
* Remove the use of common buffer (#199)
* Make publish use internal buffers
* Fix comment about packet ID
* Try a different approach for ping and disconnect
* Use writev and flush in conjuction with send
* Update the publish method to use vectors
* Add vectored IO to all functions
* Fix formatting
* Reduce complexity score
* Fix spell check and complexity score
* Fix breaking build
* Add doxygen comments
* Fix doxygen part 2
* Doxygen fix part 3
* Fix doxygen part 4
* Fix some checks
* Fix memory tables
* Fix some small errors
* Fix compiler warnings and breaking CI checks from previous commit
* Fix spell check and doxygen
* Fix a couple of CBMC proofs
* Fix ping and publish proofs
* Update the function name
* Fix more CBMC proofs
* Fix MQTT Connect proof
* Add unwinding loops
* Fix last CBMC proof
* Fix formatting
* Update the Subscribe and Unsubscribe functions
* Fix formatting and doxygen checks
* Fix broken CBMC proofs
* Fix memory statistic table
* Revert changes from serializer source
* update comments to clarify write requirements
* Add a note for write function pointer
* Fix spell check
* Update changelog (#202)
* Update MQTT logging so that log levels of the library do not leak (#205)
* Replace publish state arrays with pointers
Added an MQTT_InIt function for QoS > 0 publishes
Fixed functions which were dealing with state arrays
* Fix CI checks and clean up
* Fix CBMC proofs
* Fix sub and unsub CBMC proofs
* Fix remaining proofs
* Fix remaining CI checks
* Fix spell check
* Minor typo fix (#209)
* Update core_mqtt.h (#208)
* Update core_mqtt.h
* Update core_mqtt.h
Co-authored-by: Aniruddha Kanhere <60444055+AniruddhaKanhere@users.noreply.github.com>
* Update documentation and Doxygen comments in the source (#206)
* Update comments of the MQTT_InIt function
* Updating documentation of more of functions
* Fix formatting and spell check
* Update core_mqtt.h
* Add hooks to the source code (#200)
* Add mutex hooks
* Clean up of code
* Add doxygen comments and fix spell check
* Fix LogError call
* Fix formatting and memory table
* Fix dereference failure
* Update the hook names
* Fix broken builds
* Update the macros and variables
* Reword the briefs of hooks and uncrustify
* Fir formatting
* Protect get packet ID
* Fix formatting
* Fix Unit tests (#212)
* Fix Unit tests
* Update unit tests after new changes
* Fix more UT
* add dummy calls to the transport
* fix build error
* Remove usused variables
* Remove unsused variables
* Remove usused variables
* Unsued parameter
* Fix ut failure
* Fix uninitialized unit test variables
* Fix ut expectation
* Fix unit-tests
* Fix unit test uninitialized variable
* increase unit test coverage
* increase unit test coverage
* Fix unit test build
* State coverage 100%
* Serializer 100% coverage
* 100% UT coverage
* Fix formatting
* Fix size table
* Address PR comments
Co-authored-by: Aniruddha Kanhere <60444055+AniruddhaKanhere@users.noreply.github.com>
* Remove unnecessary ternaries (#211)
Co-authored-by: Aniruddha Kanhere <60444055+AniruddhaKanhere@users.noreply.github.com>
* Fix misra deviations (#213)
* MISRA compliance update 1
* Fix MISRA errors
* Zero MISRA violations; 13 suppressed
* Fix CI checks
* Update MISRA.md
* Remove deviations
* Fix MISRA.md file
* Fix bug - wasn't incrementing vector length properly.
* Remove unwanted files
* Update comment to clarify the control flow of UT
* Remove 'dev' branch from the CI checks
* Update horrid threshold = 10
Co-authored-by: Aniruddha Kanhere <ubuntu@ip-172-31-25-12.us-west-2.compute.internal>
Co-authored-by: Mark R. Tuttle <mrtuttle@amazon.com>
Co-authored-by: jasonpcarroll <23126711+jasonpcarroll@users.noreply.github.com>
Co-authored-by: alfred gedeon <28123637+alfred2g@users.noreply.github.com>
Co-authored-by: Archit Gupta <71798289+archigup@users.noreply.github.com>
* generate PINREQ packets on idle input or output.
* changes addressing Paul's feedback.
* changes to reflect feedback from Paul and Cobus.
* further changes after discussions with Paul.
* address issues raised by static analysis and formatting.
* update documentation and unit tests.
* use if else to clarify.
* remove stale variable.
* fix logical error.
* increment MQTT_TIMER_CALLS_PER_ITERATION by 1.
* add lastpackettxtime to the lexicon.
* use a different uncrustify config and add rx to the lexicon.
* update unit test to acheive coverage and correct memory size expectations and default tieout settings.
* cover case where keep alive interval is greater than the tx timeout.
* use correct units.
* dont pre-set waitingForPingResp to true, we want handleKeepAlive to trigger that.
* expect success on the new subtest.
* add additional test cases to cover two new branches.
* remove unused variable.
* MISRA compliance change.
* try to make both MISRA and uncrustify happy.
* try different version of uncrustify.
* Set PACKET_RX_TIMEOUT_MS to 30000U to match comment
Co-authored-by: Paul Bartell <pbartell@amazon.com>
core_mqtt.h and other coreMQTT headers pull in core_mqtt_config.h and core_mqtt_config_defaults.h.
core_mqtt_config_defaults.h defines empty logging macros. This means every application that uses coreMQTT needs to be careful to set up the logging stack before including core_mqtt.h or they may mysteriously not have logging output.
The logging setup should be in each compilation object, not set up in headers. This moves the inclusion of default logging macros from the headers to the library c files.
This fixes the issue with the logging macros for customers who do not set the logging macros in their core_mqtt_config.h. However, those who do enable logging for coreMQTT will still have their coreMQTT logging setup in all their c files using coreMQTT.
* Change logging level on CONNACK from 'Info' to 'Debug' to reflect CONNECT
* Changed Debug logging to Error logging where MQTTBadResponse is set
* Fix formatting
* Update source/core_mqtt_serializer.c
Co-authored-by: Archit Gupta <71798289+archigup@users.noreply.github.com>
* Change LogInfo to LogDebug on line 958 to mirror line 970
* Fix comments with inconsistent byte indexes
Co-authored-by: Hendrickson <johnrhen@88665a3d649f.ant.amazon.com>
Co-authored-by: Archit Gupta <71798289+archigup@users.noreply.github.com>
Non-functional change to handle all enum values for MQTTPublishState_t
and MQTTQoS_t in switch statements. This allows users to compile with
-Werror=switch-enum.
* Update version numbers
* Update CHANGELOG.md
* Add guards for C++ linkage
* Link to Memory estimates markdown from README
* Make possible to override CMake C Standard for tests
The debug-level log that is printed on not receiving any data from the network (when the first byte of an MQTT packet is attempted for reading) can be problematic when the transport interface TransportInterfaceRecv_t function is implemented in non-blocking behavior.
The problem it will cause is overwhelming logging of the message when MQTT_ProcessLoop API is called with a non-zero timeout (or the API is called multiple times with zero timeout but within a loop until some data is achieved). Due to over-logging of this message, the DEBUG logging level configured build of the coreMQTT library will be non-valuable.
This PR removes the problematic log statement.
* Fix keep alive checking interval
* Update default ping response timeout to a more reasonable value
* Update changelog
* Update doc for MQTT_PINGRESP_TIMEOUT_MS
Update API of the transport interface functions for the following:
* Transport recv() should NOT block when requested to read a single byte. It MAY block for the underlying socket timeout when requested to read n > 1 bytes.
* Transport send() should NOT return an error when the send fails because of a full TX buffer of the underlying network stack, so that the calling library can retry the send operation.
Update API doc to mention that the keep-alive mechanism is not supported by MQTT_ProcessLoop API when a dummy timer function that always returns zero is supplied to the library.
* Fix issue of data recv being interrupted
* Rename elapsedTimeMs variable to its express its new meaning
* Use configuration const for recvExact timeout
* Remove timeout check from discardPacket and address CI check failures
* Fix more CI check failures
* Remove another unused local variable
* Re-instate timeout in discard to reduce scope of changes
* Remove unused variable again
* Fix failing unit test
* Rename new config macro, and attempt to fix CBMC failures
* Doc: Improvement suggestions from code review
Co-authored-by: Muneeb Ahmed <54290492+muneebahmed10@users.noreply.github.com>
* Fix quality check failures
* Add test case to check partial network reads with zero timeout duration for ProcessLoop
* style: Improving naming
* Address complexity failure
* Address comments
* Doc: Add blocking time equation of Receive/ProcessLoop functions in their API doc
* Improvement in API doc
* Set MQTT_RECV_POLLING_TIMEOUT_MS so that recvExact runs in one iteration always for cbmc.
* doc: Add information about zero return value for Transport_Recv_t
* fix: prevent possibility of infinite loop in timeout logic of ProcessLoop
* style: Minor changes
* hygiene: minor name fix
* fix: Possibility of infinite loop in sendPacket
* Add the new configuration to doxygen
* test: Add mock transport send function that always returns zero
* fix: Issues in sendPacket and sendPublish
* test: add test for sendPacket timeout
* Update Timer Overflow test
* test: temporarily comment out unused variable
* test: fix the timer overflow test
* Address review comments
* style: make log messages concise
Co-authored-by: Muneeb Ahmed <54290492+muneebahmed10@users.noreply.github.com>
* Update call sites of sendPacket to treat partial sends as failure
* test: Add send timeout coverage for APIs calling sendPacket
* test: Add coverage for send timeout in APIs calling sendPacket
* test: review feedback
* ci: address spell check error
Co-authored-by: Muneeb Ahmed <54290492+muneebahmed10@users.noreply.github.com>
Co-authored-by: Sarena Meas <sarem@amazon.com>
* Fix issue of data recv being interrupted
* Rename elapsedTimeMs variable to its express its new meaning
* Use configuration const for recvExact timeout
* Remove timeout check from discardPacket and address CI check failures
* Fix more CI check failures
* Remove another unused local variable
* Re-instate timeout in discard to reduce scope of changes
* Remove unused variable again
* Fix failing unit test
* Rename new config macro, and attempt to fix CBMC failures
* Doc: Improvement suggestions from code review
Co-authored-by: Muneeb Ahmed <54290492+muneebahmed10@users.noreply.github.com>
* Fix quality check failures
* Add test case to check partial network reads with zero timeout duration for ProcessLoop
* style: Improving naming
* Address complexity failure
* Address comments
* Doc: Add blocking time equation of Receive/ProcessLoop functions in their API doc
* Improvement in API doc
* Set MQTT_RECV_POLLING_TIMEOUT_MS so that recvExact runs in one iteration always for cbmc.
* doc: Add information about zero return value for Transport_Recv_t
* fix: prevent possibility of infinite loop in timeout logic of ProcessLoop
* style: Minor changes
* hygiene: minor name fix
* fix: Possibility of infinite loop in sendPacket
* Add the new configuration to doxygen
* test: Add mock transport send function that always returns zero
* fix: Issues in sendPacket and sendPublish
* test: add test for sendPacket timeout
* Update Timer Overflow test
* test: temporarily comment out unused variable
* test: fix the timer overflow test
* Address review comments
* style: make log messages concise
Co-authored-by: Muneeb Ahmed <54290492+muneebahmed10@users.noreply.github.com>
Co-authored-by: Muneeb Ahmed <54290492+muneebahmed10@users.noreply.github.com>
Co-authored-by: Sarena Meas <sarem@amazon.com>
- Update core_mqtt_config.h to specify logging level as LOG_NONE
- Update GA to set logging level as LOG_DEBUG
- Fix compile error in LogDebug of recvExact
### Problem
The `MQTT_ProcessLoop` and `MQTT_ReceiveLoop` read incoming MQTT packet payload over the network by calling the `recvExact` function. The `recvExact` function can be called multiple times to read the expected number of bytes for the MQTT packet but it also implements a timeout functionality of receiving the expected number of payload within the timeout value passed to the function.
This causes problems when the `Transport_Recv` call returns less than requested number of bytes, and there is a timeout (for example, when calling `MQTT_ProcessLoop` with 0ms duration) which causes the function to assume failure instead of reading the remaining payload of the MQTT packet by calling `Transport_Recv` again. Thus, in such cases, the MQTT connection is severed prematurely even though there is a high probability of receiving the remaining bytes of the MQTT packet over the network.
### Solution
Instead of implementing a timeout on the entire duration of receiving the expected number of remaining MQTT packet bytes in `recvExact`, the use of timeout is being changed to be relevant only on the total time of receiving 0 bytes over the network over multiple calls to `Transport_Recv`.
As this modified meaning of the timeout duration is now unrelated to the timeout duration that the `MQTT_ProcessLoop` or `MQTT_ReceiveLoop` functions are called, a new configuration constant for the `recvExact` timeout value, `MQTT_RECV_POLLING_TIMEOUT_MS`, has been added to the library which will carry a default value of 10ms.
Co-authored-by: Sarena Meas <sarem@amazon.com>
This follows changes from FreeRTOS/FreeRTOS@398abba. The const qualifier is removed from send/recv because there are transport implementations that require a member of the network context to be modified such as in the case of mbedtls.
This updates the coreMQTT library so as to resend a PUBACK and PUBREC for an incoming duplicate publish packet, irrespective of the broker setting the DUP flag.
* Set publish payload to NULL when zero length
* Add unit test for zero length payload
* Fix unit tests for deserialize publish
* Rename setupWillInfo to setupPublishInfo
* Remove void * from memset
* Add version numbers
* Add missing @file tags
* Update lexicon.txt
* Update @brief tag for MQTT cbmc state
Co-authored-by: Gary Wicker <14828980+gkwicker@users.noreply.github.com>