]> git.puffer.fish Git - matthieu/frr.git/commitdiff
2004-08-26 Greg Troxel <gdt@fnord.ir.bbn.com>
authorgdt <gdt>
Thu, 26 Aug 2004 13:12:41 +0000 (13:12 +0000)
committergdt <gdt>
Thu, 26 Aug 2004 13:12:41 +0000 (13:12 +0000)
* sockopt.h: Define method-independent macro for callers of
get_ifindex to use for cmsg length.

lib/ChangeLog
lib/sockopt.h

index 514f47a1f698da88424d43e5b442954243f61285..7c372df369572e18ce3bde7807f7053288c8eb0b 100644 (file)
@@ -1,3 +1,8 @@
+2004-08-26  Greg Troxel  <gdt@fnord.ir.bbn.com>
+
+       * sockopt.h: Define method-independent macro for callers of
+       get_ifindex to use for cmsg length.
+
 2004-08-19 Paul Jakma <paul@dishone.st>
 
        * zebra.h: add MAX and MIN defines (eg for ospf6d)
index b7aa1b3aceea6240d3e6648b6bb3f556abfaf7b7..cd7971827914367b8c51f267fdfb1c685b7c57aa 100644 (file)
@@ -31,25 +31,46 @@ int setsockopt_ipv6_hoplimit (int, int);
 int setsockopt_ipv6_multicast_loop (int, int);
 #endif /* HAVE_IPV6 */
 
-#if defined (IP_PKTINFO)
+/*
+ * It is OK to reference in6_pktinfo here without a protecting #if
+ * because this macro will only be used #if HAVE_IPV6, and in6_pktinfo
+ * is not optional for HAVE_IPV6.
+ */
+#define SOPT_SIZE_CMSG_PKTINFO_IPV6() (sizeof (struct in6_pktinfo));
 
+/*
+ * 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.
+ */
+#if defined (IP_PKTINFO)
+/* Linux in_pktinfo. */
 #define SOPT_SIZE_CMSG_PKTINFO_IPV4()  (sizeof (struct in_pktinfo))
-#define SOPT_SIZE_CMSG_IFINDEX_IPV4 SOPT_SIZE_CMSG_PKTINFO_IPV4
+
+/* XXX This should perhaps be defined even if IP_PKTINFO is not. */
 #define SOPT_SIZE_CMSG_PKTINFO(af) \
   ((af == AF_INET) ? SOPT_SIZE_CMSG_PKTINFO_IPV4() \
                    : SOPT_SIZE_CMSG_PKTINFO_IPV6()
 
+#define SOPT_SIZE_CMSG_IFINDEX_IPV4()  SOPT_SIZE_CMSG_PKTINFO_IPV4
+
 #elif defined (IP_RECVIF)
+/* BSD/Solaris.  Arguably these should say RECVIF rather than IFINDEX. */
+
 #if defined (SUNOS_5)
 #define SOPT_SIZE_CMSG_IFINDEX_IPV4()  (sizeof (uint_t))
 #else
-#define SOPT_SIZE_CMSG_IFINDEX_IPV4()  (sizeof (struct sockaddr_dl))
+#define SOPT_SIZE_CMSG_IFINDEX_IPV4()  \
+       __CMSG_ALIGN((sizeof (struct sockaddr_dl)))
 #endif /* SUNOS_5 */
 
 #endif
 
-#define SOPT_SIZE_CMSG_PKTINFO_IPV6() (sizeof (struct in6_pktinfo));
-
+/*
+ * AF-parameterized message size.
+ * XXX Why is this here?  Is it used?  The v6 case is not defined. 
+ */
 #define SOPT_SIZE_CMSG_IFINDEX(af) \
   ((af == AF_INET) ? SOPT_SIZE_CMSG_IFINDEX_IPV4() \
                    : SOPT_SIZE_CMSG_IFINDEX_IPV6()
@@ -60,9 +81,13 @@ int setsockopt_multicast_ipv4(int sock,
                             unsigned int mcast_addr,
                             unsigned int ifindex);
 
-#if defined (IP_PKTINFO)
+/*
+ * XXX Exactly what is this an interface to?  Specifically, what calls
+ * can be made after calling it?
+ */
 int setsockopt_pktinfo (int, int, int);
-#endif
+
+/* Ask for, and get, ifindex, by whatever method is supported. */
 int setsockopt_ifindex (int, int, int);
 int getsockopt_ifindex (int, struct msghdr *);
 #endif /*_ZEBRA_SOCKOPT_H */