提交 f3fad223 编写于 作者: K Karsten Keil

ISDN: Fix isdnhdlc for one byte hdlc packets

Normally HDLC packets contain more as one byte (e.g a X25/X75 header).
But if you use plain HDLC framing, the current code do not encode
1 byte payloads, this patch fix that.
Signed-off-by: NKarsten Keil <keil@b1-systems.de>
上级 c38fc3bc
...@@ -47,7 +47,7 @@ enum { ...@@ -47,7 +47,7 @@ enum {
HDLC_SEND_DATA, HDLC_SEND_CRC1, HDLC_SEND_FAST_FLAG, HDLC_SEND_DATA, HDLC_SEND_CRC1, HDLC_SEND_FAST_FLAG,
HDLC_SEND_FIRST_FLAG, HDLC_SEND_CRC2, HDLC_SEND_CLOSING_FLAG, HDLC_SEND_FIRST_FLAG, HDLC_SEND_CRC2, HDLC_SEND_CLOSING_FLAG,
HDLC_SEND_IDLE1, HDLC_SEND_FAST_IDLE, HDLC_SENDFLAG_B0, HDLC_SEND_IDLE1, HDLC_SEND_FAST_IDLE, HDLC_SENDFLAG_B0,
HDLC_SENDFLAG_B1A6, HDLC_SENDFLAG_B7, STOPPED HDLC_SENDFLAG_B1A6, HDLC_SENDFLAG_B7, STOPPED, HDLC_SENDFLAG_ONE
}; };
void isdnhdlc_rcv_init(struct isdnhdlc_vars *hdlc, u32 features) void isdnhdlc_rcv_init(struct isdnhdlc_vars *hdlc, u32 features)
...@@ -362,6 +362,9 @@ int isdnhdlc_encode(struct isdnhdlc_vars *hdlc, const u8 *src, u16 slen, ...@@ -362,6 +362,9 @@ int isdnhdlc_encode(struct isdnhdlc_vars *hdlc, const u8 *src, u16 slen,
*count = slen; *count = slen;
/* special handling for one byte frames */
if ((slen == 1) && (hdlc->state == HDLC_SEND_FAST_FLAG))
hdlc->state = HDLC_SENDFLAG_ONE;
while (dsize > 0) { while (dsize > 0) {
if (hdlc->bit_shift == 0) { if (hdlc->bit_shift == 0) {
if (slen && !hdlc->do_closing) { if (slen && !hdlc->do_closing) {
...@@ -407,6 +410,8 @@ int isdnhdlc_encode(struct isdnhdlc_vars *hdlc, const u8 *src, u16 slen, ...@@ -407,6 +410,8 @@ int isdnhdlc_encode(struct isdnhdlc_vars *hdlc, const u8 *src, u16 slen,
dsize--; dsize--;
break; break;
} }
/* fall through */
case HDLC_SENDFLAG_ONE:
if (hdlc->bit_shift == 8) { if (hdlc->bit_shift == 8) {
hdlc->cbin = hdlc->ffvalue >> hdlc->cbin = hdlc->ffvalue >>
(8 - hdlc->data_bits); (8 - hdlc->data_bits);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册