]> git.proxmox.com Git - mirror_frr.git/blobdiff - pimd/pim_register.c
Merge pull request #5793 from ton31337/fix/formatting_show_bgp_summary_failed
[mirror_frr.git] / pimd / pim_register.c
index 386ed1d4240775ffeab660e64fbd86d208734ef1..013f04bb00ce13392d3438e4e681c874b23bbab6 100644 (file)
@@ -43,6 +43,7 @@
 #include "pim_join.h"
 #include "pim_util.h"
 #include "pim_ssm.h"
+#include "pim_vxlan.h"
 
 struct thread *send_test_packet_timer = NULL;
 
@@ -58,8 +59,9 @@ void pim_register_join(struct pim_upstream *up)
        }
 
        pim_channel_add_oif(up->channel_oil, pim->regiface,
-                           PIM_OIF_FLAG_PROTO_PIM);
+                           PIM_OIF_FLAG_PROTO_PIM, __func__);
        up->reg_state = PIM_REG_JOIN;
+       pim_vxlan_update_sg_reg_state(pim, up, true /*reg_join*/);
 }
 
 void pim_register_stop_send(struct interface *ifp, struct prefix_sg *sg,
@@ -92,7 +94,7 @@ void pim_register_stop_send(struct interface *ifp, struct prefix_sg *sg,
        b1length += length;
 
        pim_msg_build_header(buffer, b1length + PIM_MSG_REGISTER_STOP_LEN,
-                            PIM_MSG_TYPE_REG_STOP);
+                            PIM_MSG_TYPE_REG_STOP, false);
 
        pinfo = (struct pim_interface *)ifp->info;
        if (!pinfo) {
@@ -143,8 +145,10 @@ int pim_register_stop_recv(struct interface *ifp, uint8_t *buf, int buf_size)
        case PIM_REG_JOIN:
                upstream->reg_state = PIM_REG_PRUNE;
                pim_channel_del_oif(upstream->channel_oil, pim->regiface,
-                                   PIM_OIF_FLAG_PROTO_PIM);
+                                   PIM_OIF_FLAG_PROTO_PIM, __func__);
                pim_upstream_start_register_stop_timer(upstream, 0);
+               pim_vxlan_update_sg_reg_state(pim, upstream,
+                       false/*reg_join*/);
                break;
        case PIM_REG_JOIN_PENDING:
                upstream->reg_state = PIM_REG_PRUNE;
@@ -204,7 +208,7 @@ void pim_register_send(const uint8_t *buf, int buf_size, struct in_addr src,
        memcpy(b1, (const unsigned char *)buf, buf_size);
 
        pim_msg_build_header(buffer, buf_size + PIM_MSG_REGISTER_LEN,
-                            PIM_MSG_TYPE_REGISTER);
+                            PIM_MSG_TYPE_REGISTER, false);
 
        ++pinfo->pim_ifstat_reg_send;
 
@@ -219,6 +223,54 @@ void pim_register_send(const uint8_t *buf, int buf_size, struct in_addr src,
        }
 }
 
