diff options
Diffstat (limited to 'pimd')
| -rw-r--r-- | pimd/pim_cmd.c | 12 | ||||
| -rw-r--r-- | pimd/pim_iface.c | 24 | ||||
| -rw-r--r-- | pimd/pim_mroute.c | 9 | ||||
| -rw-r--r-- | pimd/pim_sock.c | 6 | ||||
| -rw-r--r-- | pimd/test_igmpv3_join.c | 2 |
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> |
