* 3. Redistributions of any form whatsoever must retain the following
* acknowledgment:
* "This product includes software developed by Paul Mackerras
- * <paulus@samba.org>".
+ * <paulus@ozlabs.org>".
*
* THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO
* THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
#include <linux/netlink.h>
#include <linux/rtnetlink.h>
#include <linux/if_link.h>
-
-/* Attempt at retaining compile-support with older than 4.7 kernels, or kernels
- * where RTM_NEWSTATS isn't defined for whatever reason.
- */
-#ifndef RTM_NEWSTATS
-#define RTM_NEWSTATS 92
-#define RTM_GETSTATS 94
-#define IFLA_STATS_LINK_64 1
-#endif
-
#include <linux/if_addr.h>
/* glibc versions prior to 2.24 do not define SOL_NETLINK */
static int
get_ppp_stats_rtnetlink(int u, struct pppd_stats *stats)
{
+#ifdef RTM_NEWSTATS
static int fd = -1;
struct {
err:
close(fd);
fd = -1;
+#endif
return 0;
}
* - this is normally only the case the doing demand: */
if (defaultroute_exists(&tmp_rt, -1))
del_rt = &tmp_rt;
+ } else if (!replace) {
+ /*
+ * We don't want to replace an existing route.
+ * We may however add our route along an existing route with a different
+ * metric.
+ */
+ if (defaultroute_exists(&rt, dfl_route_metric) && strcmp(rt.rt_dev, ifname) != 0) {
+ if (rt.rt_flags & RTF_GATEWAY)
+ error("not replacing existing default route via %I with metric %d",
+ SIN_ADDR(rt.rt_gateway), dfl_route_metric);
+ else
+ error("not replacing existing default route through %s with metric %d",
+ rt.rt_dev, dfl_route_metric);
+ return 0;
+ }
} else if (defaultroute_exists(&old_def_rt, -1 ) &&
strcmp( old_def_rt.rt_dev, ifname) != 0) {
/*
- * We did not yet replace an existing default route, let's
- * check if we should save and replace a default route:
+ * We want to replace an existing route and did not replace an existing
+ * default route yet, let's check if we should save and replace an
+ * existing default route:
*/
u_int32_t old_gateway = SIN_ADDR(old_def_rt.rt_gateway);