]> git.puffer.fish Git - matthieu/frr.git/commitdiff
2004-08-19 Paul Jakma <paul@dishone.st>
authorpaul <paul>
Thu, 19 Aug 2004 04:13:29 +0000 (04:13 +0000)
committerpaul <paul>
Thu, 19 Aug 2004 04:13:29 +0000 (04:13 +0000)
2004-08-19 Paul Jakma <paul@dishone.st>

        * sockopt.c: include sockopt.h
          rename some of the _pktinfo_ functions to _ifindex, where that is
          their purpose.
          (getsockopt_ipv6_pktinfo_ifindex) renamed to
          getsockopt_ipv6_ifindex.
          (setsockopt_ipv4_pktinfo) renamed to setsockopt_ipv4_ifindex
          (setsockopt_pktinfo) update with previous and add comment re
          AF_INET portability.
          (setsockopt_ifindex) generic ifindex function ala
          setsockopt_pktinfo.
          (getsockopt_ipv4_pktinfo_ifindex) renamed to
          getsockopt_ipv4_ifindex.
          (getsockopt_ipv4_ifindex) rejiggling to reduce repeated
          ifdef/elses. pktinfo case forgot to set ifindex.
          (getsockopt_pktinfo_ifindex) renamed to
          getsockopt_ifindex. update some calls to renamed functions.
        * sockopt.h: Update renamed exported functions
          Rename the CMSG_SIZE macros to IFINDEX.
          Guard IPv4 PKTINFO in a conditional define.

lib/ChangeLog
lib/sockopt.c
lib/sockopt.h

index 421a4f0bde292ed30b5615c49c8746e493f6e08a..0e1960b17d76651f9854c6706ef246e049a3b9d2 100644 (file)
@@ -1,3 +1,25 @@
+2004-08-19 Paul Jakma <paul@dishone.st>
+
+       * sockopt.c: include sockopt.h
+         rename some of the _pktinfo_ functions to _ifindex, where that is
+         their purpose.
+          (getsockopt_ipv6_pktinfo_ifindex) renamed to
+         getsockopt_ipv6_ifindex.
+         (setsockopt_ipv4_pktinfo) renamed to setsockopt_ipv4_ifindex
+         (setsockopt_pktinfo) update with previous and add comment re
+         AF_INET portability.
+         (setsockopt_ifindex) generic ifindex function ala
+         setsockopt_pktinfo.
+         (getsockopt_ipv4_pktinfo_ifindex) renamed to
+         getsockopt_ipv4_ifindex.
+         (getsockopt_ipv4_ifindex) rejiggling to reduce repeated
+          ifdef/elses. pktinfo case forgot to set ifindex.
+          (getsockopt_pktinfo_ifindex) renamed to 
+          getsockopt_ifindex. update some calls to renamed functions.
+        * sockopt.h: Update renamed exported functions
+          Rename the CMSG_SIZE macros to IFINDEX.
+          Guard IPv4 PKTINFO in a conditional define.
+
 2004-08-18 Paul Jakma <paul@dishone.st>
 
        * vty.c: (vty_serv_un) set unix vty socket to nonblocking
index 682b7397b13a0fb34064967775db1a4663baed5f..d0b034f597d802727ee0743af318a8f69fb31d92 100644 (file)
@@ -21,6 +21,7 @@
 
 #include <zebra.h>
 #include "log.h"
+#include "sockopt.h"
 
 static void *
 getsockopt_cmsg_data (struct msghdr *msgh, int level, int type)
@@ -125,7 +126,7 @@ setsockopt_ipv6_multicast_loop (int sock, int val)
 }
 
 static int
