summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pimd/pim_br.c10
-rw-r--r--pimd/pim_br.h6
-rw-r--r--pimd/pim_msg.h27
-rw-r--r--pimd/pim_register.c59
-rw-r--r--pimd/pim_register.h5
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,