Allow SLCAN RTR frames without data length code field.
parent
6cc05e08f0
commit
c588f0d0b2
75
slcanpty.c
75
slcanpty.c
|
|
@ -174,10 +174,11 @@ rx_restart:
|
||||||
nbytes--;
|
nbytes--;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nbytes < 2)
|
if (!nbytes)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
rxcmd = rxbuf[0];
|
rxcmd = rxbuf[0];
|
||||||
|
rxbuf[nbytes] = 0;
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
for (tmp = 0; tmp < nbytes; tmp++)
|
for (tmp = 0; tmp < nbytes; tmp++)
|
||||||
|
|
@ -302,37 +303,57 @@ rx_restart:
|
||||||
else
|
else
|
||||||
rxp = 9; /* dlc position Tiiiiiiiid */
|
rxp = 9; /* dlc position Tiiiiiiiid */
|
||||||
|
|
||||||
if (!((rxbuf[rxp] >= '0') && (rxbuf[rxp] < '9')))
|
|
||||||
goto rx_out_nack;
|
|
||||||
|
|
||||||
rxf.can_dlc = rxbuf[rxp] & 0x0F; /* get can_dlc */
|
|
||||||
|
|
||||||
rxbuf[rxp] = 0; /* terminate can_id string */
|
|
||||||
|
|
||||||
rxf.can_id = strtoul(rxbuf+1, NULL, 16);
|
|
||||||
|
|
||||||
if (!(rxcmd & 0x20)) /* NO tiny chars => EFF */
|
|
||||||
rxf.can_id |= CAN_EFF_FLAG;
|
|
||||||
|
|
||||||
if ((rxcmd | 0x20) == 'r') /* RTR frame */
|
|
||||||
rxf.can_id |= CAN_RTR_FLAG;
|
|
||||||
|
|
||||||
*(unsigned long long *) (&rxf.data) = 0ULL; /* clear */
|
*(unsigned long long *) (&rxf.data) = 0ULL; /* clear */
|
||||||
|
|
||||||
for (i = 0, rxp++; i < rxf.can_dlc; i++) {
|
if ((rxcmd | 0x20) == 'r' && rxbuf[rxp] != '0') {
|
||||||
|
/* RTR frame without dlc information */
|
||||||
|
|
||||||
tmp = asc2nibble(rxbuf[rxp++]);
|
rxf.can_dlc = rxbuf[rxp]; /* save */
|
||||||
if (tmp > 0x0F)
|
|
||||||
|
rxbuf[rxp] = 0; /* terminate can_id string */
|
||||||
|
|
||||||
|
rxf.can_id = strtoul(rxbuf+1, NULL, 16);
|
||||||
|
rxf.can_id |= CAN_RTR_FLAG;
|
||||||
|
|
||||||
|
if (!(rxcmd & 0x20)) /* NO tiny chars => EFF */
|
||||||
|
rxf.can_id |= CAN_EFF_FLAG;
|
||||||
|
|
||||||
|
rxbuf[rxp] = rxf.can_dlc; /* restore */
|
||||||
|
rxf.can_dlc = 0;
|
||||||
|
rxp--; /* we have no dlc component here */
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
if (!(rxbuf[rxp] >= '0' && rxbuf[rxp] < '9'))
|
||||||
goto rx_out_nack;
|
goto rx_out_nack;
|
||||||
rxf.data[i] = (tmp << 4);
|
|
||||||
tmp = asc2nibble(rxbuf[rxp++]);
|
rxf.can_dlc = rxbuf[rxp] & 0x0F; /* get dlc */
|
||||||
if (tmp > 0x0F)
|
|
||||||
goto rx_out_nack;
|
rxbuf[rxp] = 0; /* terminate can_id string */
|
||||||
rxf.data[i] |= tmp;
|
|
||||||
|
rxf.can_id = strtoul(rxbuf+1, NULL, 16);
|
||||||
|
|
||||||
|
if (!(rxcmd & 0x20)) /* NO tiny chars => EFF */
|
||||||
|
rxf.can_id |= CAN_EFF_FLAG;
|
||||||
|
|
||||||
|
if ((rxcmd | 0x20) == 'r') /* RTR frame */
|
||||||
|
rxf.can_id |= CAN_RTR_FLAG;
|
||||||
|
|
||||||
|
for (i = 0, rxp++; i < rxf.can_dlc; i++) {
|
||||||
|
|
||||||
|
tmp = asc2nibble(rxbuf[rxp++]);
|
||||||
|
if (tmp > 0x0F)
|
||||||
|
goto rx_out_nack;
|
||||||
|
rxf.data[i] = (tmp << 4);
|
||||||
|
tmp = asc2nibble(rxbuf[rxp++]);
|
||||||
|
if (tmp > 0x0F)
|
||||||
|
goto rx_out_nack;
|
||||||
|
rxf.data[i] |= tmp;
|
||||||
|
}
|
||||||
|
/* point to last real data */
|
||||||
|
if (rxf.can_dlc)
|
||||||
|
rxp--;
|
||||||
}
|
}
|
||||||
/* point to last real data */
|
|
||||||
if (rxf.can_dlc)
|
|
||||||
rxp--;
|
|
||||||
|
|
||||||
nbytes = write(s, &rxf, sizeof(rxf));
|
nbytes = write(s, &rxf, sizeof(rxf));
|
||||||
if (nbytes != sizeof(rxf)) {
|
if (nbytes != sizeof(rxf)) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue