forked from Minki/linux
tty/n_gsm: fix bug in CRC calculation for gsm1 mode
Problem description: gsm_queue() calculate a CRC for arrived frames. As a last step of CRC calculation it call gsm->fcs = gsm_fcs_add(gsm->fcs, gsm->received_fcs); This work perfectly for the case of GSM0 mode as gsm->received_fcs contain the last piece of data required to generate final CRC. gsm->received_fcs is not used for GSM1 mode. Thus we put an additional byte to CRC calculation. As result we get a wrong CRC and reject incoming frame. Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy@gmail.com> Acked-by: Alan Cox <alan@linux.intel.com> Cc: stable <stable@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
5680e94148
commit
9db4e4381a
@ -1658,8 +1658,12 @@ static void gsm_queue(struct gsm_mux *gsm)
|
||||
|
||||
if ((gsm->control & ~PF) == UI)
|
||||
gsm->fcs = gsm_fcs_add_block(gsm->fcs, gsm->buf, gsm->len);
|
||||
/* generate final CRC with received FCS */
|
||||
gsm->fcs = gsm_fcs_add(gsm->fcs, gsm->received_fcs);
|
||||
if (gsm->encoding == 0){
|
||||
/* WARNING: gsm->received_fcs is used for gsm->encoding = 0 only.
|
||||
In this case it contain the last piece of data
|
||||
required to generate final CRC */
|
||||
gsm->fcs = gsm_fcs_add(gsm->fcs, gsm->received_fcs);
|
||||
}
|
||||
if (gsm->fcs != GOOD_FCS) {
|
||||
gsm->bad_fcs++;
|
||||
if (debug & 4)
|
||||
|
Loading…
Reference in New Issue
Block a user