]> git.proxmox.com Git - mirror_frr.git/blobdiff - pimd/pim_register.c
*: s/TRUE/true/, s/FALSE/false/
[mirror_frr.git] / pimd / pim_register.c
index 386ed1d4240775ffeab660e64fbd86d208734ef1..72278f44f92c626bfcf3fba8d145720ed2d1e8b5 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;
 
@@ -60,6 +61,7 @@ void pim_register_join(struct pim_upstream *up)
        pim_channel_add_oif(up->channel_oil, pim->regiface,
                            PIM_OIF_FLAG_PROTO_PIM);
        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,
@@ -145,6 +147,8 @@ int pim_register_stop_recv(struct interface *ifp, uint8_t *buf, int buf_size)
                pim_channel_del_oif(upstream->channel_oil, pim->regiface,
                                    PIM_OIF_FLAG_PROTO_PIM);
                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;
@@ -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_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_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_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;