From 9b332909b360a1f1fd1d45292d5c7d7b4ff91cdc Mon Sep 17 00:00:00 2001 From: Luotao Fu Date: Mon, 23 Nov 2009 10:56:54 +0100 Subject: [PATCH] add get/set raw ctrlmode callbacks Signed-off-by: Luotao Fu --- include/socketcan_netlink.h | 3 +++ src/socketcan_netlink.c | 50 +++++++++++++++++++++++++++++-------- 2 files changed, 42 insertions(+), 11 deletions(-) diff --git a/include/socketcan_netlink.h b/include/socketcan_netlink.h index fe6256b..6b3b2cc 100644 --- a/include/socketcan_netlink.h +++ b/include/socketcan_netlink.h @@ -28,6 +28,7 @@ #define GET_STATE 1 #define GET_RESTART_MS 2 #define GET_BITTIMING 3 +#define GET_CTRLMODE 4 int if_down(int fd, const char *name); int if_up(int fd, const char *name); @@ -35,9 +36,11 @@ int if_up(int fd, const char *name); int set_restart(const char *name); int set_bitrate(const char *name, __u32 bitrate); int set_restart_ms(const char *name, __u32 restart_ms); +int set_ctrlmode(const char *name, __u32 mode, __u32 flags); int get_state(const char *name); __u32 get_restart_ms(const char *name); int get_bittiming(const char *name, struct can_bittiming *bt); +int get_ctrlmode(const char *name, struct can_ctrlmode *cm); #endif diff --git a/src/socketcan_netlink.c b/src/socketcan_netlink.c index ff88981..d9760dd 100644 --- a/src/socketcan_netlink.c +++ b/src/socketcan_netlink.c @@ -54,7 +54,7 @@ struct req_info { __u32 restart_ms; __u32 bitrate; __u32 ctrlmode; - __u32 flags; + __u32 ctrlflags; }; static void @@ -355,6 +355,16 @@ static int do_get_nl_link(int fd, __u8 acquire, const char *name, void *res) } else fprintf(stderr, "no bittiming data found\n"); + break; + case GET_CTRLMODE: + if (can_attr[IFLA_CAN_CTRLMODE]) { + memcpy(res, + RTA_DATA(can_attr[IFLA_CAN_CTRLMODE]), + sizeof(struct can_ctrlmode)); + ret = 0; + } else + fprintf(stderr, "no ctrlmode data found\n"); + break; default: fprintf(stderr, "unknown acquire mode\n"); @@ -429,7 +439,7 @@ static int do_set_nl_link(int fd, __u8 if_state, const char *name, if (req_info->ctrlmode) { memset(&cm, 0, sizeof(cm)); cm.mask = req_info->ctrlmode; - cm.flags = req_info->flags; + cm.flags = req_info->ctrlflags; addattr_l(&req.n, 1024, IFLA_CAN_CTRLMODE, &cm, sizeof(cm)); } @@ -482,15 +492,6 @@ int if_down(int fd, const char *name) return do_set_nl_link(fd, IF_DOWN, name, NULL); } -int set_bitrate(const char *name, __u32 bitrate) -{ - struct req_info req_info = { - .bitrate = bitrate, - }; - - return set_link(name, &req_info); -} - int set_restart(const char *name) { int fd; @@ -537,6 +538,16 @@ int set_restart_ms(const char *name, __u32 restart_ms) return set_link(name, &req_info); } +int set_ctrlmode(const char *name, __u32 mode, __u32 flags) +{ + struct req_info req_info = { + .ctrlmode = mode, + .ctrlflags = flags, + }; + + return set_link(name, &req_info); +} + int get_state(const char *name) { int fd; @@ -589,3 +600,20 @@ int get_bittiming(const char *name, struct can_bittiming *bt) close(fd); return 0; } + +int get_ctrlmode(const char *name, struct can_ctrlmode *cm) +{ + int fd; + int err; + + fd = open_nl_sock(); + if (fd < 0) + return -1; + + err = do_get_nl_link(fd, GET_CTRLMODE, name, cm); + if (err < 0) + return -1; + + close(fd); + return 0; +}