]> git.proxmox.com Git - mirror_frr.git/commitdiff
pim6d: Send register msg with IPv6 global address
authorMobashshera Rasool <mrasool@vmware.com>
Wed, 25 May 2022 04:31:09 +0000 (21:31 -0700)
committerMobashshera Rasool <mrasool@vmware.com>
Wed, 22 Jun 2022 03:44:10 +0000 (20:44 -0700)
Use global unicast IPv6 address to send the register
packet.

Fixes: #11235
Signed-off-by: Mobashshera Rasool <mrasool@vmware.com>
pimd/pim_register.c
pimd/pim_register.h

index 1945d99d210e7d0438c4912c9c18380dd8785b74..8403340d861a39bb6b139f142d4779ed22bae8ac 100644 (file)
@@ -234,6 +234,48 @@ int pim_register_stop_recv(struct interface *ifp, uint8_t *buf, int buf_size)
        return 0;
 }
 
+#if PIM_IPV == 6
+struct in6_addr pim_register_get_unicast_v6_addr(struct pim_interface *p_ifp)
+{
+       struct listnode *node;
+       struct listnode *nextnode;
+       struct pim_secondary_addr *sec_addr;
+       struct pim_interface *pim_ifp;
+       struct interface *ifp;
+       struct pim_instance *pim = p_ifp->pim;
+
+       /* Trying to get the unicast address from the RPF interface first */
+       for (ALL_LIST_ELEMENTS(p_ifp->sec_addr_list, node, nextnode,
+                              sec_addr)) {
+               if (!is_ipv6_global_unicast(&sec_addr->addr.u.prefix6))
+                       continue;
+
+               return sec_addr->addr.u.prefix6;
+       }
+
+       /* Loop through all the pim interface and try to return a global
+        * unicast ipv6 address
+        */
+       FOR_ALL_INTERFACES (pim->vrf, ifp) {
+               pim_ifp = ifp->info;
+
+               if (!pim_ifp)
+                       continue;
+
+               for (ALL_LIST_ELEMENTS(pim_ifp->sec_addr_list, node, nextnode,
+                                      sec_addr)) {
+                       if (!is_ipv6_global_unicast(&sec_addr->addr.u.prefix6))
+                               continue;
+
+                       return sec_addr->addr.u.prefix6;
+               }
+       }
+
+       zlog_warn("No global address found for use to send register message");
+       return PIMADDR_ANY;
+}
+#endif
+
 void pim_register_send(const uint8_t *buf, int buf_size, pim_addr src,
                       struct pim_rpf *rpg, int null_register,
                       struct pim_upstream *up)
@@ -278,6 +320,13 @@ void pim_register_send(const uint8_t *buf, int buf_size, pim_addr src,
 
        memcpy(b1, (const unsigned char *)buf, buf_size);
 
+#if PIM_IPV == 6
+       /* While sending Register message to RP, we cannot use link-local
+        * address therefore using unicast ipv6 address here, choosing it
+        * from the RPF Interface
+        */
+       src = pim_register_get_unicast_v6_addr(pinfo);
+#endif
        pim_msg_build_header(src, dst, buffer, buf_size + PIM_MSG_REGISTER_LEN,
                             PIM_MSG_TYPE_REGISTER, false);
 
index 79c64d995fef1483c4703a79df155dc5f82c2f1d..ddb34921ae06c99cc5913864577ec8ed63ed7bb5 100644 (file)
@@ -34,7 +34,9 @@ int pim_register_stop_recv(struct interface *ifp, uint8_t *buf, int 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);
-
+#if PIM_IPV == 6
+struct in6_addr pim_register_get_unicast_v6_addr(struct pim_interface *p_ifp);
+#endif
 void pim_register_send(const uint8_t *buf, int buf_size, pim_addr src,
                       struct pim_rpf *rpg, int null_register,
                       struct pim_upstream *up);