summaryrefslogtreecommitdiffstats
path: root/zebra/ioctl.c
diff options
context:
space:
mode:
authorDavid Lamparter <equinox@diac24.net>2010-02-03 19:28:22 +0100
committerDavid Lamparter <equinox@diac24.net>2010-02-04 02:52:39 +0100
commit762fdc882e51b6836fd7b66cbcef0b3634353092 (patch)
treefabca07e42363445ceb755d3d00d18e67f901982 /zebra/ioctl.c
parent85e53d51f723112b44075c658431d9700facd4c0 (diff)
downloadquagga-762fdc882e51b6836fd7b66cbcef0b3634353092.tar.bz2
quagga-762fdc882e51b6836fd7b66cbcef0b3634353092.tar.xz
zebra: NetBSD: support setting IPSRCSEL preference
add 'ip address X preference Y' vty command and appropriate infrastructure for setting it through ioctl(SIOCSIFADDRPREF). IPSRCSEL is a NetBSD kernel option(4), documented in in_getifa(9) and is available since NetBSD 4.0 but not enabled in default GENERIC.
Diffstat (limited to 'zebra/ioctl.c')
-rw-r--r--zebra/ioctl.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/zebra/ioctl.c b/zebra/ioctl.c
index 8eb2d93c..6cb428a7 100644
--- a/zebra/ioctl.c
+++ b/zebra/ioctl.c
@@ -238,6 +238,23 @@ if_set_prefix (struct interface *ifp, struct connected *ifc)
ret = if_ioctl (SIOCAIFADDR, (caddr_t) &addreq);
if (ret < 0)
return ret;
+
+#ifdef SIOCSIFADDRPREF
+ if (ifc->preference != 0)
+ {
+ struct if_addrprefreq ifapr;
+
+ memset (&ifapr, 0, sizeof ifapr);
+ strncpy ((char *)&ifapr.ifap_name, ifp->name, sizeof ifapr.ifap_name);
+ ifapr.ifap_preference = ifc->preference;
+ memcpy (&ifapr.ifap_addr, &addr, sizeof (struct sockaddr_in));
+
+ ret = if_ioctl (SIOCSIFADDRPREF, (caddr_t) &ifapr);
+ if (ret < 0)
+ zlog_err("if_ioctl(SIOCSIFADDRPREF) failed: %s",
+ safe_strerror(errno));
+ }
+#endif
return 0;
}