summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKurt Van Dijck <kurt.van.dijck@eia.be>2011-10-12 14:55:13 +0200
committerMarc Kleine-Budde <mkl@pengutronix.de>2011-10-18 13:26:48 +0200
commit6db5d772b4b03bf76a72ba95ff5dda2bf94466db (patch)
tree4837abb440cf35384f096314ea7e45506d29be4c
parent42a3b65198f65134ac049172d5c9b998ae6220de (diff)
downloadlibsocketcan-6db5d772b4b03bf76a72ba95ff5dda2bf94466db.tar.gz
libsocketcan-6db5d772b4b03bf76a72ba95ff5dda2bf94466db.tar.xz
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 <kurt.van.dijck@eia.be> Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
-rw-r--r--include/libsocketcan.h1
-rw-r--r--src/libsocketcan.c33
2 files changed, 34 insertions, 0 deletions
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);
+}