diff options
36 files changed, 697 insertions, 440 deletions
diff --git a/configure.ac b/configure.ac index bdddf4b846..32ee560df9 100644 --- a/configure.ac +++ b/configure.ac @@ -1526,6 +1526,13 @@ AC_CHECK_HEADERS([linux/mroute.h], [], [],[  	#include <linux/types.h>  ]) +AC_CHECK_HEADERS([linux/mroute6.h], [], [],[ +	#include <sys/socket.h> +	#include <netinet/in.h> +	#define _LINUX_IN_H             /* For Linux <= 2.6.25 */ +	#include <linux/types.h> +]) +  m4_define([FRR_INCLUDES],  FRR_INCLUDES  [#ifdef HAVE_LINUX_MROUTE_H diff --git a/pimd/pim6_main.c b/pimd/pim6_main.c index 3d8ebd0d86..a6cfe7682c 100644 --- a/pimd/pim6_main.c +++ b/pimd/pim6_main.c @@ -183,8 +183,8 @@ int main(int argc, char **argv, char **envp)  	/* TODO PIM6: next line is temporary since pim_cmd_init is disabled */  	if_cmd_init(NULL); -#if 0  	pim_zebra_init(); +#if 0  	pim_bfd_init();  	pim_mlag_init(); diff --git a/pimd/pim6_stubs.c b/pimd/pim6_stubs.c new file mode 100644 index 0000000000..038baa0692 --- /dev/null +++ b/pimd/pim6_stubs.c @@ -0,0 +1,141 @@ +/* + * PIMv6 temporary stubs + * Copyright (C) 2022  David Lamparter for NetDEF, Inc. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; see the file COPYING; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include <zebra.h> + +#include "pimd.h" +#include "pim_nht.h" +#include "pim_zlookup.h" +#include "pim_pim.h" +#include "pim_register.h" +#include "pim_cmd.h" + +/* + * NH lookup / NHT + */ +void pim_sendmsg_zebra_rnh(struct pim_instance *pim, struct zclient *zclient, +			   struct pim_nexthop_cache *pnc, int command) +{ +} + +int pim_ecmp_nexthop_lookup(struct pim_instance *pim, +			    struct pim_nexthop *nexthop, struct prefix *src, +			    struct prefix *grp, int neighbor_needed) +{ +	return 0; +} + +int pim_find_or_track_nexthop(struct pim_instance *pim, struct prefix *addr, +			      struct pim_upstream *up, struct rp_info *rp, +			      struct pim_nexthop_cache *out_pnc) +{ +	return 0; +} + +void pim_delete_tracked_nexthop(struct pim_instance *pim, struct prefix *addr, +				struct pim_upstream *up, struct rp_info *rp) +{ +} + +struct pim_nexthop_cache *pim_nexthop_cache_find(struct pim_instance *pim, +						 struct pim_rpf *rpf) +{ +	return NULL; +} + +void pim_rp_nexthop_del(struct rp_info *rp_info) +{ +} + +void pim_nht_bsr_add(struct pim_instance *pim, struct in_addr addr) +{ +} + +void pim_nht_bsr_del(struct pim_instance *pim, struct in_addr addr) +{ +} + +int zclient_lookup_nexthop(struct pim_instance *pim, +			   struct pim_zlookup_nexthop nexthop_tab[], +			   const int tab_size, pim_addr addr, +			   int max_lookup) +{ +	return -1; +} + +void zclient_lookup_new(void) +{ +} + +void zclient_lookup_free(void) +{ +} + +/* + * packet handling + */ +int pim_msg_send(int fd, pim_addr src, pim_addr dst, uint8_t *pim_msg, +		 int pim_msg_size, const char *ifname) +{ +	return 0; +} + +int pim_hello_send(struct interface *ifp, uint16_t holdtime) +{ +	return -1; +} + +void pim_hello_restart_now(struct interface *ifp) +{ +} + +void pim_hello_restart_triggered(struct interface *ifp) +{ +} + +int pim_sock_add(struct interface *ifp) +{ +	return -1; +} + +void pim_sock_delete(struct interface *ifp, const char *delete_message) +{ +} + +/* + * PIM register + */ +void pim_register_join(struct pim_upstream *up) +{ +} + +void pim_null_register_send(struct pim_upstream *up) +{ +} + +void pim_reg_del_on_couldreg_fail(struct interface *ifp) +{ +} + +/* + * CLI + */ +void pim_cmd_init(void) +{ +} diff --git a/pimd/pim_addr.c b/pimd/pim_addr.c index 2a6b4fe20f..6ba0947c2f 100644 --- a/pimd/pim_addr.c +++ b/pimd/pim_addr.c @@ -44,9 +44,6 @@ static ssize_t printfrr_pimaddr(struct fbuf *buf, struct printfrr_eargs *ea,  #if PIM_IPV == 4  	return bprintfrr(buf, "%pI4", addr); -#elif !defined(PIM_V6_TEMP_BREAK) -	CPP_NOTICE("note IPv6 typing for pim_addr is temporarily disabled."); -	return bprintfrr(buf, "%pI4", addr);  #else  	return bprintfrr(buf, "%pI6", addr);  #endif diff --git a/pimd/pim_addr.h b/pimd/pim_addr.h index 3c4b5a84d1..1351fca225 100644 --- a/pimd/pim_addr.h +++ b/pimd/pim_addr.h @@ -25,11 +25,7 @@  /* clang-format off */ -/* temporarily disable IPv6 types to keep code compiling. - * Defining PIM_V6_TEMP_BREAK will show a lot of compile errors - they are - * very useful to see TODOs. - */ -#if PIM_IPV == 4 || !defined(PIM_V6_TEMP_BREAK) +#if PIM_IPV == 4  typedef struct in_addr pim_addr;  #define PIM_ADDRSTRLEN	INET_ADDRSTRLEN diff --git a/pimd/pim_bfd.c b/pimd/pim_bfd.c index 3e3021dc4d..c2fe525b2d 100644 --- a/pimd/pim_bfd.c +++ b/pimd/pim_bfd.c @@ -94,7 +94,7 @@ void pim_bfd_info_nbr_create(struct pim_interface *pim_ifp,  	bfd_sess_set_timers(  		neigh->bfd_session, pim_ifp->bfd_config.detection_multiplier,  		pim_ifp->bfd_config.min_rx, pim_ifp->bfd_config.min_tx); -#if PIM_IPV == 4 || !defined(PIM_V6_TEMP_BREAK) +#if PIM_IPV == 4  	bfd_sess_set_ipv4_addrs(neigh->bfd_session, NULL, &neigh->source_addr);  #else  	bfd_sess_set_ipv6_addrs(neigh->bfd_session, NULL, &neigh->source_addr); diff --git a/pimd/pim_bsm.c b/pimd/pim_bsm.c index 5901ae3439..8d65901b57 100644 --- a/pimd/pim_bsm.c +++ b/pimd/pim_bsm.c @@ -1371,7 +1371,12 @@ int pim_bsm_process(struct interface *ifp, struct ip *ip_hdr, uint8_t *buf,  		}  	} -	if (ip_hdr->ip_dst.s_addr == qpim_all_pim_routers_addr.s_addr) { +#if PIM_IPV == 4 +	if (ip_hdr->ip_dst.s_addr == qpim_all_pim_routers_addr.s_addr) +#else +	if (0) +#endif +	{  		/* Multicast BSMs are only accepted if source interface & IP  		 * match RPF towards the BSR's IP address, or they have  		 * no-forward set diff --git a/pimd/pim_cmd.c b/pimd/pim_cmd.c index 83ba74f69f..3e3074827f 100644 --- a/pimd/pim_cmd.c +++ b/pimd/pim_cmd.c @@ -3901,7 +3901,6 @@ static void clear_mroute(struct pim_instance *pim)  	/* scan interfaces */  	FOR_ALL_INTERFACES (pim->vrf, ifp) {  		struct pim_interface *pim_ifp = ifp->info; -		struct gm_group *grp;  		struct pim_ifchannel *ch;  		if (!pim_ifp) @@ -3914,7 +3913,9 @@ static void clear_mroute(struct pim_instance *pim)  			pim_ifchannel_delete(ch);  		} +#if PIM_IPV == 4  		/* clean up all igmp groups */ +		struct gm_group *grp;  		if (pim_ifp->gm_group_list) {  			while (pim_ifp->gm_group_list->count) { @@ -3922,6 +3923,7 @@ static void clear_mroute(struct pim_instance *pim)  				igmp_group_delete(grp);  			}  		} +#endif  	}  	/* clean up all upstreams*/ @@ -8236,6 +8238,7 @@ DEFPY_HIDDEN (interface_ip_igmp_query_generate,  	      "IGMP version\n"  	      "IGMP version number\n")  { +#if PIM_IPV == 4  	VTY_DECLVAR_CONTEXT(interface, ifp);  	int igmp_version;  	struct pim_interface *pim_ifp = ifp->info; @@ -8253,7 +8256,7 @@ DEFPY_HIDDEN (interface_ip_igmp_query_generate,  		igmp_version = atoi(argv[4]->arg);  	igmp_send_query_on_intf(ifp, igmp_version); - +#endif  	return CMD_SUCCESS;  } diff --git a/pimd/pim_iface.c b/pimd/pim_iface.c index 57fe97816e..d6016d060b 100644 --- a/pimd/pim_iface.c +++ b/pimd/pim_iface.c @@ -50,10 +50,12 @@  #include "pim_igmp_join.h"  #include "pim_vxlan.h" +#if PIM_IPV == 4  static void pim_if_igmp_join_del_all(struct interface *ifp);  static int igmp_join_sock(const char *ifname, ifindex_t ifindex,  			  struct in_addr group_addr,  			  struct in_addr source_addr); +#endif  void pim_if_init(struct pim_instance *pim)  { @@ -83,6 +85,7 @@ static void pim_sec_addr_free(struct pim_secondary_addr *sec_addr)  	XFREE(MTYPE_PIM_SEC_ADDR, sec_addr);  } +__attribute__((unused))  static int pim_sec_addr_comp(const void *p1, const void *p2)  {  	const struct pim_secondary_addr *sec1 = p1; @@ -124,6 +127,7 @@ struct pim_interface *pim_if_new(struct interface *ifp, bool igmp, bool pim,  	pim_ifp->pim = ifp->vrf->info;  	pim_ifp->mroute_vif_index = -1; +#if PIM_IPV == 4  	pim_ifp->igmp_version = IGMP_DEFAULT_VERSION;  	pim_ifp->gm_default_robustness_variable =  		IGMP_DEFAULT_ROBUSTNESS_VARIABLE; @@ -185,6 +189,7 @@ struct pim_interface *pim_if_new(struct interface *ifp, bool igmp, bool pim,  	pim_sock_reset(ifp);  	pim_if_add_vif(ifp, ispimreg, is_vxlan_term); +#endif  	pim_ifp->pim->mcast_if_count++;  	return pim_ifp; @@ -198,6 +203,10 @@ void pim_if_delete(struct interface *ifp)  	pim_ifp = ifp->info;  	assert(pim_ifp); +	pim_ifp->pim->mcast_if_count--; +#if PIM_IPV == 4 +	struct pim_ifchannel *ch; +  	if (pim_ifp->gm_join_list) {  		pim_if_igmp_join_del_all(ifp);  	} @@ -208,7 +217,6 @@ void pim_if_delete(struct interface *ifp)  	pim_neighbor_delete_all(ifp, "Interface removed from configuration");  	pim_if_del_vif(ifp); -	pim_ifp->pim->mcast_if_count--;  	pim_igmp_if_fini(pim_ifp); @@ -218,6 +226,7 @@ void pim_if_delete(struct interface *ifp)  	XFREE(MTYPE_PIM_INTERFACE, pim_ifp->boundary_oil_plist);  	XFREE(MTYPE_PIM_INTERFACE, pim_ifp); +#endif  	ifp->info = NULL;  } @@ -486,7 +495,6 @@ void pim_if_addr_add(struct connected *ifc)  {  	struct pim_interface *pim_ifp;  	struct interface *ifp; -	struct in_addr ifaddr;  	bool vxlan_term;  	assert(ifc); @@ -507,13 +515,14 @@ void pim_if_addr_add(struct connected *ifc)  				   ? "secondary"  				   : "primary"); -	ifaddr = ifc->address->u.prefix4; -  	detect_address_change(ifp, 0, __func__);  	// if (ifc->address->family != AF_INET)  	//  return; +#if PIM_IPV == 4 +	struct in_addr ifaddr = ifc->address->u.prefix4; +  	if (PIM_IF_TEST_IGMP(pim_ifp->options)) {  		struct gm_sock *igmp; @@ -579,6 +588,7 @@ void pim_if_addr_add(struct connected *ifc)  					  true);  		}  	} /* igmp mtrace only */ +#endif  	if (PIM_IF_TEST_PIM(pim_ifp->options)) { @@ -630,6 +640,7 @@ void pim_if_addr_add(struct connected *ifc)  static void pim_if_addr_del_igmp(struct connected *ifc)  { +#if PIM_IPV == 4  	struct pim_interface *pim_ifp = ifc->ifp->info;  	struct gm_sock *igmp;  	struct in_addr ifaddr; @@ -652,6 +663,7 @@ static void pim_if_addr_del_igmp(struct connected *ifc)  		/* if addr found, del IGMP socket */  		igmp_sock_delete(igmp);  	} +#endif  }  static void pim_if_addr_del_pim(struct connected *ifc) @@ -1140,6 +1152,7 @@ long pim_if_t_suppressed_msec(struct interface *ifp)  	return t_suppressed_msec;  } +#if PIM_IPV == 4  static void igmp_join_free(struct gm_join *ij)  {  	XFREE(MTYPE_PIM_IGMP_JOIN, ij); @@ -1330,6 +1343,7 @@ int pim_if_igmp_join_del(struct interface *ifp, struct in_addr group_addr,  	return 0;  } +__attribute__((unused))  static void pim_if_igmp_join_del_all(struct interface *ifp)  {  	struct pim_interface *pim_ifp; @@ -1350,6 +1364,19 @@ static void pim_if_igmp_join_del_all(struct interface *ifp)  	for (ALL_LIST_ELEMENTS(pim_ifp->gm_join_list, node, nextnode, ij))  		pim_if_igmp_join_del(ifp, ij->group_addr, ij->source_addr);  } +#else /* PIM_IPV != 4 */ +ferr_r pim_if_igmp_join_add(struct interface *ifp, struct in_addr group_addr, +			    struct in_addr source_addr) +{ +	return ferr_ok(); +} + +int pim_if_igmp_join_del(struct interface *ifp, struct in_addr group_addr, +			 struct in_addr source_addr) +{ +	return 0; +} +#endif /* PIM_IPV != 4 */  /*    RFC 4601 @@ -1524,6 +1551,7 @@ static int pim_ifp_create(struct interface *ifp)  		 */  		if (pim_ifp)  			pim_ifp->pim = pim; +#if PIM_IPV == 4  		pim_if_addr_add_all(ifp);  		/* @@ -1535,8 +1563,10 @@ static int pim_ifp_create(struct interface *ifp)  		 * this is a no-op if it's already been done.  		 */  		pim_if_create_pimreg(pim); +#endif  	} +#if PIM_IPV == 4  	/*  	 * If we are a vrf device that is up, open up the pim_socket for  	 * listening @@ -1564,6 +1594,7 @@ static int pim_ifp_create(struct interface *ifp)  				"%s: Cannot enable pim on %s. MAXVIFS(%d) reached. Deleting and readding the vxlan termimation device after unconfiguring pim from other interfaces may succeed.",  				__func__, ifp->name, MAXVIFS);  	} +#endif  	return 0;  } @@ -1572,7 +1603,6 @@ static int pim_ifp_up(struct interface *ifp)  {  	struct pim_interface *pim_ifp;  	struct pim_instance *pim; -	uint32_t table_id;  	if (PIM_DEBUG_ZEBRA) {  		zlog_debug( @@ -1593,6 +1623,9 @@ static int pim_ifp_up(struct interface *ifp)  	if (pim_ifp)  		pim_ifp->pim = pim; +#if PIM_IPV == 4 +	uint32_t table_id; +  	/*  	  pim_if_addr_add_all() suffices for bringing up both IGMP and  	  PIM @@ -1621,6 +1654,7 @@ static int pim_ifp_up(struct interface *ifp)  			}  		}  	} +#endif  	return 0;  } @@ -1634,6 +1668,7 @@ static int pim_ifp_down(struct interface *ifp)  			ifp->mtu, if_is_operative(ifp));  	} +#if PIM_IPV == 4  	if (!if_is_operative(ifp)) {  		pim_ifchannel_delete_all(ifp);  		/* @@ -1656,14 +1691,13 @@ static int pim_ifp_down(struct interface *ifp)  		pim_if_del_vif(ifp);  		pim_ifstat_reset(ifp);  	} +#endif  	return 0;  }  static int pim_ifp_destroy(struct interface *ifp)  { -	struct pim_instance *pim; -  	if (PIM_DEBUG_ZEBRA) {  		zlog_debug(  			"%s: %s index %d vrf %s(%u) flags %ld metric %d mtu %d operative %d", @@ -1672,12 +1706,16 @@ static int pim_ifp_destroy(struct interface *ifp)  			ifp->mtu, if_is_operative(ifp));  	} +#if PIM_IPV == 4 +	struct pim_instance *pim; +  	if (!if_is_operative(ifp))  		pim_if_addr_del_all(ifp);  	pim = ifp->vrf->info;  	if (pim && pim->vxlan.term_if == ifp)  		pim_vxlan_del_term_dev(pim); +#endif  	return 0;  } diff --git a/pimd/pim_ifchannel.c b/pimd/pim_ifchannel.c index 3079c25a1c..76d7341a33 100644 --- a/pimd/pim_ifchannel.c +++ b/pimd/pim_ifchannel.c @@ -306,8 +306,8 @@ void pim_ifchannel_ifjoin_switch(const char *caller, struct pim_ifchannel *ch,  					 * supplying the implied  					 * if channel.  So remove it.  					 */ -					if (c_oil->oil.mfcc_ttls -						    [pim_ifp->mroute_vif_index]) +					if (oil_if_has(c_oil, +						       pim_ifp->mroute_vif_index))  						pim_channel_del_inherited_oif(  							c_oil, ch->interface,  							__func__); @@ -1287,7 +1287,7 @@ void pim_ifchannel_local_membership_del(struct interface *ifp, pim_sgaddr *sg)  			if (!pim_upstream_evaluate_join_desired_interface(  				child, ch, starch) ||  				(!chchannel && -				 c_oil->oil.mfcc_ttls[pim_ifp->mroute_vif_index])) { +				 oil_if_has(c_oil, pim_ifp->mroute_vif_index))) {  				pim_channel_del_inherited_oif(c_oil, ifp,  						__func__);  			} diff --git a/pimd/pim_igmp.h b/pimd/pim_igmp.h index b82b62ea74..5c35996634 100644 --- a/pimd/pim_igmp.h +++ b/pimd/pim_igmp.h @@ -105,6 +105,7 @@ struct gm_sock {  struct pim_interface; +#if PIM_IPV == 4  void pim_igmp_if_init(struct pim_interface *pim_ifp, struct interface *ifp);  void pim_igmp_if_reset(struct pim_interface *pim_ifp);  void pim_igmp_if_fini(struct pim_interface *pim_ifp); @@ -126,6 +127,24 @@ void pim_igmp_other_querier_timer_off(struct gm_sock *igmp);  int igmp_validate_checksum(char *igmp_msg, int igmp_msg_len); +#else /* PIM_IPV != 4 */ +static inline void pim_igmp_general_query_on(struct gm_sock *igmp) +{ +} + +static inline void pim_igmp_general_query_off(struct gm_sock *igmp) +{ +} + +static inline void pim_igmp_other_querier_timer_on(struct gm_sock *igmp) +{ +} + +static inline void pim_igmp_other_querier_timer_off(struct gm_sock *igmp) +{ +} +#endif /* PIM_IPV == 4 */ +  #define IGMP_SOURCE_MASK_FORWARDING        (1 << 0)  #define IGMP_SOURCE_MASK_DELETE            (1 << 1)  #define IGMP_SOURCE_MASK_SEND              (1 << 2) @@ -184,6 +203,7 @@ struct gm_group {  	int64_t last_igmp_v2_report_dsec;  }; +#if PIM_IPV == 4  struct gm_group *find_group_by_addr(struct gm_sock *igmp,  				    struct in_addr group_addr);  struct gm_group *igmp_add_group_by_addr(struct gm_sock *igmp, @@ -210,4 +230,11 @@ void igmp_send_query(int igmp_version, struct gm_group *group, int fd,  void igmp_group_delete(struct gm_group *group);  void igmp_send_query_on_intf(struct interface *ifp, int igmp_ver); + +#else /* PIM_IPV != 4 */ +static inline void igmp_startup_mode_on(struct gm_sock *igmp) +{ +} +#endif /* PIM_IPV != 4 */ +  #endif /* PIM_IGMP_H */ diff --git a/pimd/pim_igmp_join.h b/pimd/pim_igmp_join.h index c323902764..8027b8b94b 100644 --- a/pimd/pim_igmp_join.h +++ b/pimd/pim_igmp_join.h @@ -39,9 +39,9 @@ struct group_source_req {  };  #endif -static int pim_igmp_join_source(int fd, ifindex_t ifindex, -				struct in_addr group_addr, -				struct in_addr source_addr) +static inline int pim_igmp_join_source(int fd, ifindex_t ifindex, +				       struct in_addr group_addr, +				       struct in_addr source_addr)  {  	struct group_source_req req;  	struct sockaddr_in group; diff --git a/pimd/pim_igmp_stats.h b/pimd/pim_igmp_stats.h index 57b5cc62f4..a70a433557 100644 --- a/pimd/pim_igmp_stats.h +++ b/pimd/pim_igmp_stats.h @@ -35,7 +35,17 @@ struct igmp_stats {  	uint32_t	unsupported;  }; +#if PIM_IPV == 4  void igmp_stats_init(struct igmp_stats *stats);  void igmp_stats_add(struct igmp_stats *a, struct igmp_stats *b); +#else +static inline void igmp_stats_init(struct igmp_stats *stats) +{ +} + +static inline void igmp_stats_add(struct igmp_stats *a, struct igmp_stats *b) +{ +} +#endif  #endif /* PIM_IGMP_STATS_H */ diff --git a/pimd/pim_igmpv3.h b/pimd/pim_igmpv3.h index 7449e420e4..5041e54cb4 100644 --- a/pimd/pim_igmpv3.h +++ b/pimd/pim_igmpv3.h @@ -53,6 +53,7 @@  /* OHPI: Older Host Present Interval */  #define PIM_IGMP_OHPI_DSEC(qrv,qqi,qri_dsec) ((qrv) * (10 * (qqi)) + (qri_dsec)) +#if PIM_IPV == 4  void igmp_group_reset_gmi(struct gm_group *group);  void igmp_source_reset_gmi(struct gm_group *group, struct gm_source *source); @@ -98,4 +99,16 @@ void igmp_v3_recv_query(struct gm_sock *igmp, const char *from_str,  int igmp_v3_recv_report(struct gm_sock *igmp, struct in_addr from,  			const char *from_str, char *igmp_msg, int igmp_msg_len); +#else /* PIM_IPV != 4 */ +static inline void igmp_group_reset_gmi(struct gm_group *group) +{ +} + + +static inline void igmp_source_reset_gmi(struct gm_group *group, +					 struct gm_source *source) +{ +} +#endif +  #endif /* PIM_IGMPV3_H */ diff --git a/pimd/pim_jp_agg.c b/pimd/pim_jp_agg.c index 42ad5dcd1e..7cbd0304ae 100644 --- a/pimd/pim_jp_agg.c +++ b/pimd/pim_jp_agg.c @@ -109,6 +109,7 @@ pim_jp_agg_get_interface_upstream_switch_list(struct pim_rpf *rpf)  	struct pim_interface *pim_ifp;  	struct pim_iface_upstream_switch *pius;  	struct listnode *node, *nnode; +	pim_addr rpf_addr;  	if (!ifp)  		return NULL; @@ -119,16 +120,18 @@ pim_jp_agg_get_interface_upstream_switch_list(struct pim_rpf *rpf)  	if (!pim_ifp)  		return NULL; +	rpf_addr = pim_addr_from_prefix(&rpf->rpf_addr); +  	for (ALL_LIST_ELEMENTS(pim_ifp->upstream_switch_list, node, nnode,  			       pius)) { -		if (pius->address.s_addr == rpf->rpf_addr.u.prefix4.s_addr) +		if (!pim_addr_cmp(pius->address, rpf_addr))  			break;  	}  	if (!pius) {  		pius = XCALLOC(MTYPE_PIM_JP_AGG_GROUP,  			       sizeof(struct pim_iface_upstream_switch)); -		pius->address.s_addr = rpf->rpf_addr.u.prefix4.s_addr; +		pius->address = rpf_addr;  		pius->us = list_new();  		listnode_add_sort(pim_ifp->upstream_switch_list, pius);  	} diff --git a/pimd/pim_mlag.h b/pimd/pim_mlag.h index 996e4d473f..0555c7d3ff 100644 --- a/pimd/pim_mlag.h +++ b/pimd/pim_mlag.h @@ -28,6 +28,7 @@  #include "mlag.h"  #include "pim_iface.h" +#if PIM_IPV == 4  extern void pim_mlag_init(void);  extern void pim_mlag_terminate(void);  extern void pim_instance_mlag_init(struct pim_instance *pim); @@ -52,4 +53,49 @@ extern void pim_mlag_up_local_del(struct pim_instance *pim,  extern bool pim_mlag_up_df_role_update(struct pim_instance *pim,  				       struct pim_upstream *up, bool is_df,  				       const char *reason); +#else /* PIM_IPV == 4 */ +static inline void pim_mlag_terminate(void) +{ +} + +static inline void pim_instance_mlag_init(struct pim_instance *pim) +{ +} + +static inline void pim_instance_mlag_terminate(struct pim_instance *pim) +{ +} + +static inline void pim_if_configure_mlag_dualactive( +						struct pim_interface *pim_ifp) +{ +} + +static inline void pim_if_unconfigure_mlag_dualactive( +						struct pim_interface *pim_ifp) +{ +} + +static inline void pim_mlag_register(void) +{ +} + +static inline void pim_mlag_up_local_add(struct pim_instance *pim, +					 struct pim_upstream *upstream) +{ +} + +static inline void pim_mlag_up_local_del(struct pim_instance *pim, +					 struct pim_upstream *upstream) +{ +} + +static inline bool pim_mlag_up_df_role_update(struct pim_instance *pim, +					      struct pim_upstream *up, +					      bool is_df, const char *reason) +{ +	return false; +} +#endif +  #endif diff --git a/pimd/pim_mroute.c b/pimd/pim_mroute.c index cf9127bc91..af6f59824c 100644 --- a/pimd/pim_mroute.c +++ b/pimd/pim_mroute.c @@ -145,6 +145,7 @@ static int pim_mroute_set(struct pim_instance *pim, int enable)  	return 0;  } +#if PIM_IPV == 4  static const char *const igmpmsgtype2str[IGMPMSG_WRVIFWHOLE + 1] = {  	"<unknown_upcall?>", "NOCACHE", "WRONGVIF", "WHOLEPKT", "WRVIFWHOLE"}; @@ -227,7 +228,7 @@ static int pim_mroute_msg_nocache(int fd, struct interface *ifp,  	up->channel_oil->cc.pktcnt++;  	// resolve mfcc_parent prior to mroute_add in channel_add_oif  	if (up->rpf.source_nexthop.interface && -	    up->channel_oil->oil.mfcc_parent >= MAXVIFS) { +	    *oil_parent(up->channel_oil) >= MAXVIFS) {  		pim_upstream_mroute_iif_update(up->channel_oil, __func__);  	}  	pim_register_join(up); @@ -580,12 +581,8 @@ static int pim_mroute_msg(struct pim_instance *pim, const char *buf,  			  int buf_size, ifindex_t ifindex)  {  	struct interface *ifp; -	struct pim_interface *pim_ifp;  	const struct ip *ip_hdr;  	const struct igmpmsg *msg; -	struct in_addr ifaddr; -	struct gm_sock *igmp; -	const struct prefix *connected_src;  	if (buf_size < (int)sizeof(struct ip))  		return 0; @@ -593,6 +590,11 @@ static int pim_mroute_msg(struct pim_instance *pim, const char *buf,  	ip_hdr = (const struct ip *)buf;  	if (ip_hdr->ip_p == IPPROTO_IGMP) { +#if PIM_IPV == 4 +		struct pim_interface *pim_ifp; +		struct in_addr ifaddr; +		struct gm_sock *igmp; +		const struct prefix *connected_src;  		/* We have the IP packet but we do not know which interface this  		 * packet was @@ -632,6 +634,7 @@ static int pim_mroute_msg(struct pim_instance *pim, const char *buf,  			zlog_debug("No IGMP socket on interface: %s with connected source: %pFX",  				   ifp->name, connected_src);  		} +#endif  	} else if (ip_hdr->ip_p) {  		if (PIM_DEBUG_MROUTE_DETAIL) {  			zlog_debug( @@ -676,6 +679,14 @@ static int pim_mroute_msg(struct pim_instance *pim, const char *buf,  	return 0;  } +#else /* PIM_IPV != 4 */ + +static int pim_mroute_msg(struct pim_instance *pim, const char *buf, +			  int buf_size, ifindex_t ifindex) +{ +	return 0; +} +#endif /* PIM_IPV != 4 */  static void mroute_read(struct thread *t)  { @@ -797,7 +808,7 @@ int pim_mroute_socket_disable(struct pim_instance *pim)    would be used for multicast forwarding, a corresponding multicast    interface must be added to the kernel.   */ -int pim_mroute_add_vif(struct interface *ifp, struct in_addr ifaddr, +int pim_mroute_add_vif(struct interface *ifp, pim_addr ifaddr,  		       unsigned char flags)  {  	struct pim_interface *pim_ifp = ifp->info; @@ -836,15 +847,10 @@ int pim_mroute_add_vif(struct interface *ifp, struct in_addr ifaddr,  	err = setsockopt(pim_ifp->pim->mroute_socket, IPPROTO_IP, MRT_ADD_VIF,  			 (void *)&vc, sizeof(vc));  	if (err) { -		char ifaddr_str[INET_ADDRSTRLEN]; - -		pim_inet4_dump("<ifaddr?>", ifaddr, ifaddr_str, -			       sizeof(ifaddr_str)); -  		zlog_warn( -			"%s: failure: setsockopt(fd=%d,IPPROTO_IP,MRT_ADD_VIF,vif_index=%d,ifaddr=%s,flag=%d): errno=%d: %s", +			"%s: failure: setsockopt(fd=%d,IPPROTO_IP,MRT_ADD_VIF,vif_index=%d,ifaddr=%pPAs,flag=%d): errno=%d: %s",  			__func__, pim_ifp->pim->mroute_socket, ifp->ifindex, -			ifaddr_str, flags, errno, safe_strerror(errno)); +			&ifaddr, flags, errno, safe_strerror(errno));  		return -2;  	} @@ -918,26 +924,26 @@ bool pim_mroute_allow_iif_in_oil(struct channel_oil *c_oil,  #endif  } -static inline void pim_mroute_copy(struct mfcctl *oil, -		struct channel_oil *c_oil) +static inline void pim_mroute_copy(struct channel_oil *out, +				   struct channel_oil *in)  {  	int i; -	oil->mfcc_origin = c_oil->oil.mfcc_origin; -	oil->mfcc_mcastgrp = c_oil->oil.mfcc_mcastgrp; -	oil->mfcc_parent = c_oil->oil.mfcc_parent; +	*oil_origin(out) = *oil_origin(in); +	*oil_mcastgrp(out) = *oil_mcastgrp(in); +	*oil_parent(out) = *oil_parent(in);  	for (i = 0; i < MAXVIFS; ++i) { -		if ((oil->mfcc_parent == i) && -				!pim_mroute_allow_iif_in_oil(c_oil, i)) { -			oil->mfcc_ttls[i] = 0; +		if (*oil_parent(out) == i && +		    !pim_mroute_allow_iif_in_oil(in, i)) { +			oil_if_set(out, i, 0);  			continue;  		} -		if (c_oil->oif_flags[i] & PIM_OIF_FLAG_MUTE) -			oil->mfcc_ttls[i] = 0; +		if (in->oif_flags[i] & PIM_OIF_FLAG_MUTE) +			oil_if_set(out, i, 0);  		else -			oil->mfcc_ttls[i] = c_oil->oil.mfcc_ttls[i]; +			oil_if_set(out, i, oil_if_has(in, i));  	}  } @@ -947,7 +953,7 @@ static inline void pim_mroute_copy(struct mfcctl *oil,  static int pim_mroute_add(struct channel_oil *c_oil, const char *name)  {  	struct pim_instance *pim = c_oil->pim; -	struct mfcctl tmp_oil = { {0} }; +	struct channel_oil tmp_oil[1] = { };  	int err;  	pim->mroute_add_last = pim_time_monotonic_sec(); @@ -956,14 +962,14 @@ static int pim_mroute_add(struct channel_oil *c_oil, const char *name)  	/* Copy the oil to a temporary structure to fixup (without need to  	 * later restore) before sending the mroute add to the dataplane  	 */ -	pim_mroute_copy(&tmp_oil, c_oil); +	pim_mroute_copy(tmp_oil, c_oil);  	/* The linux kernel *expects* the incoming  	 * vif to be part of the outgoing list  	 * in the case of a (*,G).  	 */ -	if (c_oil->oil.mfcc_origin.s_addr == INADDR_ANY) { -		tmp_oil.mfcc_ttls[c_oil->oil.mfcc_parent] = 1; +	if (pim_addr_is_any(*oil_origin(c_oil))) { +		oil_if_set(tmp_oil, *oil_parent(c_oil), 1);  	}  	/* @@ -973,19 +979,19 @@ static int pim_mroute_add(struct channel_oil *c_oil, const char *name)  	 * the packets to be forwarded.  Then set it  	 * to the correct IIF afterwords.  	 */ -	if (!c_oil->installed && c_oil->oil.mfcc_origin.s_addr != INADDR_ANY -	    && c_oil->oil.mfcc_parent != 0) { -		tmp_oil.mfcc_parent = 0; +	if (!c_oil->installed && !pim_addr_is_any(*oil_origin(c_oil)) +	    && *oil_parent(c_oil) != 0) { +		*oil_parent(tmp_oil) = 0;  	}  	err = setsockopt(pim->mroute_socket, IPPROTO_IP, MRT_ADD_MFC, -			 &tmp_oil, sizeof(tmp_oil)); +			 &tmp_oil->oil, sizeof(tmp_oil->oil));  	if (!err && !c_oil->installed -	    && c_oil->oil.mfcc_origin.s_addr != INADDR_ANY -	    && c_oil->oil.mfcc_parent != 0) { -		tmp_oil.mfcc_parent = c_oil->oil.mfcc_parent; +	    && !pim_addr_is_any(*oil_origin(c_oil)) +	    && *oil_parent(c_oil) != 0) { +		*oil_parent(tmp_oil) = *oil_parent(c_oil);  		err = setsockopt(pim->mroute_socket, IPPROTO_IP, MRT_ADD_MFC, -				 &tmp_oil, sizeof(tmp_oil)); +				 &tmp_oil->oil, sizeof(tmp_oil->oil));  	}  	if (err) { @@ -1040,7 +1046,7 @@ static int pim_upstream_mroute_update(struct channel_oil *c_oil,  {  	char buf[1000]; -	if (c_oil->oil.mfcc_parent >= MAXVIFS) { +	if (*oil_parent(c_oil) >= MAXVIFS) {  		/* the c_oil cannot be installed as a mroute yet */  		if (PIM_DEBUG_MROUTE)  			zlog_debug( @@ -1087,13 +1093,13 @@ int pim_upstream_mroute_add(struct channel_oil *c_oil, const char *name)  	iif = pim_upstream_get_mroute_iif(c_oil, name); -	if (c_oil->oil.mfcc_parent != iif) { -		c_oil->oil.mfcc_parent = iif; -		if (c_oil->oil.mfcc_origin.s_addr == INADDR_ANY && +	if (*oil_parent(c_oil) != iif) { +		*oil_parent(c_oil) = iif; +		if (pim_addr_is_any(*oil_origin(c_oil)) &&  				c_oil->up)  			pim_upstream_all_sources_iif_update(c_oil->up);  	} else { -		c_oil->oil.mfcc_parent = iif; +		*oil_parent(c_oil) = iif;  	}  	return pim_upstream_mroute_update(c_oil, name); @@ -1108,13 +1114,13 @@ int pim_upstream_mroute_iif_update(struct channel_oil *c_oil, const char *name)  	char buf[1000];  	iif = pim_upstream_get_mroute_iif(c_oil, name); -	if (c_oil->oil.mfcc_parent == iif) { +	if (*oil_parent(c_oil) == iif) {  		/* no change */  		return 0;  	} -	c_oil->oil.mfcc_parent = iif; +	*oil_parent(c_oil) = iif; -	if (c_oil->oil.mfcc_origin.s_addr == INADDR_ANY && +	if (pim_addr_is_any(*oil_origin(c_oil)) &&  			c_oil->up)  		pim_upstream_all_sources_iif_update(c_oil->up); @@ -1137,10 +1143,10 @@ void pim_static_mroute_iif_update(struct channel_oil *c_oil,  				int input_vif_index,  				const char *name)  { -	if (c_oil->oil.mfcc_parent == input_vif_index) +	if (*oil_parent(c_oil) == input_vif_index)  		return; -	c_oil->oil.mfcc_parent = input_vif_index; +	*oil_parent(c_oil) = input_vif_index;  	if (input_vif_index == MAXVIFS)  		pim_mroute_del(c_oil, name);  	else @@ -1160,7 +1166,7 @@ int pim_mroute_del(struct channel_oil *c_oil, const char *name)  			char buf[1000];  			zlog_debug(  				"%s %s: vifi %d for route is %s not installed, do not need to send del req. ", -				__FILE__, __func__, c_oil->oil.mfcc_parent, +				__FILE__, __func__, *oil_parent(c_oil),  				pim_channel_oil_dump(c_oil, buf, sizeof(buf)));  		}  		return -2; @@ -1193,7 +1199,6 @@ int pim_mroute_del(struct channel_oil *c_oil, const char *name)  void pim_mroute_update_counters(struct channel_oil *c_oil)  {  	struct pim_instance *pim = c_oil->pim; -	struct sioc_sg_req sgreq;  	c_oil->cc.oldpktcnt = c_oil->cc.pktcnt;  	c_oil->cc.oldbytecnt = c_oil->cc.bytecnt; @@ -1204,24 +1209,27 @@ void pim_mroute_update_counters(struct channel_oil *c_oil)  		if (PIM_DEBUG_MROUTE) {  			pim_sgaddr sg; -			sg.src = c_oil->oil.mfcc_origin; -			sg.grp = c_oil->oil.mfcc_mcastgrp; +			sg.src = *oil_origin(c_oil); +			sg.grp = *oil_mcastgrp(c_oil);  			zlog_debug("Channel%pSG is not installed no need to collect data from kernel",  				   &sg);  		}  		return;  	} +#if PIM_IPV == 4 +	struct sioc_sg_req sgreq; +  	memset(&sgreq, 0, sizeof(sgreq)); -	sgreq.src = c_oil->oil.mfcc_origin; -	sgreq.grp = c_oil->oil.mfcc_mcastgrp; +	sgreq.src = *oil_origin(c_oil); +	sgreq.grp = *oil_mcastgrp(c_oil);  	pim_zlookup_sg_statistics(c_oil);  	if (ioctl(pim->mroute_socket, SIOCGETSGCNT, &sgreq)) {  		pim_sgaddr sg; -		sg.src = c_oil->oil.mfcc_origin; -		sg.grp = c_oil->oil.mfcc_mcastgrp; +		sg.src = *oil_origin(c_oil); +		sg.grp = *oil_mcastgrp(c_oil);  		zlog_warn("ioctl(SIOCGETSGCNT=%lu) failure for (S,G)=%pSG: errno=%d: %s",  			  (unsigned long)SIOCGETSGCNT, &sg, @@ -1232,6 +1240,6 @@ void pim_mroute_update_counters(struct channel_oil *c_oil)  	c_oil->cc.pktcnt = sgreq.pktcnt;  	c_oil->cc.bytecnt = sgreq.bytecnt;  	c_oil->cc.wrong_if = sgreq.wrong_if; - +#endif  	return;  } diff --git a/pimd/pim_mroute.h b/pimd/pim_mroute.h index 4cd6b9f0ac..14b0a8ccaf 100644 --- a/pimd/pim_mroute.h +++ b/pimd/pim_mroute.h @@ -37,6 +37,7 @@  #define PIM_MROUTE_MIN_TTL (1) +#if PIM_IPV == 4  #if defined(HAVE_LINUX_MROUTE_H)  #include <linux/mroute.h>  #else @@ -157,6 +158,19 @@ struct igmpmsg {  	struct in_addr im_src, im_dst;  };  #endif + +#endif /* HAVE_LINUX_MROUTE_H */ + +typedef struct mfcctl pim_mfcctl; + +#else /* PIM_IPV != 4 */ +#if defined(HAVE_LINUX_MROUTE6_H) +#include <linux/mroute6.h> +#endif + +typedef struct mf6cctl pim_mfcctl; + +#define MAXVIFS IF_SETSIZE  #endif  #ifndef IGMPMSG_WRVIFWHOLE @@ -172,7 +186,7 @@ struct channel_oil;  int pim_mroute_socket_enable(struct pim_instance *pim);  int pim_mroute_socket_disable(struct pim_instance *pim); -int pim_mroute_add_vif(struct interface *ifp, struct in_addr ifaddr, +int pim_mroute_add_vif(struct interface *ifp, pim_addr ifaddr,  		       unsigned char flags);  int pim_mroute_del_vif(struct interface *ifp); diff --git a/pimd/pim_msg.c b/pimd/pim_msg.c index e25cf11549..a0653e1a57 100644 --- a/pimd/pim_msg.c +++ b/pimd/pim_msg.c @@ -138,7 +138,7 @@ uint8_t *pim_msg_addr_encode_ipv6_group(uint8_t *buf, struct in6_addr addr)  	return buf;  } -#if PIM_IPV == 4 || !defined(PIM_V6_TEMP_BREAK) +#if PIM_IPV == 4  #define pim_msg_addr_encode(what) pim_msg_addr_encode_ipv4_##what  #else  #define pim_msg_addr_encode(what) pim_msg_addr_encode_ipv6_##what diff --git a/pimd/pim_nb_config.c b/pimd/pim_nb_config.c index 8a78489ae0..27cac0c1a7 100644 --- a/pimd/pim_nb_config.c +++ b/pimd/pim_nb_config.c @@ -46,9 +46,13 @@ int funcname(struct argtype *args)                                             \  }                                                                              \  MACRO_REQUIRE_SEMICOLON() +#define yang_dnode_get_pimaddr yang_dnode_get_ipv6 +  #else /* PIM_IPV != 6 */  #define pim6_msdp_err(funcname, argtype)                                       \  MACRO_REQUIRE_SEMICOLON() + +#define yang_dnode_get_pimaddr yang_dnode_get_ipv4  #endif /* PIM_IPV != 6 */  static void pim_if_membership_clear(struct interface *ifp) @@ -173,8 +177,7 @@ static int pim_cmd_interface_delete(struct interface *ifp)  }  static int interface_pim_use_src_cmd_worker(struct interface *ifp, -		struct in_addr source_addr, -		char *errmsg, size_t errmsg_len) +		pim_addr source_addr, char *errmsg, size_t errmsg_len)  {  	int result;  	int ret = NB_OK; @@ -397,15 +400,10 @@ static void igmp_sock_query_interval_reconfig(struct gm_sock *igmp)  	ifp = igmp->interface;  	pim_ifp = ifp->info; -	if (PIM_DEBUG_IGMP_TRACE) { -		char ifaddr_str[INET_ADDRSTRLEN]; - -		pim_inet4_dump("<ifaddr?>", igmp->ifaddr, ifaddr_str, -			       sizeof(ifaddr_str)); -		zlog_debug("%s: Querier %s on %s reconfig query_interval=%d", -			   __func__, ifaddr_str, ifp->name, +	if (PIM_DEBUG_IGMP_TRACE) +		zlog_debug("%s: Querier %pPAs on %s reconfig query_interval=%d", +			   __func__, &igmp->ifaddr, ifp->name,  			   pim_ifp->gm_default_query_interval); -	}  	/*  	 * igmp_startup_mode_on() will reset QQI: @@ -2016,7 +2014,7 @@ int lib_interface_pim_address_family_use_source_modify(  	struct nb_cb_modify_args *args)  {  	struct interface *ifp; -	struct ipaddr source_addr; +	pim_addr source_addr;  	int result;  	const struct lyd_node *if_dnode; @@ -2034,10 +2032,14 @@ int lib_interface_pim_address_family_use_source_modify(  		break;  	case NB_EV_APPLY:  		ifp = nb_running_get_entry(args->dnode, NULL, true); -		yang_dnode_get_ip(&source_addr, args->dnode, NULL); +#if PIM_IPV == 4 +		yang_dnode_get_ipv4(&source_addr, args->dnode, NULL); +#else +		yang_dnode_get_ipv6(&source_addr, args->dnode, NULL); +#endif  		result = interface_pim_use_src_cmd_worker( -				ifp, source_addr.ip._v4_addr, +				ifp, source_addr,  				args->errmsg, args->errmsg_len);  		if (result != PIM_SUCCESS) @@ -2053,7 +2055,6 @@ int lib_interface_pim_address_family_use_source_destroy(  	struct nb_cb_destroy_args *args)  {  	struct interface *ifp; -	struct in_addr source_addr = {INADDR_ANY};  	int result;  	const struct lyd_node *if_dnode; @@ -2072,7 +2073,7 @@ int lib_interface_pim_address_family_use_source_destroy(  	case NB_EV_APPLY:  		ifp = nb_running_get_entry(args->dnode, NULL, true); -		result = interface_pim_use_src_cmd_worker(ifp, source_addr, +		result = interface_pim_use_src_cmd_worker(ifp, PIMADDR_ANY,  				args->errmsg,  				args->errmsg_len); @@ -2180,8 +2181,8 @@ int lib_interface_pim_address_family_mroute_destroy(  	struct interface *iif;  	struct interface *oif;  	const char *oifname; -	struct ipaddr source_addr; -	struct ipaddr group_addr; +	pim_addr source_addr; +	pim_addr group_addr;  	const struct lyd_node *if_dnode;  	switch (args->event) { @@ -2211,11 +2212,10 @@ int lib_interface_pim_address_family_mroute_destroy(  			return NB_ERR_INCONSISTENCY;  		} -		yang_dnode_get_ip(&source_addr, args->dnode, "./source-addr"); -		yang_dnode_get_ip(&group_addr, args->dnode, "./group-addr"); +		yang_dnode_get_pimaddr(&source_addr, args->dnode, "./source-addr"); +		yang_dnode_get_pimaddr(&group_addr, args->dnode, "./group-addr"); -		if (pim_static_del(pim, iif, oif, group_addr.ip._v4_addr, -					source_addr.ip._v4_addr)) { +		if (pim_static_del(pim, iif, oif, group_addr, source_addr)) {  			snprintf(args->errmsg, args->errmsg_len,  					"Failed to remove static mroute");  			return NB_ERR_INCONSISTENCY; @@ -2238,8 +2238,8 @@ int lib_interface_pim_address_family_mroute_oif_modify(  	struct interface *iif;  	struct interface *oif;  	const char *oifname; -	struct ipaddr source_addr; -	struct ipaddr group_addr; +	pim_addr source_addr; +	pim_addr group_addr;  	const struct lyd_node *if_dnode;  	switch (args->event) { @@ -2288,11 +2288,10 @@ int lib_interface_pim_address_family_mroute_oif_modify(  			return NB_ERR_INCONSISTENCY;  		} -		yang_dnode_get_ip(&source_addr, args->dnode, "../source-addr"); -		yang_dnode_get_ip(&group_addr, args->dnode, "../group-addr"); +		yang_dnode_get_pimaddr(&source_addr, args->dnode, "../source-addr"); +		yang_dnode_get_pimaddr(&group_addr, args->dnode, "../group-addr"); -		if (pim_static_add(pim, iif, oif, group_addr.ip._v4_addr, -				   source_addr.ip._v4_addr)) { +		if (pim_static_add(pim, iif, oif, group_addr, source_addr)) {  			snprintf(args->errmsg, args->errmsg_len,  				 "Failed to add static mroute");  			return NB_ERR_INCONSISTENCY; diff --git a/pimd/pim_nht.c b/pimd/pim_nht.c index 2e690d85f6..a494968e91 100644 --- a/pimd/pim_nht.c +++ b/pimd/pim_nht.c @@ -361,7 +361,7 @@ bool pim_nht_bsr_rpf_check(struct pim_instance *pim, struct in_addr bsr_addr,  		pim_addr nhaddr;  		switch (nh->type) { -#if PIM_IPV == 4 || !defined(PIM_V6_TEMP_BREAK) +#if PIM_IPV == 4  		case NEXTHOP_TYPE_IPV4:  			if (nh->ifindex == IFINDEX_INTERNAL)  				continue; @@ -605,7 +605,7 @@ static int pim_ecmp_nexthop_search(struct pim_instance *pim,  		ifps[i] =  			if_lookup_by_index(nh_node->ifindex, pim->vrf->vrf_id);  		if (ifps[i]) { -#if PIM_IPV == 4 || !defined(PIM_V6_TEMP_BREAK) +#if PIM_IPV == 4  			pim_addr nhaddr = nh_node->gate.ipv4;  #else  			pim_addr nhaddr = nh_node->gate.ipv6; @@ -798,7 +798,7 @@ int pim_parse_nexthop_update(ZAPI_CALLBACK_ARGS)  					nbr = pim_neighbor_find_if(ifp1);  				/* Overwrite with Nbr address as NH addr */  				if (nbr) -#if PIM_IPV == 4 || !defined(PIM_V6_TEMP_BREAK) +#if PIM_IPV == 4  					nexthop->gate.ipv4 = nbr->source_addr;  #else  					nexthop->gate.ipv6 = nbr->source_addr; diff --git a/pimd/pim_oil.c b/pimd/pim_oil.c index b17f821dd6..a499c884b4 100644 --- a/pimd/pim_oil.c +++ b/pimd/pim_oil.c @@ -42,15 +42,15 @@ char *pim_channel_oil_dump(struct channel_oil *c_oil, char *buf, size_t size)  	pim_sgaddr sg;  	int i; -	sg.src = c_oil->oil.mfcc_origin; -	sg.grp = c_oil->oil.mfcc_mcastgrp; -	ifp = pim_if_find_by_vif_index(c_oil->pim, c_oil->oil.mfcc_parent); +	sg.src = *oil_origin(c_oil); +	sg.grp = *oil_mcastgrp(c_oil); +	ifp = pim_if_find_by_vif_index(c_oil->pim, *oil_parent(c_oil));  	snprintfrr(buf, size, "%pSG IIF: %s, OIFS: ", &sg,  		   ifp ? ifp->name : "(?)");  	out = buf + strlen(buf);  	for (i = 0; i < MAXVIFS; i++) { -		if (c_oil->oil.mfcc_ttls[i] != 0) { +		if (oil_if_has(c_oil, i) != 0) {  			ifp = pim_if_find_by_vif_index(c_oil->pim, i);  			snprintf(out, buf + size - out, "%s ",  				 ifp ? ifp->name : "(?)"); @@ -61,25 +61,19 @@ char *pim_channel_oil_dump(struct channel_oil *c_oil, char *buf, size_t size)  	return buf;  } -int pim_channel_oil_compare(const struct channel_oil *c1, -			    const struct channel_oil *c2) +int pim_channel_oil_compare(const struct channel_oil *cc1, +			    const struct channel_oil *cc2)  { -	if (ntohl(c1->oil.mfcc_mcastgrp.s_addr) -	    < ntohl(c2->oil.mfcc_mcastgrp.s_addr)) -		return -1; - -	if (ntohl(c1->oil.mfcc_mcastgrp.s_addr) -	    > ntohl(c2->oil.mfcc_mcastgrp.s_addr)) -		return 1; - -	if (ntohl(c1->oil.mfcc_origin.s_addr) -	    < ntohl(c2->oil.mfcc_origin.s_addr)) -		return -1; - -	if (ntohl(c1->oil.mfcc_origin.s_addr) -	    > ntohl(c2->oil.mfcc_origin.s_addr)) -		return 1; - +	struct channel_oil *c1 = (struct channel_oil *)cc1; +	struct channel_oil *c2 = (struct channel_oil *)cc2; +	int rv; + +	rv = pim_addr_cmp(*oil_mcastgrp(c1), *oil_mcastgrp(c2)); +	if (rv) +		return rv; +	rv = pim_addr_cmp(*oil_origin(c1), *oil_origin(c2)); +	if (rv) +		return rv;  	return 0;  } @@ -109,8 +103,8 @@ struct channel_oil *pim_find_channel_oil(struct pim_instance *pim,  	struct channel_oil *c_oil = NULL;  	struct channel_oil lookup; -	lookup.oil.mfcc_mcastgrp = sg->grp; -	lookup.oil.mfcc_origin = sg->src; +	*oil_mcastgrp(&lookup) = sg->grp; +	*oil_origin(&lookup) = sg->src;  	c_oil = rb_pim_oil_find(&pim->channel_oil_head, &lookup); @@ -151,10 +145,10 @@ struct channel_oil *pim_channel_oil_add(struct pim_instance *pim,  	c_oil = XCALLOC(MTYPE_PIM_CHANNEL_OIL, sizeof(*c_oil)); -	c_oil->oil.mfcc_mcastgrp = sg->grp; -	c_oil->oil.mfcc_origin = sg->src; +	*oil_mcastgrp(c_oil) = sg->grp; +	*oil_origin(c_oil) = sg->src; -	c_oil->oil.mfcc_parent = MAXVIFS; +	*oil_parent(c_oil) = MAXVIFS;  	c_oil->oil_ref_count = 1;  	c_oil->installed = 0;  	c_oil->up = pim_upstream_find(pim, sg); @@ -172,8 +166,8 @@ struct channel_oil *pim_channel_oil_del(struct channel_oil *c_oil,  					const char *name)  {  	if (PIM_DEBUG_MROUTE) { -		pim_sgaddr sg = {.src = c_oil->oil.mfcc_mcastgrp, -				 .grp = c_oil->oil.mfcc_origin}; +		pim_sgaddr sg = {.src = *oil_mcastgrp(c_oil), +				 .grp = *oil_origin(c_oil)};  		zlog_debug(  			"%s(%s): Del oil for %pSG, Ref Count: %d (Predecrement)", @@ -228,23 +222,15 @@ int pim_channel_del_oif(struct channel_oil *channel_oil, struct interface *oif,  	 */  	if (!(channel_oil->oif_flags[pim_ifp->mroute_vif_index] & proto_mask)) {  		if (PIM_DEBUG_MROUTE) { -			char group_str[INET_ADDRSTRLEN]; -			char source_str[INET_ADDRSTRLEN]; -			pim_inet4_dump("<group?>", -				       channel_oil->oil.mfcc_mcastgrp, -				       group_str, sizeof(group_str)); -			pim_inet4_dump("<source?>", -				       channel_oil->oil.mfcc_origin, source_str, -				       sizeof(source_str));  			zlog_debug( -				"%s %s: no existing protocol mask %u(%u) for requested OIF %s (vif_index=%d, min_ttl=%d) for channel (S,G)=(%s,%s)", +				"%s %s: no existing protocol mask %u(%u) for requested OIF %s (vif_index=%d, min_ttl=%d) for channel (S,G)=(%pPAs,%pPAs)",  				__FILE__, __func__, proto_mask,  				channel_oil  					->oif_flags[pim_ifp->mroute_vif_index],  				oif->name, pim_ifp->mroute_vif_index, -				channel_oil->oil -					.mfcc_ttls[pim_ifp->mroute_vif_index], -				source_str, group_str); +				oil_if_has(channel_oil, pim_ifp->mroute_vif_index), +				oil_origin(channel_oil), +				oil_mcastgrp(channel_oil));  		}  		return 0;  	} @@ -254,44 +240,29 @@ int pim_channel_del_oif(struct channel_oil *channel_oil, struct interface *oif,  	if (channel_oil->oif_flags[pim_ifp->mroute_vif_index] &  			PIM_OIF_FLAG_PROTO_ANY) {  		if (PIM_DEBUG_MROUTE) { -			char group_str[INET_ADDRSTRLEN]; -			char source_str[INET_ADDRSTRLEN]; -			pim_inet4_dump("<group?>", -				       channel_oil->oil.mfcc_mcastgrp, -				       group_str, sizeof(group_str)); -			pim_inet4_dump("<source?>", -				       channel_oil->oil.mfcc_origin, source_str, -				       sizeof(source_str));  			zlog_debug( -				"%s %s: other protocol masks remain for requested OIF %s (vif_index=%d, min_ttl=%d) for channel (S,G)=(%s,%s)", +				"%s %s: other protocol masks remain for requested OIF %s (vif_index=%d, min_ttl=%d) for channel (S,G)=(%pPAs,%pPAs)",  				__FILE__, __func__, oif->name,  				pim_ifp->mroute_vif_index, -				channel_oil->oil -					.mfcc_ttls[pim_ifp->mroute_vif_index], -				source_str, group_str); +				oil_if_has(channel_oil, pim_ifp->mroute_vif_index), +				oil_origin(channel_oil), +				oil_mcastgrp(channel_oil));  		}  		return 0;  	} -	channel_oil->oil.mfcc_ttls[pim_ifp->mroute_vif_index] = 0; +	oil_if_set(channel_oil, pim_ifp->mroute_vif_index, false);  	/* clear mute; will be re-evaluated when the OIF becomes valid again */  	channel_oil->oif_flags[pim_ifp->mroute_vif_index] &= ~PIM_OIF_FLAG_MUTE;  	if (pim_upstream_mroute_add(channel_oil, __func__)) {  		if (PIM_DEBUG_MROUTE) { -			char group_str[INET_ADDRSTRLEN]; -			char source_str[INET_ADDRSTRLEN]; -			pim_inet4_dump("<group?>", -				       channel_oil->oil.mfcc_mcastgrp, -				       group_str, sizeof(group_str)); -			pim_inet4_dump("<source?>", -				       channel_oil->oil.mfcc_origin, source_str, -				       sizeof(source_str));  			zlog_debug( -				"%s %s: could not remove output interface %s (vif_index=%d) for channel (S,G)=(%s,%s)", +				"%s %s: could not remove output interface %s (vif_index=%d) for channel (S,G)=(%pPAs,%pPAs)",  				__FILE__, __func__, oif->name, -				pim_ifp->mroute_vif_index, source_str, -				group_str); +				pim_ifp->mroute_vif_index, +				oil_origin(channel_oil), +				oil_mcastgrp(channel_oil));  		}  		return -1;  	} @@ -299,16 +270,12 @@ int pim_channel_del_oif(struct channel_oil *channel_oil, struct interface *oif,  	--channel_oil->oil_size;  	if (PIM_DEBUG_MROUTE) { -		char group_str[INET_ADDRSTRLEN]; -		char source_str[INET_ADDRSTRLEN]; -		pim_inet4_dump("<group?>", channel_oil->oil.mfcc_mcastgrp, -			       group_str, sizeof(group_str)); -		pim_inet4_dump("<source?>", channel_oil->oil.mfcc_origin, -			       source_str, sizeof(source_str));  		zlog_debug( -			"%s(%s): (S,G)=(%s,%s): proto_mask=%u IIF:%d OIF=%s vif_index=%d", -			__func__, caller, source_str, group_str, proto_mask, -			channel_oil->oil.mfcc_parent, oif->name, +			"%s(%s): (S,G)=(%pPAs,%pPAs): proto_mask=%u IIF:%d OIF=%s vif_index=%d", +			__func__, caller, oil_origin(channel_oil), +			oil_mcastgrp(channel_oil), +			proto_mask, +			*oil_parent(channel_oil), oif->name,  			pim_ifp->mroute_vif_index);  	} @@ -397,7 +364,7 @@ void pim_channel_update_oif_mute(struct channel_oil *c_oil,  	bool new_mute;  	/* If pim_ifp is not a part of the OIL there is nothing to do */ -	if (!c_oil->oil.mfcc_ttls[pim_ifp->mroute_vif_index]) +	if (!oil_if_has(c_oil, pim_ifp->mroute_vif_index))  		return;  	old_mute = !!(c_oil->oif_flags[pim_ifp->mroute_vif_index] & @@ -455,21 +422,13 @@ int pim_channel_add_oif(struct channel_oil *channel_oil, struct interface *oif,  	   channel (S,G) multiple times */  	if (channel_oil->oif_flags[pim_ifp->mroute_vif_index] & proto_mask) {  		if (PIM_DEBUG_MROUTE) { -			char group_str[INET_ADDRSTRLEN]; -			char source_str[INET_ADDRSTRLEN]; -			pim_inet4_dump("<group?>", -				       channel_oil->oil.mfcc_mcastgrp, -				       group_str, sizeof(group_str)); -			pim_inet4_dump("<source?>", -				       channel_oil->oil.mfcc_origin, source_str, -				       sizeof(source_str));  			zlog_debug( -				"%s %s: existing protocol mask %u requested OIF %s (vif_index=%d, min_ttl=%d) for channel (S,G)=(%s,%s)", +				"%s %s: existing protocol mask %u requested OIF %s (vif_index=%d, min_ttl=%d) for channel (S,G)=(%pPAs,%pPAs)",  				__FILE__, __func__, proto_mask, oif->name,  				pim_ifp->mroute_vif_index, -				channel_oil->oil -					.mfcc_ttls[pim_ifp->mroute_vif_index], -				source_str, group_str); +				oil_if_has(channel_oil, pim_ifp->mroute_vif_index), +				oil_origin(channel_oil), +				oil_mcastgrp(channel_oil));  		}  		return -3;  	} @@ -487,36 +446,21 @@ int pim_channel_add_oif(struct channel_oil *channel_oil, struct interface *oif,  		channel_oil->oif_flags[pim_ifp->mroute_vif_index] |= proto_mask;  		/* Check the OIF really exists before returning, and only log  		   warning otherwise */ -		if (channel_oil->oil.mfcc_ttls[pim_ifp->mroute_vif_index] < 1) { -			char group_str[INET_ADDRSTRLEN]; -			char source_str[INET_ADDRSTRLEN]; -			pim_inet4_dump("<group?>", -				       channel_oil->oil.mfcc_mcastgrp, -				       group_str, sizeof(group_str)); -			pim_inet4_dump("<source?>", -				       channel_oil->oil.mfcc_origin, source_str, -				       sizeof(source_str)); +		if (oil_if_has(channel_oil, pim_ifp->mroute_vif_index) < 1) {  			zlog_warn( -				"%s %s: new protocol mask %u requested nonexistent OIF %s (vif_index=%d, min_ttl=%d) for channel (S,G)=(%s,%s)", +				"%s %s: new protocol mask %u requested nonexistent OIF %s (vif_index=%d, min_ttl=%d) for channel (S,G)=(%pPAs,%pPAs)",  				__FILE__, __func__, proto_mask, oif->name,  				pim_ifp->mroute_vif_index, -				channel_oil->oil -					.mfcc_ttls[pim_ifp->mroute_vif_index], -				source_str, group_str); +				oil_if_has(channel_oil, pim_ifp->mroute_vif_index), +				oil_origin(channel_oil), +				oil_mcastgrp(channel_oil));  		}  		if (PIM_DEBUG_MROUTE) { -			char group_str[INET_ADDRSTRLEN]; -			char source_str[INET_ADDRSTRLEN]; -			pim_inet4_dump("<group?>", -				       channel_oil->oil.mfcc_mcastgrp, -				       group_str, sizeof(group_str)); -			pim_inet4_dump("<source?>", -				       channel_oil->oil.mfcc_origin, source_str, -				       sizeof(source_str));  			zlog_debug( -				"%s(%s): (S,G)=(%s,%s): proto_mask=%u OIF=%s vif_index=%d added to 0x%x", -				__func__, caller, source_str, group_str, +				"%s(%s): (S,G)=(%pPAs,%pPAs): proto_mask=%u OIF=%s vif_index=%d added to 0x%x", +				__func__, caller, oil_origin(channel_oil), +				oil_mcastgrp(channel_oil),  				proto_mask, oif->name,  				pim_ifp->mroute_vif_index,  				channel_oil @@ -525,29 +469,21 @@ int pim_channel_add_oif(struct channel_oil *channel_oil, struct interface *oif,  		return 0;  	} -	old_ttl = channel_oil->oil.mfcc_ttls[pim_ifp->mroute_vif_index]; +	old_ttl = oil_if_has(channel_oil, pim_ifp->mroute_vif_index);  	if (old_ttl > 0) {  		if (PIM_DEBUG_MROUTE) { -			char group_str[INET_ADDRSTRLEN]; -			char source_str[INET_ADDRSTRLEN]; -			pim_inet4_dump("<group?>", -				       channel_oil->oil.mfcc_mcastgrp, -				       group_str, sizeof(group_str)); -			pim_inet4_dump("<source?>", -				       channel_oil->oil.mfcc_origin, source_str, -				       sizeof(source_str));  			zlog_debug( -				"%s %s: interface %s (vif_index=%d) is existing output for channel (S,G)=(%s,%s)", +				"%s %s: interface %s (vif_index=%d) is existing output for channel (S,G)=(%pPAs,%pPAs)",  				__FILE__, __func__, oif->name, -				pim_ifp->mroute_vif_index, source_str, -				group_str); +				pim_ifp->mroute_vif_index, +				oil_origin(channel_oil), +				oil_mcastgrp(channel_oil));  		}  		return -4;  	} -	channel_oil->oil.mfcc_ttls[pim_ifp->mroute_vif_index] = -		PIM_MROUTE_MIN_TTL; +	oil_if_set(channel_oil, pim_ifp->mroute_vif_index, PIM_MROUTE_MIN_TTL);  	/* Some OIFs are held in a muted state i.e. the PIM state machine  	 * decided to include the OIF but additional status check such as @@ -564,26 +500,19 @@ int pim_channel_add_oif(struct channel_oil *channel_oil, struct interface *oif,  	/* channel_oil->oil.mfcc_parent != MAXVIFS indicate this entry is not  	 * valid to get installed in kernel.  	 */ -	if (channel_oil->oil.mfcc_parent != MAXVIFS) { +	if (*oil_parent(channel_oil) != MAXVIFS) {  		if (pim_upstream_mroute_add(channel_oil, __func__)) {  			if (PIM_DEBUG_MROUTE) { -				char group_str[INET_ADDRSTRLEN]; -				char source_str[INET_ADDRSTRLEN]; -				pim_inet4_dump("<group?>", -				      channel_oil->oil.mfcc_mcastgrp, -				      group_str, sizeof(group_str)); -				pim_inet4_dump("<source?>", -				      channel_oil->oil.mfcc_origin, source_str, -				      sizeof(source_str));  				zlog_debug( -					"%s %s: could not add output interface %s (vif_index=%d) for channel (S,G)=(%s,%s)", +					"%s %s: could not add output interface %s (vif_index=%d) for channel (S,G)=(%pPAs,%pPAs)",  					__FILE__, __func__, oif->name, -					pim_ifp->mroute_vif_index, source_str, -					group_str); +					pim_ifp->mroute_vif_index, +					oil_origin(channel_oil), +					oil_mcastgrp(channel_oil));  			} -			channel_oil->oil.mfcc_ttls[pim_ifp->mroute_vif_index] -				= old_ttl; +			oil_if_set(channel_oil, pim_ifp->mroute_vif_index, +				   old_ttl);  			return -5;  		}  	} @@ -594,15 +523,11 @@ int pim_channel_add_oif(struct channel_oil *channel_oil, struct interface *oif,  	channel_oil->oif_flags[pim_ifp->mroute_vif_index] |= proto_mask;  	if (PIM_DEBUG_MROUTE) { -		char group_str[INET_ADDRSTRLEN]; -		char source_str[INET_ADDRSTRLEN]; -		pim_inet4_dump("<group?>", channel_oil->oil.mfcc_mcastgrp, -			       group_str, sizeof(group_str)); -		pim_inet4_dump("<source?>", channel_oil->oil.mfcc_origin, -			       source_str, sizeof(source_str));  		zlog_debug( -			"%s(%s): (S,G)=(%s,%s): proto_mask=%u OIF=%s vif_index=%d: DONE", -			__func__, caller, source_str, group_str, proto_mask, +			"%s(%s): (S,G)=(%pPAs,%pPAs): proto_mask=%u OIF=%s vif_index=%d: DONE", +			__func__, caller, oil_origin(channel_oil), +			oil_mcastgrp(channel_oil), +			proto_mask,  			oif->name, pim_ifp->mroute_vif_index);  	} @@ -611,8 +536,6 @@ int pim_channel_add_oif(struct channel_oil *channel_oil, struct interface *oif,  int pim_channel_oil_empty(struct channel_oil *c_oil)  { -	static struct mfcctl null_oil; -  	if (!c_oil)  		return 1; @@ -620,6 +543,13 @@ int pim_channel_oil_empty(struct channel_oil *c_oil)  	 * non-NULL.  	 * pimreg device (in all vrfs) uses a vifi of  	 * 0 (PIM_OIF_PIM_REGISTER_VIF) so we simply mfcc_ttls[0] */ +#if PIM_IPV == 4 +	static pim_mfcctl null_oil; +  	return !memcmp(&c_oil->oil.mfcc_ttls[1], &null_oil.mfcc_ttls[1],  		sizeof(null_oil.mfcc_ttls) - sizeof(null_oil.mfcc_ttls[0])); +#else +	CPP_NOTICE("FIXME STUB"); +	return false; +#endif  } diff --git a/pimd/pim_oil.h b/pimd/pim_oil.h index 696ef70645..a52e23351e 100644 --- a/pimd/pim_oil.h +++ b/pimd/pim_oil.h @@ -98,7 +98,7 @@ struct channel_oil {  	struct rb_pim_oil_item oil_rb; -	struct mfcctl oil; +	pim_mfcctl oil;  	int installed;  	int oil_inherited_rescan;  	int oil_size; @@ -110,6 +110,61 @@ struct channel_oil {  	time_t mroute_creation;  }; +#if PIM_IPV == 4 +static inline pim_addr *oil_origin(struct channel_oil *c_oil) +{ +	return &c_oil->oil.mfcc_origin; +} + +static inline pim_addr *oil_mcastgrp(struct channel_oil *c_oil) +{ +	return &c_oil->oil.mfcc_mcastgrp; +} + +static inline vifi_t *oil_parent(struct channel_oil *c_oil) +{ +	return &c_oil->oil.mfcc_parent; +} + +static inline uint8_t oil_if_has(struct channel_oil *c_oil, vifi_t ifi) +{ +	return c_oil->oil.mfcc_ttls[ifi]; +} + +static inline void oil_if_set(struct channel_oil *c_oil, vifi_t ifi, uint8_t set) +{ +	c_oil->oil.mfcc_ttls[ifi] = set; +} +#else +static inline pim_addr *oil_origin(struct channel_oil *c_oil) +{ +	return &c_oil->oil.mf6cc_origin.sin6_addr; +} + +static inline pim_addr *oil_mcastgrp(struct channel_oil *c_oil) +{ +	return &c_oil->oil.mf6cc_mcastgrp.sin6_addr; +} + +static inline mifi_t *oil_parent(struct channel_oil *c_oil) +{ +	return &c_oil->oil.mf6cc_parent; +} + +static inline bool oil_if_has(struct channel_oil *c_oil, mifi_t ifi) +{ +	return !!IF_ISSET(ifi, &c_oil->oil.mf6cc_ifset); +} + +static inline void oil_if_set(struct channel_oil *c_oil, mifi_t ifi, bool set) +{ +	if (set) +		IF_SET(ifi, &c_oil->oil.mf6cc_ifset); +	else +		IF_CLR(ifi, &c_oil->oil.mf6cc_ifset); +} +#endif +  extern int pim_channel_oil_compare(const struct channel_oil *c1,  				   const struct channel_oil *c2);  DECLARE_RBTREE_UNIQ(rb_pim_oil, struct channel_oil, oil_rb, diff --git a/pimd/pim_rp.c b/pimd/pim_rp.c index a5183c9e9b..0346a7067b 100644 --- a/pimd/pim_rp.c +++ b/pimd/pim_rp.c @@ -1366,7 +1366,7 @@ void pim_resolve_rp_nh(struct pim_instance *pim, struct pim_neighbor *nbr)  			if (nbr->interface != ifp1)  				continue; -#if PIM_IPV == 4 || !defined(PIM_V6_TEMP_BREAK) +#if PIM_IPV == 4  			nh_node->gate.ipv4 = nbr->source_addr;  #else  			nh_node->gate.ipv6 = nbr->source_addr; diff --git a/pimd/pim_rpf.c b/pimd/pim_rpf.c index 2e8fc8e661..d971cef24b 100644 --- a/pimd/pim_rpf.c +++ b/pimd/pim_rpf.c @@ -39,7 +39,7 @@  #include "pim_oil.h"  #include "pim_mlag.h" -static struct in_addr pim_rpf_find_rpf_addr(struct pim_upstream *up); +static pim_addr pim_rpf_find_rpf_addr(struct pim_upstream *up);  void pim_rpf_set_refresh_time(struct pim_instance *pim)  { @@ -51,7 +51,7 @@ void pim_rpf_set_refresh_time(struct pim_instance *pim)  }  bool pim_nexthop_lookup(struct pim_instance *pim, struct pim_nexthop *nexthop, -			struct in_addr addr, int neighbor_needed) +			pim_addr addr, int neighbor_needed)  {  	struct pim_zlookup_nexthop nexthop_tab[MULTIPATH_NUM];  	struct pim_neighbor *nbr = NULL; @@ -61,6 +61,7 @@ bool pim_nexthop_lookup(struct pim_instance *pim, struct pim_nexthop *nexthop,  	int found = 0;  	int i = 0; +#if PIM_IPV == 4  	/*  	 * We should not attempt to lookup a  	 * 255.255.255.255 address, since @@ -68,33 +69,27 @@ bool pim_nexthop_lookup(struct pim_instance *pim, struct pim_nexthop *nexthop,  	 */  	if (addr.s_addr == INADDR_NONE)  		return false; +#endif -	if ((nexthop->last_lookup.s_addr == addr.s_addr) +	if (!pim_addr_cmp(nexthop->last_lookup, addr)  	    && (nexthop->last_lookup_time > pim->last_route_change_time)) {  		if (PIM_DEBUG_PIM_NHT) { -			char addr_str[INET_ADDRSTRLEN]; -			pim_inet4_dump("<addr?>", addr, addr_str, -				       sizeof(addr_str));  			char nexthop_str[PREFIX_STRLEN];  			pim_addr_dump("<nexthop?>", &nexthop->mrib_nexthop_addr,  				      nexthop_str, sizeof(nexthop_str));  			zlog_debug( -				"%s: Using last lookup for %s at %lld, %" PRId64" addr %s", -				__func__, addr_str, nexthop->last_lookup_time, +				"%s: Using last lookup for %pPAs at %lld, %" PRId64" addr %s", +				__func__, &addr, nexthop->last_lookup_time,  				pim->last_route_change_time, nexthop_str);  		}  		pim->nexthop_lookups_avoided++;  		return true;  	} else { -		if (PIM_DEBUG_PIM_NHT) { -			char addr_str[INET_ADDRSTRLEN]; -			pim_inet4_dump("<addr?>", addr, addr_str, -				       sizeof(addr_str)); +		if (PIM_DEBUG_PIM_NHT)  			zlog_debug( -				"%s: Looking up: %s, last lookup time: %lld, %" PRId64, -				__func__, addr_str, nexthop->last_lookup_time, +				"%s: Looking up: %pPAs, last lookup time: %lld, %" PRId64, +				__func__, &addr, nexthop->last_lookup_time,  				pim->last_route_change_time); -		}  	}  	memset(nexthop_tab, 0, @@ -102,11 +97,9 @@ bool pim_nexthop_lookup(struct pim_instance *pim, struct pim_nexthop *nexthop,  	num_ifindex = zclient_lookup_nexthop(pim, nexthop_tab, MULTIPATH_NUM,  					     addr, PIM_NEXTHOP_LOOKUP_MAX);  	if (num_ifindex < 1) { -		char addr_str[INET_ADDRSTRLEN]; -		pim_inet4_dump("<addr?>", addr, addr_str, sizeof(addr_str));  		zlog_warn( -			"%s %s: could not find nexthop ifindex for address %s", -			__FILE__, __func__, addr_str); +			"%s %s: could not find nexthop ifindex for address %pPAs", +			__FILE__, __func__, &addr);  		return false;  	} @@ -115,29 +108,21 @@ bool pim_nexthop_lookup(struct pim_instance *pim, struct pim_nexthop *nexthop,  		ifp = if_lookup_by_index(first_ifindex, pim->vrf->vrf_id);  		if (!ifp) { -			if (PIM_DEBUG_ZEBRA) { -				char addr_str[INET_ADDRSTRLEN]; -				pim_inet4_dump("<addr?>", addr, addr_str, -					       sizeof(addr_str)); +			if (PIM_DEBUG_ZEBRA)  				zlog_debug( -					"%s %s: could not find interface for ifindex %d (address %s)", +					"%s %s: could not find interface for ifindex %d (address %pPAs)",  					__FILE__, __func__, first_ifindex, -					addr_str); -			} +					&addr);  			i++;  			continue;  		}  		if (!ifp->info) { -			if (PIM_DEBUG_ZEBRA) { -				char addr_str[INET_ADDRSTRLEN]; -				pim_inet4_dump("<addr?>", addr, addr_str, -					       sizeof(addr_str)); +			if (PIM_DEBUG_ZEBRA)  				zlog_debug( -					"%s: multicast not enabled on input interface %s (ifindex=%d, RPF for source %s)", +					"%s: multicast not enabled on input interface %s (ifindex=%d, RPF for source %pPAs)",  					__func__, ifp->name, first_ifindex, -					addr_str); -			} +					&addr);  			i++;  		} else if (neighbor_needed  			   && !pim_if_connected_to_source(ifp, addr)) { @@ -157,15 +142,12 @@ bool pim_nexthop_lookup(struct pim_instance *pim, struct pim_nexthop *nexthop,  	if (found) {  		if (PIM_DEBUG_ZEBRA) {  			char nexthop_str[PREFIX_STRLEN]; -			char addr_str[INET_ADDRSTRLEN];  			pim_addr_dump("<nexthop?>",  				      &nexthop_tab[i].nexthop_addr, nexthop_str,  				      sizeof(nexthop_str)); -			pim_inet4_dump("<addr?>", addr, addr_str, -				       sizeof(addr_str));  			zlog_debug( -				"%s %s: found nexthop %s for address %s: interface %s ifindex=%d metric=%d pref=%d", -				__FILE__, __func__, nexthop_str, addr_str, +				"%s %s: found nexthop %s for address %pPAs: interface %s ifindex=%d metric=%d pref=%d", +				__FILE__, __func__, nexthop_str, &addr,  				ifp->name, first_ifindex,  				nexthop_tab[i].route_metric,  				nexthop_tab[i].protocol_distance); @@ -230,6 +212,7 @@ enum pim_rpf_result pim_rpf_update(struct pim_instance *pim,  	struct prefix src, grp;  	bool neigh_needed = true;  	uint32_t saved_mrib_route_metric; +	pim_addr rpf_addr;  	if (PIM_UPSTREAM_FLAG_TEST_STATIC_IIF(up->flags))  		return PIM_RPF_OK; @@ -265,8 +248,9 @@ enum pim_rpf_result pim_rpf_update(struct pim_instance *pim,  		return PIM_RPF_FAILURE;  	} -	rpf->rpf_addr.family = AF_INET; -	rpf->rpf_addr.u.prefix4 = pim_rpf_find_rpf_addr(up); +	rpf_addr = pim_rpf_find_rpf_addr(up); +	pim_addr_to_prefix(&rpf->rpf_addr, rpf_addr); +  	if (pim_rpf_addr_is_inaddr_any(rpf) && PIM_DEBUG_ZEBRA) {  		/* RPF'(S,G) not found */  		zlog_debug("%s(%s): RPF'%s not found: won't send join upstream", @@ -369,18 +353,17 @@ void pim_upstream_rpf_clear(struct pim_instance *pim,    packets should be coming and to which joins should be sent on the RP    tree and SPT, respectively.  */ -static struct in_addr pim_rpf_find_rpf_addr(struct pim_upstream *up) +static pim_addr pim_rpf_find_rpf_addr(struct pim_upstream *up)  {  	struct pim_ifchannel *rpf_ch;  	struct pim_neighbor *neigh; -	struct in_addr rpf_addr; +	pim_addr rpf_addr;  	if (!up->rpf.source_nexthop.interface) {  		zlog_warn("%s: missing RPF interface for upstream (S,G)=%s",  			  __func__, up->sg_str); -		rpf_addr.s_addr = PIM_NET_INADDR_ANY; -		return rpf_addr; +		return PIMADDR_ANY;  	}  	rpf_ch = pim_ifchannel_find(up->rpf.source_nexthop.interface, &up->sg); @@ -400,7 +383,7 @@ static struct in_addr pim_rpf_find_rpf_addr(struct pim_upstream *up)  	if (neigh)  		rpf_addr = neigh->source_addr;  	else -		rpf_addr.s_addr = PIM_NET_INADDR_ANY; +		rpf_addr = PIMADDR_ANY;  	return rpf_addr;  } diff --git a/pimd/pim_rpf.h b/pimd/pim_rpf.h index d6a8880ffb..662fd41a7f 100644 --- a/pimd/pim_rpf.h +++ b/pimd/pim_rpf.h @@ -58,7 +58,7 @@ unsigned int pim_rpf_hash_key(const void *arg);  bool pim_rpf_equal(const void *arg1, const void *arg2);  bool pim_nexthop_lookup(struct pim_instance *pim, struct pim_nexthop *nexthop, -			struct in_addr addr, int neighbor_needed); +			pim_addr addr, int neighbor_needed);  enum pim_rpf_result pim_rpf_update(struct pim_instance *pim,  				   struct pim_upstream *up,  				   struct pim_rpf *old, const char *caller); diff --git a/pimd/pim_ssm.c b/pimd/pim_ssm.c index 45aac7756a..688d38c84c 100644 --- a/pimd/pim_ssm.c +++ b/pimd/pim_ssm.c @@ -32,6 +32,7 @@  static void pim_ssm_range_reevaluate(struct pim_instance *pim)  { +#if PIM_IPV == 4  	/* 1. Setup register state for (S,G) entries if G has changed from SSM  	 * to  	 *    ASM. @@ -50,6 +51,7 @@ static void pim_ssm_range_reevaluate(struct pim_instance *pim)  	 */  	pim_upstream_register_reevaluate(pim);  	igmp_source_forward_reevaluate_all(pim); +#endif  }  void pim_ssm_prefix_list_update(struct pim_instance *pim, diff --git a/pimd/pim_static.c b/pimd/pim_static.c index be06a25bea..45f0a194b0 100644 --- a/pimd/pim_static.c +++ b/pimd/pim_static.c @@ -43,8 +43,8 @@ static struct static_route *static_route_alloc(void)  }  static struct static_route *static_route_new(ifindex_t iif, ifindex_t oif, -					     struct in_addr group, -					     struct in_addr source) +					     pim_addr group, +					     pim_addr source)  {  	struct static_route *s_route;  	s_route = static_route_alloc(); @@ -54,10 +54,10 @@ static struct static_route *static_route_new(ifindex_t iif, ifindex_t oif,  	s_route->iif = iif;  	s_route->oif_ttls[oif] = 1;  	s_route->c_oil.oil_ref_count = 1; -	s_route->c_oil.oil.mfcc_origin = source; -	s_route->c_oil.oil.mfcc_mcastgrp = group; -	s_route->c_oil.oil.mfcc_parent = iif; -	s_route->c_oil.oil.mfcc_ttls[oif] = 1; +	*oil_origin(&s_route->c_oil) = source; +	*oil_mcastgrp(&s_route->c_oil) = group; +	*oil_parent(&s_route->c_oil) = iif; +	oil_if_set(&s_route->c_oil, oif, 1);  	s_route->c_oil.oif_creation[oif] = pim_time_monotonic_sec();  	return s_route; @@ -65,8 +65,7 @@ static struct static_route *static_route_new(ifindex_t iif, ifindex_t oif,  int pim_static_add(struct pim_instance *pim, struct interface *iif, -		   struct interface *oif, struct in_addr group, -		   struct in_addr source) +		   struct interface *oif, pim_addr group, pim_addr source)  {  	struct listnode *node = NULL;  	struct static_route *s_route = NULL; @@ -97,20 +96,14 @@ int pim_static_add(struct pim_instance *pim, struct interface *iif,  	}  	for (ALL_LIST_ELEMENTS_RO(pim->static_routes, node, s_route)) { -		if (s_route->group.s_addr == group.s_addr -		    && s_route->source.s_addr == source.s_addr) { +		if (!pim_addr_cmp(s_route->group, group) +		    && !pim_addr_cmp(s_route->source, source)) {  			if (s_route->iif == iif_index  			    && s_route->oif_ttls[oif_index]) { -				char gifaddr_str[INET_ADDRSTRLEN]; -				char sifaddr_str[INET_ADDRSTRLEN]; -				pim_inet4_dump("<ifaddr?>", group, gifaddr_str, -					       sizeof(gifaddr_str)); -				pim_inet4_dump("<ifaddr?>", source, sifaddr_str, -					       sizeof(sifaddr_str));  				zlog_warn( -					"%s %s: Unable to add static route: Route already exists (iif=%d,oif=%d,group=%s,source=%s)", +					"%s %s: Unable to add static route: Route already exists (iif=%d,oif=%d,group=%pPAs,source=%pPAs)",  					__FILE__, __func__, iif_index, -					oif_index, gifaddr_str, sifaddr_str); +					oif_index, &group, &source);  				return -3;  			} @@ -130,7 +123,7 @@ int pim_static_add(struct pim_instance *pim, struct interface *iif,  			 * adding a new output interface */  			if (s_route->iif == iif_index) {  				s_route->oif_ttls[oif_index] = 1; -				s_route->c_oil.oil.mfcc_ttls[oif_index] = 1; +				oil_if_set(&s_route->c_oil, oif_index, 1);  				s_route->c_oil.oif_creation[oif_index] =  					pim_time_monotonic_sec();  				++s_route->c_oil.oil_ref_count; @@ -147,8 +140,8 @@ int pim_static_add(struct pim_instance *pim, struct interface *iif,  					s_route->oif_ttls[iif_index] = 0;  					s_route->c_oil.oif_creation[iif_index] =  						0; -					s_route->c_oil.oil -						.mfcc_ttls[iif_index] = 0; +					oil_if_set(&s_route->c_oil, iif_index, +						   0);  					--s_route->c_oil.oil_ref_count;  				}  #endif @@ -158,8 +151,8 @@ int pim_static_add(struct pim_instance *pim, struct interface *iif,  					s_route->oif_ttls[oif_index] = 1;  					s_route->c_oil.oif_creation[oif_index] =  						pim_time_monotonic_sec(); -					s_route->c_oil.oil -						.mfcc_ttls[oif_index] = 1; +					oil_if_set(&s_route->c_oil, oif_index, +						   1);  					++s_route->c_oil.oil_ref_count;  				}  			} @@ -178,16 +171,10 @@ int pim_static_add(struct pim_instance *pim, struct interface *iif,  	s_route->c_oil.pim = pim;  	if (pim_static_mroute_add(&s_route->c_oil, __func__)) { -		char gifaddr_str[INET_ADDRSTRLEN]; -		char sifaddr_str[INET_ADDRSTRLEN]; -		pim_inet4_dump("<ifaddr?>", group, gifaddr_str, -			       sizeof(gifaddr_str)); -		pim_inet4_dump("<ifaddr?>", source, sifaddr_str, -			       sizeof(sifaddr_str));  		zlog_warn( -			"%s %s: Unable to add static route(iif=%d,oif=%d,group=%s,source=%s)", -			__FILE__, __func__, iif_index, oif_index, gifaddr_str, -			sifaddr_str); +			"%s %s: Unable to add static route(iif=%d,oif=%d,group=%pPAs,source=%pPAs)", +			__FILE__, __func__, iif_index, oif_index, &group, +			&source);  		/* Need to put s_route back to the way it was */  		if (original_s_route) { @@ -213,24 +200,17 @@ int pim_static_add(struct pim_instance *pim, struct interface *iif,  	}  	if (PIM_DEBUG_STATIC) { -		char gifaddr_str[INET_ADDRSTRLEN]; -		char sifaddr_str[INET_ADDRSTRLEN]; -		pim_inet4_dump("<ifaddr?>", group, gifaddr_str, -			       sizeof(gifaddr_str)); -		pim_inet4_dump("<ifaddr?>", source, sifaddr_str, -			       sizeof(sifaddr_str));  		zlog_debug( -			"%s: Static route added(iif=%d,oif=%d,group=%s,source=%s)", -			__func__, iif_index, oif_index, gifaddr_str, -			sifaddr_str); +			"%s: Static route added(iif=%d,oif=%d,group=%pPAs,source=%pPAs)", +			__func__, iif_index, oif_index, &group, +			&source);  	}  	return 0;  }  int pim_static_del(struct pim_instance *pim, struct interface *iif, -		   struct interface *oif, struct in_addr group, -		   struct in_addr source) +		   struct interface *oif, pim_addr group, pim_addr source)  {  	struct listnode *node = NULL;  	struct listnode *nextnode = NULL; @@ -249,11 +229,11 @@ int pim_static_del(struct pim_instance *pim, struct interface *iif,  	for (ALL_LIST_ELEMENTS(pim->static_routes, node, nextnode, s_route)) {  		if (s_route->iif == iif_index -		    && s_route->group.s_addr == group.s_addr -		    && s_route->source.s_addr == source.s_addr +		    && !pim_addr_cmp(s_route->group, group) +		    && !pim_addr_cmp(s_route->source, source)  		    && s_route->oif_ttls[oif_index]) {  			s_route->oif_ttls[oif_index] = 0; -			s_route->c_oil.oil.mfcc_ttls[oif_index] = 0; +			oil_if_set(&s_route->c_oil, oif_index, 0);  			--s_route->c_oil.oil_ref_count;  			/* If there are no more outputs then delete the whole @@ -263,19 +243,13 @@ int pim_static_del(struct pim_instance *pim, struct interface *iif,  				    ? pim_mroute_del(&s_route->c_oil, __func__)  				    : pim_static_mroute_add(&s_route->c_oil,  							    __func__)) { -				char gifaddr_str[INET_ADDRSTRLEN]; -				char sifaddr_str[INET_ADDRSTRLEN]; -				pim_inet4_dump("<ifaddr?>", group, gifaddr_str, -					       sizeof(gifaddr_str)); -				pim_inet4_dump("<ifaddr?>", source, sifaddr_str, -					       sizeof(sifaddr_str));  				zlog_warn( -					"%s %s: Unable to remove static route(iif=%d,oif=%d,group=%s,source=%s)", +					"%s %s: Unable to remove static route(iif=%d,oif=%d,group=%pPAs,source=%pPAs)",  					__FILE__, __func__, iif_index, -					oif_index, gifaddr_str, sifaddr_str); +					oif_index, &group, &source);  				s_route->oif_ttls[oif_index] = 1; -				s_route->c_oil.oil.mfcc_ttls[oif_index] = 1; +				oil_if_set(&s_route->c_oil, oif_index, 1);  				++s_route->c_oil.oil_ref_count;  				return -1; @@ -289,16 +263,10 @@ int pim_static_del(struct pim_instance *pim, struct interface *iif,  			}  			if (PIM_DEBUG_STATIC) { -				char gifaddr_str[INET_ADDRSTRLEN]; -				char sifaddr_str[INET_ADDRSTRLEN]; -				pim_inet4_dump("<ifaddr?>", group, gifaddr_str, -					       sizeof(gifaddr_str)); -				pim_inet4_dump("<ifaddr?>", source, sifaddr_str, -					       sizeof(sifaddr_str));  				zlog_debug( -					"%s: Static route removed(iif=%d,oif=%d,group=%s,source=%s)", +					"%s: Static route removed(iif=%d,oif=%d,group=%pPAs,source=%pPAs)",  					__func__, iif_index, oif_index, -					gifaddr_str, sifaddr_str); +					&group, &source);  			}  			break; @@ -306,16 +274,10 @@ int pim_static_del(struct pim_instance *pim, struct interface *iif,  	}  	if (!node) { -		char gifaddr_str[INET_ADDRSTRLEN]; -		char sifaddr_str[INET_ADDRSTRLEN]; -		pim_inet4_dump("<ifaddr?>", group, gifaddr_str, -			       sizeof(gifaddr_str)); -		pim_inet4_dump("<ifaddr?>", source, sifaddr_str, -			       sizeof(sifaddr_str));  		zlog_warn( -			"%s %s: Unable to remove static route: Route does not exist(iif=%d,oif=%d,group=%s,source=%s)", -			__FILE__, __func__, iif_index, oif_index, gifaddr_str, -			sifaddr_str); +			"%s %s: Unable to remove static route: Route does not exist(iif=%d,oif=%d,group=%pPAs,source=%pPAs)", +			__FILE__, __func__, iif_index, oif_index, &group, +			&source);  		return -3;  	} @@ -329,15 +291,11 @@ int pim_static_write_mroute(struct pim_instance *pim, struct vty *vty,  	struct listnode *node;  	struct static_route *sroute;  	int count = 0; -	char sbuf[INET_ADDRSTRLEN]; -	char gbuf[INET_ADDRSTRLEN];  	if (!pim_ifp)  		return 0;  	for (ALL_LIST_ELEMENTS_RO(pim->static_routes, node, sroute)) { -		pim_inet4_dump("<ifaddr?>", sroute->group, gbuf, sizeof(gbuf)); -		pim_inet4_dump("<ifaddr?>", sroute->source, sbuf, sizeof(sbuf));  		if (sroute->iif == pim_ifp->mroute_vif_index) {  			int i;  			for (i = 0; i < MAXVIFS; i++) @@ -345,14 +303,15 @@ int pim_static_write_mroute(struct pim_instance *pim, struct vty *vty,  					struct interface *oifp =  						pim_if_find_by_vif_index(pim,  									 i); -					if (sroute->source.s_addr == INADDR_ANY) +					if (pim_addr_is_any(sroute->source))  						vty_out(vty, -							" ip mroute %s %s\n", -							oifp->name, gbuf); +							" ip mroute %s %pPA\n", +							oifp->name, &sroute->group);  					else  						vty_out(vty, -							" ip mroute %s %s %s\n", -							oifp->name, gbuf, sbuf); +							" ip mroute %s %pPA %pPA\n", +							oifp->name, &sroute->group, +							&sroute->source);  					count++;  				}  		} diff --git a/pimd/pim_static.h b/pimd/pim_static.h index 953ec0a70a..56bfbd4e4f 100644 --- a/pimd/pim_static.h +++ b/pimd/pim_static.h @@ -26,8 +26,8 @@  struct static_route {  	/* Each static route is unique by these pair of addresses */ -	struct in_addr group; -	struct in_addr source; +	pim_addr group; +	pim_addr source;  	struct channel_oil c_oil;  	ifindex_t iif; @@ -37,11 +37,9 @@ struct static_route {  void pim_static_route_free(struct static_route *s_route);  int pim_static_add(struct pim_instance *pim, struct interface *iif, -		   struct interface *oif, struct in_addr group, -		   struct in_addr source); +		   struct interface *oif, pim_addr group, pim_addr source);  int pim_static_del(struct pim_instance *pim, struct interface *iif, -		   struct interface *oif, struct in_addr group, -		   struct in_addr source); +		   struct interface *oif, pim_addr group, pim_addr source);  int pim_static_write_mroute(struct pim_instance *pim, struct vty *vty,  			    struct interface *ifp); diff --git a/pimd/pim_upstream.c b/pimd/pim_upstream.c index ae62823161..7d835996f0 100644 --- a/pimd/pim_upstream.c +++ b/pimd/pim_upstream.c @@ -1261,7 +1261,7 @@ void pim_upstream_update_join_desired(struct pim_instance *pim,    it so that it expires after t_override seconds.  */  void pim_upstream_rpf_genid_changed(struct pim_instance *pim, -				    struct in_addr neigh_addr) +				    pim_addr neigh_addr)  {  	struct pim_upstream *up; @@ -1269,24 +1269,24 @@ void pim_upstream_rpf_genid_changed(struct pim_instance *pim,  	 * Scan all (S,G) upstreams searching for RPF'(S,G)=neigh_addr  	 */  	frr_each (rb_pim_upstream, &pim->upstream_head, up) { -		if (PIM_DEBUG_PIM_TRACE) { -			char rpf_addr_str[PREFIX_STRLEN]; -			pim_addr_dump("<rpf?>", &up->rpf.rpf_addr, rpf_addr_str, -				      sizeof(rpf_addr_str)); +		pim_addr rpf_addr; + +		rpf_addr = pim_addr_from_prefix(&up->rpf.rpf_addr); + +		if (PIM_DEBUG_PIM_TRACE)  			zlog_debug( -				"%s: matching neigh=%pI4 against upstream (S,G)=%s[%s] joined=%d rpf_addr=%s", +				"%s: matching neigh=%pPA against upstream (S,G)=%s[%s] joined=%d rpf_addr=%pPA",  				__func__, &neigh_addr, up->sg_str,  				pim->vrf->name,  				up->join_state == PIM_UPSTREAM_JOINED, -				rpf_addr_str); -		} +				&rpf_addr);  		/* consider only (S,G) upstream in Joined state */  		if (up->join_state != PIM_UPSTREAM_JOINED)  			continue;  		/* match RPF'(S,G)=neigh_addr */ -		if (up->rpf.rpf_addr.u.prefix4.s_addr != neigh_addr.s_addr) +		if (pim_addr_cmp(rpf_addr, neigh_addr))  			continue;  		pim_upstream_join_timer_decrease_to_t_override( @@ -1992,7 +1992,7 @@ static bool pim_upstream_kat_start_ok(struct pim_upstream *up)  		return false;  	pim_ifp = ifp->info; -	if (pim_ifp->mroute_vif_index != c_oil->oil.mfcc_parent) +	if (pim_ifp->mroute_vif_index != *oil_parent(c_oil))  		return false;  	if (pim_if_connected_to_source(up->rpf.source_nexthop.interface, diff --git a/pimd/pim_upstream.h b/pimd/pim_upstream.h index 25ff3bffe7..ad936a2839 100644 --- a/pimd/pim_upstream.h +++ b/pimd/pim_upstream.h @@ -326,7 +326,7 @@ void pim_upstream_join_timer_decrease_to_t_override(const char *debug_label,  void pim_upstream_join_timer_restart(struct pim_upstream *up,  				     struct pim_rpf *old);  void pim_upstream_rpf_genid_changed(struct pim_instance *pim, -				    struct in_addr neigh_addr); +				    pim_addr neigh_addr);  void pim_upstream_rpf_interface_changed(struct pim_upstream *up,  					struct interface *old_rpf_ifp); diff --git a/pimd/pim_vty.c b/pimd/pim_vty.c index 8130aac872..b452b024ed 100644 --- a/pimd/pim_vty.c +++ b/pimd/pim_vty.c @@ -397,6 +397,7 @@ int pim_interface_config_write(struct vty *vty)  					++writes;  				} +#if PIM_IPV == 4  				/* IF ip igmp join */  				if (pim_ifp->gm_join_list) {  					struct listnode *node; @@ -428,6 +429,7 @@ int pim_interface_config_write(struct vty *vty)  						++writes;  					}  				} +#endif /* PIM_IPV == 4 */  				if (pim_ifp->activeactive)  					vty_out(vty, " ip pim active-active\n"); diff --git a/pimd/pim_zebra.c b/pimd/pim_zebra.c index 8be930aeb4..0acd3c0694 100644 --- a/pimd/pim_zebra.c +++ b/pimd/pim_zebra.c @@ -55,6 +55,7 @@ struct zclient *zclient;  /* Router-id update message from zebra. */ +__attribute__((unused))  static int pim_router_id_update_zebra(ZAPI_CALLBACK_ARGS)  {  	struct prefix router_id; @@ -64,6 +65,7 @@ static int pim_router_id_update_zebra(ZAPI_CALLBACK_ARGS)  	return 0;  } +__attribute__((unused))  static int pim_zebra_interface_vrf_update(ZAPI_CALLBACK_ARGS)  {  	struct interface *ifp; @@ -112,7 +114,6 @@ static int pim_zebra_if_address_add(ZAPI_CALLBACK_ARGS)  	struct connected *c;  	struct prefix *p;  	struct pim_interface *pim_ifp; -	struct pim_instance *pim;  	/*  	  zebra api notifies address adds/dels events by using the same call @@ -141,6 +142,7 @@ static int pim_zebra_if_address_add(ZAPI_CALLBACK_ARGS)  #endif  	} +#if PIM_IPV == 4  	if (p->family != PIM_AF)  		SET_FLAG(c->flags, ZEBRA_IFA_SECONDARY);  	else if (!CHECK_FLAG(c->flags, ZEBRA_IFA_SECONDARY)) { @@ -159,6 +161,8 @@ static int pim_zebra_if_address_add(ZAPI_CALLBACK_ARGS)  	pim_if_addr_add(c);  	if (pim_ifp) { +		struct pim_instance *pim; +  		pim = pim_get_pim_instance(vrf_id);  		pim_ifp->pim = pim; @@ -174,7 +178,10 @@ static int pim_zebra_if_address_add(ZAPI_CALLBACK_ARGS)  				pim_if_addr_add_all(ifp);  		}  	} - +#else /* PIM_IPV != 4 */ +	/* unused - for now */ +	(void)pim_ifp; +#endif  	return 0;  } @@ -183,11 +190,9 @@ static int pim_zebra_if_address_del(ZAPI_CALLBACK_ARGS)  	struct connected *c;  	struct prefix *p;  	struct vrf *vrf = vrf_lookup_by_id(vrf_id); -	struct pim_instance *pim;  	if (!vrf)  		return 0; -	pim = vrf->info;  	/*  	  zebra api notifies address adds/dels events by using the same call @@ -202,24 +207,29 @@ static int pim_zebra_if_address_del(ZAPI_CALLBACK_ARGS)  		return 0;  	p = c->address; -	if (p->family == AF_INET) { -		if (PIM_DEBUG_ZEBRA) { -			zlog_debug( -				"%s: %s(%u) disconnected IP address %pFX flags %u %s", -				__func__, c->ifp->name, vrf_id, p, c->flags, -				CHECK_FLAG(c->flags, ZEBRA_IFA_SECONDARY) -					? "secondary" -					: "primary"); +	if (PIM_DEBUG_ZEBRA) { +		zlog_debug( +			"%s: %s(%u) disconnected IP address %pFX flags %u %s", +			__func__, c->ifp->name, vrf_id, p, c->flags, +			CHECK_FLAG(c->flags, ZEBRA_IFA_SECONDARY) +				? "secondary" +				: "primary");  #ifdef PIM_DEBUG_IFADDR_DUMP -			dump_if_address(c->ifp); +		dump_if_address(c->ifp);  #endif -		} +	} + +#if PIM_IPV == 4 +	if (p->family == AF_INET) { +		struct pim_instance *pim; +		pim = vrf->info;  		pim_if_addr_del(c, 0);  		pim_rp_setup(pim);  		pim_i_am_rp_re_evaluate(pim);  	} +#endif  	connected_free(&c);  	return 0; @@ -242,7 +252,7 @@ void pim_zebra_update_all_interfaces(struct pim_instance *pim)  			struct pim_rpf rpf;  			rpf.source_nexthop.interface = ifp; -			rpf.rpf_addr.u.prefix4 = us->address; +			pim_addr_to_prefix(&rpf.rpf_addr, us->address);  			pim_joinprune_send(&rpf, us->us);  			pim_jp_agg_clear_group(us->us);  		} @@ -325,6 +335,7 @@ void pim_zebra_upstream_rpf_changed(struct pim_instance *pim,  	pim_upstream_update_join_desired(pim, up);  } +__attribute__((unused))  static int pim_zebra_vxlan_sg_proc(ZAPI_CALLBACK_ARGS)  {  	struct stream *s; @@ -354,6 +365,7 @@ static int pim_zebra_vxlan_sg_proc(ZAPI_CALLBACK_ARGS)  	return 0;  } +__attribute__((unused))  static void pim_zebra_vxlan_replay(void)  {  	struct stream *s = NULL; @@ -421,13 +433,17 @@ void sched_rpf_cache_refresh(struct pim_instance *pim)  static void pim_zebra_connected(struct zclient *zclient)  { +#if PIM_IPV == 4  	/* Send the client registration */  	bfd_client_sendmsg(zclient, ZEBRA_BFD_CLIENT_REGISTER, router->vrf_id); +#endif  	zclient_send_reg_requests(zclient, router->vrf_id); +#if PIM_IPV == 4  	/* request for VxLAN BUM group addresses */  	pim_zebra_vxlan_replay(); +#endif  }  static void pim_zebra_capabilities(struct zclient_capabilities *cap) @@ -436,9 +452,10 @@ static void pim_zebra_capabilities(struct zclient_capabilities *cap)  }  static zclient_handler *const pim_handlers[] = { -	[ZEBRA_ROUTER_ID_UPDATE] = pim_router_id_update_zebra,  	[ZEBRA_INTERFACE_ADDRESS_ADD] = pim_zebra_if_address_add,  	[ZEBRA_INTERFACE_ADDRESS_DELETE] = pim_zebra_if_address_del, +#if PIM_IPV == 4 +	[ZEBRA_ROUTER_ID_UPDATE] = pim_router_id_update_zebra,  	[ZEBRA_INTERFACE_VRF_UPDATE] = pim_zebra_interface_vrf_update,  	[ZEBRA_NEXTHOP_UPDATE] = pim_parse_nexthop_update, @@ -448,6 +465,7 @@ static zclient_handler *const pim_handlers[] = {  	[ZEBRA_MLAG_PROCESS_UP] = pim_zebra_mlag_process_up,  	[ZEBRA_MLAG_PROCESS_DOWN] = pim_zebra_mlag_process_down,  	[ZEBRA_MLAG_FORWARD_MSG] = pim_zebra_mlag_handle_msg, +#endif  };  void pim_zebra_init(void) @@ -467,6 +485,7 @@ void pim_zebra_init(void)  	zclient_lookup_new();  } +#if PIM_IPV == 4  void igmp_anysource_forward_start(struct pim_instance *pim,  				  struct gm_group *group)  { @@ -793,6 +812,7 @@ void igmp_source_forward_stop(struct gm_source *source)  	IGMP_SOURCE_DONT_FORWARDING(source->source_flags);  } +#endif /* PIM_IPV == 4 */  void pim_forward_start(struct pim_ifchannel *ch)  { diff --git a/pimd/pim_zlookup.c b/pimd/pim_zlookup.c index 3cdf596ae2..a0877b883c 100644 --- a/pimd/pim_zlookup.c +++ b/pimd/pim_zlookup.c @@ -394,7 +394,7 @@ void zclient_lookup_read_pipe(struct thread *thread)  int zclient_lookup_nexthop(struct pim_instance *pim,  			   struct pim_zlookup_nexthop nexthop_tab[], -			   const int tab_size, struct in_addr addr, +			   const int tab_size, pim_addr addr,  			   int max_lookup)  {  	int lookup; diff --git a/pimd/pim_zlookup.h b/pimd/pim_zlookup.h index 09e8dcd51f..c3818dbdbc 100644 --- a/pimd/pim_zlookup.h +++ b/pimd/pim_zlookup.h @@ -39,7 +39,7 @@ void zclient_lookup_free(void);  int zclient_lookup_nexthop(struct pim_instance *pim,  			   struct pim_zlookup_nexthop nexthop_tab[], -			   const int tab_size, struct in_addr addr, +			   const int tab_size, pim_addr addr,  			   int max_lookup);  void pim_zlookup_show_ip_multicast(struct vty *vty); diff --git a/pimd/subdir.am b/pimd/subdir.am index 6c267f290c..86e8ca780b 100644 --- a/pimd/subdir.am +++ b/pimd/subdir.am @@ -18,32 +18,22 @@ pim_common = \  	pimd/pim_bfd.c \  	pimd/pim_br.c \  	pimd/pim_bsm.c \ -	pimd/pim_cmd.c \  	pimd/pim_errors.c \  	pimd/pim_hello.c \  	pimd/pim_iface.c \  	pimd/pim_ifchannel.c \ -	pimd/pim_igmp.c \ -	pimd/pim_igmp_mtrace.c \ -	pimd/pim_igmp_stats.c \ -	pimd/pim_igmpv2.c \ -	pimd/pim_igmpv3.c \  	pimd/pim_instance.c \  	pimd/pim_int.c \  	pimd/pim_join.c \  	pimd/pim_jp_agg.c \  	pimd/pim_macro.c \  	pimd/pim_memory.c \ -	pimd/pim_mlag.c \  	pimd/pim_mroute.c \  	pimd/pim_msg.c \  	pimd/pim_nb.c \  	pimd/pim_nb_config.c \  	pimd/pim_neighbor.c \ -	pimd/pim_nht.c \  	pimd/pim_oil.c \ -	pimd/pim_pim.c \ -	pimd/pim_register.c \  	pimd/pim_routemap.c \  	pimd/pim_rp.c \  	pimd/pim_rpf.c \ @@ -58,19 +48,29 @@ pim_common = \  	pimd/pim_util.c \  	pimd/pim_vty.c \  	pimd/pim_zebra.c \ -	pimd/pim_zlookup.c \  	pimd/pim_vxlan.c \ -	pimd/pim_zpthread.c \  	pimd/pimd.c \  	# end  pimd_pimd_SOURCES = \  	$(pim_common) \ +	pimd/pim_cmd.c \ +	pimd/pim_igmp.c \ +	pimd/pim_igmp_mtrace.c \ +	pimd/pim_igmp_stats.c \ +	pimd/pim_igmpv2.c \ +	pimd/pim_igmpv3.c \  	pimd/pim_main.c \ +	pimd/pim_mlag.c \  	pimd/pim_msdp.c \  	pimd/pim_msdp_packet.c \  	pimd/pim_msdp_socket.c \ +	pimd/pim_nht.c \ +	pimd/pim_pim.c \ +	pimd/pim_register.c \  	pimd/pim_signals.c \ +	pimd/pim_zlookup.c \ +	pimd/pim_zpthread.c \  	# end  nodist_pimd_pimd_SOURCES = \ @@ -82,6 +82,7 @@ nodist_pimd_pimd_SOURCES = \  pimd_pim6d_SOURCES = \  	$(pim_common) \  	pimd/pim6_main.c \ +	pimd/pim6_stubs.c \  	# end  nodist_pimd_pim6d_SOURCES = \ @@ -158,7 +159,7 @@ if DEV_BUILD  # (change noinst_ to sbin_ below to install it.)  #  noinst_PROGRAMS += pimd/pim6d -pimd_pim6d_CFLAGS = $(AM_CFLAGS) -DPIM_IPV=6 $(and $(PIM_V6_TEMP_BREAK),-DPIM_V6_TEMP_BREAK) +pimd_pim6d_CFLAGS = $(AM_CFLAGS) -DPIM_IPV=6  pimd_pim6d_LDADD = lib/libfrr.la $(LIBCAP)  endif  endif  | 
