summaryrefslogtreecommitdiff
path: root/zebra/if_ioctl.c
diff options
context:
space:
mode:
Diffstat (limited to 'zebra/if_ioctl.c')
-rw-r--r--zebra/if_ioctl.c134
1 files changed, 2 insertions, 132 deletions
diff --git a/zebra/if_ioctl.c b/zebra/if_ioctl.c
index 5b7b5863e5..cc348fc237 100644
--- a/zebra/if_ioctl.c
+++ b/zebra/if_ioctl.c
@@ -36,6 +36,8 @@
#include "zebra/interface.h"
#include "zebra/rib.h"
+#include <ifaddrs.h>
+
/* Interface looking up using infamous SIOCGIFCONF. */
static int
interface_list_ioctl (void)
@@ -138,44 +140,7 @@ interface_list_ioctl (void)
static int
if_get_index (struct interface *ifp)
{
-#if defined(HAVE_IF_NAMETOINDEX)
- /* Modern systems should have if_nametoindex(3). */
ifp->ifindex = if_nametoindex(ifp->name);
-#elif defined(SIOCGIFINDEX) && !defined(HAVE_BROKEN_ALIASES)
- /* Fall-back for older linuxes. */
- int ret;
- struct ifreq ifreq;
- static int if_fake_index;
-
- ifreq_set_name (&ifreq, ifp);
-
- ret = if_ioctl (SIOCGIFINDEX, (caddr_t) &ifreq);
- if (ret < 0)
- {
- /* Linux 2.0.X does not have interface index. */
- ifp->ifindex = if_fake_index++;
- return ifp->ifindex;
- }
-
- /* OK we got interface index. */
-#ifdef ifr_ifindex
- ifp->ifindex = ifreq.ifr_ifindex;
-#else
- ifp->ifindex = ifreq.ifr_index;
-#endif
-
-#else
-/* Linux 2.2.X does not provide individual interface index
- for aliases and we know it. For others issue a warning. */
-#if !defined(HAVE_BROKEN_ALIASES)
-#warning "Using if_fake_index. You may want to add appropriate"
-#warning "mapping from ifname to ifindex for your system..."
-#endif
- /* This branch probably won't provide usable results, but anyway... */
- static int if_fake_index = 1;
- ifp->ifindex = if_fake_index++;
-#endif
-
return ifp->ifindex;
}
@@ -211,9 +176,6 @@ if_get_hwaddr (struct interface *ifp)
}
#endif /* SIOCGIFHWADDR */
-#ifdef HAVE_GETIFADDRS
-#include <ifaddrs.h>
-
static int
if_getaddrs (void)
{
@@ -334,93 +296,6 @@ if_getaddrs (void)
return 0;
}
-#else /* HAVE_GETIFADDRS */
-/* Interface address lookup by ioctl. This function only looks up
- IPv4 address. */
-int
-if_get_addr (struct interface *ifp)
-{
- int ret;
- struct ifreq ifreq;
- struct sockaddr_in addr;
- struct sockaddr_in mask;
- struct sockaddr_in dest;
- struct in_addr *dest_pnt;
- u_char prefixlen;
- int flags = 0;
-
- /* Interface's name and address family. */
- strncpy (ifreq.ifr_name, ifp->name, IFNAMSIZ);
- ifreq.ifr_addr.sa_family = AF_INET;
-
- /* Interface's address. */
- ret = if_ioctl (SIOCGIFADDR, (caddr_t) &ifreq);
- if (ret < 0)
- {
- if (errno != EADDRNOTAVAIL)
- {
- zlog_warn ("SIOCGIFADDR fail: %s", safe_strerror (errno));
- return ret;
- }
- return 0;
- }
- memcpy (&addr, &ifreq.ifr_addr, sizeof (struct sockaddr_in));
-
- /* Interface's network mask. */
- ret = if_ioctl (SIOCGIFNETMASK, (caddr_t) &ifreq);
- if (ret < 0)
- {
- if (errno != EADDRNOTAVAIL)
- {
- zlog_warn ("SIOCGIFNETMASK fail: %s", safe_strerror (errno));
- return ret;
- }
- return 0;
- }
-#ifdef ifr_netmask
- memcpy (&mask, &ifreq.ifr_netmask, sizeof (struct sockaddr_in));
-#else
- memcpy (&mask, &ifreq.ifr_addr, sizeof (struct sockaddr_in));
-#endif /* ifr_netmask */
- prefixlen = ip_masklen (mask.sin_addr);
-
- /* Point to point or borad cast address pointer init. */
- dest_pnt = NULL;
-
- ret = if_ioctl (SIOCGIFDSTADDR, (caddr_t) &ifreq);
- if (ret < 0)
- {
- if (errno != EADDRNOTAVAIL)
- zlog_warn ("SIOCGIFDSTADDR fail: %s", safe_strerror (errno));
- }
- else if (!IPV4_ADDR_SAME(&addr.sin_addr, &ifreq.ifr_dstaddr.sin_addr))
- {
- memcpy (&dest, &ifreq.ifr_dstaddr, sizeof (struct sockaddr_in));
- dest_pnt = &dest.sin_addr;
- flags = ZEBRA_IFA_PEER;
- }
- if (!dest_pnt)
- {
- ret = if_ioctl (SIOCGIFBRDADDR, (caddr_t) &ifreq);
- if (ret < 0)
- {
- if (errno != EADDRNOTAVAIL)
- zlog_warn ("SIOCGIFBRDADDR fail: %s", safe_strerror (errno));
- }
- else if (!IPV4_ADDR_SAME(&addr.sin_addr, &ifreq.ifr_broadaddr.sin_addr))
- {
- memcpy (&dest, &ifreq.ifr_broadaddr, sizeof (struct sockaddr_in));
- dest_pnt = &dest.sin_addr;
- }
- }
-
-
- /* Set address to the interface. */
- connected_add_ipv4 (ifp, flags, &addr.sin_addr, prefixlen, dest_pnt, NULL);
-
- return 0;
-}
-#endif /* HAVE_GETIFADDRS */
/* Fetch interface information via ioctl(). */
static void
@@ -436,9 +311,6 @@ interface_info_ioctl ()
if_get_hwaddr (ifp);
#endif /* SIOCGIFHWADDR */
if_get_flags (ifp);
-#ifndef HAVE_GETIFADDRS
- if_get_addr (ifp);
-#endif /* ! HAVE_GETIFADDRS */
if_get_mtu (ifp);
if_get_metric (ifp);
}
@@ -462,9 +334,7 @@ interface_list (struct zebra_ns *zns)
interface's information. */
interface_info_ioctl ();
-#ifdef HAVE_GETIFADDRS
if_getaddrs ();
-#endif /* HAVE_GETIFADDRS */
#if defined(HAVE_IPV6) && defined(HAVE_PROC_NET_IF_INET6)
/* Linux provides interface's IPv6 address via