summary refs log tree commit diff
path: root/src/nm-netlink-utils.c
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2012-03-24 01:37:02 +0100
committerMichael Biebl <biebl@debian.org>2012-03-24 01:37:02 +0100
commitde06e5715e780baade318f3490ac7a4c9ce84e32 (patch)
tree23fbc3fafc12072476eff98bee60100eb54c29db /src/nm-netlink-utils.c
parentb436a68a20ff3114ded32a7a3d70cdd4954039f9 (diff)
Imported Upstream version 0.9.4.0 upstream/0.9.4.0
Diffstat (limited to 'src/nm-netlink-utils.c')
-rw-r--r--src/nm-netlink-utils.c109
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
  *