X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=cangw.c;h=b908fe45ddb59b0fbb59fb75c84c8d9bd7491588;hb=HEAD;hp=fbc230d4599e9a4532b14ac945bf37e0a6f829fa;hpb=d3468d907f94c01f8b41c8142007529bae9a6ccc;p=profile%2Fivi%2Fcan-utils.git diff --git a/cangw.c b/cangw.c index fbc230d..b908fe4 100644 --- a/cangw.c +++ b/cangw.c @@ -1,8 +1,4 @@ /* - * $Id$ - */ - -/* * cangw.c - manage PF_CAN netlink gateway * * Copyright (c) 2010 Volkswagen Group Electronic Research @@ -41,7 +37,7 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. * - * Send feedback to + * Send feedback to * */ @@ -102,7 +98,10 @@ void printfilter(const void *data) { struct can_filter *filter = (struct can_filter *)data; - printf("-f %03X:%X ", filter->can_id, filter->can_mask); + if (filter->can_id & CAN_INV_FILTER) + printf("-f %03X~%X ", (filter->can_id & ~CAN_INV_FILTER), filter->can_mask); + else + printf("-f %03X:%X ", filter->can_id, filter->can_mask); } void printmod(const char *type, const void *data) @@ -196,6 +195,8 @@ 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, " -l (limit the number of frame hops / routings)\n"); fprintf(stderr, " -f (set CAN filter)\n"); fprintf(stderr, " -m (set frame modifications)\n"); fprintf(stderr, " -x ::: (XOR checksum)\n"); @@ -357,7 +358,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; @@ -398,6 +399,7 @@ int parse_rtlist(char *prgname, unsigned char *rxbuf, int len) handled = 0; dropped = 0; + deleted = 0; src_ifindex = 0; dst_ifindex = 0; @@ -416,6 +418,7 @@ int parse_rtlist(char *prgname, unsigned char *rxbuf, int len) case CGW_MOD_OR: case CGW_MOD_XOR: case CGW_MOD_SET: + case CGW_LIM_HOPS: case CGW_CS_XOR: case CGW_CS_CRC8: break; @@ -436,6 +439,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; @@ -453,6 +460,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); @@ -481,6 +491,10 @@ int parse_rtlist(char *prgname, unsigned char *rxbuf, int len) printmod("SET", RTA_DATA(rta)); break; + case CGW_LIM_HOPS: + printf("-l %d ", *(__u8 *)RTA_DATA(rta)); + break; + case CGW_CS_XOR: print_cs_xor((struct cgw_csum_xor *)RTA_DATA(rta)); break; @@ -493,6 +507,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: @@ -502,7 +517,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); @@ -534,6 +551,7 @@ int main(int argc, char **argv) struct nlmsgerr *rte; unsigned int src_ifindex = 0; unsigned int dst_ifindex = 0; + __u8 limit_hops = 0; __u16 flags = 0; int len; @@ -552,7 +570,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:teil:f:c:p:x:m:?")) != -1) { switch (opt) { case 'A': @@ -591,6 +609,17 @@ int main(int argc, char **argv) flags |= CGW_FLAGS_CAN_ECHO; break; + case 'i': + flags |= CGW_FLAGS_CAN_IIF_TX_OK; + break; + + case 'l': + if (sscanf(optarg, "%hhd", &limit_hops) != 1 || !(limit_hops)) { + printf("Bad hop limit definition '%s'.\n", optarg); + exit(1); + } + break; + case 'f': if (sscanf(optarg, "%x:%x", &filter.can_id, &filter.can_mask) == 2) { @@ -669,6 +698,11 @@ int main(int argc, char **argv) exit(1); } + if (!modidx && (have_cs_crc8 || have_cs_xor)) { + printf("-c or -x can only be used in conjunction with -m\n"); + exit(1); + } + s = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE); switch (cmd) { @@ -723,6 +757,9 @@ int main(int argc, char **argv) if (have_cs_xor) addattr_l(&req.nh, sizeof(req), CGW_CS_XOR, &cs_xor, sizeof(cs_xor)); + if (limit_hops) + addattr_l(&req.nh, sizeof(req), CGW_LIM_HOPS, &limit_hops, sizeof(__u8)); + /* * a better example code * modmsg.modtype = CGW_MOD_ID;