From ad70f78936e76ed30aaadda8fdf9ad934f438ef0 Mon Sep 17 00:00:00 2001 From: Tom Gundersen Date: Fri, 9 Oct 2015 18:52:35 +0200 Subject: sd-netlink: rtnl - add route_get_{scope,tos,table,protocol}() --- src/libsystemd/sd-netlink/rtnl-message.c | 60 ++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) (limited to 'src/libsystemd') diff --git a/src/libsystemd/sd-netlink/rtnl-message.c b/src/libsystemd/sd-netlink/rtnl-message.c index 2f31f4ee69..03049bd31f 100644 --- a/src/libsystemd/sd-netlink/rtnl-message.c +++ b/src/libsystemd/sd-netlink/rtnl-message.c @@ -99,6 +99,66 @@ int sd_rtnl_message_route_get_family(sd_netlink_message *m, int *family) { return 0; } +int sd_rtnl_message_route_get_protocol(sd_netlink_message *m, unsigned char *protocol) { + struct rtmsg *rtm; + + assert_return(m, -EINVAL); + assert_return(m->hdr, -EINVAL); + assert_return(rtnl_message_type_is_route(m->hdr->nlmsg_type), -EINVAL); + assert_return(protocol, -EINVAL); + + rtm = NLMSG_DATA(m->hdr); + + *protocol = rtm->rtm_protocol; + + return 0; +} + +int sd_rtnl_message_route_get_scope(sd_netlink_message *m, unsigned char *scope) { + struct rtmsg *rtm; + + assert_return(m, -EINVAL); + assert_return(m->hdr, -EINVAL); + assert_return(rtnl_message_type_is_route(m->hdr->nlmsg_type), -EINVAL); + assert_return(scope, -EINVAL); + + rtm = NLMSG_DATA(m->hdr); + + *scope = rtm->rtm_scope; + + return 0; +} + +int sd_rtnl_message_route_get_tos(sd_netlink_message *m, unsigned char *tos) { + struct rtmsg *rtm; + + assert_return(m, -EINVAL); + assert_return(m->hdr, -EINVAL); + assert_return(rtnl_message_type_is_route(m->hdr->nlmsg_type), -EINVAL); + assert_return(tos, -EINVAL); + + rtm = NLMSG_DATA(m->hdr); + + *tos = rtm->rtm_tos; + + return 0; +} + +int sd_rtnl_message_route_get_table(sd_netlink_message *m, unsigned char *table) { + struct rtmsg *rtm; + + assert_return(m, -EINVAL); + assert_return(m->hdr, -EINVAL); + assert_return(rtnl_message_type_is_route(m->hdr->nlmsg_type), -EINVAL); + assert_return(table, -EINVAL); + + rtm = NLMSG_DATA(m->hdr); + + *table = rtm->rtm_table; + + return 0; +} + int sd_rtnl_message_route_get_dst_prefixlen(sd_netlink_message *m, unsigned char *dst_len) { struct rtmsg *rtm; -- cgit v1.2.3-54-g00ecf From 87e4c847f63ba138fa9cc5047a00d2c80b6f0d1f Mon Sep 17 00:00:00 2001 From: Tom Gundersen Date: Fri, 9 Oct 2015 21:37:04 +0200 Subject: sd-netlink: add support for subscribing to ROUTE messages Also, explicitly don't support subscribing to GET or SET messages, as these will never be emitted by the kernel. --- src/libsystemd/sd-netlink/sd-netlink.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) (limited to 'src/libsystemd') diff --git a/src/libsystemd/sd-netlink/sd-netlink.c b/src/libsystemd/sd-netlink/sd-netlink.c index d248869c8d..f4a0a358a9 100644 --- a/src/libsystemd/sd-netlink/sd-netlink.c +++ b/src/libsystemd/sd-netlink/sd-netlink.c @@ -856,8 +856,6 @@ int sd_netlink_add_match(sd_netlink *rtnl, switch (type) { case RTM_NEWLINK: - case RTM_SETLINK: - case RTM_GETLINK: case RTM_DELLINK: r = socket_join_broadcast_group(rtnl, RTNLGRP_LINK); if (r < 0) @@ -865,7 +863,6 @@ int sd_netlink_add_match(sd_netlink *rtnl, break; case RTM_NEWADDR: - case RTM_GETADDR: case RTM_DELADDR: r = socket_join_broadcast_group(rtnl, RTNLGRP_IPV4_IFADDR); if (r < 0) @@ -876,6 +873,16 @@ int sd_netlink_add_match(sd_netlink *rtnl, return r; break; + case RTM_NEWROUTE: + case RTM_DELROUTE: + r = socket_join_broadcast_group(rtnl, RTNLGRP_IPV4_ROUTE); + if (r < 0) + return r; + + r = socket_join_broadcast_group(rtnl, RTNLGRP_IPV6_ROUTE); + if (r < 0) + return r; + break; default: return -EOPNOTSUPP; } -- cgit v1.2.3-54-g00ecf