Hi Marko,
Before receiving the "NO CARRIER" signal,
the modem leaves the data mode
and enters the chat mode (apparently too early).
In my log you can see that it gets some leftovers
of a PPP package,including an opening double quote
... but it never gets the closing one, and therefore
oFono is not responding any more.
Here is the log:
(the modem has already established a data connection,
and I pull out the SIM card of its slot)
Aha. Now I understand. You're removing the SIM card, which triggers
at_gprs_context_remove. And the modem firmware is not smart enough to
send the final HDLC frame prior to sending us the SIM removed event.
ofonod[2816]: Modem: < ~\377}#\300!}%}"} }$Y(~
ofonod[2816]: Modem: < \r\nNO CARRIER\r\n
And indeed, we switch out of HDLC mode too early in this case.
>
>> I think this is an major issue that should be fixed in oFono.
>> The syntax parser has to be extended to handle such cases.
>>
>
> Any suggestions on how oFono should detect this condition?
Here is our "quick" solution to this problem.
--- gatchat.c (f83233d)
+++ gatchat.c (a3cb2b2)
@@ -957,6 +957,11 @@
g_at_io_set_debug(chat->io, chat->debugf, chat->debug_data);
g_at_io_set_read_handler(chat->io, new_bytes, chat);
+ /* Prevent garbage that arrives from the late data connection to
+ * switch the AT syntax parser to string mode (when it contains a
doublequote) */
+ if (chat->syntax->set_hint)
+ chat->syntax->set_hint(chat->syntax, G_AT_SYNTAX_EXPECT_GARBAGE);
+
if (g_queue_get_length(chat->command_queue) > 0)
chat_wakeup_writer(chat);
}
--- gatsyntax.c (359f790)
+++ gatsyntax.c (a3cb2b2)
@@ -57,6 +57,8 @@
GSM_PERMISSIVE_STATE_PROMPT,
GSM_PERMISSIVE_STATE_GUESS_SHORT_PROMPT,
GSM_PERMISSIVE_STATE_SHORT_PROMPT,
+ GSM_PERMISSIVE_STATE_GUESS_GARBAGE,
+ GSM_PERMISSIVE_STATE_GARBAGE,
};
static void gsmv1_hint(GAtSyntax *syntax, GAtSyntaxExpectHint hint)
@@ -270,6 +272,8 @@
syntax->state = GSM_PERMISSIVE_STATE_GUESS_PDU;
else if (hint == G_AT_SYNTAX_EXPECT_SHORT_PROMPT)
syntax->state = GSM_PERMISSIVE_STATE_GUESS_SHORT_PROMPT;
+ else if (hint == G_AT_SYNTAX_EXPECT_GARBAGE)
+ syntax->state = GSM_PERMISSIVE_STATE_GUESS_GARBAGE;
}
static GAtSyntaxResult gsm_permissive_feed(GAtSyntax *syntax,
@@ -358,6 +362,21 @@
syntax->state = GSM_PERMISSIVE_STATE_RESPONSE;
return G_AT_SYNTAX_RESULT_UNSURE;
+ case GSM_PERMISSIVE_STATE_GUESS_GARBAGE:
+ if (byte != '\r' && byte != '\n')
+ syntax->state = GSM_PERMISSIVE_STATE_GARBAGE;
+ break;
+
+ case GSM_PERMISSIVE_STATE_GARBAGE:
+ if (byte == '\r') {
+ syntax->state = GSM_PERMISSIVE_STATE_IDLE;
+
+ i += 1;
+ res = G_AT_SYNTAX_RESULT_GARBAGE;
+ goto out;
+ }
+ break;
+
default:
break;
};
--- gatsyntax.h (21f9da9)
+++ gatsyntax.h (a3cb2b2)
@@ -30,7 +30,8 @@
G_AT_SYNTAX_EXPECT_PDU,
G_AT_SYNTAX_EXPECT_MULTILINE,
G_AT_SYNTAX_EXPECT_PROMPT,
- G_AT_SYNTAX_EXPECT_SHORT_PROMPT
+ G_AT_SYNTAX_EXPECT_SHORT_PROMPT,
+ G_AT_SYNTAX_EXPECT_GARBAGE,
};
typedef enum _GAtSyntaxExpectHint GAtSyntaxExpectHint;
@@ -42,6 +43,7 @@
G_AT_SYNTAX_RESULT_MULTILINE,
G_AT_SYNTAX_RESULT_PDU,
G_AT_SYNTAX_RESULT_PROMPT,
+ G_AT_SYNTAX_RESULT_GARBAGE,
};
typedef enum _GAtSyntaxResult GAtSyntaxResult;
Our opinion is that the modem should only switch its
mode once it really received the NO CARRIER
signal (or something in this manner).
Correct. However, we currently expect all atom drivers to cleanup
immediately (e.g. at_gprs_context_remove), so doing this cleanly is tricky.
P.S. We would also like to post a patch regarding oFono.
How can we do this?
git send-email.
Regards,
-Denis