Re: [PATCH] [resend] [3/3] Use libnl instead of iproute/AF_PACKET (nm_system_device_set_ip4_route)
- From: Dan Williams <dcbw redhat com>
- To: Benoit Boissinot <bboissin+networkmanager gmail com>
- Cc: networkmanager-list gnome org
- Subject: Re: [PATCH] [resend] [3/3] Use libnl instead of iproute/AF_PACKET (nm_system_device_set_ip4_route)
- Date: Fri, 25 Apr 2008 15:39:22 -0400
On Wed, 2008-04-23 at 21:04 +0200, Benoit Boissinot wrote:
> (resend)
>
> Removes the AF_INET implementation of nm_system_device_set_ip4_route,
> reimplement it with libnl.
> The fifth argument is now the prefixlen, and no longer the netmask (it
> was always called with 255.255.255.255)
Committed, thanks!
Dan
> diff -r 123bf3a77d50 src/NetworkManagerSystem.c
> --- a/src/NetworkManagerSystem.c Wed Apr 23 19:29:39 2008 +0200
> +++ b/src/NetworkManagerSystem.c Wed Apr 23 19:31:18 2008 +0200
> @@ -69,16 +69,18 @@
> static gboolean
> nm_system_device_set_ip4_route (const char *iface,
> NMIP4Config *iface_config,
> - int ip4_gateway,
> - int ip4_dest,
> - int ip4_netmask,
> + guint32 ip4_gateway,
> + guint32 ip4_dest,
> + int prefix,
> int mss)
> {
> - int fd, err;
> - gboolean success = FALSE;
> - struct rtentry rtent;
> - struct sockaddr_in *p;
> - struct rtentry rtent2;
> + gboolean success = FALSE;
> + struct rtnl_route * route = NULL;
> + struct rtnl_route * route2 = NULL;
> + struct nl_handle * nlh = NULL;
> + struct nl_addr * gw_addr = NULL;
> + struct nl_addr * dest_addr = NULL;
> + int err, iface_idx;
>
> /*
> * Zero is not a legal gateway and the ioctl will fail. But zero is a
> @@ -97,86 +99,88 @@
> return TRUE;
>
>
> - fd = socket (AF_PACKET, SOCK_PACKET, htons (ETH_P_ALL));
> - if (fd < 0) {
> - nm_warning ("couldn't open control socket.");
> - return FALSE;
> + nlh = nm_netlink_get_default_handle ();
> + g_return_val_if_fail (nlh != NULL, FALSE);
> +
> + iface_idx = nm_netlink_iface_to_index (iface);
> + g_return_val_if_fail (iface_idx >= 0, FALSE);
> +
> + route = rtnl_route_alloc ();
> + g_return_val_if_fail (route != NULL, FALSE);
> +
> + rtnl_route_set_scope (route, RT_SCOPE_UNIVERSE);
> + rtnl_route_set_oif (route, iface_idx);
> +
> + gw_addr = nl_addr_build (AF_INET, &ip4_gateway, sizeof (ip4_gateway));
> + if (gw_addr == NULL)
> + goto out;
> + rtnl_route_set_gateway (route, gw_addr);
> +
> + dest_addr = nl_addr_build (AF_INET, &ip4_dest, sizeof (ip4_dest));
> + if (dest_addr == NULL)
> + goto out;
> + nl_addr_set_prefixlen (dest_addr, prefix);
> + rtnl_route_set_dst (route, dest_addr);
> + nl_addr_put (dest_addr);
> +
> + if (mss) {
> + if (rtnl_route_set_metric (route, RTAX_ADVMSS, mss) < 0)
> + goto out;
> }
>
> - memset (&rtent, 0, sizeof (struct rtentry));
> - p = (struct sockaddr_in *) &rtent.rt_dst;
> - p->sin_family = AF_INET;
> - p->sin_addr.s_addr = ip4_dest;
> - p = (struct sockaddr_in *) &rtent.rt_gateway;
> - p->sin_family = AF_INET;
> - p->sin_addr.s_addr = ip4_gateway;
> - p = (struct sockaddr_in *) &rtent.rt_genmask;
> - p->sin_family = AF_INET;
> - p->sin_addr.s_addr = ip4_netmask;
> - rtent.rt_dev = (char *)iface;
> - rtent.rt_metric = 1;
> - rtent.rt_window = 0;
> - rtent.rt_flags = RTF_UP | RTF_GATEWAY | (rtent.rt_window ? RTF_WINDOW : 0);
> -
> - if (mss) {
> - rtent.rt_flags |= RTF_MTU;
> - rtent.rt_mtu = mss;
> - }
> -
> - err = ioctl (fd, SIOCADDRT, &rtent);
> + err = rtnl_route_add (nlh, route, 0);
> if (err == 0) {
> /* Everything good */
> success = TRUE;
> goto out;
> }
>
> - if (errno != ENETUNREACH) {
> + if (err != ESRCH) {
> nm_warning ("Failed to set IPv4 default route on '%s': %s",
> iface,
> - strerror (errno));
> + nl_geterror ());
> goto out;
> }
>
> /* Gateway might be over a bridge; try adding a route to gateway first */
> - memset (&rtent2, 0, sizeof(struct rtentry));
> - p = (struct sockaddr_in *)&rtent2.rt_dst;
> - p->sin_family = AF_INET;
> - p = (struct sockaddr_in *)&rtent2.rt_gateway;
> - p->sin_family = AF_INET;
> - p->sin_addr.s_addr = ip4_gateway;
> - p = (struct sockaddr_in *)&rtent2.rt_genmask;
> - p->sin_family = AF_INET;
> - p->sin_addr.s_addr = 0xffffffff;
> - rtent2.rt_dev = (char *)iface;
> - rtent2.rt_metric = 0;
> - rtent2.rt_flags = RTF_UP | RTF_HOST;
> + route2 = rtnl_route_alloc ();
> + if (route2 == NULL)
> + goto out;
> + rtnl_route_set_oif (route2, iface_idx);
> + rtnl_route_set_dst (route2, gw_addr);
>
> if (mss) {
> - rtent2.rt_flags |= RTF_MTU;
> - rtent2.rt_mtu = mss;
> + if (rtnl_route_set_metric (route2, RTAX_ADVMSS, mss) < 0)
> + goto out;
> }
>
> /* Add route to gateway over bridge */
> - err = ioctl (fd, SIOCADDRT, &rtent2);
> + err = rtnl_route_add (nlh, route2, 0);
> if (err) {
> nm_warning ("Failed to add IPv4 default route on '%s': %s",
> iface,
> - strerror (errno));
> + nl_geterror ());
> goto out;
> }
>
> /* Try adding the route again */
> - err = ioctl (fd, SIOCADDRT, &rtent);
> + err = rtnl_route_add (nlh, route, 0);
> if (!err) {
> success = TRUE;
> } else {
> + rtnl_route_del (nlh, route2, 0);
> nm_warning ("Failed to set IPv4 default route on '%s': %s",
> iface,
> - strerror (errno));
> + nl_geterror ());
> }
>
> out:
> - close (fd);
> + if (gw_addr)
> + nl_addr_put (gw_addr);
> + if (route2)
> + rtnl_route_put (route2);
> + if (route)
> + rtnl_route_put (route);
> return success;
> }
>
> @@ -272,7 +276,7 @@
> guint32 route = nm_ip4_config_get_static_route (config, (i * 2) + 1);
> guint32 saddr = nm_ip4_config_get_static_route (config, i * 2);
>
> - nm_system_device_set_ip4_route (iface, config, route, saddr, 0xffffffff, mss);
> + nm_system_device_set_ip4_route (iface, config, route, saddr, 32, mss);
> }
>
> if (nm_ip4_config_get_mtu (config))
> @@ -314,7 +318,7 @@
> ad_config,
> nm_ip4_config_get_gateway (ad_config),
> nm_ip4_config_get_gateway (config),
> - 0xFFFFFFFF,
> + 32,
> nm_ip4_config_get_mss (config));
> }
>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]