-getsockopt_ipv6_pktinfo_ifindex (struct msghdr *msgh)
+getsockopt_ipv6_ifindex (struct msghdr *msgh)
 {
   struct in6_pktinfo *pktinfo;
   
@@ -221,7 +222,7 @@ setsockopt_multicast_ipv4(int sock,
 }
 
 static int
-setsockopt_ipv4_pktinfo (int sock, int val)
+setsockopt_ipv4_ifindex (int sock, int val)
 {
   int ret;
 
@@ -243,6 +244,7 @@ setsockopt_ipv4_pktinfo (int sock, int val)
 /* set appropriate pktinfo socket option 
  * on systems without PKTINFO, sets RECVIF, which only retrieves
  * interface index.
+ * Not portable for IPv4, use only setsockopt_ifindex for v4.
  */
 int 
 setsockopt_pktinfo (int af, int sock, int val)
@@ -252,7 +254,8 @@ setsockopt_pktinfo (int af, int sock, int val)
   switch (af)
     {
       case AF_INET:
-        ret = setsockopt_ipv4_pktinfo (sock, val);
+        /* _ifindex will use PKTINFO if available.. */
+        ret = setsockopt_ipv4_ifindex (sock, val);
         break;
 #ifdef HAVE_IPV6
       case AF_INET6:
@@ -265,62 +268,83 @@ setsockopt_pktinfo (int af, int sock, int val)
   return ret;
 }
 
-
+int
+setsockopt_ifindex (int af, int sock, int val)
+{
+  int ret = -1;
+  
+  switch (af)
+    {
+      case AF_INET:
+        ret = setsockopt_ipv4_ifindex (sock, val);
+        break;
+#ifdef HAVE_IPV6
+      case AF_INET6:
+        ret = setsockopt_ipv6_pktinfo (sock, val);
+        break;
+#endif
+      default:
+        zlog_warn ("setsockopt_ifindex: unknown address family %d");
+    }
+  return ret;
+}
+  
 static int
-getsockopt_ipv4_pktinfo_ifindex (struct msghdr *msgh)
+getsockopt_ipv4_ifindex (struct msghdr *msgh)
 {
-  int ifindex = 0;
-#if defined (IP_PKTINFO)
+  int ifindex = -1;
+#if defined(IP_PKTINFO)
+/* Linux pktinfo based ifindex retrieval */
   struct in_pktinfo *pktinfo;
-#elif defined (IP_RECVIF)
+  
+  pktinfo = 
+    (struct in_pktinfo *)getsockopt_cmsg_data (msgh, IPPROTO_IP, IP_PKTINFO);
+  ifindex = pktinfo->ipi_ifindex;
+  
+#elif defined(IP_RECVIF)
+/* BSD/other IP_RECVIF based ifindex retrieval */
 #ifndef SUNOS_5
   /* RECVIF, but not SUNOS, so BSD */
   struct sockaddr_dl *sdl;
 #endif /* SUNOS_5 */
   /* SUNOS_5 doesn't need a structure to extract ifindex */
-#else /* IP_RECVIF */
-  /* XXX Neither, so we are going to lose. */
-#endif /* IP_PKTINFO */
-  
-#ifdef IP_PKTINFO
-  pktinfo = 
-    (struct in_pktinfo *)getsockopt_cmsg_data (msgh, IPPROTO_IP, IP_PKTINFO);
-#elif defined (IP_RECVIF)
+
 #ifndef SUNOS_5
   sdl = 
     (struct sockaddr_dl *)getsockopt_cmsg_data (msgh, IPPROTO_IP, IP_RECVIF);
   ifindex = sdl->sdl_index;
-#else
+#else /* !SUNOS_5 */
   ifindex = *(uint_t *)getsockopt_cmsg_data (msgh, IPPROTO_IP, IP_RECVIF);
 #endif /* SUNOS_5 */
-#else
+
+#else /* neither IP_PKTINFO nor IP_RECVIF, broken */
+
 #warning "getsockopt_ipv4_pktinfo_ifindex: dont have PKTINFO or RECVIF"
+#warning "things will be broken on this platform!"
   /* XXX why not -1 - this is a failure condition. */
-  ifindex = 0;
-#endif /* IP_PKTINFO */
+  ifindex = -1;
+#endif /* IP_PKTINFO */ 
   return ifindex;
 }
 
 /* return ifindex, 0 if none found */
 int
-getsockopt_pktinfo_ifindex (int af, struct msghdr *msgh)
+getsockopt_ifindex (int af, struct msghdr *msgh)
 {
   int ifindex = 0;
   
   switch (af)
     {
       case AF_INET:
-        return (getsockopt_ipv4_pktinfo_ifindex (msgh));
+        return (getsockopt_ipv4_ifindex (msgh));
         break;
 #ifdef HAVE_IPV6
       case AF_INET6:
-        return (getsockopt_ipv6_pktinfo_ifindex (msgh));
+        return (getsockopt_ipv6_ifindex (msgh));
         break;
 #endif
       default:
-        zlog_warn ("getsockopt_pktinfo_ifindex: unknown address family %d");
+        zlog_warn ("getsockopt_ifindex: unknown address family %d");
         return (ifindex = 0);
     }
 }
-
index c5d171c25d3f82145352161c0837a8136246f651..b7aa1b3aceea6240d3e6648b6bb3f556abfaf7b7 100644 (file)
@@ -32,26 +32,37 @@ int setsockopt_ipv6_multicast_loop (int, int);
 #endif /* HAVE_IPV6 */
 
 #if defined (IP_PKTINFO)
+
 #define SOPT_SIZE_CMSG_PKTINFO_IPV4()  (sizeof (struct in_pktinfo))
+#define SOPT_SIZE_CMSG_IFINDEX_IPV4 SOPT_SIZE_CMSG_PKTINFO_IPV4
+#define SOPT_SIZE_CMSG_PKTINFO(af) \
+  ((af == AF_INET) ? SOPT_SIZE_CMSG_PKTINFO_IPV4() \
+                   : SOPT_SIZE_CMSG_PKTINFO_IPV6()
+
 #elif defined (IP_RECVIF)
 #if defined (SUNOS_5)
-#define SOPT_SIZE_CMSG_PKTINFO_IPV4()  (sizeof (uint_t))
+#define SOPT_SIZE_CMSG_IFINDEX_IPV4()  (sizeof (uint_t))
 #else
-#define SOPT_SIZE_CMSG_PKTINFO_IPV4()  (sizeof (struct sockaddr_dl))
+#define SOPT_SIZE_CMSG_IFINDEX_IPV4()  (sizeof (struct sockaddr_dl))
 #endif /* SUNOS_5 */
+
 #endif
 
 #define SOPT_SIZE_CMSG_PKTINFO_IPV6() (sizeof (struct in6_pktinfo));
 
-#define SOPT_SIZE_CMSG_PKTINFO(af) \
-  ((af == AF_INET) ? SOPT_SIZE_CMSG_PKTINFO_IPV4() \
-                   : SOPT_SIZE_CMSG_PKTINFO_IPV6()
+#define SOPT_SIZE_CMSG_IFINDEX(af) \
+  ((af == AF_INET) ? SOPT_SIZE_CMSG_IFINDEX_IPV4() \
+                   : SOPT_SIZE_CMSG_IFINDEX_IPV6()
 
 int setsockopt_multicast_ipv4(int sock, 
                             int optname, 
                             struct in_addr if_addr,
                             unsigned int mcast_addr,
                             unsigned int ifindex);
+
+#if defined (IP_PKTINFO)
 int setsockopt_pktinfo (int, int, int);
-int getsockopt_pktinfo_ifindex (int, struct msghdr *);
+#endif
+int setsockopt_ifindex (int, int, int);
+int getsockopt_ifindex (int, struct msghdr *);
 #endif /*_ZEBRA_SOCKOPT_H */