summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/ChangeLog8
-rw-r--r--lib/sockopt.h5
-rw-r--r--lib/zebra.h16
3 files changed, 25 insertions, 4 deletions
diff --git a/lib/ChangeLog b/lib/ChangeLog
index b662aed7..f5471b48 100644
--- a/lib/ChangeLog
+++ b/lib/ChangeLog
@@ -1,3 +1,11 @@
+2004-11-15 Greg Troxel <gdt@fnord.ir.bbn.com>
+
+ * sockopt.h: Avoid CMSG_ALIGN, and declare that sizes are without
+ alignment (users should use CMSG_SPACE).
+
+ * zebra.h: Rationalize CMSG_SPACE compatibility defines. Warn if
+ asumming 4-byte alignment, since this isn't safe.
+
2004-11-15 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
* memory.c: (zerror) Use zlog_err instead of fprintf to stderr.
diff --git a/lib/sockopt.h b/lib/sockopt.h
index bec26163..df199c19 100644
--- a/lib/sockopt.h
+++ b/lib/sockopt.h
@@ -44,7 +44,7 @@ int setsockopt_ipv6_multicast_loop (int, int);
* Size defines for control messages used to get ifindex. We define
* values for each method, and define a macro that can be used by code
* that is unaware of which method is in use.
- * XXX Needs to use CMSG_DATA and CMSG_ALIGN.
+ * These values are without any alignment needed (see CMSG_SPACE in RFC3542).
*/
#if defined (IP_PKTINFO)
/* Linux in_pktinfo. */
@@ -61,8 +61,7 @@ int setsockopt_ipv6_multicast_loop (int, int);
#if defined (SUNOS_5)
#define SOPT_SIZE_CMSG_RECVIF_IPV4() (sizeof (uint_t))
#else
-#define SOPT_SIZE_CMSG_RECVIF_IPV4() \
- __CMSG_ALIGN((sizeof (struct sockaddr_dl)))
+#define SOPT_SIZE_CMSG_RECVIF_IPV4() (sizeof (struct sockaddr_dl))
#endif /* SUNOS_5 */
#endif /* IP_RECVIF */
diff --git a/lib/zebra.h b/lib/zebra.h
index 6980529e..f2c396d8 100644
--- a/lib/zebra.h
+++ b/lib/zebra.h
@@ -210,7 +210,13 @@ typedef int socklen_t;
#endif /* BSDI_NRL */
/*
- * RFC 2553-bis defines not available on some systems.
+ * RFC 3542 defines several macros for using struct cmsghdr.
+ * Here, we define those that are not present
+ */
+
+/*
+ * Internal defines, for use only in this file.
+ * These are likely wrong on other than ILP32 machines, so warn.
*/
#ifndef _CMSG_DATA_ALIGN
#define _CMSG_DATA_ALIGN(n) (((n) + 3) & ~3)
@@ -220,16 +226,24 @@ typedef int socklen_t;
#define _CMSG_HDR_ALIGN(n) (((n) + 3) & ~3)
#endif /* _CMSG_HDR_ALIGN */
+/*
+ * CMSG_SPACE and CMSG_LEN are required in RFC3542, but were new in that
+ * version.
+ */
#ifndef CMSG_SPACE
#define CMSG_SPACE(l) (_CMSG_DATA_ALIGN(sizeof(struct cmsghdr)) + \
_CMSG_HDR_ALIGN(l))
+#warning "assuming 4-byte alignment for CMSG_SPACE"
#endif /* CMSG_SPACE */
#ifndef CMSG_LEN
#define CMSG_LEN(l) (_CMSG_DATA_ALIGN(sizeof(struct cmsghdr)) + (l))
+#warning "assuming 4-byte alignment for CMSG_LEN"
#endif /* CMSG_LEN */
+
+
#if !(defined(__GNUC__) || defined(VTYSH_EXTRACT_PL))
#define __attribute__(x)
#endif /* !__GNUC__ */