]> rtime.felk.cvut.cz Git - socketcan-devel.git/commitdiff
Add can_id/can_mask filter handling which is defined in the slcan protocol (m/M).
authorhartkopp <hartkopp@030b6a49-0b11-0410-94ab-b0dab22257f2>
Wed, 21 Jan 2009 09:17:20 +0000 (09:17 +0000)
committerhartkopp <hartkopp@030b6a49-0b11-0410-94ab-b0dab22257f2>
Wed, 21 Jan 2009 09:17:20 +0000 (09:17 +0000)
git-svn-id: svn://svn.berlios.de//socketcan/trunk@913 030b6a49-0b11-0410-94ab-b0dab22257f2

can-utils/slcanpty.c

index e80b7251aafedfe85ed17879b81abfbf270c0559..07a05562a0c087b228c96364f3cdac962d0d3b76 100644 (file)
@@ -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;