From: Oliver Hartkopp Date: Tue, 29 Jan 2013 19:17:52 +0000 (+0100) Subject: cangw: support new can-gw features for Linux 3.9+ X-Git-Url: http://rtime.felk.cvut.cz/gitweb/can-utils.git/commitdiff_plain/9dad9f7354f069e5219172a5b0e30219eb616d18 cangw: support new can-gw features for Linux 3.9+ Added new option '-i' for can-gw rules to allow to route CAN frames back to the originating/incoming CAN interface (which is disabled by default). CAN frames that are deleted due to the violation of the max_hops limit are now printed when displaying the configured rules with 'cangw -L'. Signed-off-by: Oliver Hartkopp --- diff --git a/cangw.c b/cangw.c index 18cc50c..4b4595c 100644 --- a/cangw.c +++ b/cangw.c @@ -192,6 +192,7 @@ void print_usage(char *prg) fprintf(stderr, " -d (destination netdevice)\n"); fprintf(stderr, "Options: -t (preserve src_dev rx timestamp)\n"); fprintf(stderr, " -e (echo sent frames - recommended on vcanx)\n"); + fprintf(stderr, " -i (allow to route to incoming interface)\n"); fprintf(stderr, " -f (set CAN filter)\n"); fprintf(stderr, " -m (set frame modifications)\n"); fprintf(stderr, " -x ::: (XOR checksum)\n"); @@ -353,7 +354,7 @@ int parse_rtlist(char *prgname, unsigned char *rxbuf, int len) struct nlmsghdr *nlh; unsigned int src_ifindex = 0; unsigned int dst_ifindex = 0; - __u32 handled, dropped; + __u32 handled, dropped, deleted; int rtlen; @@ -394,6 +395,7 @@ int parse_rtlist(char *prgname, unsigned char *rxbuf, int len) handled = 0; dropped = 0; + deleted = 0; src_ifindex = 0; dst_ifindex = 0; @@ -432,6 +434,10 @@ int parse_rtlist(char *prgname, unsigned char *rxbuf, int len) dropped = *(__u32 *)RTA_DATA(rta); break; + case CGW_DELETED: + deleted = *(__u32 *)RTA_DATA(rta); + break; + default: printf("Unknown attribute %d!", rta->rta_type); return -EINVAL; @@ -449,6 +455,9 @@ int parse_rtlist(char *prgname, unsigned char *rxbuf, int len) if (rtc->flags & CGW_FLAGS_CAN_SRC_TSTAMP) printf("-t "); + if (rtc->flags & CGW_FLAGS_CAN_IIF_TX_OK) + printf("-i "); + /* second parse for mod attributes */ rta = (struct rtattr *) RTCAN_RTA(rtc); rtlen = RTCAN_PAYLOAD(nlh); @@ -489,6 +498,7 @@ int parse_rtlist(char *prgname, unsigned char *rxbuf, int len) case CGW_DST_IF: case CGW_HANDLED: case CGW_DROPPED: + case CGW_DELETED: break; default: @@ -498,7 +508,9 @@ int parse_rtlist(char *prgname, unsigned char *rxbuf, int len) } } - printf("# %d handled %d dropped\n", handled, dropped); /* end of entry */ + /* end of entry */ + printf("# %d handled %d dropped %d deleted\n", + handled, dropped, deleted); /* jump to next NLMSG in the given buffer */ nlh = NLMSG_NEXT(nlh, len); @@ -548,7 +560,7 @@ int main(int argc, char **argv) memset(&cs_xor, 0, sizeof(cs_xor)); memset(&cs_crc8, 0, sizeof(cs_crc8)); - while ((opt = getopt(argc, argv, "ADFLs:d:tef:c:p:x:m:?")) != -1) { + while ((opt = getopt(argc, argv, "ADFLs:d:teif:c:p:x:m:?")) != -1) { switch (opt) { case 'A': @@ -587,6 +599,10 @@ int main(int argc, char **argv) flags |= CGW_FLAGS_CAN_ECHO; break; + case 'i': + flags |= CGW_FLAGS_CAN_IIF_TX_OK; + break; + case 'f': if (sscanf(optarg, "%x:%x", &filter.can_id, &filter.can_mask) == 2) { diff --git a/include/socketcan/can/gw.h b/include/socketcan/can/gw.h index fc428cc..9c290dc 100644 --- a/include/socketcan/can/gw.h +++ b/include/socketcan/can/gw.h @@ -44,6 +44,7 @@ enum { CGW_SRC_IF, /* ifindex of source network interface */ CGW_DST_IF, /* ifindex of destination network interface */ CGW_FILTER, /* specify struct can_filter on source CAN device */ + CGW_DELETED, /* number of deleted CAN frames (see max_hops param) */ __CGW_MAX }; @@ -51,6 +52,7 @@ enum { #define CGW_FLAGS_CAN_ECHO 0x01 #define CGW_FLAGS_CAN_SRC_TSTAMP 0x02 +#define CGW_FLAGS_CAN_IIF_TX_OK 0x04 #define CGW_MOD_FUNCS 4 /* AND OR XOR SET */