Skip to content

Commit 7079283

Browse files
dstarke-siemensgregkh
authored andcommitted
tty: n_gsm: fix SW flow control encoding/handling
commit 8838b2a upstream. n_gsm is based on the 3GPP 07.010 and its newer version is the 3GPP 27.010. See https://portal.3gpp.org/desktopmodules/Specifications/SpecificationDetails.aspx?specificationId=1516 The changes from 07.010 to 27.010 are non-functional. Therefore, I refer to the newer 27.010 here. Chapter 5.2.7.3 states that DC1 (XON) and DC3 (XOFF) are the control characters defined in ISO/IEC 646. These shall be quoted if seen in the data stream to avoid interpretation as flow control characters. ISO/IEC 646 refers to the set of ISO standards described as the ISO 7-bit coded character set for information interchange. Its final version is also known as ITU T.50. See https://www.itu.int/rec/T-REC-T.50-199209-I/en To abide the standard it is needed to quote DC1 and DC3 correctly if these are seen as data bytes and not as control characters. The current implementation already tries to enforce this but fails to catch all defined cases. 3GPP 27.010 chapter 5.2.7.3 clearly states that the most significant bit shall be ignored for DC1 and DC3 handling. The current implementation handles only the case with the most significant bit set 0. Cases in which DC1 and DC3 have the most significant bit set 1 are left unhandled. This patch fixes this by masking the data bytes with ISO_IEC_646_MASK (only the 7 least significant bits set 1) before comparing them with XON (a.k.a. DC1) and XOFF (a.k.a. DC3) when testing which byte values need quotation via byte stuffing. Fixes: e1eaea4 ("tty: n_gsm line discipline") Cc: [email protected] Signed-off-by: Daniel Starke <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 2683b0d commit 7079283

File tree

1 file changed

+3
-1
lines changed

1 file changed

+3
-1
lines changed

drivers/tty/n_gsm.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,7 @@ static struct tty_driver *gsm_tty_driver;
317317
#define GSM1_ESCAPE_BITS 0x20
318318
#define XON 0x11
319319
#define XOFF 0x13
320+
#define ISO_IEC_646_MASK 0x7F
320321

321322
static const struct tty_port_operations gsm_port_ops;
322323

@@ -526,7 +527,8 @@ static int gsm_stuff_frame(const u8 *input, u8 *output, int len)
526527
int olen = 0;
527528
while (len--) {
528529
if (*input == GSM1_SOF || *input == GSM1_ESCAPE
529-
|| *input == XON || *input == XOFF) {
530+
|| (*input & ISO_IEC_646_MASK) == XON
531+
|| (*input & ISO_IEC_646_MASK) == XOFF) {
530532
*output++ = GSM1_ESCAPE;
531533
*output++ = *input++ ^ GSM1_ESCAPE_BITS;
532534
olen++;

0 commit comments

Comments
 (0)