+2005-11-24 Paul Jakma <paul.jakma@sun.com>
+
+ * kernel_socket.h: New header for functions exported to sysctl
+ methods.
+ * kernel_socket.c: include previous.
+ Remove static qualifier from couple of functions which are
+ used by sysctl methods.
+ Add a workaround for a bogus gcc warning to the RTA_ macros.
+ * Makefile.am: Add kernel_socket.h to noinst_HEADERS
+ * if_sysctl.c: include rt.h and kernel_socket.h and remove
+ redundant prototypes.
+ * rtread_sysctl.c: ditto.
+ (route_read) fix mismatch of return values.
+ * {rt,zserv,rib}.h: Include lib headers depended on.
+
2005-11-23 Paul Jakma <paul.jakma@sun.com>
* (general) fix some small compile errors, and mark several
noinst_HEADERS = \
connected.h ioctl.h rib.h rt.h zserv.h redistribute.h debug.h rtadv.h \
- interface.h ipforward.h irdp.h router-id.h
+ interface.h ipforward.h irdp.h router-id.h kernel_socket.h
zebra_LDADD = $(otherobj) $(LIBCAP) $(LIB_IPV6) ../lib/libzebra.la
#include "ioctl.h"
#include "log.h"
+#include "zebra/rt.h"
+#include "zebra/kernel_socket.h"
+
int
ifstat_update_sysctl ()
{
caddr_t ref, buf, end;
size_t bufsiz;
struct if_msghdr *ifm;
- int ifm_read (struct if_msghdr *);
- int ifam_read (struct ifa_msghdr *);
#define MIBSIZ 6
int mib[MIBSIZ] =
#include "zebra/interface.h"
#include "zebra/zserv.h"
#include "zebra/debug.h"
+#include "zebra/kernel_socket.h"
extern struct zebra_privs_t zserv_privs;
extern struct zebra_t zebrad;
ROUNDUP(sizeof(struct sockaddr_dl)) : sizeof(struct sockaddr)))
#endif /* HAVE_SA_LEN */
+/* We use an additional pointer in following, pdest, rather than (DEST)
+ * directly, because gcc will warn if the macro is expanded and DEST is NULL,
+ * complaining that memcpy is being passed a NULL value, despite the fact
+ * the if (NULL) makes it impossible.
+ */
#define RTA_ADDR_GET(DEST, RTA, RTMADDRS, PNT) \
if ((RTMADDRS) & (RTA)) \
{ \
+ void *pdest = (DEST); \
int len = SAROUNDUP ((PNT)); \
if ( ((DEST) != NULL) && \
af_check (((struct sockaddr *)(PNT))->sa_family)) \
- memcpy ((DEST), (PNT), len); \
+ memcpy (pdest, (PNT), len); \
(PNT) += len; \
}
#define RTA_ATTR_GET(DEST, RTA, RTMADDRS, PNT) \
if ((RTMADDRS) & (RTA)) \
{ \
+ void *pdest = (DEST); \
int len = SAROUNDUP ((PNT)); \
- if ( ((DEST) != NULL) ) \
- memcpy ((DEST), (PNT), len); \
+ if ((DEST) != NULL) \
+ memcpy (pdest, (PNT), len); \
(PNT) += len; \
}
#define RTA_NAME_GET(DEST, RTA, RTMADDRS, PNT, LEN) \
if ((RTMADDRS) & (RTA)) \
{ \
+ u_char *pdest = (u_char *) (DEST); \
int len = SAROUNDUP ((PNT)); \
struct sockaddr_dl *sdl = (struct sockaddr_dl *)(PNT); \
if (IS_ZEBRA_DEBUG_KERNEL) \
if ( ((DEST) != NULL) && (sdl->sdl_family == AF_LINK) \
&& (sdl->sdl_nlen < IFNAMSIZ) && (sdl->sdl_nlen <= len) ) \
{ \
- memcpy ((DEST), sdl->sdl_data, sdl->sdl_nlen); \
- (DEST)[sdl->sdl_nlen] = '\0'; \
+ memcpy (pdest, sdl->sdl_data, sdl->sdl_nlen); \
+ pdest[sdl->sdl_nlen] = '\0'; \
(LEN) = sdl->sdl_nlen; \
} \
(PNT) += len; \
assert ( (ifp->ifindex == ifan->ifan_index)
|| (ifp->ifindex == IFINDEX_INTERNAL) );
- if ( (ifp == NULL) || (ifp->ifindex == IFINDEX_INTERNAL)
- && (ifan->ifan_what == IFAN_ARRIVAL) )
+ if ( (ifp == NULL)
+ || ((ifp->ifindex == IFINDEX_INTERNAL)
+ && (ifan->ifan_what == IFAN_ARRIVAL)) )
{
if (IS_ZEBRA_DEBUG_KERNEL)
zlog_debug ("%s: creating interface for ifindex %d, name %s",
* sysctl (from interface_list). There may or may not be sockaddrs
* present after the header.
*/
-static int
+int
ifm_read (struct if_msghdr *ifm)
{
struct interface *ifp = NULL;
}
/* Interface's address information get. */
-static int
+int
ifam_read (struct ifa_msghdr *ifam)
{
struct interface *ifp = NULL;
return rtm->rtm_flags;
}
-static void
+void
rtm_read (struct rt_msghdr *rtm)
{
int flags;
--- /dev/null
+/*
+ * Exported kernel_socket functions, exported only for convenience of
+ * sysctl methods.
+ *
+ * This file is part of Quagga.
+ *
+ * Quagga is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2, or (at your option) any
+ * later version.
+ *
+ * Quagga is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Quagga; see the file COPYING. If not, write to the Free
+ * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ */
+
+#ifndef __ZEBRA_KERNEL_SOCKET_H
+#define __ZEBRA_KERNEL_SOCKET_H
+
+extern void rtm_read (struct rt_msghdr *);
+extern int ifam_read (struct ifa_msghdr *);
+extern int ifm_read (struct if_msghdr *);
+extern int rtm_write (int, union sockunion *, union sockunion *,
+ union sockunion *, unsigned int, int, int);
+
+#endif /* __ZEBRA_KERNEL_SOCKET_H */
#ifndef _ZEBRA_RIB_H
#define _ZEBRA_RIB_H
+#include "prefix.h"
+
#define DISTANCE_INFINITY 255
/* Routing information base. */
#ifndef _ZEBRA_RT_H
#define _ZEBRA_RT_H
+#include "prefix.h"
+#include "if.h"
+
extern int kernel_add_ipv4 (struct prefix *, struct rib *);
extern int kernel_delete_ipv4 (struct prefix *, struct rib *);
extern int kernel_add_route (struct prefix_ipv4 *, struct in_addr *, int, int);
#include "zebra/zserv.h"
#include "zebra/rt.h"
+#include "zebra/kernel_socket.h"
/* Kernel routing table read up by sysctl function. */
void
caddr_t buf, end, ref;
size_t bufsiz;
struct rt_msghdr *rtm;
- void rtm_read (struct rt_msghdr *);
#define MIBSIZ 6
int mib[MIBSIZ] =
if (sysctl (mib, MIBSIZ, NULL, &bufsiz, NULL, 0) < 0)
{
zlog_warn ("sysctl fail: %s", safe_strerror (errno));
- return -1;
+ return;
}
/* Allocate buffer. */
if (sysctl (mib, MIBSIZ, buf, &bufsiz, NULL, 0) < 0)
{
zlog_warn ("sysctl() fail by %s", safe_strerror (errno));
- return -1;
+ return;
}
for (end = buf + bufsiz; buf < end; buf += rtm->rtm_msglen)
/* Free buffer. */
XFREE (MTYPE_TMP, ref);
- return 0;
+ return;
}
#define _ZEBRA_ZSERV_H
#include "rib.h"
+#include "if.h"
#include "workqueue.h"
/* Default port information. */