diff options
Diffstat (limited to 'src/nm-netlink-utils.c')
| -rw-r--r-- | src/nm-netlink-utils.c | 109 |
1 files changed, 76 insertions, 33 deletions
diff --git a/src/nm-netlink-utils.c b/src/nm-netlink-utils.c index 4a62aa55..99aebcb8 100644 --- a/src/nm-netlink-utils.c +++ b/src/nm-netlink-utils.c @@ -165,45 +165,50 @@ nm_netlink_route_new (int ifindex, } /** - * nm_netlink_route_add: + * _route_add: * @route: the route to add + * @family: address family, either %AF_INET or %AF_INET6 + * @dest: the route destination address, either a struct in_addr or a struct + * in6_addr depending on @family + * @dest_prefix: the CIDR prefix of @dest + * @gateway: the gateway through which to reach @dest, if any; given as a + * struct in_addr or struct in6_addr depending on @family + * @flags: flags to pass to rtnl_route_add(), eg %NLM_F_REPLACE * * 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) +static int +_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; + 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); + if (family == AF_INET) { + addrlen = sizeof (struct in_addr); log = LOGD_IP4; - } - else if (family == AF_INET6) { - addrlen = sizeof(struct in6_addr); + } else if (family == AF_INET6) { + addrlen = sizeof (struct in6_addr); log = LOGD_IP6; - } else { + } else g_assert_not_reached (); - } - - sk = nm_netlink_get_default_handle(); + 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); + tmp_addr = g_malloc0 (addrlen); + memcpy (tmp_addr, dest, addrlen); dest_addr = nl_addr_build (family, tmp_addr, addrlen); - g_free(tmp_addr); + g_free (tmp_addr); g_return_val_if_fail (dest_addr != NULL, -NLE_INVAL); nl_addr_set_prefixlen (dest_addr, dest_prefix); @@ -214,20 +219,19 @@ int nm_netlink_route_add(struct rtnl_route * route, /* Build up the gateway address */ if (gateway) { - tmp_addr = g_malloc0(addrlen); - memcpy(tmp_addr, gateway, addrlen); + tmp_addr = g_malloc0 (addrlen); + memcpy (tmp_addr, gateway, addrlen); gw_addr = nl_addr_build (family, tmp_addr, addrlen); - g_free(tmp_addr); + 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 { + nl_addr_put (gw_addr); + } else nm_log_err (LOGD_DEVICE | log, "Invalid gateway"); - } } err = rtnl_route_add (sk, route, flags); @@ -236,15 +240,54 @@ int nm_netlink_route_add(struct rtnl_route * route, 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_route4_add: + * @route: the route to add + * @dest: the route destination address in network byte order + * @dest_prefix: the CIDR prefix of @dest + * @gateway: the gateway through which to reach @dest, if any, in network byte order + * @flags: flags to pass to rtnl_route_add(), eg %NLM_F_REPLACE + * + * Adds an IPv4 route with the given parameters. + * + * Returns: zero if succeeded or the netlink error otherwise. + **/ +int +nm_netlink_route4_add (struct rtnl_route *route, + guint32 *dst, + int prefix, + guint32 *gw, + int flags) +{ + return _route_add (route, AF_INET, dst, prefix, gw, flags); +} + +/** + * nm_netlink_route6_add: + * @route: the route to add + * @dest: the route destination address + * @dest_prefix: the CIDR prefix of @dest + * @gateway: the gateway through which to reach @dest, if any + * @flags: flags to pass to rtnl_route_add(), eg %NLM_F_REPLACE + * + * Adds an IPv6 route with the given parameters. + * + * Returns: zero if succeeded or the netlink error otherwise. + **/ +int +nm_netlink_route6_add (struct rtnl_route *route, + const struct in6_addr *dst, + int prefix, + const struct in6_addr *gw, + int flags) +{ + return _route_add (route, AF_INET6, dst, prefix, gw, flags); +} + +/** * nm_netlink_route_delete: * @route: the route to delete * |