From 8af831f377161f1a5dbbb4f80794d793aa5462df Mon Sep 17 00:00:00 2001 From: Oliver Hartkopp Date: Thu, 11 Jun 2015 20:48:43 +0200 Subject: [PATCH] cangw: introduce uid command line option Similar to referencing iptables rules by their line number this UID allows to reference created routing jobs, e.g. to alter configured data modifications. The UID is an optional non-zero value which can be provided at routing job creation time. When the UID is set the UID replaces the data modification configuration as job identification attribute e.g. at job removal time. The UID option is provided by mainline Linux 4.2+ Signed-off-by: Oliver Hartkopp --- cangw.c | 16 +++++++++++++++- include/linux/can/gw.h | 5 +++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/cangw.c b/cangw.c index b908fe4..ff76fd7 100644 --- a/cangw.c +++ b/cangw.c @@ -196,6 +196,7 @@ void print_usage(char *prg) 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, " -u (user defined modification identifier)\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"); @@ -418,6 +419,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_MOD_UID: case CGW_LIM_HOPS: case CGW_CS_XOR: case CGW_CS_CRC8: @@ -491,6 +493,10 @@ int parse_rtlist(char *prgname, unsigned char *rxbuf, int len) printmod("SET", RTA_DATA(rta)); break; + case CGW_MOD_UID: + printf("-u %X ", *(__u32 *)RTA_DATA(rta)); + break; + case CGW_LIM_HOPS: printf("-l %d ", *(__u8 *)RTA_DATA(rta)); break; @@ -551,6 +557,7 @@ int main(int argc, char **argv) struct nlmsgerr *rte; unsigned int src_ifindex = 0; unsigned int dst_ifindex = 0; + __u32 uid = 0; __u8 limit_hops = 0; __u16 flags = 0; int len; @@ -570,7 +577,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:teil:f:c:p:x:m:?")) != -1) { + while ((opt = getopt(argc, argv, "ADFLs:d:teiu:l:f:c:p:x:m:?")) != -1) { switch (opt) { case 'A': @@ -613,6 +620,10 @@ int main(int argc, char **argv) flags |= CGW_FLAGS_CAN_IIF_TX_OK; break; + case 'u': + uid = strtoul(optarg, (char **)NULL, 16); + break; + case 'l': if (sscanf(optarg, "%hhd", &limit_hops) != 1 || !(limit_hops)) { printf("Bad hop limit definition '%s'.\n", optarg); @@ -757,6 +768,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 (uid) + addattr_l(&req.nh, sizeof(req), CGW_MOD_UID, &uid, sizeof(__u32)); + if (limit_hops) addattr_l(&req.nh, sizeof(req), CGW_LIM_HOPS, &limit_hops, sizeof(__u8)); diff --git a/include/linux/can/gw.h b/include/linux/can/gw.h index 844c896..210e7c9 100644 --- a/include/linux/can/gw.h +++ b/include/linux/can/gw.h @@ -78,6 +78,7 @@ enum { CGW_FILTER, /* specify struct can_filter on source CAN device */ CGW_DELETED, /* number of deleted CAN frames (see max_hops param) */ CGW_LIM_HOPS, /* limit the number of hops of this specific rule */ + CGW_MOD_UID, /* user defined identifier for modification updates */ __CGW_MAX }; @@ -162,6 +163,10 @@ enum { * load time of the can-gw module). This value is used to reduce the number of * possible hops for this gateway rule to a value smaller then max_hops. * + * CGW_MOD_UID (length 4 bytes): + * Optional non-zero user defined routing job identifier to alter existing + * modification settings at runtime. + * * CGW_CS_XOR (length 4 bytes): * Set a simple XOR checksum starting with an initial value into * data[result-idx] using data[start-idx] .. data[end-idx]