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); +}