Skip to content

Commit 0025751

Browse files
SeppoTakalocfriedt
authored andcommitted
modem: cmux: Rework the drop handling
Do not read extra byte when we decide to drop a frame. Instead go directly to MODEM_CMUX_RECEIVE_STATE_SOF, so the next flag character will start a new frame. Signed-off-by: Seppo Takalo <[email protected]>
1 parent 2d151b2 commit 0025751

File tree

2 files changed

+11
-16
lines changed

2 files changed

+11
-16
lines changed

include/zephyr/modem/cmux.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,6 @@ enum modem_cmux_receive_state {
7474
MODEM_CMUX_RECEIVE_STATE_LENGTH_CONT,
7575
MODEM_CMUX_RECEIVE_STATE_DATA,
7676
MODEM_CMUX_RECEIVE_STATE_FCS,
77-
MODEM_CMUX_RECEIVE_STATE_DROP,
7877
MODEM_CMUX_RECEIVE_STATE_EOF,
7978
};
8079

subsys/modem/modem_cmux.c

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ LOG_MODULE_REGISTER(modem_cmux, CONFIG_MODEM_CMUX_LOG_LEVEL);
1313

1414
#include <string.h>
1515

16+
#define MODEM_CMUX_SOF (0xF9)
1617
#define MODEM_CMUX_FCS_POLYNOMIAL (0xE0)
1718
#define MODEM_CMUX_FCS_INIT_VALUE (0xFF)
1819
#define MODEM_CMUX_EA (0x01)
@@ -282,7 +283,7 @@ static uint16_t modem_cmux_transmit_frame(struct modem_cmux *cmux,
282283
data_len = MIN(data_len, CONFIG_MODEM_CMUX_MTU);
283284

284285
/* SOF */
285-
buf[0] = 0xF9;
286+
buf[0] = MODEM_CMUX_SOF;
286287

287288
/* DLCI Address (Max 63) */
288289
buf[1] = 0x01 | (frame->cr << 1) | (frame->dlci_address << 2);
@@ -318,7 +319,7 @@ static uint16_t modem_cmux_transmit_frame(struct modem_cmux *cmux,
318319

319320
/* FCS and EOF will be put on the same call */
320321
buf[0] = fcs;
321-
buf[1] = 0xF9;
322+
buf[1] = MODEM_CMUX_SOF;
322323
ring_buf_put(&cmux->transmit_rb, buf, 2);
323324
k_work_schedule(&cmux->transmit_work, K_NO_WAIT);
324325
return data_len;
@@ -744,7 +745,7 @@ static void modem_cmux_process_received_byte(struct modem_cmux *cmux, uint8_t by
744745

745746
switch (cmux->receive_state) {
746747
case MODEM_CMUX_RECEIVE_STATE_SOF:
747-
if (byte == 0xF9) {
748+
if (byte == MODEM_CMUX_SOF) {
748749
cmux->receive_state = MODEM_CMUX_RECEIVE_STATE_RESYNC;
749750
break;
750751
}
@@ -756,7 +757,7 @@ static void modem_cmux_process_received_byte(struct modem_cmux *cmux, uint8_t by
756757
* Allow any number of consecutive flags (0xF9).
757758
* 0xF9 could also be a valid address field for DLCI 62.
758759
*/
759-
if (byte == 0xF9) {
760+
if (byte == MODEM_CMUX_SOF) {
760761
break;
761762
}
762763

@@ -813,7 +814,7 @@ static void modem_cmux_process_received_byte(struct modem_cmux *cmux, uint8_t by
813814

814815
if (cmux->frame.data_len > CONFIG_MODEM_CMUX_MTU) {
815816
LOG_ERR("Too large frame");
816-
cmux->receive_state = MODEM_CMUX_RECEIVE_STATE_DROP;
817+
modem_cmux_drop_frame(cmux);
817818
break;
818819
}
819820

@@ -838,15 +839,15 @@ static void modem_cmux_process_received_byte(struct modem_cmux *cmux, uint8_t by
838839

839840
if (cmux->frame.data_len > CONFIG_MODEM_CMUX_MTU) {
840841
LOG_ERR("Too large frame");
841-
cmux->receive_state = MODEM_CMUX_RECEIVE_STATE_DROP;
842+
modem_cmux_drop_frame(cmux);
842843
break;
843844
}
844845

845846
if (cmux->frame.data_len > cmux->receive_buf_size) {
846847
LOG_ERR("Indicated frame data length %u exceeds receive buffer size %u",
847848
cmux->frame.data_len, cmux->receive_buf_size);
848849

849-
cmux->receive_state = MODEM_CMUX_RECEIVE_STATE_DROP;
850+
modem_cmux_drop_frame(cmux);
850851
break;
851852
}
852853

@@ -873,7 +874,7 @@ static void modem_cmux_process_received_byte(struct modem_cmux *cmux, uint8_t by
873874
if (cmux->receive_buf_len > cmux->receive_buf_size) {
874875
LOG_WRN("Receive buffer overrun (%u > %u)",
875876
cmux->receive_buf_len, cmux->receive_buf_size);
876-
cmux->receive_state = MODEM_CMUX_RECEIVE_STATE_DROP;
877+
modem_cmux_drop_frame(cmux);
877878
break;
878879
}
879880

@@ -890,21 +891,16 @@ static void modem_cmux_process_received_byte(struct modem_cmux *cmux, uint8_t by
890891
if (fcs != byte) {
891892
LOG_WRN("Frame FCS error");
892893

893-
/* Drop frame */
894-
cmux->receive_state = MODEM_CMUX_RECEIVE_STATE_DROP;
894+
modem_cmux_drop_frame(cmux);
895895
break;
896896
}
897897

898898
cmux->receive_state = MODEM_CMUX_RECEIVE_STATE_EOF;
899899
break;
900900

901-
case MODEM_CMUX_RECEIVE_STATE_DROP:
902-
modem_cmux_drop_frame(cmux);
903-
break;
904-
905901
case MODEM_CMUX_RECEIVE_STATE_EOF:
906902
/* Validate byte is EOF */
907-
if (byte != 0xF9) {
903+
if (byte != MODEM_CMUX_SOF) {
908904
/* Unexpected byte */
909905
modem_cmux_drop_frame(cmux);
910906
break;

0 commit comments

Comments
 (0)