+
+ rxf.can_dlc = rxbuf[rxp] & 0x0F; /* get 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;
+
+ 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--;