From 3e5b7080218970011c9d0c717ed8e9adf4dc6e60 Mon Sep 17 00:00:00 2001 From: Mobashshera Rasool Date: Mon, 13 Dec 2021 22:10:29 -0800 Subject: [PATCH 01/13] pimd: Adding pim_addr as common address for IPv4 and IPv6 PIM_ADDR will be controlled at compile time for IPv4 and IPv6. in_addr and in6_addr will be compiled for the respective daemons. Signed-off-by: Mobashshera Rasool --- pimd/pim_str.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pimd/pim_str.h b/pimd/pim_str.h index 94ba324154..40d26d6f57 100644 --- a/pimd/pim_str.h +++ b/pimd/pim_str.h @@ -26,6 +26,8 @@ #include +typedef struct in_addr pim_addr; + /* * Longest possible length of a (S,G) string is 36 bytes * 123.123.123.123 = 16 * 2 From 3b37b961c1a761a7c6f486679bc157cac88a0539 Mon Sep 17 00:00:00 2001 From: Mobashshera Rasool Date: Mon, 13 Dec 2021 22:15:23 -0800 Subject: [PATCH 02/13] pimd: API changes to accomodate IPv4 and IPv6 Added apis which will be decided on compile time for pimd and pim6d daemon Reviewed-by: Sarita Patra Signed-off-by: Mobashshera Rasool --- pimd/pim_str.h | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/pimd/pim_str.h b/pimd/pim_str.h index 40d26d6f57..3510d994b9 100644 --- a/pimd/pim_str.h +++ b/pimd/pim_str.h @@ -39,6 +39,21 @@ typedef struct in_addr pim_addr; #define pim_inet4_dump prefix_mcast_inet4_dump #define pim_str_sg_set prefix_sg2str +static inline void pim_addr_copy(pim_addr *dest, pim_addr *source) +{ + dest->s_addr = source->s_addr; +} + +static inline int pim_is_addr_any(pim_addr addr) +{ + return (addr.s_addr == INADDR_ANY); +} + +static inline int pim_addr_cmp(pim_addr addr1, pim_addr addr2) +{ + return IPV4_ADDR_CMP(&addr1, &addr2); +} + void pim_addr_dump(const char *onfail, struct prefix *p, char *buf, int buf_size); void pim_inet4_dump(const char *onfail, struct in_addr addr, char *buf, From b85201d5cde1ad28fba70517ab4a33063fba1ae0 Mon Sep 17 00:00:00 2001 From: Mobashshera Rasool Date: Mon, 13 Dec 2021 22:20:37 -0800 Subject: [PATCH 03/13] pimd: Modifying in_addr to pim_addr in struct pim_ifchannel for IPv6. Changed struct in_addr ifassert_winner to pim_addr which will be used in both IPv4 and IPv6(Both MLD and IGMP). Reviewed-by: Sarita Patra Signed-off-by: Mobashshera Rasool --- pimd/pim_assert.c | 13 ++++++------- pimd/pim_assert.h | 3 +-- pimd/pim_ifchannel.h | 2 +- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/pimd/pim_assert.c b/pimd/pim_assert.c index 0988938701..cac3194681 100644 --- a/pimd/pim_assert.c +++ b/pimd/pim_assert.c @@ -43,12 +43,11 @@ static void assert_action_a6(struct pim_ifchannel *ch, struct pim_assert_metric winner_metric); void pim_ifassert_winner_set(struct pim_ifchannel *ch, - enum pim_ifassert_state new_state, - struct in_addr winner, + enum pim_ifassert_state new_state, pim_addr winner, struct pim_assert_metric winner_metric) { struct pim_interface *pim_ifp = ch->interface->info; - int winner_changed = (ch->ifassert_winner.s_addr != winner.s_addr); + int winner_changed = !!pim_addr_cmp(ch->ifassert_winner, winner); int metric_changed = !pim_assert_metric_match( &ch->ifassert_winner_metric, &winner_metric); @@ -66,9 +65,9 @@ void pim_ifassert_winner_set(struct pim_ifchannel *ch, char was_str[INET_ADDRSTRLEN]; char winner_str[INET_ADDRSTRLEN]; pim_inet4_dump("", ch->ifassert_winner, was_str, - sizeof(was_str)); + sizeof(was_str)); pim_inet4_dump("", winner, winner_str, - sizeof(winner_str)); + sizeof(winner_str)); zlog_debug( "%s: (S,G)=%s assert winner changed from %s to %s on interface %s", __func__, ch->sg_str, was_str, winner_str, @@ -179,8 +178,8 @@ static int dispatch_assert(struct interface *ifp, struct in_addr source_addr, } break; case PIM_IFASSERT_I_AM_LOSER: - if (recv_metric.ip_address.s_addr - == ch->ifassert_winner.s_addr) { + if (!pim_addr_cmp(recv_metric.ip_address, + ch->ifassert_winner)) { /* Assert from current winner */ if (cancel_assert(&recv_metric)) { diff --git a/pimd/pim_assert.h b/pimd/pim_assert.h index c07cbeb013..2e6e62cc3a 100644 --- a/pimd/pim_assert.h +++ b/pimd/pim_assert.h @@ -55,8 +55,7 @@ struct pim_assert_metric { #define PIM_ASSERT_ROUTE_METRIC_MAX (0xFFFFFFFF) void pim_ifassert_winner_set(struct pim_ifchannel *ch, - enum pim_ifassert_state new_state, - struct in_addr winner, + enum pim_ifassert_state new_state, pim_addr winner, struct pim_assert_metric winner_metric); int pim_assert_recv(struct interface *ifp, struct pim_neighbor *neigh, diff --git a/pimd/pim_ifchannel.h b/pimd/pim_ifchannel.h index 332d40d926..e266040697 100644 --- a/pimd/pim_ifchannel.h +++ b/pimd/pim_ifchannel.h @@ -106,7 +106,7 @@ struct pim_ifchannel { /* Per-interface (S,G) Assert State (Section 4.6.1 of RFC4601) */ enum pim_ifassert_state ifassert_state; struct thread *t_ifassert_timer; - struct in_addr ifassert_winner; + pim_addr ifassert_winner; struct pim_assert_metric ifassert_winner_metric; int64_t ifassert_creation; /* Record uptime of ifassert state */ struct pim_assert_metric ifassert_my_metric; From 95d516622bcbf90bc8bfff23cc6512ea416fd8da Mon Sep 17 00:00:00 2001 From: Mobashshera Rasool Date: Mon, 13 Dec 2021 22:28:46 -0800 Subject: [PATCH 04/13] pimd: Modify in_addr to pim_addr in pim_assert_metric This change is to accomodate IPv6 and IPv4 in the same code. Based on pimd or pim6d, this will be compiled. Reviewed-by: Sarita Patra Signed-off-by: Mobashshera Rasool --- pimd/pim_assert.c | 8 ++++---- pimd/pim_assert.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pimd/pim_assert.c b/pimd/pim_assert.c index cac3194681..a335bc8c1a 100644 --- a/pimd/pim_assert.c +++ b/pimd/pim_assert.c @@ -65,9 +65,9 @@ void pim_ifassert_winner_set(struct pim_ifchannel *ch, char was_str[INET_ADDRSTRLEN]; char winner_str[INET_ADDRSTRLEN]; pim_inet4_dump("", ch->ifassert_winner, was_str, - sizeof(was_str)); + sizeof(was_str)); pim_inet4_dump("", winner, winner_str, - sizeof(winner_str)); + sizeof(winner_str)); zlog_debug( "%s: (S,G)=%s assert winner changed from %s to %s on interface %s", __func__, ch->sg_str, was_str, winner_str, @@ -339,7 +339,7 @@ int pim_assert_metric_better(const struct pim_assert_metric *m1, if (m1->route_metric > m2->route_metric) return 0; - return ntohl(m1->ip_address.s_addr) > ntohl(m2->ip_address.s_addr); + return pim_addr_cmp(m1->ip_address, m2->ip_address) > 0; } int pim_assert_metric_match(const struct pim_assert_metric *m1, @@ -352,7 +352,7 @@ int pim_assert_metric_match(const struct pim_assert_metric *m1, if (m1->route_metric != m2->route_metric) return 0; - return m1->ip_address.s_addr == m2->ip_address.s_addr; + return !pim_addr_cmp(m1->ip_address, m2->ip_address); } int pim_assert_build_msg(uint8_t *pim_msg, int buf_size, struct interface *ifp, diff --git a/pimd/pim_assert.h b/pimd/pim_assert.h index 2e6e62cc3a..a149fb176e 100644 --- a/pimd/pim_assert.h +++ b/pimd/pim_assert.h @@ -37,7 +37,7 @@ struct pim_assert_metric { uint32_t rpt_bit_flag; uint32_t metric_preference; uint32_t route_metric; - struct in_addr ip_address; /* neighbor router that sourced the Assert + pim_addr ip_address; /* neighbor router that sourced the Assert message */ }; From 12e76340181e41872d56e1f45f502bb04584e886 Mon Sep 17 00:00:00 2001 From: Mobashshera Rasool Date: Mon, 13 Dec 2021 22:31:39 -0800 Subject: [PATCH 05/13] pimd: Modifying in_addr to pim_addr in struct pim_interface for IPv6 Based on compiler option, pim_addr will be changed to in_addr or in6_addr for pimd and pim6d respectively. Reviewed-by: Sarita Patra Signed-off-by: Mobashshera Rasool --- pimd/pim_iface.h | 16 +++++++--------- pimd/pim_macro.c | 2 +- pimd/pim_macro.h | 2 +- pimd/pim_pim.c | 4 ++-- 4 files changed, 11 insertions(+), 13 deletions(-) diff --git a/pimd/pim_iface.h b/pimd/pim_iface.h index 72168b690a..9213e600f9 100644 --- a/pimd/pim_iface.h +++ b/pimd/pim_iface.h @@ -94,16 +94,14 @@ struct pim_interface { uint32_t options; /* bit vector */ ifindex_t mroute_vif_index; struct pim_instance *pim; - - struct in_addr primary_address; /* remember addr to detect change */ + pim_addr primary_address; /* remember addr to detect change */ struct list *sec_addr_list; /* list of struct pim_secondary_addr */ - struct in_addr update_source; /* user can statically set the primary + pim_addr update_source; /* user can statically set the primary * address of the interface */ - - int igmp_version; /* IGMP version */ - int igmp_default_robustness_variable; /* IGMPv3 QRV */ - int igmp_default_query_interval; /* IGMPv3 secs between general - queries */ + int igmp_version; /* IGMP or MLD version */ + int igmp_default_robustness_variable; /* IGMP or MLD QRV */ + int igmp_default_query_interval; /* IGMP or MLD secs between general + queries */ int igmp_query_max_response_time_dsec; /* IGMPv3 Max Response Time in dsecs for general queries */ int igmp_specific_query_max_response_time_dsec; /* IGMPv3 Max Response @@ -144,7 +142,7 @@ struct pim_interface { int64_t pim_dr_election_last; /* timestamp */ int pim_dr_election_count; int pim_dr_election_changes; - struct in_addr pim_dr_addr; + pim_addr pim_dr_addr; uint32_t pim_dr_priority; /* config */ int pim_dr_num_nondrpri_neighbors; /* neighbors without dr_pri */ diff --git a/pimd/pim_macro.c b/pimd/pim_macro.c index c6961d30c2..81ef6962de 100644 --- a/pimd/pim_macro.c +++ b/pimd/pim_macro.c @@ -261,7 +261,7 @@ int pim_macro_ch_could_assert_eval(const struct pim_ifchannel *ch) } */ struct pim_assert_metric pim_macro_spt_assert_metric(const struct pim_rpf *rpf, - struct in_addr ifaddr) + pim_addr ifaddr) { struct pim_assert_metric metric; diff --git a/pimd/pim_macro.h b/pimd/pim_macro.h index f310e244e8..b88a84e2d2 100644 --- a/pimd/pim_macro.h +++ b/pimd/pim_macro.h @@ -33,7 +33,7 @@ int pim_macro_chisin_pim_include(const struct pim_ifchannel *ch); int pim_macro_chisin_joins_or_include(const struct pim_ifchannel *ch); int pim_macro_ch_could_assert_eval(const struct pim_ifchannel *ch); struct pim_assert_metric pim_macro_spt_assert_metric(const struct pim_rpf *rpf, - struct in_addr ifaddr); + pim_addr ifaddr); struct pim_assert_metric pim_macro_ch_my_assert_metric_eval(const struct pim_ifchannel *ch); int pim_macro_chisin_oiflist(const struct pim_ifchannel *ch); diff --git a/pimd/pim_pim.c b/pimd/pim_pim.c index 351b906d24..2142d9010b 100644 --- a/pimd/pim_pim.c +++ b/pimd/pim_pim.c @@ -570,8 +570,8 @@ static int pim_msg_send_frame(int fd, char *buf, size_t len, return 0; } -int pim_msg_send(int fd, struct in_addr src, struct in_addr dst, - uint8_t *pim_msg, int pim_msg_size, const char *ifname) +int pim_msg_send(int fd, pim_addr src, struct in_addr dst, uint8_t *pim_msg, + int pim_msg_size, const char *ifname) { struct sockaddr_in to; socklen_t tolen; From 5e8d3f4f5e99a6c9e92ca0a5b1f8ded2b6bf136b Mon Sep 17 00:00:00 2001 From: Mobashshera Rasool Date: Mon, 13 Dec 2021 23:12:29 -0800 Subject: [PATCH 06/13] pimd: Modifying in_addr to pim_addr in igmp_join for IPv6. Changed struct in_addr source_addr to pim_addr source_addr in struct igmp_join which is to be used in both IPv4 and IPv6(Both MLD and IGMP). Reviewed-by: Sarita Patra Signed-off-by: Mobashshera Rasool --- pimd/pim_igmp.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pimd/pim_igmp.h b/pimd/pim_igmp.h index 0a7e0605a5..bc34266ccc 100644 --- a/pimd/pim_igmp.h +++ b/pimd/pim_igmp.h @@ -26,6 +26,7 @@ #include "vty.h" #include "linklist.h" #include "pim_igmp_stats.h" +#include "pim_str.h" /* The following sizes are likely to support @@ -76,8 +77,8 @@ } while (0) struct gm_join { - struct in_addr group_addr; - struct in_addr source_addr; + pim_addr group_addr; + pim_addr source_addr; int sock_fd; time_t sock_creation; }; From b050b030e8362b7f508b89e8052fd76a1dbae60c Mon Sep 17 00:00:00 2001 From: Mobashshera Rasool Date: Tue, 14 Dec 2021 02:02:48 -0800 Subject: [PATCH 07/13] pimd: Modifying in_addr to pim_addr in igmp_source for IPv6. Changed struct in_addr source_addr to pim_addr source_addr in struct igmp_source which is to be used in both IPv4 and IPv6(Both MLD and IGMP). Reviewed-by: Sarita Patra Signed-off-by: Mobashshera Rasool --- pimd/pim_igmp.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pimd/pim_igmp.h b/pimd/pim_igmp.h index bc34266ccc..5fd4fdb32c 100644 --- a/pimd/pim_igmp.h +++ b/pimd/pim_igmp.h @@ -140,7 +140,7 @@ int igmp_validate_checksum(char *igmp_msg, int igmp_msg_len); #define IGMP_SOURCE_DONT_SEND(flags) ((flags) &= ~IGMP_SOURCE_MASK_SEND) struct gm_source { - struct in_addr source_addr; + pim_addr source_addr; struct thread *t_source_timer; struct gm_group *source_group; /* back pointer */ time_t source_creation; From 9040a7f939e8c5e1c9311042c69e70465d122ee8 Mon Sep 17 00:00:00 2001 From: Mobashshera Rasool Date: Mon, 13 Dec 2021 23:42:29 -0800 Subject: [PATCH 08/13] pimd: Modifying in_addr to pim_addr in struct pim_jp_agg_group for IPv6 Changed struct in_addr group to struct pim_addr group which is to be used in both IPv4 and IPv6(Both MLD and IGMP). Reviewed-by: Sarita Patra Signed-off-by: Mobashshera Rasool --- pimd/pim_jp_agg.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pimd/pim_jp_agg.h b/pimd/pim_jp_agg.h index d88ff8892b..506bf2d5ac 100644 --- a/pimd/pim_jp_agg.h +++ b/pimd/pim_jp_agg.h @@ -26,7 +26,7 @@ struct pim_jp_sources { }; struct pim_jp_agg_group { - struct in_addr group; + pim_addr group; struct list *sources; }; From 568b78b5bd7ba40bfb08a7c231a4b15ca445ea05 Mon Sep 17 00:00:00 2001 From: sarita patra Date: Mon, 13 Dec 2021 06:01:36 -0800 Subject: [PATCH 09/13] pimd: Modifying in_addr to pim_addr in struct pim_iface_upstream_switch Changed struct in_addr address to struct pim_addr in struct pim_iface_upstream_switch which is to be used in both IPv4 and IPv6(Both MLD and IGMP). Reviewed-by: Mobashshera Rasool Signed-off-by: sarita patra --- pimd/pim_iface.h | 3 ++- pimd/pim_igmp.h | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/pimd/pim_iface.h b/pimd/pim_iface.h index 9213e600f9..65dde45782 100644 --- a/pimd/pim_iface.h +++ b/pimd/pim_iface.h @@ -32,6 +32,7 @@ #include "pim_upstream.h" #include "pim_instance.h" #include "bfd.h" +#include "pim_str.h" #define PIM_IF_MASK_PIM (1 << 0) #define PIM_IF_MASK_IGMP (1 << 1) @@ -76,7 +77,7 @@ #define PIM_IF_FLAG_UNSET_HELLO_SENT(flags) ((flags) &= ~PIM_IF_FLAG_HELLO_SENT) struct pim_iface_upstream_switch { - struct in_addr address; + pim_addr address; struct list *us; }; diff --git a/pimd/pim_igmp.h b/pimd/pim_igmp.h index 5fd4fdb32c..2a818c068b 100644 --- a/pimd/pim_igmp.h +++ b/pimd/pim_igmp.h @@ -93,7 +93,7 @@ struct gm_sock { struct thread *t_igmp_query_timer; /* timer: issue IGMP general queries */ struct thread *t_other_querier_timer; /* timer: other querier present */ - struct in_addr querier_addr; /* IP address of the querier */ + pim_addr querier_addr; /* IP address of the querier */ int querier_query_interval; /* QQI */ int querier_robustness_variable; /* QRV */ int startup_query_count; From d1257ae9e6ab1c523289e9f3a009f099d09b52a5 Mon Sep 17 00:00:00 2001 From: sarita patra Date: Mon, 13 Dec 2021 06:03:31 -0800 Subject: [PATCH 10/13] pimd: Modifying in_addr to pim_addr in struct igmp_group for IPv6. Changed struct in_addr group_addr to struct PIM_ADDR group_addr in struct igmp_group which is to be used in both IPv4 and IPv6(Both MLD and IGMP). Reviewed-by: Mobashshera Rasool Signed-off-by: sarita patra --- pimd/pim_igmp.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pimd/pim_igmp.h b/pimd/pim_igmp.h index 2a818c068b..a3f470d8dc 100644 --- a/pimd/pim_igmp.h +++ b/pimd/pim_igmp.h @@ -175,8 +175,7 @@ struct gm_group { /* compatibility mode - igmp v1, v2 or v3 */ int igmp_version; - - struct in_addr group_addr; + pim_addr group_addr; int group_filtermode_isexcl; /* 0=INCLUDE, 1=EXCLUDE */ struct list *group_source_list; /* list of struct gm_source */ time_t group_creation; From d02ea60665e381c7fa598f9032bfbfb67ea6f2e2 Mon Sep 17 00:00:00 2001 From: sarita patra Date: Tue, 14 Dec 2021 04:17:29 -0800 Subject: [PATCH 11/13] pimd: Modifying in_addr to pim_addr in struct pim_nexthop for IPv6. Changed struct in_addr last_lookup to struct PIM_ADDR last_lookup which is to be used in both IPv4 and IPv6(Both MLD and IGMP). Reviewed-by: Mobashshera Rasool Signed-off-by: sarita patra --- pimd/pim_rpf.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pimd/pim_rpf.h b/pimd/pim_rpf.h index 006aa1b636..d6a8880ffb 100644 --- a/pimd/pim_rpf.h +++ b/pimd/pim_rpf.h @@ -21,6 +21,7 @@ #define PIM_RPF_H #include +#include "pim_str.h" /* RFC 4601: @@ -35,7 +36,7 @@ units applicable to the unicast routing protocol used. */ struct pim_nexthop { - struct in_addr last_lookup; + pim_addr last_lookup; long long last_lookup_time; struct interface *interface; /* RPF_interface(S) */ struct prefix mrib_nexthop_addr; /* MRIB.next_hop(S) */ From b7ed98e9b6f5a0aad4e4659d458093c3d9c059d9 Mon Sep 17 00:00:00 2001 From: sarita patra Date: Tue, 14 Dec 2021 04:22:28 -0800 Subject: [PATCH 12/13] pimd: Modifying in_addr to pim_addr in struct pim_upstream for IPv6. Changed struct in_addr upstream_addr and struct in_addr upstream_register to struct PIM_ADDR upstream_addr and struct PIM_ADDR upstream_register which are to be used in both IPv4 and IPv6(Both MLD and IGMP). Reviewed-by: Mobashshera Rasool Signed-off-by: sarita patra --- pimd/pim_upstream.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pimd/pim_upstream.h b/pimd/pim_upstream.h index ea3b564f8a..b4469ad329 100644 --- a/pimd/pim_upstream.h +++ b/pimd/pim_upstream.h @@ -229,8 +229,8 @@ struct pim_upstream { struct pim_instance *pim; struct rb_pim_upstream_item upstream_rb; struct pim_upstream *parent; - struct in_addr upstream_addr; /* Who we are talking to */ - struct in_addr upstream_register; /*Who we received a register from*/ + pim_addr upstream_addr; /* Who we are talking to */ + pim_addr upstream_register; /*Who we received a register from*/ struct prefix_sg sg; /* (S,G) group key */ char sg_str[PIM_SG_LEN]; uint32_t flags; From ca7613e25a624d73c7febcb999851c4308c59140 Mon Sep 17 00:00:00 2001 From: sarita patra Date: Tue, 14 Dec 2021 04:25:40 -0800 Subject: [PATCH 13/13] pimd: Modifying in_addr to pim_addr in struct pim_neighbor and gm_sock Changed struct in_addr source_addr to struct PIM_ADDR source_addr which is to be used in both IPv4 and IPv6(Both MLD and IGMP). Reviewed-by: Mobashshera Rasool Signed-off-by: sarita patra --- pimd/pim_igmp.h | 4 ++-- pimd/pim_neighbor.h | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/pimd/pim_igmp.h b/pimd/pim_igmp.h index a3f470d8dc..b82b62ea74 100644 --- a/pimd/pim_igmp.h +++ b/pimd/pim_igmp.h @@ -86,14 +86,14 @@ struct gm_join { struct gm_sock { int fd; struct interface *interface; - struct in_addr ifaddr; + pim_addr ifaddr; time_t sock_creation; struct thread *t_igmp_read; /* read: IGMP sockets */ struct thread *t_igmp_query_timer; /* timer: issue IGMP general queries */ struct thread *t_other_querier_timer; /* timer: other querier present */ - pim_addr querier_addr; /* IP address of the querier */ + pim_addr querier_addr; /* IP address of the querier */ int querier_query_interval; /* QQI */ int querier_robustness_variable; /* QRV */ int startup_query_count; diff --git a/pimd/pim_neighbor.h b/pimd/pim_neighbor.h index d71b2b87c3..12c469ae2a 100644 --- a/pimd/pim_neighbor.h +++ b/pimd/pim_neighbor.h @@ -28,10 +28,11 @@ #include "pim_tlv.h" #include "pim_iface.h" +#include "pim_str.h" struct pim_neighbor { int64_t creation; /* timestamp of creation */ - struct in_addr source_addr; + pim_addr source_addr; pim_hello_options hello_options; uint16_t holdtime; uint16_t propagation_delay_msec;