mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-07-05 21:15:02 +00:00
Merge pull request #10707 from mobash-rasool/pimv6-register-recv
This commit is contained in:
commit
f1bfeadcc1
@ -30,14 +30,12 @@
|
|||||||
|
|
||||||
struct pim_br {
|
struct pim_br {
|
||||||
pim_sgaddr sg;
|
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;
|
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 listnode *node;
|
||||||
struct pim_br *pim_br;
|
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->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 listnode *node, *next;
|
||||||
struct pim_br *pim_br;
|
struct pim_br *pim_br;
|
||||||
|
@ -20,13 +20,11 @@
|
|||||||
#ifndef PIM_BR_H
|
#ifndef PIM_BR_H
|
||||||
#define 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_clear_pmbr(pim_sgaddr *sg);
|
||||||
|
|
||||||
void pim_br_init(void);
|
void pim_br_init(void);
|
||||||
|
|
||||||
extern struct in_addr pim_br_unknown;
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -21,6 +21,9 @@
|
|||||||
#define PIM_MSG_H
|
#define PIM_MSG_H
|
||||||
|
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
|
#if PIM_IPV == 6
|
||||||
|
#include <netinet/ip6.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "pim_jp_agg.h"
|
#include "pim_jp_agg.h"
|
||||||
|
|
||||||
@ -181,6 +184,30 @@ struct pim_jp {
|
|||||||
struct pim_jp_groups groups[1];
|
struct pim_jp_groups groups[1];
|
||||||
} __attribute__((packed));
|
} __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,
|
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_type, bool no_fwd);
|
||||||
uint8_t *pim_msg_addr_encode_ipv4_ucast(uint8_t *buf, struct in_addr addr);
|
uint8_t *pim_msg_addr_encode_ipv4_ucast(uint8_t *buf, struct in_addr addr);
|
||||||
|
@ -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,31 +398,25 @@ 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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*bits & PIM_REGISTER_BORDER_BIT) {
|
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)
|
if (PIM_DEBUG_PIM_PACKETS)
|
||||||
zlog_debug(
|
zlog_debug(
|
||||||
"%s: Received Register message with Border bit set",
|
"%s: Received Register message with Border bit set",
|
||||||
__func__);
|
__func__);
|
||||||
|
|
||||||
if (pimbr.s_addr == pim_br_unknown.s_addr)
|
if (pim_addr_is_any(pimbr))
|
||||||
pim_br_set_pmbr(&sg, src_addr);
|
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,
|
pim_register_stop_send(ifp, &sg, dest_addr,
|
||||||
src_addr);
|
src_addr);
|
||||||
if (PIM_DEBUG_PIM_PACKETS)
|
if (PIM_DEBUG_PIM_PACKETS)
|
||||||
|
@ -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,
|
||||||
|
Loading…
Reference in New Issue
Block a user