From f0d63d90bd2e2c4e189850bf7772e7ea2f4c501b Mon Sep 17 00:00:00 2001 From: David Lamparter Date: Tue, 18 Jan 2022 15:07:38 +0100 Subject: [PATCH] pim6d: IPv6-adjust static multicast routes Signed-off-by: David Lamparter --- pimd/pim_nb_config.c | 22 ++++---- pimd/pim_static.c | 121 ++++++++++++++----------------------------- pimd/pim_static.h | 10 ++-- 3 files changed, 54 insertions(+), 99 deletions(-) diff --git a/pimd/pim_nb_config.c b/pimd/pim_nb_config.c index 13c9b81aca..72dd28e69a 100644 --- a/pimd/pim_nb_config.c +++ b/pimd/pim_nb_config.c @@ -2180,8 +2180,8 @@ int lib_interface_pim_address_family_mroute_destroy( struct interface *iif; struct interface *oif; const char *oifname; - struct ipaddr source_addr; - struct ipaddr group_addr; + pim_addr source_addr; + pim_addr group_addr; const struct lyd_node *if_dnode; switch (args->event) { @@ -2211,11 +2211,10 @@ int lib_interface_pim_address_family_mroute_destroy( return NB_ERR_INCONSISTENCY; } - yang_dnode_get_ip(&source_addr, args->dnode, "./source-addr"); - yang_dnode_get_ip(&group_addr, args->dnode, "./group-addr"); + yang_dnode_get_pimaddr(&source_addr, args->dnode, "./source-addr"); + yang_dnode_get_pimaddr(&group_addr, args->dnode, "./group-addr"); - if (pim_static_del(pim, iif, oif, group_addr.ip._v4_addr, - source_addr.ip._v4_addr)) { + if (pim_static_del(pim, iif, oif, group_addr, source_addr)) { snprintf(args->errmsg, args->errmsg_len, "Failed to remove static mroute"); return NB_ERR_INCONSISTENCY; @@ -2238,8 +2237,8 @@ int lib_interface_pim_address_family_mroute_oif_modify( struct interface *iif; struct interface *oif; const char *oifname; - struct ipaddr source_addr; - struct ipaddr group_addr; + pim_addr source_addr; + pim_addr group_addr; const struct lyd_node *if_dnode; switch (args->event) { @@ -2288,11 +2287,10 @@ int lib_interface_pim_address_family_mroute_oif_modify( return NB_ERR_INCONSISTENCY; } - yang_dnode_get_ip(&source_addr, args->dnode, "../source-addr"); - yang_dnode_get_ip(&group_addr, args->dnode, "../group-addr"); + yang_dnode_get_pimaddr(&source_addr, args->dnode, "../source-addr"); + yang_dnode_get_pimaddr(&group_addr, args->dnode, "../group-addr"); - if (pim_static_add(pim, iif, oif, group_addr.ip._v4_addr, - source_addr.ip._v4_addr)) { + if (pim_static_add(pim, iif, oif, group_addr, source_addr)) { snprintf(args->errmsg, args->errmsg_len, "Failed to add static mroute"); return NB_ERR_INCONSISTENCY; diff --git a/pimd/pim_static.c b/pimd/pim_static.c index be06a25bea..45f0a194b0 100644 --- a/pimd/pim_static.c +++ b/pimd/pim_static.c @@ -43,8 +43,8 @@ static struct static_route *static_route_alloc(void) } static struct static_route *static_route_new(ifindex_t iif, ifindex_t oif, - struct in_addr group, - struct in_addr source) + pim_addr group, + pim_addr source) { struct static_route *s_route; s_route = static_route_alloc(); @@ -54,10 +54,10 @@ static struct static_route *static_route_new(ifindex_t iif, ifindex_t oif, s_route->iif = iif; s_route->oif_ttls[oif] = 1; s_route->c_oil.oil_ref_count = 1; - s_route->c_oil.oil.mfcc_origin = source; - s_route->c_oil.oil.mfcc_mcastgrp = group; - s_route->c_oil.oil.mfcc_parent = iif; - s_route->c_oil.oil.mfcc_ttls[oif] = 1; + *oil_origin(&s_route->c_oil) = source; + *oil_mcastgrp(&s_route->c_oil) = group; + *oil_parent(&s_route->c_oil) = iif; + oil_if_set(&s_route->c_oil, oif, 1); s_route->c_oil.oif_creation[oif] = pim_time_monotonic_sec(); return s_route; @@ -65,8 +65,7 @@ static struct static_route *static_route_new(ifindex_t iif, ifindex_t oif, int pim_static_add(struct pim_instance *pim, struct interface *iif, - struct interface *oif, struct in_addr group, - struct in_addr source) + struct interface *oif, pim_addr group, pim_addr source) { struct listnode *node = NULL; struct static_route *s_route = NULL; @@ -97,20 +96,14 @@ int pim_static_add(struct pim_instance *pim, struct interface *iif, } 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 (!pim_addr_cmp(s_route->group, group) + && !pim_addr_cmp(s_route->source, source)) { if (s_route->iif == iif_index && s_route->oif_ttls[oif_index]) { - char gifaddr_str[INET_ADDRSTRLEN]; - char sifaddr_str[INET_ADDRSTRLEN]; - pim_inet4_dump("", group, gifaddr_str, - sizeof(gifaddr_str)); - pim_inet4_dump("", source, sifaddr_str, - sizeof(sifaddr_str)); zlog_warn( - "%s %s: Unable to add static route: Route already exists (iif=%d,oif=%d,group=%s,source=%s)", + "%s %s: Unable to add static route: Route already exists (iif=%d,oif=%d,group=%pPAs,source=%pPAs)", __FILE__, __func__, iif_index, - oif_index, gifaddr_str, sifaddr_str); + oif_index, &group, &source); return -3; } @@ -130,7 +123,7 @@ int pim_static_add(struct pim_instance *pim, struct interface *iif, * adding a new output interface */ if (s_route->iif == iif_index) { s_route->oif_ttls[oif_index] = 1; - s_route->c_oil.oil.mfcc_ttls[oif_index] = 1; + oil_if_set(&s_route->c_oil, oif_index, 1); s_route->c_oil.oif_creation[oif_index] = pim_time_monotonic_sec(); ++s_route->c_oil.oil_ref_count; @@ -147,8 +140,8 @@ int pim_static_add(struct pim_instance *pim, struct interface *iif, s_route->oif_ttls[iif_index] = 0; s_route->c_oil.oif_creation[iif_index] = 0; - s_route->c_oil.oil - .mfcc_ttls[iif_index] = 0; + oil_if_set(&s_route->c_oil, iif_index, + 0); --s_route->c_oil.oil_ref_count; } #endif @@ -158,8 +151,8 @@ int pim_static_add(struct pim_instance *pim, struct interface *iif, s_route->oif_ttls[oif_index] = 1; s_route->c_oil.oif_creation[oif_index] = pim_time_monotonic_sec(); - s_route->c_oil.oil - .mfcc_ttls[oif_index] = 1; + oil_if_set(&s_route->c_oil, oif_index, + 1); ++s_route->c_oil.oil_ref_count; } } @@ -178,16 +171,10 @@ int pim_static_add(struct pim_instance *pim, struct interface *iif, s_route->c_oil.pim = pim; if (pim_static_mroute_add(&s_route->c_oil, __func__)) { - char gifaddr_str[INET_ADDRSTRLEN]; - char sifaddr_str[INET_ADDRSTRLEN]; - pim_inet4_dump("", group, gifaddr_str, - sizeof(gifaddr_str)); - pim_inet4_dump("", source, sifaddr_str, - sizeof(sifaddr_str)); zlog_warn( - "%s %s: Unable to add static route(iif=%d,oif=%d,group=%s,source=%s)", - __FILE__, __func__, iif_index, oif_index, gifaddr_str, - sifaddr_str); + "%s %s: Unable to add static route(iif=%d,oif=%d,group=%pPAs,source=%pPAs)", + __FILE__, __func__, iif_index, oif_index, &group, + &source); /* Need to put s_route back to the way it was */ if (original_s_route) { @@ -213,24 +200,17 @@ int pim_static_add(struct pim_instance *pim, struct interface *iif, } if (PIM_DEBUG_STATIC) { - char gifaddr_str[INET_ADDRSTRLEN]; - char sifaddr_str[INET_ADDRSTRLEN]; - pim_inet4_dump("", group, gifaddr_str, - sizeof(gifaddr_str)); - pim_inet4_dump("", source, sifaddr_str, - sizeof(sifaddr_str)); zlog_debug( - "%s: Static route added(iif=%d,oif=%d,group=%s,source=%s)", - __func__, iif_index, oif_index, gifaddr_str, - sifaddr_str); + "%s: Static route added(iif=%d,oif=%d,group=%pPAs,source=%pPAs)", + __func__, iif_index, oif_index, &group, + &source); } return 0; } int pim_static_del(struct pim_instance *pim, struct interface *iif, - struct interface *oif, struct in_addr group, - struct in_addr source) + struct interface *oif, pim_addr group, pim_addr source) { struct listnode *node = NULL; struct listnode *nextnode = NULL; @@ -249,11 +229,11 @@ int pim_static_del(struct pim_instance *pim, struct interface *iif, 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 + && !pim_addr_cmp(s_route->group, group) + && !pim_addr_cmp(s_route->source, source) && s_route->oif_ttls[oif_index]) { s_route->oif_ttls[oif_index] = 0; - s_route->c_oil.oil.mfcc_ttls[oif_index] = 0; + oil_if_set(&s_route->c_oil, oif_index, 0); --s_route->c_oil.oil_ref_count; /* If there are no more outputs then delete the whole @@ -263,19 +243,13 @@ int pim_static_del(struct pim_instance *pim, struct interface *iif, ? pim_mroute_del(&s_route->c_oil, __func__) : pim_static_mroute_add(&s_route->c_oil, __func__)) { - char gifaddr_str[INET_ADDRSTRLEN]; - char sifaddr_str[INET_ADDRSTRLEN]; - pim_inet4_dump("", group, gifaddr_str, - sizeof(gifaddr_str)); - pim_inet4_dump("", source, sifaddr_str, - sizeof(sifaddr_str)); zlog_warn( - "%s %s: Unable to remove static route(iif=%d,oif=%d,group=%s,source=%s)", + "%s %s: Unable to remove static route(iif=%d,oif=%d,group=%pPAs,source=%pPAs)", __FILE__, __func__, iif_index, - oif_index, gifaddr_str, sifaddr_str); + oif_index, &group, &source); s_route->oif_ttls[oif_index] = 1; - s_route->c_oil.oil.mfcc_ttls[oif_index] = 1; + oil_if_set(&s_route->c_oil, oif_index, 1); ++s_route->c_oil.oil_ref_count; return -1; @@ -289,16 +263,10 @@ int pim_static_del(struct pim_instance *pim, struct interface *iif, } if (PIM_DEBUG_STATIC) { - char gifaddr_str[INET_ADDRSTRLEN]; - char sifaddr_str[INET_ADDRSTRLEN]; - pim_inet4_dump("", group, gifaddr_str, - sizeof(gifaddr_str)); - pim_inet4_dump("", source, sifaddr_str, - sizeof(sifaddr_str)); zlog_debug( - "%s: Static route removed(iif=%d,oif=%d,group=%s,source=%s)", + "%s: Static route removed(iif=%d,oif=%d,group=%pPAs,source=%pPAs)", __func__, iif_index, oif_index, - gifaddr_str, sifaddr_str); + &group, &source); } break; @@ -306,16 +274,10 @@ int pim_static_del(struct pim_instance *pim, struct interface *iif, } if (!node) { - char gifaddr_str[INET_ADDRSTRLEN]; - char sifaddr_str[INET_ADDRSTRLEN]; - pim_inet4_dump("", group, gifaddr_str, - sizeof(gifaddr_str)); - pim_inet4_dump("", source, sifaddr_str, - sizeof(sifaddr_str)); zlog_warn( - "%s %s: Unable to remove static route: Route does not exist(iif=%d,oif=%d,group=%s,source=%s)", - __FILE__, __func__, iif_index, oif_index, gifaddr_str, - sifaddr_str); + "%s %s: Unable to remove static route: Route does not exist(iif=%d,oif=%d,group=%pPAs,source=%pPAs)", + __FILE__, __func__, iif_index, oif_index, &group, + &source); return -3; } @@ -329,15 +291,11 @@ int pim_static_write_mroute(struct pim_instance *pim, struct vty *vty, struct listnode *node; struct static_route *sroute; int count = 0; - char sbuf[INET_ADDRSTRLEN]; - char gbuf[INET_ADDRSTRLEN]; if (!pim_ifp) return 0; for (ALL_LIST_ELEMENTS_RO(pim->static_routes, node, sroute)) { - pim_inet4_dump("", sroute->group, gbuf, sizeof(gbuf)); - pim_inet4_dump("", sroute->source, sbuf, sizeof(sbuf)); if (sroute->iif == pim_ifp->mroute_vif_index) { int i; for (i = 0; i < MAXVIFS; i++) @@ -345,14 +303,15 @@ int pim_static_write_mroute(struct pim_instance *pim, struct vty *vty, struct interface *oifp = pim_if_find_by_vif_index(pim, i); - if (sroute->source.s_addr == INADDR_ANY) + if (pim_addr_is_any(sroute->source)) vty_out(vty, - " ip mroute %s %s\n", - oifp->name, gbuf); + " ip mroute %s %pPA\n", + oifp->name, &sroute->group); else vty_out(vty, - " ip mroute %s %s %s\n", - oifp->name, gbuf, sbuf); + " ip mroute %s %pPA %pPA\n", + oifp->name, &sroute->group, + &sroute->source); count++; } } diff --git a/pimd/pim_static.h b/pimd/pim_static.h index 953ec0a70a..56bfbd4e4f 100644 --- a/pimd/pim_static.h +++ b/pimd/pim_static.h @@ -26,8 +26,8 @@ struct static_route { /* Each static route is unique by these pair of addresses */ - struct in_addr group; - struct in_addr source; + pim_addr group; + pim_addr source; struct channel_oil c_oil; ifindex_t iif; @@ -37,11 +37,9 @@ struct static_route { void pim_static_route_free(struct static_route *s_route); int pim_static_add(struct pim_instance *pim, struct interface *iif, - struct interface *oif, struct in_addr group, - struct in_addr source); + struct interface *oif, pim_addr group, pim_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 interface *oif, pim_addr group, pim_addr source); int pim_static_write_mroute(struct pim_instance *pim, struct vty *vty, struct interface *ifp); -- 2.39.5