]> git.proxmox.com Git - mirror_frr.git/blobdiff - pimd/pim_static.c
lib: enforce vrf_name_to_id by returning default_vrf when name is null
[mirror_frr.git] / pimd / pim_static.c
index 7c9aca47a72ca43273e83bcf897f789da16788f4..9569b7dcac2fa86cfb91e2a329c3cdc202fda3f0 100644 (file)
@@ -39,14 +39,7 @@ void pim_static_route_free(struct static_route *s_route)
 
 static struct static_route *static_route_alloc()
 {
-       struct static_route *s_route;
-
-       s_route = XCALLOC(MTYPE_PIM_STATIC_ROUTE, sizeof(*s_route));
-       if (!s_route) {
-               zlog_err("PIM XCALLOC(%zu) failure", sizeof(*s_route));
-               return 0;
-       }
-       return s_route;
+       return XCALLOC(MTYPE_PIM_STATIC_ROUTE, sizeof(struct static_route));
 }
 
 static struct static_route *static_route_new(unsigned int iif, unsigned int oif,
@@ -55,9 +48,6 @@ static struct static_route *static_route_new(unsigned int iif, unsigned int oif,
 {
        struct static_route *s_route;
        s_route = static_route_alloc();
-       if (!s_route) {
-               return 0;
-       }
 
        s_route->group = group;
        s_route->source = source;
@@ -74,8 +64,9 @@ static struct static_route *static_route_new(unsigned int iif, unsigned int oif,
 }
 
 
-int pim_static_add(struct interface *iif, struct interface *oif,
-                  struct in_addr group, struct in_addr source)
+int pim_static_add(struct pim_instance *pim, struct interface *iif,
+                  struct interface *oif, struct in_addr group,
+                  struct in_addr source)
 {
        struct listnode *node = NULL;
        struct static_route *s_route = NULL;
@@ -101,8 +92,11 @@ int pim_static_add(struct interface *iif, struct interface *oif,
                return -4;
        }
 #endif
+       if (iif->vrf_id != oif->vrf_id) {
+               return -3;
+       }
 
-       for (ALL_LIST_ELEMENTS_RO(qpim_static_route_list, node, s_route)) {
+       for (ALL_LIST_ELEMENTS_RO(pim->static_routes, node, s_route)) {
                if (s_route->group.s_addr == group.s_addr
                    && s_route->source.s_addr == source.s_addr) {
                        if (s_route->iif == iif_index
@@ -181,9 +175,11 @@ int pim_static_add(struct interface *iif, struct interface *oif,
         * match */
        if (!node) {
                s_route = static_route_new(iif_index, oif_index, group, source);
-               listnode_add(qpim_static_route_list, s_route);
+               listnode_add(pim->static_routes, s_route);
        }
 
+       s_route->c_oil.pim = pim;
+
        if (pim_mroute_add(&s_route->c_oil, __PRETTY_FUNCTION__)) {
                char gifaddr_str[INET_ADDRSTRLEN];
                char sifaddr_str[INET_ADDRSTRLEN];
@@ -203,7 +199,7 @@ int pim_static_add(struct interface *iif, struct interface *oif,
                } else {
                        /* we never stored off a copy, so it must have been a
                         * fresh new route */
-                       listnode_delete(qpim_static_route_list, s_route);
+                       listnode_delete(pim->static_routes, s_route);
                        pim_static_route_free(s_route);
                }
 
@@ -235,8 +231,9 @@ int pim_static_add(struct interface *iif, struct interface *oif,
        return 0;
 }
 
-int pim_static_del(struct interface *iif, struct interface *oif,
-                  struct in_addr group, struct in_addr source)
+int pim_static_del(struct pim_instance *pim, struct interface *iif,
+                  struct interface *oif, struct in_addr group,
+                  struct in_addr source)
 {
        struct listnode *node = NULL;
        struct listnode *nextnode = NULL;
@@ -253,8 +250,7 @@ int pim_static_del(struct interface *iif, struct interface *oif,
                return -2;
        }
 
-       for (ALL_LIST_ELEMENTS(qpim_static_route_list, node, nextnode,
-                              s_route)) {
+       for (ALL_LIST_ELEMENTS(pim->static_routes, node, nextnode, s_route)) {
                if (s_route->iif == iif_index
                    && s_route->group.s_addr == group.s_addr
                    && s_route->source.s_addr == source.s_addr
@@ -293,8 +289,7 @@ int pim_static_del(struct interface *iif, struct interface *oif,
                        s_route->c_oil.oif_creation[oif_index] = 0;
 
                        if (s_route->c_oil.oil_ref_count <= 0) {
-                               listnode_delete(qpim_static_route_list,
-                                               s_route);
+                               listnode_delete(pim->static_routes, s_route);
                                pim_static_route_free(s_route);
                        }
 
@@ -332,7 +327,8 @@ int pim_static_del(struct interface *iif, struct interface *oif,
        return 0;
 }
 
-int pim_static_write_mroute(struct vty *vty, struct interface *ifp)
+int pim_static_write_mroute(struct pim_instance *pim, struct vty *vty,
+                           struct interface *ifp)
 {
        struct pim_interface *pim_ifp = ifp->info;
        struct listnode *node;
@@ -344,7 +340,7 @@ int pim_static_write_mroute(struct vty *vty, struct interface *ifp)
        if (!pim_ifp)
                return 0;
 
-       for (ALL_LIST_ELEMENTS_RO(qpim_static_route_list, node, sroute)) {
+       for (ALL_LIST_ELEMENTS_RO(pim->static_routes, node, sroute)) {
                pim_inet4_dump("<ifaddr?>", sroute->group, gbuf, sizeof(gbuf));
                pim_inet4_dump("<ifaddr?>", sroute->source, sbuf, sizeof(sbuf));
                if (sroute->iif == pim_ifp->mroute_vif_index) {
@@ -352,7 +348,8 @@ int pim_static_write_mroute(struct vty *vty, struct interface *ifp)
                        for (i = 0; i < MAXVIFS; i++)
                                if (sroute->oif_ttls[i]) {
                                        struct interface *oifp =
-                                               pim_if_find_by_vif_index(i);
+                                               pim_if_find_by_vif_index(pim,
+                                                                        i);
                                        if (sroute->source.s_addr == 0)
                                                vty_out(vty,
                                                        " ip mroute %s %s\n",