+void pim_null_register_send(struct pim_upstream *up)
+{
+       struct ip ip_hdr;
+       struct pim_interface *pim_ifp;
+       struct pim_rpf *rpg;
+       struct in_addr src;
+
+       pim_ifp = up->rpf.source_nexthop.interface->info;
+       if (!pim_ifp) {
+               if (PIM_DEBUG_PIM_TRACE)
+                       zlog_debug(
+                               "%s: Cannot send null-register for %s no valid iif",
+                               __PRETTY_FUNCTION__, up->sg_str);
+               return;
+       }
+
+       rpg = RP(pim_ifp->pim, up->sg.grp);
+       if (!rpg) {
+               if (PIM_DEBUG_PIM_TRACE)
+                       zlog_debug(
+                               "%s: Cannot send null-register for %s no RPF to the RP",
+                               __PRETTY_FUNCTION__, up->sg_str);
+               return;
+       }
+
+       memset(&ip_hdr, 0, sizeof(struct ip));
+       ip_hdr.ip_p = PIM_IP_PROTO_PIM;
+       ip_hdr.ip_hl = 5;
+       ip_hdr.ip_v = 4;
+       ip_hdr.ip_src = up->sg.src;
+       ip_hdr.ip_dst = up->sg.grp;
+       ip_hdr.ip_len = htons(20);
+
+       /* checksum is broken */
+       src = pim_ifp->primary_address;
+       if (PIM_UPSTREAM_FLAG_TEST_SRC_VXLAN_ORIG(up->flags)) {
+               if (!pim_vxlan_get_register_src(pim_ifp->pim, up, &src)) {
+                       if (PIM_DEBUG_PIM_TRACE)
+                               zlog_debug(
+                                       "%s: Cannot send null-register for %s vxlan-aa PIP unavailable",
+                                       __PRETTY_FUNCTION__, up->sg_str);
+                       return;
+               }
+       }
+       pim_register_send((uint8_t *)&ip_hdr, sizeof(struct ip),
+                       src, rpg, 1, up);
+}
+
 /*
  * 4.4.2 Receiving Register Messages at the RP
  *
@@ -231,8 +283,8 @@ void pim_register_send(const uint8_t *buf, int buf_size, struct in_addr src,
  *          # Note: this may be a spoofing attempt
  *      }
  *      if( I_am_RP(G) AND outer.dst == RP(G) ) {
- *            sentRegisterStop = FALSE;
- *            if ( register.borderbit == TRUE ) {
+ *            sentRegisterStop = false;
+ *            if ( register.borderbit == true ) {
  *                 if ( PMBR(S,G) == unknown ) {
  *                      PMBR(S,G) = outer.src
  *                 } else if ( outer.src != PMBR(S,G) ) {
@@ -244,10 +296,10 @@ void pim_register_send(const uint8_t *buf, int buf_size, struct in_addr src,
  *             ( SwitchToSptDesired(S,G) AND
  *               ( inherited_olist(S,G) == NULL ))) {
  *              send Register-Stop(S,G) to outer.src
- *              sentRegisterStop = TRUE;
+ *              sentRegisterStop = true;
  *            }
  *            if ( SPTbit(S,G) OR SwitchToSptDesired(S,G) ) {
- *                 if ( sentRegisterStop == TRUE ) {
+ *                 if ( sentRegisterStop == true ) {
  *                      set KeepaliveTimer(S,G) to RP_Keepalive_Period;
  *                 } else {
  *                      set KeepaliveTimer(S,G) to Keepalive_Period;
@@ -400,10 +452,9 @@ int pim_register_recv(struct interface *ifp, struct in_addr dest_addr,
                }
 
                if ((upstream->sptbit == PIM_UPSTREAM_SPTBIT_TRUE)
-                   || ((SwitchToSptDesired(pim_ifp->pim, &sg))
+                   || ((SwitchToSptDesiredOnRp(pim_ifp->pim, &sg))
                        && pim_upstream_inherited_olist(pim_ifp->pim, upstream)
                                   == 0)) {
-                       // pim_scan_individual_oil (upstream->channel_oil);
                        pim_register_stop_send(ifp, &sg, dest_addr, src_addr);
                        sentRegisterStop = 1;
                } else {
@@ -412,7 +463,7 @@ int pim_register_recv(struct interface *ifp, struct in_addr dest_addr,
                                           upstream->sptbit);
                }
                if ((upstream->sptbit == PIM_UPSTREAM_SPTBIT_TRUE)
-                   || (SwitchToSptDesired(pim_ifp->pim, &sg))) {
+                   || (SwitchToSptDesiredOnRp(pim_ifp->pim, &sg))) {
                        if (sentRegisterStop) {
                                pim_upstream_keep_alive_timer_start(
                                        upstream,