@@ -22,6 +22,9 @@ void lwmqtt_init(lwmqtt_client_t *client, uint8_t *write_buf, size_t write_buf_s
2222 client -> command_timer = NULL ;
2323 client -> timer_set = NULL ;
2424 client -> timer_get = NULL ;
25+
26+ client -> drop_overflow = false;
27+ client -> overflow_counter = NULL ;
2528}
2629
2730void lwmqtt_set_network (lwmqtt_client_t * client , void * ref , lwmqtt_network_read_t read , lwmqtt_network_write_t write ) {
@@ -46,6 +49,11 @@ void lwmqtt_set_callback(lwmqtt_client_t *client, void *ref, lwmqtt_callback_t c
4649 client -> callback = cb ;
4750}
4851
52+ void lwmqtt_drop_overflow (lwmqtt_client_t * client , bool enabled , uint32_t * counter ) {
53+ client -> drop_overflow = enabled ;
54+ client -> overflow_counter = counter ;
55+ }
56+
4957static uint16_t lwmqtt_get_next_packet_id (lwmqtt_client_t * client ) {
5058 // check overflow
5159 if (client -> last_packet_id == 65535 ) {
@@ -91,6 +99,36 @@ static lwmqtt_err_t lwmqtt_read_from_network(lwmqtt_client_t *client, size_t off
9199 return LWMQTT_SUCCESS ;
92100}
93101
102+ static lwmqtt_err_t lwmqtt_drain_network (lwmqtt_client_t * client , size_t amount ) {
103+ // read while data is left
104+ while (amount > 0 ) {
105+ // check remaining time
106+ int32_t remaining_time = client -> timer_get (client -> command_timer );
107+ if (remaining_time <= 0 ) {
108+ return LWMQTT_NETWORK_TIMEOUT ;
109+ }
110+
111+ // get max read
112+ size_t max_read = amount ;
113+ if (max_read > client -> read_buf_size ) {
114+ max_read = client -> read_buf_size ;
115+ }
116+
117+ // read
118+ size_t partial_read = 0 ;
119+ lwmqtt_err_t err =
120+ client -> network_read (client -> network , client -> read_buf , max_read , & partial_read , (uint32_t )remaining_time );
121+ if (err != LWMQTT_SUCCESS ) {
122+ return err ;
123+ }
124+
125+ // decrement counter
126+ amount -= partial_read ;
127+ }
128+
129+ return LWMQTT_SUCCESS ;
130+ }
131+
94132static lwmqtt_err_t lwmqtt_write_to_network (lwmqtt_client_t * client , size_t offset , size_t len ) {
95133 // prepare counter
96134 size_t written = 0 ;
@@ -161,6 +199,26 @@ static lwmqtt_err_t lwmqtt_read_packet_in_buffer(lwmqtt_client_t *client, size_t
161199 return err ;
162200 }
163201
202+ // handle overflow
203+ if (client -> drop_overflow && 1 + len + rem_len > client -> read_buf_size ) {
204+ // drain network
205+ err = lwmqtt_drain_network (client , rem_len );
206+ if (err != LWMQTT_SUCCESS ) {
207+ return err ;
208+ }
209+
210+ // unset packet
211+ * packet_type = LWMQTT_NO_PACKET ;
212+ * read = 0 ;
213+
214+ // increment if counter is available
215+ if (client -> overflow_counter != NULL ) {
216+ * client -> overflow_counter += 1 ;
217+ }
218+
219+ return LWMQTT_SUCCESS ;
220+ }
221+
164222 // read the rest of the buffer if needed
165223 if (rem_len > 0 ) {
166224 err = lwmqtt_read_from_network (client , 1 + len , rem_len );
0 commit comments