]> git.proxmox.com Git - mirror_frr.git/blobdiff - pimd/pim_iface.c
Merge pull request #3502 from donaldsharp/socket_to_me_baby
[mirror_frr.git] / pimd / pim_iface.c
index e075ff5ac29cbf1abf5d3296da624fb8f003eea6..1ad71823b89c27808bd97627a2dcf267f92e8c37 100644 (file)
@@ -46,6 +46,7 @@
 #include "pim_rp.h"
 #include "pim_nht.h"
 #include "pim_jp_agg.h"
+#include "pim_igmp_join.h"
 
 static void pim_if_igmp_join_del_all(struct interface *ifp);
 static int igmp_join_sock(const char *ifname, ifindex_t ifindex,
@@ -107,7 +108,8 @@ static int pim_sec_addr_comp(const void *p1, const void *p2)
        return 0;
 }
 
-struct pim_interface *pim_if_new(struct interface *ifp, int igmp, int pim)
+struct pim_interface *pim_if_new(struct interface *ifp, bool igmp, bool pim,
+                                bool ispimreg)
 {
        struct pim_interface *pim_ifp;
 
@@ -174,7 +176,7 @@ struct pim_interface *pim_if_new(struct interface *ifp, int igmp, int pim)
 
        pim_sock_reset(ifp);
 
-       pim_if_add_vif(ifp);
+       pim_if_add_vif(ifp, ispimreg);
 
        return pim_ifp;
 }
@@ -199,10 +201,10 @@ void pim_if_delete(struct interface *ifp)
 
        pim_if_del_vif(ifp);
 
-       list_delete_and_null(&pim_ifp->igmp_socket_list);
-       list_delete_and_null(&pim_ifp->pim_neighbor_list);
-       list_delete_and_null(&pim_ifp->upstream_switch_list);
-       list_delete_and_null(&pim_ifp->sec_addr_list);
+       list_delete(&pim_ifp->igmp_socket_list);
+       list_delete(&pim_ifp->pim_neighbor_list);
+       list_delete(&pim_ifp->upstream_switch_list);
+       list_delete(&pim_ifp->sec_addr_list);
 
        if (pim_ifp->boundary_oil_plist)
                XFREE(MTYPE_PIM_INTERFACE, pim_ifp->boundary_oil_plist);
@@ -625,7 +627,7 @@ void pim_if_addr_add(struct connected *ifc)
          address assigned, then try to create a vif_index.
        */
        if (pim_ifp->mroute_vif_index < 0) {
-               pim_if_add_vif(ifp);
+               pim_if_add_vif(ifp, false);
        }
        pim_ifchannel_scan_forward_start(ifp);
 }
@@ -758,7 +760,7 @@ void pim_if_addr_add_all(struct interface *ifp)
         * address assigned, then try to create a vif_index.
         */
        if (pim_ifp->mroute_vif_index < 0) {
-               pim_if_add_vif(ifp);
+               pim_if_add_vif(ifp, false);
        }
        pim_ifchannel_scan_forward_start(ifp);
 
@@ -923,7 +925,7 @@ static int pim_iface_next_vif_index(struct interface *ifp)
 
   see also pim_if_find_vifindex_by_ifindex()
  */
-int pim_if_add_vif(struct interface *ifp)
+int pim_if_add_vif(struct interface *ifp, bool ispimreg)
 {
        struct pim_interface *pim_ifp = ifp->info;
        struct in_addr ifaddr;
@@ -945,8 +947,7 @@ int pim_if_add_vif(struct interface *ifp)
        }
 
        ifaddr = pim_ifp->primary_address;
-       if (ifp->ifindex != PIM_OIF_PIM_REGISTER_VIF
-           && PIM_INADDR_IS_ANY(ifaddr)) {
+       if (!ispimreg && PIM_INADDR_IS_ANY(ifaddr)) {
                zlog_warn(
                        "%s: could not get address for interface %s ifindex=%d",
                        __PRETTY_FUNCTION__, ifp->name, ifp->ifindex);
@@ -1194,8 +1195,18 @@ static int igmp_join_sock(const char *ifname, ifindex_t ifindex,
                return -1;
        }
 
-       if (pim_socket_join_source(join_fd, ifindex, group_addr, source_addr,
-                                  ifname)) {
+       if (pim_igmp_join_source(join_fd, ifindex, group_addr, source_addr)) {
+               char group_str[INET_ADDRSTRLEN];
+               char source_str[INET_ADDRSTRLEN];
+               pim_inet4_dump("<grp?>", group_addr, group_str,
+                              sizeof(group_str));
+               pim_inet4_dump("<src?>", source_addr, source_str,
+                              sizeof(source_str));
+               zlog_warn(
+                       "%s: setsockopt(fd=%d) failure for IGMP group %s source %s ifindex %d on interface %s: errno=%d: %s",
+                       __PRETTY_FUNCTION__, join_fd, group_str, source_str,
+                       ifindex, ifname, errno, safe_strerror(errno));
+
                close(join_fd);
                return -2;
        }
@@ -1219,6 +1230,7 @@ static struct igmp_join *igmp_join_new(struct interface *ifp,
        if (join_fd < 0) {
                char group_str[INET_ADDRSTRLEN];
                char source_str[INET_ADDRSTRLEN];
+
                pim_inet4_dump("<grp?>", group_addr, group_str,
                               sizeof(group_str));
                pim_inet4_dump("<src?>", source_addr, source_str,
@@ -1337,7 +1349,7 @@ int pim_if_igmp_join_del(struct interface *ifp, struct in_addr group_addr,
        listnode_delete(pim_ifp->igmp_join_list, ij);
        igmp_join_free(ij);
        if (listcount(pim_ifp->igmp_join_list) < 1) {
-               list_delete_and_null(&pim_ifp->igmp_join_list);
+               list_delete(&pim_ifp->igmp_join_list);
                pim_ifp->igmp_join_list = 0;
        }
 
@@ -1456,7 +1468,7 @@ void pim_if_create_pimreg(struct pim_instance *pim)
                pim->regiface = if_create(pimreg_name, pim->vrf_id);
                pim->regiface->ifindex = PIM_OIF_PIM_REGISTER_VIF;
 
-               pim_if_new(pim->regiface, 0, 0);
+               pim_if_new(pim->regiface, false, false, true);
        }
 }
 
@@ -1483,14 +1495,6 @@ int pim_if_connected_to_source(struct interface *ifp, struct in_addr src)
        return 0;
 }
 
-bool pim_if_is_loopback(struct interface *ifp)
-{
-       if (if_is_loopback(ifp) || if_is_vrf(ifp))
-               return true;
-
-       return false;
-}
-
 bool pim_if_is_vrf_device(struct interface *ifp)
 {
        if (if_is_vrf(ifp))