diff options
author | David Lamparter <equinox@diac24.net> | 2010-02-03 19:28:22 +0100 |
---|---|---|
committer | David Lamparter <equinox@diac24.net> | 2010-02-04 02:52:39 +0100 |
commit | 762fdc882e51b6836fd7b66cbcef0b3634353092 (patch) | |
tree | fabca07e42363445ceb755d3d00d18e67f901982 /zebra/ioctl.c | |
parent | 85e53d51f723112b44075c658431d9700facd4c0 (diff) | |
download | quagga-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.c | 17 |
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; } |