mirror of git://git.sysmocom.de/ofono
Fix broken HDLC flag handling
This commit is contained in:
parent
057bd9f0b3
commit
cc1975270c
|
@ -161,6 +161,7 @@ static void read_watch_destroy(gpointer user_data)
|
||||||
GAtHDLC *g_at_hdlc_new(GIOChannel *channel)
|
GAtHDLC *g_at_hdlc_new(GIOChannel *channel)
|
||||||
{
|
{
|
||||||
GAtHDLC *hdlc;
|
GAtHDLC *hdlc;
|
||||||
|
unsigned char *buf;
|
||||||
|
|
||||||
if (!channel)
|
if (!channel)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -183,6 +184,11 @@ GAtHDLC *g_at_hdlc_new(GIOChannel *channel)
|
||||||
if (!hdlc->write_buffer)
|
if (!hdlc->write_buffer)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
|
/* Write an initial 0x7e as wakeup character */
|
||||||
|
buf = ring_buffer_write_ptr(hdlc->write_buffer, 0);
|
||||||
|
*buf = HDLC_FLAG;
|
||||||
|
ring_buffer_write_advance(hdlc->write_buffer, 1);
|
||||||
|
|
||||||
hdlc->decode_buffer = g_try_malloc(BUFFER_SIZE * 2);
|
hdlc->decode_buffer = g_try_malloc(BUFFER_SIZE * 2);
|
||||||
if (!hdlc->decode_buffer)
|
if (!hdlc->decode_buffer)
|
||||||
goto error;
|
goto error;
|
||||||
|
@ -320,7 +326,7 @@ gboolean g_at_hdlc_send(GAtHDLC *hdlc, const unsigned char *data, gsize size)
|
||||||
unsigned int avail = ring_buffer_avail(hdlc->write_buffer);
|
unsigned int avail = ring_buffer_avail(hdlc->write_buffer);
|
||||||
unsigned int wrap = ring_buffer_avail_no_wrap(hdlc->write_buffer);
|
unsigned int wrap = ring_buffer_avail_no_wrap(hdlc->write_buffer);
|
||||||
unsigned char *buf = ring_buffer_write_ptr(hdlc->write_buffer, 0);
|
unsigned char *buf = ring_buffer_write_ptr(hdlc->write_buffer, 0);
|
||||||
unsigned char tail[3];
|
unsigned char tail[2];
|
||||||
unsigned int i = 0;
|
unsigned int i = 0;
|
||||||
guint16 fcs = HDLC_INITFCS;
|
guint16 fcs = HDLC_INITFCS;
|
||||||
gboolean escape = FALSE;
|
gboolean escape = FALSE;
|
||||||
|
@ -357,7 +363,6 @@ gboolean g_at_hdlc_send(GAtHDLC *hdlc, const unsigned char *data, gsize size)
|
||||||
fcs ^= HDLC_INITFCS;
|
fcs ^= HDLC_INITFCS;
|
||||||
tail[0] = fcs & 0xff;
|
tail[0] = fcs & 0xff;
|
||||||
tail[1] = fcs >> 8;
|
tail[1] = fcs >> 8;
|
||||||
tail[2] = HDLC_FLAG;
|
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
|
|
||||||
|
@ -382,6 +387,12 @@ gboolean g_at_hdlc_send(GAtHDLC *hdlc, const unsigned char *data, gsize size)
|
||||||
if (i < sizeof(tail))
|
if (i < sizeof(tail))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
if (pos + 1 > avail)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
*buf = HDLC_FLAG;
|
||||||
|
pos++;
|
||||||
|
|
||||||
ring_buffer_write_advance(hdlc->write_buffer, pos);
|
ring_buffer_write_advance(hdlc->write_buffer, pos);
|
||||||
|
|
||||||
wakeup_write(hdlc);
|
wakeup_write(hdlc);
|
||||||
|
|
Loading…
Reference in New Issue