@@ -451,11 +451,12 @@ static void modem_cmux_on_cld_command(struct modem_cmux *cmux, struct modem_cmux
451
451
static void modem_cmux_on_control_frame_ua (struct modem_cmux * cmux )
452
452
{
453
453
if (cmux -> state != MODEM_CMUX_STATE_CONNECTING ) {
454
- LOG_DBG ("Unexpected UA frame" );
454
+ LOG_DBG ("Unexpected UA frame in state %d" , cmux -> state );
455
455
return ;
456
456
}
457
457
458
458
cmux -> state = MODEM_CMUX_STATE_CONNECTED ;
459
+ cmux -> initiator = true;
459
460
k_mutex_lock (& cmux -> transmit_rb_lock , K_FOREVER );
460
461
cmux -> flow_control_on = true;
461
462
k_mutex_unlock (& cmux -> transmit_rb_lock );
@@ -526,15 +527,15 @@ static void modem_cmux_connect_response_transmit(struct modem_cmux *cmux)
526
527
527
528
static void modem_cmux_on_control_frame_sabm (struct modem_cmux * cmux )
528
529
{
529
- modem_cmux_connect_response_transmit (cmux );
530
-
531
530
if ((cmux -> state == MODEM_CMUX_STATE_CONNECTED ) ||
532
531
(cmux -> state == MODEM_CMUX_STATE_DISCONNECTING )) {
533
532
LOG_DBG ("Connect request not accepted" );
534
533
return ;
535
534
}
536
535
536
+ cmux -> initiator = false;
537
537
cmux -> state = MODEM_CMUX_STATE_CONNECTED ;
538
+ modem_cmux_connect_response_transmit (cmux );
538
539
k_mutex_lock (& cmux -> transmit_rb_lock , K_FOREVER );
539
540
cmux -> flow_control_on = true;
540
541
k_mutex_unlock (& cmux -> transmit_rb_lock );
@@ -547,6 +548,11 @@ static void modem_cmux_on_control_frame(struct modem_cmux *cmux)
547
548
{
548
549
modem_cmux_log_received_frame (& cmux -> frame );
549
550
551
+ if (cmux -> state == MODEM_CMUX_STATE_CONNECTED && cmux -> frame .cr == cmux -> initiator ) {
552
+ LOG_DBG ("Received a response frame, dropping" );
553
+ return ;
554
+ }
555
+
550
556
switch (cmux -> frame .type ) {
551
557
case MODEM_CMUX_FRAME_TYPE_UA :
552
558
modem_cmux_on_control_frame_ua (cmux );
@@ -584,6 +590,12 @@ static struct modem_cmux_dlci *modem_cmux_find_dlci(struct modem_cmux *cmux)
584
590
585
591
static void modem_cmux_on_dlci_frame_ua (struct modem_cmux_dlci * dlci )
586
592
{
593
+ /* Drop invalid UA frames */
594
+ if (dlci -> cmux -> frame .cr != dlci -> cmux -> initiator ) {
595
+ LOG_DBG ("Received a response frame, dropping" );
596
+ return ;
597
+ }
598
+
587
599
switch (dlci -> state ) {
588
600
case MODEM_CMUX_DLCI_STATE_OPENING :
589
601
dlci -> state = MODEM_CMUX_DLCI_STATE_OPEN ;
@@ -665,6 +677,11 @@ static void modem_cmux_on_dlci_frame(struct modem_cmux *cmux)
665
677
666
678
modem_cmux_log_received_frame (& cmux -> frame );
667
679
680
+ if (cmux -> state != MODEM_CMUX_STATE_CONNECTED ) {
681
+ LOG_DBG ("Unexpected DLCI frame in state %d" , cmux -> state );
682
+ return ;
683
+ }
684
+
668
685
dlci = modem_cmux_find_dlci (cmux );
669
686
if (dlci == NULL ) {
670
687
LOG_WRN ("Ignoring frame intended for unconfigured DLCI %u." ,
@@ -1007,6 +1024,7 @@ static void modem_cmux_connect_handler(struct k_work *item)
1007
1024
cmux = CONTAINER_OF (dwork , struct modem_cmux , connect_work );
1008
1025
1009
1026
cmux -> state = MODEM_CMUX_STATE_CONNECTING ;
1027
+ cmux -> initiator = true;
1010
1028
1011
1029
static const struct modem_cmux_frame frame = {
1012
1030
.dlci_address = 0 ,
@@ -1039,7 +1057,7 @@ static void modem_cmux_disconnect_handler(struct k_work *item)
1039
1057
1040
1058
struct modem_cmux_frame frame = {
1041
1059
.dlci_address = 0 ,
1042
- .cr = true ,
1060
+ .cr = cmux -> initiator ,
1043
1061
.pf = false,
1044
1062
.type = MODEM_CMUX_FRAME_TYPE_UIH ,
1045
1063
.data = data ,
@@ -1118,7 +1136,7 @@ static int modem_cmux_dlci_pipe_api_transmit(void *data, const uint8_t *buf, siz
1118
1136
1119
1137
struct modem_cmux_frame frame = {
1120
1138
.dlci_address = dlci -> dlci_address ,
1121
- .cr = true ,
1139
+ .cr = cmux -> initiator ,
1122
1140
.pf = false,
1123
1141
.type = MODEM_CMUX_FRAME_TYPE_UIH ,
1124
1142
.data = buf ,
@@ -1193,7 +1211,7 @@ static void modem_cmux_dlci_open_handler(struct k_work *item)
1193
1211
1194
1212
struct modem_cmux_frame frame = {
1195
1213
.dlci_address = dlci -> dlci_address ,
1196
- .cr = true ,
1214
+ .cr = dlci -> cmux -> initiator ,
1197
1215
.pf = true,
1198
1216
.type = MODEM_CMUX_FRAME_TYPE_SABM ,
1199
1217
.data = NULL ,
@@ -1222,7 +1240,7 @@ static void modem_cmux_dlci_close_handler(struct k_work *item)
1222
1240
1223
1241
struct modem_cmux_frame frame = {
1224
1242
.dlci_address = dlci -> dlci_address ,
1225
- .cr = true ,
1243
+ .cr = dlci -> cmux -> initiator ,
1226
1244
.pf = true,
1227
1245
.type = MODEM_CMUX_FRAME_TYPE_DISC ,
1228
1246
.data = NULL ,
0 commit comments