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)); > } > _______________________________________________ NetworkManager-list mailing list NetworkManager-list@gnome.org http://mail.gnome.org/mailman/listinfo/networkmanager-list