From: Oliver Hartkopp Date: Wed, 21 Jan 2009 09:17:20 +0000 (+0000) Subject: Add can_id/can_mask filter handling which is defined in the slcan protocol (m/M). X-Git-Url: https://rtime.felk.cvut.cz/gitweb/sojka/can-utils.git/commitdiff_plain/baa90a135aad4993da0b0f8a6d4b8aa654b58dfa Add can_id/can_mask filter handling which is defined in the slcan protocol (m/M). --- diff --git a/slcanpty.c b/slcanpty.c index e80b725..07a0556 100644 --- a/slcanpty.c +++ b/slcanpty.c @@ -74,6 +74,7 @@ int main(int argc, char **argv) char rxbuf[SLC_MTU]; int txp, rxp; struct can_frame txf, rxf; + struct can_filter fi; int tmp, i; /* check command line options */ @@ -128,6 +129,10 @@ int main(int argc, char **argv) return 1; } + /* no filter content by default */ + fi.can_id = CAN_ERR_FLAG; + fi.can_mask = CAN_ERR_FLAG; + while (running) { FD_ZERO(&rdfs); @@ -156,6 +161,26 @@ int main(int argc, char **argv) /* convert to struct can_frame rxf */ rxcmd = rxbuf[0]; + /* check for filter configuration commands */ + if (rxcmd == 'm' || rxcmd == 'M') { + rxbuf[9] = 0; /* terminate filter string */ + + if (rxcmd == 'm') { + fi.can_id = strtoul(rxbuf+1,NULL,16); + fi.can_id &= CAN_EFF_MASK; + } else { + fi.can_mask = strtoul(rxbuf+1,NULL,16); + fi.can_mask &= CAN_EFF_MASK; + } + + /* set only when both values are defined */ + if (fi.can_id != CAN_ERR_FLAG && + fi.can_mask != CAN_ERR_FLAG) + setsockopt(s, SOL_CAN_RAW, + CAN_RAW_FILTER, &fi, + sizeof(struct can_filter)); + } + if ((rxcmd != 't') && (rxcmd != 'T') && (rxcmd != 'r') && (rxcmd != 'R')) continue;