pim6d: Parsing pimv6 register msg

Signed-off-by: Mobashshera Rasool <mrasool@vmware.com>
This commit is contained in:
Mobashshera Rasool 2022-02-28 09:50:58 -08:00
parent d1fd950aa0
commit c7842d245e
2 changed files with 21 additions and 37 deletions

View File

@ -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, int pim_register_recv(struct interface *ifp, pim_addr dest_addr,
struct in_addr src_addr, uint8_t *tlv_buf, pim_addr src_addr, uint8_t *tlv_buf, int tlv_buf_size)
int tlv_buf_size)
{ {
int sentRegisterStop = 0; int sentRegisterStop = 0;
struct ip *ip_hdr; const void *ip_hdr;
pim_sgaddr sg; pim_sgaddr sg;
uint32_t *bits; uint32_t *bits;
int i_am_rp = 0; int i_am_rp = 0;
struct pim_interface *pim_ifp = ifp->info; struct pim_interface *pim_ifp = ifp->info;
struct pim_instance *pim = pim_ifp->pim; struct pim_instance *pim = pim_ifp->pim;
pim_addr rp_addr;
#define PIM_MSG_REGISTER_BIT_RESERVED_LEN 4 #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 (!if_address_is_local(&dest_addr, PIM_AF, pim->vrf->vrf_id)) {
if (PIM_DEBUG_PIM_REG) { if (PIM_DEBUG_PIM_REG)
char dest[INET_ADDRSTRLEN];
pim_inet4_dump("<dst?>", dest_addr, dest, sizeof(dest));
zlog_debug( zlog_debug(
"%s: Received Register message for destination address: %s that I do not own", "%s: Received Register message for destination address: %pPA that I do not own",
__func__, dest); __func__, &dest_addr);
}
return 0; return 0;
} }
@ -367,18 +363,14 @@ int pim_register_recv(struct interface *ifp, struct in_addr dest_addr,
* start of the actual Encapsulated data. * start of the actual Encapsulated data.
*/ */
memset(&sg, 0, sizeof(sg)); memset(&sg, 0, sizeof(sg));
sg.src = ip_hdr->ip_src; sg = pim_sgaddr_from_iphdr(ip_hdr);
sg.grp = ip_hdr->ip_dst;
i_am_rp = I_am_RP(pim, sg.grp); i_am_rp = I_am_RP(pim, sg.grp);
if (PIM_DEBUG_PIM_REG) { if (PIM_DEBUG_PIM_REG)
char src_str[INET_ADDRSTRLEN]; zlog_debug(
"Received Register message%pSG from %pPA on %s, rp: %d",
pim_inet4_dump("<src?>", src_addr, src_str, sizeof(src_str)); &sg, &src_addr, ifp->name, i_am_rp);
zlog_debug("Received Register message%pSG from %s on %s, rp: %d",
&sg, src_str, ifp->name, i_am_rp);
}
if (pim_is_grp_ssm(pim_ifp->pim, sg.grp)) { if (pim_is_grp_ssm(pim_ifp->pim, sg.grp)) {
if (pim_addr_is_any(sg.src)) { 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 rp_addr = pim_addr_from_prefix(&(RP(pim, sg.grp))->rpf_addr);
&& (dest_addr.s_addr if (i_am_rp && (!pim_addr_cmp(dest_addr, rp_addr))) {
== ((RP(pim, sg.grp))->rpf_addr.u.prefix4.s_addr))) {
sentRegisterStop = 0; sentRegisterStop = 0;
if (pim->register_plist) { if (pim->register_plist) {
@ -407,16 +398,10 @@ int pim_register_recv(struct interface *ifp, struct in_addr dest_addr,
if (prefix_list_apply(plist, &src) == PREFIX_DENY) { if (prefix_list_apply(plist, &src) == PREFIX_DENY) {
pim_register_stop_send(ifp, &sg, dest_addr, pim_register_stop_send(ifp, &sg, dest_addr,
src_addr); src_addr);
if (PIM_DEBUG_PIM_PACKETS) { if (PIM_DEBUG_PIM_PACKETS)
char src_str[INET_ADDRSTRLEN];
pim_inet4_dump("<src?>", src_addr,
src_str,
sizeof(src_str));
zlog_debug( zlog_debug(
"%s: Sending register-stop to %s for %pSG due to prefix-list denial, dropping packet", "%s: Sending register-stop to %pPA for %pSG due to prefix-list denial, dropping packet",
__func__, src_str, &sg); __func__, &src_addr, &sg);
}
return 0; return 0;
} }

View File

@ -32,9 +32,8 @@
int pim_register_stop_recv(struct interface *ifp, uint8_t *buf, int buf_size); 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, int pim_register_recv(struct interface *ifp, pim_addr dest_addr,
struct in_addr src_addr, uint8_t *tlv_buf, pim_addr src_addr, uint8_t *tlv_buf, int tlv_buf_size);
int tlv_buf_size);
void pim_register_send(const uint8_t *buf, int buf_size, struct in_addr src, void pim_register_send(const uint8_t *buf, int buf_size, struct in_addr src,
struct pim_rpf *rpg, int null_register, struct pim_rpf *rpg, int null_register,