summaryrefslogtreecommitdiff
path: root/pimd
diff options
context:
space:
mode:
Diffstat (limited to 'pimd')
-rw-r--r--pimd/pim_cmd.c12
-rw-r--r--pimd/pim_iface.c24
-rw-r--r--pimd/pim_mroute.c9
-rw-r--r--pimd/pim_sock.c6
-rw-r--r--pimd/test_igmpv3_join.c2
5 files changed, 30 insertions, 23 deletions
diff --git a/pimd/pim_cmd.c b/pimd/pim_cmd.c
index 13cc305274..54ed11da81 100644
--- a/pimd/pim_cmd.c
+++ b/pimd/pim_cmd.c
@@ -2462,9 +2462,9 @@ DEFUN (ip_pim_rp,
ip_pim_rp_cmd,
"ip pim rp A.B.C.D",
IP_STR
- "pim multicast routing"
- "Rendevous Point"
- "ip address of RP")
+ "pim multicast routing\n"
+ "Rendevous Point\n"
+ "ip address of RP\n")
{
int result;
@@ -2487,9 +2487,9 @@ DEFUN (no_ip_pim_rp,
"no ip pim rp {A.B.C.D}",
NO_STR
IP_STR
- "pim multicast routing"
- "Rendevous Point"
- "ip address of RP")
+ "pim multicast routing\n"
+ "Rendevous Point\n"
+ "ip address of RP\n")
{
qpim_rp.rpf_addr.s_addr = INADDR_NONE;
diff --git a/pimd/pim_iface.c b/pimd/pim_iface.c
index 14c8c7262e..3c60275027 100644
--- a/pimd/pim_iface.c
+++ b/pimd/pim_iface.c
@@ -41,19 +41,6 @@
#include "pim_time.h"
#include "pim_ssmpingd.h"
-#ifndef VIFF_USE_IFINDEX
-# ifdef linux
-/* make it work compile-time - whether it works runtime depends on the user
- * having 2.6.32 or newer */
-# define VIFF_USE_IFINDEX 0x8
-# else
-# error no VIFF_USE_IFINDEX on this system, code needs porting
-/* NB: without VIFF_USE_IFINDEX, the local IP address is used to identify
- * interfaces, which means it's impossible to support multiple interfaces that
- * have the same or no IP address (e.g. unnumbered) */
-# endif
-#endif
-
struct interface *pim_regiface = NULL;
static void pim_if_igmp_join_del_all(struct interface *ifp);
@@ -645,7 +632,7 @@ int pim_if_add_vif(struct interface *ifp)
{
struct pim_interface *pim_ifp = ifp->info;
struct in_addr ifaddr;
- unsigned char flags;
+ unsigned char flags = 0;
zassert(pim_ifp);
@@ -681,8 +668,13 @@ int pim_if_add_vif(struct interface *ifp)
return -3;
}
- flags = (ifp->ifindex == PIM_OIF_PIM_REGISTER_VIF) ?
- VIFF_REGISTER : VIFF_USE_IFINDEX;
+ if (ifp->ifindex == PIM_OIF_PIM_REGISTER_VIF)
+ flags = VIFF_REGISTER;
+#ifdef VIFF_USE_IFINDEX
+ else
+ flags = VIFF_USE_IFINDEX;
+#endif
+
if (pim_mroute_add_vif(ifp, ifaddr, flags)) {
/* pim_mroute_add_vif reported error */
return -5;
diff --git a/pimd/pim_mroute.c b/pimd/pim_mroute.c
index ab3742438d..56f49d62f5 100644
--- a/pimd/pim_mroute.c
+++ b/pimd/pim_mroute.c
@@ -501,7 +501,16 @@ int pim_mroute_add_vif(struct interface *ifp, struct in_addr ifaddr, unsigned ch
memset(&vc, 0, sizeof(vc));
vc.vifc_vifi = pim_ifp->mroute_vif_index;
+#ifdef VIFF_USE_IFINDEX
vc.vifc_lcl_ifindex = ifp->ifindex;
+#else
+ if (ifaddr.s_addr == INADDR_ANY) {
+ zlog_warn("%s: unnumbered interfaces are not supported on this platform",
+ __PRETTY_FUNCTION__);
+ return -1;
+ }
+ memcpy(&vc.vifc_lcl_addr, &ifaddr, sizeof(vc.vifc_lcl_addr));
+#endif
vc.vifc_flags = flags;
vc.vifc_threshold = PIM_MROUTE_MIN_TTL;
vc.vifc_rate_limit = 0;
diff --git a/pimd/pim_sock.c b/pimd/pim_sock.c
index a2e166f796..e04cd41575 100644
--- a/pimd/pim_sock.c
+++ b/pimd/pim_sock.c
@@ -79,6 +79,7 @@ int pim_socket_mcast(int protocol, struct in_addr ifaddr, int ifindex, int loop)
return PIM_SOCK_ERR_SOCKET;
}
+#ifdef SO_BINDTODEVICE
if (protocol == IPPROTO_PIM)
{
int ret;
@@ -104,7 +105,10 @@ int pim_socket_mcast(int protocol, struct in_addr ifaddr, int ifindex, int loop)
return PIM_SOCK_ERR_BIND;
}
}
-
+#else
+ /* XXX: use IP_PKTINFO / IP_RECVIF to emulate behaviour? Or change to
+ * only use 1 socket for all interfaces? */
+#endif
/* Needed to obtain destination address from recvmsg() */
{
diff --git a/pimd/test_igmpv3_join.c b/pimd/test_igmpv3_join.c
index fe64fbc005..7fcf38bcec 100644
--- a/pimd/test_igmpv3_join.c
+++ b/pimd/test_igmpv3_join.c
@@ -20,6 +20,8 @@
$QuaggaId: $Format:%an, %ai, %h$ $
*/
+#include <zebra.h>
+
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>