@@ -460,12 +460,13 @@ static void modem_cmux_on_cld_command(struct modem_cmux *cmux, struct modem_cmux
460
460
static void modem_cmux_on_control_frame_ua (struct modem_cmux * cmux )
461
461
{
462
462
if (cmux -> state != MODEM_CMUX_STATE_CONNECTING ) {
463
- LOG_DBG ("Unexpected UA frame" );
463
+ LOG_DBG ("Unexpected UA frame in state %d" , cmux -> state );
464
464
return ;
465
465
}
466
466
467
467
LOG_DBG ("CMUX connected" );
468
468
cmux -> state = MODEM_CMUX_STATE_CONNECTED ;
469
+ cmux -> initiator = true;
469
470
k_mutex_lock (& cmux -> transmit_rb_lock , K_FOREVER );
470
471
cmux -> flow_control_on = true;
471
472
k_mutex_unlock (& cmux -> transmit_rb_lock );
@@ -536,16 +537,16 @@ static void modem_cmux_connect_response_transmit(struct modem_cmux *cmux)
536
537
537
538
static void modem_cmux_on_control_frame_sabm (struct modem_cmux * cmux )
538
539
{
539
- modem_cmux_connect_response_transmit (cmux );
540
-
541
540
if ((cmux -> state == MODEM_CMUX_STATE_CONNECTED ) ||
542
541
(cmux -> state == MODEM_CMUX_STATE_DISCONNECTING )) {
543
542
LOG_DBG ("Connect request not accepted" );
544
543
return ;
545
544
}
546
545
547
546
LOG_DBG ("CMUX connection request received" );
547
+ cmux -> initiator = false;
548
548
cmux -> state = MODEM_CMUX_STATE_CONNECTED ;
549
+ modem_cmux_connect_response_transmit (cmux );
549
550
k_mutex_lock (& cmux -> transmit_rb_lock , K_FOREVER );
550
551
cmux -> flow_control_on = true;
551
552
k_mutex_unlock (& cmux -> transmit_rb_lock );
@@ -558,6 +559,11 @@ static void modem_cmux_on_control_frame(struct modem_cmux *cmux)
558
559
{
559
560
modem_cmux_log_received_frame (& cmux -> frame );
560
561
562
+ if (cmux -> state == MODEM_CMUX_STATE_CONNECTED && cmux -> frame .cr == cmux -> initiator ) {
563
+ LOG_DBG ("Received a response frame, dropping" );
564
+ return ;
565
+ }
566
+
561
567
switch (cmux -> frame .type ) {
562
568
case MODEM_CMUX_FRAME_TYPE_UA :
563
569
modem_cmux_on_control_frame_ua (cmux );
@@ -595,6 +601,12 @@ static struct modem_cmux_dlci *modem_cmux_find_dlci(struct modem_cmux *cmux)
595
601
596
602
static void modem_cmux_on_dlci_frame_ua (struct modem_cmux_dlci * dlci )
597
603
{
604
+ /* Drop invalid UA frames */
605
+ if (dlci -> cmux -> frame .cr != dlci -> cmux -> initiator ) {
606
+ LOG_DBG ("Received a response frame, dropping" );
607
+ return ;
608
+ }
609
+
598
610
switch (dlci -> state ) {
599
611
case MODEM_CMUX_DLCI_STATE_OPENING :
600
612
LOG_DBG ("DLCI %u opened" , dlci -> dlci_address );
@@ -680,6 +692,11 @@ static void modem_cmux_on_dlci_frame(struct modem_cmux *cmux)
680
692
681
693
modem_cmux_log_received_frame (& cmux -> frame );
682
694
695
+ if (cmux -> state != MODEM_CMUX_STATE_CONNECTED ) {
696
+ LOG_DBG ("Unexpected DLCI frame in state %d" , cmux -> state );
697
+ return ;
698
+ }
699
+
683
700
dlci = modem_cmux_find_dlci (cmux );
684
701
if (dlci == NULL ) {
685
702
LOG_WRN ("Ignoring frame intended for unconfigured DLCI %u." ,
@@ -1018,6 +1035,7 @@ static void modem_cmux_connect_handler(struct k_work *item)
1018
1035
cmux = CONTAINER_OF (dwork , struct modem_cmux , connect_work );
1019
1036
1020
1037
cmux -> state = MODEM_CMUX_STATE_CONNECTING ;
1038
+ cmux -> initiator = true;
1021
1039
1022
1040
static const struct modem_cmux_frame frame = {
1023
1041
.dlci_address = 0 ,
@@ -1050,7 +1068,7 @@ static void modem_cmux_disconnect_handler(struct k_work *item)
1050
1068
1051
1069
struct modem_cmux_frame frame = {
1052
1070
.dlci_address = 0 ,
1053
- .cr = true ,
1071
+ .cr = cmux -> initiator ,
1054
1072
.pf = false,
1055
1073
.type = MODEM_CMUX_FRAME_TYPE_UIH ,
1056
1074
.data = data ,
@@ -1129,7 +1147,7 @@ static int modem_cmux_dlci_pipe_api_transmit(void *data, const uint8_t *buf, siz
1129
1147
1130
1148
struct modem_cmux_frame frame = {
1131
1149
.dlci_address = dlci -> dlci_address ,
1132
- .cr = true ,
1150
+ .cr = cmux -> initiator ,
1133
1151
.pf = false,
1134
1152
.type = MODEM_CMUX_FRAME_TYPE_UIH ,
1135
1153
.data = buf ,
@@ -1204,7 +1222,7 @@ static void modem_cmux_dlci_open_handler(struct k_work *item)
1204
1222
1205
1223
struct modem_cmux_frame frame = {
1206
1224
.dlci_address = dlci -> dlci_address ,
1207
- .cr = true ,
1225
+ .cr = dlci -> cmux -> initiator ,
1208
1226
.pf = true,
1209
1227
.type = MODEM_CMUX_FRAME_TYPE_SABM ,
1210
1228
.data = NULL ,
@@ -1233,7 +1251,7 @@ static void modem_cmux_dlci_close_handler(struct k_work *item)
1233
1251
1234
1252
struct modem_cmux_frame frame = {
1235
1253
.dlci_address = dlci -> dlci_address ,
1236
- .cr = true ,
1254
+ .cr = dlci -> cmux -> initiator ,
1237
1255
.pf = true,
1238
1256
.type = MODEM_CMUX_FRAME_TYPE_DISC ,
1239
1257
.data = NULL ,
0 commit comments