From 6db5d772b4b03bf76a72ba95ff5dda2bf94466db Mon Sep 17 00:00:00 2001 From: Kurt Van Dijck Date: Wed, 12 Oct 2011 14:55:13 +0200 Subject: [PATCH] add can_get_device_stats() When using libsocketcan on git://git.pengutronix.de/git/tools/libsocketcan.git, I kind of missed a method to fetch the can device statistics. This patch adds that functionality. I think this is the proper library to put such function. Signed-off-by: Kurt Van Dijck Signed-off-by: Marc Kleine-Budde --- include/libsocketcan.h | 1 + src/libsocketcan.c | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/include/libsocketcan.h b/include/libsocketcan.h index 10c012c..6098d6a 100644 --- a/include/libsocketcan.h +++ b/include/libsocketcan.h @@ -45,5 +45,6 @@ int can_get_state(const char *name, int *state); int can_get_clock(const char *name, struct can_clock *clock); int can_get_bittiming_const(const char *name, struct can_bittiming_const *btc); int can_get_berr_counter(const char *name, struct can_berr_counter *bc); +int can_get_device_stats(const char *name, struct can_device_stats *cds); #endif diff --git a/src/libsocketcan.c b/src/libsocketcan.c index 6c0b184..26da338 100644 --- a/src/libsocketcan.c +++ b/src/libsocketcan.c @@ -53,6 +53,7 @@ #define GET_CLOCK 5 #define GET_BITTIMING_CONST 6 #define GET_BERR_COUNTER 7 +#define GET_XSTATS 8 struct get_req { struct nlmsghdr n; @@ -386,6 +387,17 @@ static int do_get_nl_link(int fd, __u8 acquire, const char *name, void *res) else continue; + if (acquire == GET_XSTATS) { + if (!linkinfo[IFLA_INFO_XSTATS]) + fprintf(stderr, "no can statistics found\n"); + else { + memcpy(res, RTA_DATA(linkinfo[IFLA_INFO_XSTATS]), + sizeof(struct can_device_stats)); + ret = 0; + } + continue; + } + if (!linkinfo[IFLA_INFO_DATA]) { fprintf(stderr, "no link data found\n"); return ret; @@ -1121,3 +1133,24 @@ int can_get_berr_counter(const char *name, struct can_berr_counter *bc) { return get_link(name, GET_BERR_COUNTER, bc); } + +/** + * @ingroup extern + * can_get_device_stats - get the can_device_stats. + * + * @param name name of the can device. This is the netdev name, as ifconfig -a shows + * in your system. usually it contains prefix "can" and the numer of the can + * line. e.g. "can0" + * @param bc pointer to the error counter struct.. + * + * This one gets the current can_device_stats. + * + * Please see struct can_device_stats for more information. + * + * @return 0 if success + * @return -1 if failed + */ +int can_get_device_stats(const char *name, struct can_device_stats *cds) +{ + return get_link(name, GET_XSTATS, cds); +}