From a73039c0ec8d1717100cdbe29480e47b8879d816 Mon Sep 17 00:00:00 2001 From: Alfredo Matos Date: Fri, 5 Aug 2011 16:02:34 +0100 Subject: [PATCH] libnl: Create a common netlink route add function --- src/nm-netlink-utils.c | 80 ++++++++++++++++++++++++++++++++++++++++++ src/nm-netlink-utils.h | 7 ++++ 2 files changed, 87 insertions(+) diff --git a/src/nm-netlink-utils.c b/src/nm-netlink-utils.c index d6fdd81aed..cc61197da6 100644 --- a/src/nm-netlink-utils.c +++ b/src/nm-netlink-utils.c @@ -164,6 +164,86 @@ nm_netlink_route_new (int ifindex, return route; } +/** + * nm_netlink_route_add: + * @route: the route to add + * + * Returns: zero if succeeded or the netlink error otherwise. + **/ +int nm_netlink_route_add(struct rtnl_route * route, + int family, + const void * dest, /* in_addr or in6_addr */ + int dest_prefix, + const void * gateway, /* in_addr or in6_addr */ + int flags) +{ + struct nl_sock * sk; + struct nl_addr * dest_addr, * gw_addr; + void * tmp_addr; + int addrlen, err, log; + + if(family == AF_INET) { + addrlen = sizeof(struct in_addr); + log = LOGD_IP4; + } + else if (family == AF_INET6) { + addrlen = sizeof(struct in6_addr); + log = LOGD_IP6; + } else { + g_assert_not_reached (); + } + + + sk = nm_netlink_get_default_handle(); + + /* Build up the destination address */ + if (dest) { + /* Copy to preserve const */ + tmp_addr = g_malloc0(addrlen); + memcpy(tmp_addr, dest, addrlen); + + dest_addr = nl_addr_build (family, tmp_addr, addrlen); + g_free(tmp_addr); + + g_return_val_if_fail (dest_addr != NULL, -NLE_INVAL); + nl_addr_set_prefixlen (dest_addr, dest_prefix); + + rtnl_route_set_dst (route, dest_addr); + nl_addr_put (dest_addr); + } + + /* Build up the gateway address */ + if (gateway) { + tmp_addr = g_malloc0(addrlen); + memcpy(tmp_addr, gateway, addrlen); + + gw_addr = nl_addr_build (family, tmp_addr, addrlen); + g_free(tmp_addr); + + if (gw_addr) { + nl_addr_set_prefixlen (gw_addr, 0); + rtnl_route_set_gateway (route, gw_addr); + rtnl_route_set_scope (route, RT_SCOPE_UNIVERSE); + nl_addr_put(gw_addr); + } else { + nm_log_err (LOGD_DEVICE | log, "Invalid gateway"); + } + } + + err = rtnl_route_add (sk, route, 0); + + /* LIBNL Bug: Aliased ESRCH */ + if (err == -NLE_FAILURE) + err = -NLE_OBJ_NOTFOUND; + + if (err) + nm_log_warn (LOGD_DEVICE | log, + "Failed to add route %s", + nl_geterror(err)); + + return err; +} + /** * nm_netlink_route_delete: * @route: the route to delete diff --git a/src/nm-netlink-utils.h b/src/nm-netlink-utils.h index bcee6e3d10..c6c452a00a 100644 --- a/src/nm-netlink-utils.h +++ b/src/nm-netlink-utils.h @@ -43,6 +43,13 @@ struct rtnl_route * nm_netlink_route_new (int ifindex, int mss, ...) __attribute__((__sentinel__)); +int nm_netlink_route_add (struct rtnl_route *route, + int family, + const void * dst, /* struct in_addr or struct in6_addr */ + int prefix, + const void * gw, /* struct in_addr or struct in6_addr */ + int flags); + gboolean nm_netlink_route_delete (struct rtnl_route *route); /**