diff options
| -rw-r--r-- | pimd/pim_br.c | 10 | ||||
| -rw-r--r-- | pimd/pim_br.h | 6 | ||||
| -rw-r--r-- | pimd/pim_msg.h | 27 | ||||
| -rw-r--r-- | pimd/pim_register.c | 59 | ||||
| -rw-r--r-- | pimd/pim_register.h | 5 |
5 files changed, 57 insertions, 50 deletions
diff --git a/pimd/pim_br.c b/pimd/pim_br.c index 3e64296deb..6ec6b11e7b 100644 --- a/pimd/pim_br.c +++ b/pimd/pim_br.c @@ -30,14 +30,12 @@ struct pim_br { pim_sgaddr sg; - struct in_addr pmbr; + pim_addr pmbr; }; -struct in_addr pim_br_unknown = {.s_addr = 0}; - static struct list *pim_br_list = NULL; -struct in_addr pim_br_get_pmbr(pim_sgaddr *sg) +pim_addr pim_br_get_pmbr(pim_sgaddr *sg) { struct listnode *node; struct pim_br *pim_br; @@ -47,10 +45,10 @@ struct in_addr pim_br_get_pmbr(pim_sgaddr *sg) return pim_br->pmbr; } - return pim_br_unknown; + return PIMADDR_ANY; } -void pim_br_set_pmbr(pim_sgaddr *sg, struct in_addr br) +void pim_br_set_pmbr(pim_sgaddr *sg, pim_addr br) { struct listnode *node, *next; struct pim_br *pim_br; diff --git a/pimd/pim_br.h b/pimd/pim_br.h index ef24ef3c19..7b87c0f1fd 100644 --- a/pimd/pim_br.h +++ b/pimd/pim_br.h @@ -20,13 +20,11 @@ #ifndef PIM_BR_H #define PIM_BR_H -struct in_addr pim_br_get_pmbr(pim_sgaddr *sg); +pim_addr pim_br_get_pmbr(pim_sgaddr *sg); -void pim_br_set_pmbr(pim_sgaddr *sg, struct in_addr value); +void pim_br_set_pmbr(pim_sgaddr *sg, pim_addr value); void pim_br_clear_pmbr(pim_sgaddr *sg); void pim_br_init(void); -extern struct in_addr pim_br_unknown; - #endif diff --git a/pimd/pim_msg.h b/pimd/pim_msg.h index 522e94504a..456c356d9f 100644 --- a/pimd/pim_msg.h +++ b/pimd/pim_msg.h @@ -21,6 +21,9 @@ #define PIM_MSG_H #include <netinet/in.h> +#if PIM_IPV == 6 +#include <netinet/ip6.h> +#endif #include "pim_jp_agg.h" @@ -181,6 +184,30 @@ struct pim_jp { struct pim_jp_groups groups[1]; } __attribute__((packed)); +#if PIM_IPV == 4 +static inline pim_sgaddr pim_sgaddr_from_iphdr(const void *iphdr) +{ + const struct ip *ipv4_hdr = iphdr; + pim_sgaddr sg; + + sg.src = ipv4_hdr->ip_src; + sg.grp = ipv4_hdr->ip_dst; + + return sg; +} +#else +static inline pim_sgaddr pim_sgaddr_from_iphdr(const void *iphdr) +{ + const struct ip6_hdr *ipv6_hdr = iphdr; + pim_sgaddr sg; + + sg.src = ipv6_hdr->ip6_src; + sg.grp = ipv6_hdr->ip6_dst; + + return sg; +} +#endif + void pim_msg_build_header(uint8_t *pim_msg, size_t pim_msg_size, uint8_t pim_msg_type, bool no_fwd); uint8_t *pim_msg_addr_encode_ipv4_ucast(uint8_t *buf, struct in_addr addr); diff --git a/pimd/pim_register.c b/pimd/pim_register.c index 2cc80f957c..8313c8d4f6 100644 --- a/pimd/pim_register.c +++ b/pimd/pim_register.c @@ -311,30 +311,26 @@ void pim_null_register_send(struct pim_upstream *up) * } * } */ -int pim_register_recv(struct interface *ifp, struct in_addr dest_addr, - struct in_addr src_addr, uint8_t *tlv_buf, - int tlv_buf_size) +int pim_register_recv(struct interface *ifp, pim_addr dest_addr, + pim_addr src_addr, uint8_t *tlv_buf, int tlv_buf_size) { int sentRegisterStop = 0; - struct ip *ip_hdr; + const void *ip_hdr; pim_sgaddr sg; uint32_t *bits; int i_am_rp = 0; struct pim_interface *pim_ifp = ifp->info; struct pim_instance *pim = pim_ifp->pim; + pim_addr rp_addr; #define PIM_MSG_REGISTER_BIT_RESERVED_LEN 4 - ip_hdr = (struct ip *)(tlv_buf + PIM_MSG_REGISTER_BIT_RESERVED_LEN); + ip_hdr = (tlv_buf + PIM_MSG_REGISTER_BIT_RESERVED_LEN); - if (!if_address_is_local(&dest_addr, AF_INET, pim->vrf->vrf_id)) { - if (PIM_DEBUG_PIM_REG) { - char dest[INET_ADDRSTRLEN]; - - pim_inet4_dump("<dst?>", dest_addr, dest, sizeof(dest)); + if (!if_address_is_local(&dest_addr, PIM_AF, pim->vrf->vrf_id)) { + if (PIM_DEBUG_PIM_REG) zlog_debug( - "%s: Received Register message for destination address: %s that I do not own", - __func__, dest); - } + "%s: Received Register message for destination address: %pPA that I do not own", + __func__, &dest_addr); return 0; } @@ -367,18 +363,14 @@ int pim_register_recv(struct interface *ifp, struct in_addr dest_addr, * start of the actual Encapsulated data. */ memset(&sg, 0, sizeof(sg)); - sg.src = ip_hdr->ip_src; - sg.grp = ip_hdr->ip_dst; + sg = pim_sgaddr_from_iphdr(ip_hdr); i_am_rp = I_am_RP(pim, sg.grp); - if (PIM_DEBUG_PIM_REG) { - char src_str[INET_ADDRSTRLEN]; - - pim_inet4_dump("<src?>", src_addr, src_str, sizeof(src_str)); - zlog_debug("Received Register message%pSG from %s on %s, rp: %d", - &sg, src_str, ifp->name, i_am_rp); - } + if (PIM_DEBUG_PIM_REG) + zlog_debug( + "Received Register message%pSG from %pPA on %s, rp: %d", + &sg, &src_addr, ifp->name, i_am_rp); if (pim_is_grp_ssm(pim_ifp->pim, sg.grp)) { if (pim_addr_is_any(sg.src)) { @@ -390,9 +382,8 @@ int pim_register_recv(struct interface *ifp, struct in_addr dest_addr, } } - if (i_am_rp - && (dest_addr.s_addr - == ((RP(pim, sg.grp))->rpf_addr.u.prefix4.s_addr))) { + rp_addr = pim_addr_from_prefix(&(RP(pim, sg.grp))->rpf_addr); + if (i_am_rp && (!pim_addr_cmp(dest_addr, rp_addr))) { sentRegisterStop = 0; if (pim->register_plist) { @@ -407,31 +398,25 @@ int pim_register_recv(struct interface *ifp, struct in_addr dest_addr, if (prefix_list_apply(plist, &src) == PREFIX_DENY) { pim_register_stop_send(ifp, &sg, dest_addr, src_addr); - if (PIM_DEBUG_PIM_PACKETS) { - char src_str[INET_ADDRSTRLEN]; - - pim_inet4_dump("<src?>", src_addr, - src_str, - sizeof(src_str)); + if (PIM_DEBUG_PIM_PACKETS) zlog_debug( - "%s: Sending register-stop to %s for %pSG due to prefix-list denial, dropping packet", - __func__, src_str, &sg); - } + "%s: Sending register-stop to %pPA for %pSG due to prefix-list denial, dropping packet", + __func__, &src_addr, &sg); return 0; } } if (*bits & PIM_REGISTER_BORDER_BIT) { - struct in_addr pimbr = pim_br_get_pmbr(&sg); + pim_addr pimbr = pim_br_get_pmbr(&sg); if (PIM_DEBUG_PIM_PACKETS) zlog_debug( "%s: Received Register message with Border bit set", __func__); - if (pimbr.s_addr == pim_br_unknown.s_addr) + if (pim_addr_is_any(pimbr)) pim_br_set_pmbr(&sg, src_addr); - else if (src_addr.s_addr != pimbr.s_addr) { + else if (pim_addr_cmp(src_addr, pimbr)) { pim_register_stop_send(ifp, &sg, dest_addr, src_addr); if (PIM_DEBUG_PIM_PACKETS) diff --git a/pimd/pim_register.h b/pimd/pim_register.h index fd4284b802..0ebef40c58 100644 --- a/pimd/pim_register.h +++ b/pimd/pim_register.h @@ -32,9 +32,8 @@ int pim_register_stop_recv(struct interface *ifp, uint8_t *buf, int buf_size); -int pim_register_recv(struct interface *ifp, struct in_addr dest_addr, - struct in_addr src_addr, uint8_t *tlv_buf, - int tlv_buf_size); +int pim_register_recv(struct interface *ifp, pim_addr dest_addr, + pim_addr src_addr, uint8_t *tlv_buf, int tlv_buf_size); void pim_register_send(const uint8_t *buf, int buf_size, struct in_addr src, struct pim_rpf *rpg, int null_register, |
