Use struct ip_mreqn' instead of
struct ip_mreq' for multicast
operations on 2.1/2.2 kernels. This allows passing of real interface indexes instead of referencing interfaces by their IP addresses which fails badly in presence of unnumbered interfaces. Unfortunately, this structure is not visible with glibc 2.0 as it provides its own networking headers :-( Both libc5 and glibc 2.1 should be OK.
This commit is contained in:
parent
5a99ade413
commit
61fb537c62
4 changed files with 17 additions and 2 deletions
12
aclocal.m4
vendored
12
aclocal.m4
vendored
|
@ -116,3 +116,15 @@ case "$bird_cv_type_time_t" in
|
|||
*) AC_DEFINE(TIME_T_IS_SIGNED) ;;
|
||||
esac
|
||||
])
|
||||
|
||||
AC_DEFUN(BIRD_CHECK_STRUCT_IP_MREQN,
|
||||
[AC_CACHE_CHECK([struct ip_mreqn], bird_cv_struct_ip_mreqn,[
|
||||
AC_TRY_COMPILE([#include <netinet/in.h>
|
||||
],[struct ip_mreqn x;
|
||||
],[bird_cv_struct_ip_mreqn=yes
|
||||
],[bird_cv_struct_ip_mreqn=no
|
||||
])])
|
||||
if test "$bird_cv_struct_ip_mreqn" = yes ; then
|
||||
AC_DEFINE(HAVE_STRUCT_IP_MREQN)
|
||||
fi
|
||||
])
|
||||
|
|
|
@ -109,6 +109,7 @@ BIRD_CHECK_INTEGERS
|
|||
BIRD_CHECK_ENDIAN
|
||||
BIRD_CHECK_STRUCT_ALIGN
|
||||
BIRD_CHECK_TIME_T
|
||||
BIRD_CHECK_STRUCT_MREQN
|
||||
|
||||
if test "$enable_debug" = yes ; then
|
||||
AC_DEFINE(PATH_CONFIG_DIR, ".")
|
||||
|
|
|
@ -29,6 +29,9 @@
|
|||
#undef TIME_T_IS_64BIT
|
||||
#undef TIME_T_IS_SIGNED
|
||||
|
||||
/* We have struct ip_mreqn in <netinet/in.h> */
|
||||
#undef HAVE_STRUCT_IP_MREQN
|
||||
|
||||
/* Protocols compiled in */
|
||||
#undef CONFIG_STATIC
|
||||
#undef CONFIG_RIP
|
||||
|
|
|
@ -407,8 +407,7 @@ sk_open(sock *s)
|
|||
case SK_UDP_MC:
|
||||
case SK_IP_MC:
|
||||
{
|
||||
#ifdef HAVE_IP_MREQN
|
||||
/* FIXME: Define HAVE_IP_MREQN somewhere :) */
|
||||
#ifdef HAVE_STRUCT_IP_MREQN
|
||||
struct ip_mreqn mreq;
|
||||
#define mreq_add mreq
|
||||
ASSERT(s->iface);
|
||||
|
|
Loading…
Reference in a new issue