mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-13 19:39:28 +00:00
pim6d: IPv6-adjust static multicast routes
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
This commit is contained in:
parent
a9338fa449
commit
f0d63d90bd
@ -2180,8 +2180,8 @@ int lib_interface_pim_address_family_mroute_destroy(
|
|||||||
struct interface *iif;
|
struct interface *iif;
|
||||||
struct interface *oif;
|
struct interface *oif;
|
||||||
const char *oifname;
|
const char *oifname;
|
||||||
struct ipaddr source_addr;
|
pim_addr source_addr;
|
||||||
struct ipaddr group_addr;
|
pim_addr group_addr;
|
||||||
const struct lyd_node *if_dnode;
|
const struct lyd_node *if_dnode;
|
||||||
|
|
||||||
switch (args->event) {
|
switch (args->event) {
|
||||||
@ -2211,11 +2211,10 @@ int lib_interface_pim_address_family_mroute_destroy(
|
|||||||
return NB_ERR_INCONSISTENCY;
|
return NB_ERR_INCONSISTENCY;
|
||||||
}
|
}
|
||||||
|
|
||||||
yang_dnode_get_ip(&source_addr, args->dnode, "./source-addr");
|
yang_dnode_get_pimaddr(&source_addr, args->dnode, "./source-addr");
|
||||||
yang_dnode_get_ip(&group_addr, args->dnode, "./group-addr");
|
yang_dnode_get_pimaddr(&group_addr, args->dnode, "./group-addr");
|
||||||
|
|
||||||
if (pim_static_del(pim, iif, oif, group_addr.ip._v4_addr,
|
if (pim_static_del(pim, iif, oif, group_addr, source_addr)) {
|
||||||
source_addr.ip._v4_addr)) {
|
|
||||||
snprintf(args->errmsg, args->errmsg_len,
|
snprintf(args->errmsg, args->errmsg_len,
|
||||||
"Failed to remove static mroute");
|
"Failed to remove static mroute");
|
||||||
return NB_ERR_INCONSISTENCY;
|
return NB_ERR_INCONSISTENCY;
|
||||||
@ -2238,8 +2237,8 @@ int lib_interface_pim_address_family_mroute_oif_modify(
|
|||||||
struct interface *iif;
|
struct interface *iif;
|
||||||
struct interface *oif;
|
struct interface *oif;
|
||||||
const char *oifname;
|
const char *oifname;
|
||||||
struct ipaddr source_addr;
|
pim_addr source_addr;
|
||||||
struct ipaddr group_addr;
|
pim_addr group_addr;
|
||||||
const struct lyd_node *if_dnode;
|
const struct lyd_node *if_dnode;
|
||||||
|
|
||||||
switch (args->event) {
|
switch (args->event) {
|
||||||
@ -2288,11 +2287,10 @@ int lib_interface_pim_address_family_mroute_oif_modify(
|
|||||||
return NB_ERR_INCONSISTENCY;
|
return NB_ERR_INCONSISTENCY;
|
||||||
}
|
}
|
||||||
|
|
||||||
yang_dnode_get_ip(&source_addr, args->dnode, "../source-addr");
|
yang_dnode_get_pimaddr(&source_addr, args->dnode, "../source-addr");
|
||||||
yang_dnode_get_ip(&group_addr, args->dnode, "../group-addr");
|
yang_dnode_get_pimaddr(&group_addr, args->dnode, "../group-addr");
|
||||||
|
|
||||||
if (pim_static_add(pim, iif, oif, group_addr.ip._v4_addr,
|
if (pim_static_add(pim, iif, oif, group_addr, source_addr)) {
|
||||||
source_addr.ip._v4_addr)) {
|
|
||||||
snprintf(args->errmsg, args->errmsg_len,
|
snprintf(args->errmsg, args->errmsg_len,
|
||||||
"Failed to add static mroute");
|
"Failed to add static mroute");
|
||||||
return NB_ERR_INCONSISTENCY;
|
return NB_ERR_INCONSISTENCY;
|
||||||
|
@ -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,
|
static struct static_route *static_route_new(ifindex_t iif, ifindex_t oif,
|
||||||
struct in_addr group,
|
pim_addr group,
|
||||||
struct in_addr source)
|
pim_addr source)
|
||||||
{
|
{
|
||||||
struct static_route *s_route;
|
struct static_route *s_route;
|
||||||
s_route = static_route_alloc();
|
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->iif = iif;
|
||||||
s_route->oif_ttls[oif] = 1;
|
s_route->oif_ttls[oif] = 1;
|
||||||
s_route->c_oil.oil_ref_count = 1;
|
s_route->c_oil.oil_ref_count = 1;
|
||||||
s_route->c_oil.oil.mfcc_origin = source;
|
*oil_origin(&s_route->c_oil) = source;
|
||||||
s_route->c_oil.oil.mfcc_mcastgrp = group;
|
*oil_mcastgrp(&s_route->c_oil) = group;
|
||||||
s_route->c_oil.oil.mfcc_parent = iif;
|
*oil_parent(&s_route->c_oil) = iif;
|
||||||
s_route->c_oil.oil.mfcc_ttls[oif] = 1;
|
oil_if_set(&s_route->c_oil, oif, 1);
|
||||||
s_route->c_oil.oif_creation[oif] = pim_time_monotonic_sec();
|
s_route->c_oil.oif_creation[oif] = pim_time_monotonic_sec();
|
||||||
|
|
||||||
return s_route;
|
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,
|
int pim_static_add(struct pim_instance *pim, struct interface *iif,
|
||||||
struct interface *oif, struct in_addr group,
|
struct interface *oif, pim_addr group, pim_addr source)
|
||||||
struct in_addr source)
|
|
||||||
{
|
{
|
||||||
struct listnode *node = NULL;
|
struct listnode *node = NULL;
|
||||||
struct static_route *s_route = 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)) {
|
for (ALL_LIST_ELEMENTS_RO(pim->static_routes, node, s_route)) {
|
||||||
if (s_route->group.s_addr == group.s_addr
|
if (!pim_addr_cmp(s_route->group, group)
|
||||||
&& s_route->source.s_addr == source.s_addr) {
|
&& !pim_addr_cmp(s_route->source, source)) {
|
||||||
if (s_route->iif == iif_index
|
if (s_route->iif == iif_index
|
||||||
&& s_route->oif_ttls[oif_index]) {
|
&& s_route->oif_ttls[oif_index]) {
|
||||||
char gifaddr_str[INET_ADDRSTRLEN];
|
|
||||||
char sifaddr_str[INET_ADDRSTRLEN];
|
|
||||||
pim_inet4_dump("<ifaddr?>", group, gifaddr_str,
|
|
||||||
sizeof(gifaddr_str));
|
|
||||||
pim_inet4_dump("<ifaddr?>", source, sifaddr_str,
|
|
||||||
sizeof(sifaddr_str));
|
|
||||||
zlog_warn(
|
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,
|
__FILE__, __func__, iif_index,
|
||||||
oif_index, gifaddr_str, sifaddr_str);
|
oif_index, &group, &source);
|
||||||
return -3;
|
return -3;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -130,7 +123,7 @@ int pim_static_add(struct pim_instance *pim, struct interface *iif,
|
|||||||
* adding a new output interface */
|
* adding a new output interface */
|
||||||
if (s_route->iif == iif_index) {
|
if (s_route->iif == iif_index) {
|
||||||
s_route->oif_ttls[oif_index] = 1;
|
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] =
|
s_route->c_oil.oif_creation[oif_index] =
|
||||||
pim_time_monotonic_sec();
|
pim_time_monotonic_sec();
|
||||||
++s_route->c_oil.oil_ref_count;
|
++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->oif_ttls[iif_index] = 0;
|
||||||
s_route->c_oil.oif_creation[iif_index] =
|
s_route->c_oil.oif_creation[iif_index] =
|
||||||
0;
|
0;
|
||||||
s_route->c_oil.oil
|
oil_if_set(&s_route->c_oil, iif_index,
|
||||||
.mfcc_ttls[iif_index] = 0;
|
0);
|
||||||
--s_route->c_oil.oil_ref_count;
|
--s_route->c_oil.oil_ref_count;
|
||||||
}
|
}
|
||||||
#endif
|
#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->oif_ttls[oif_index] = 1;
|
||||||
s_route->c_oil.oif_creation[oif_index] =
|
s_route->c_oil.oif_creation[oif_index] =
|
||||||
pim_time_monotonic_sec();
|
pim_time_monotonic_sec();
|
||||||
s_route->c_oil.oil
|
oil_if_set(&s_route->c_oil, oif_index,
|
||||||
.mfcc_ttls[oif_index] = 1;
|
1);
|
||||||
++s_route->c_oil.oil_ref_count;
|
++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;
|
s_route->c_oil.pim = pim;
|
||||||
|
|
||||||
if (pim_static_mroute_add(&s_route->c_oil, __func__)) {
|
if (pim_static_mroute_add(&s_route->c_oil, __func__)) {
|
||||||
char gifaddr_str[INET_ADDRSTRLEN];
|
|
||||||
char sifaddr_str[INET_ADDRSTRLEN];
|
|
||||||
pim_inet4_dump("<ifaddr?>", group, gifaddr_str,
|
|
||||||
sizeof(gifaddr_str));
|
|
||||||
pim_inet4_dump("<ifaddr?>", source, sifaddr_str,
|
|
||||||
sizeof(sifaddr_str));
|
|
||||||
zlog_warn(
|
zlog_warn(
|
||||||
"%s %s: Unable to add static route(iif=%d,oif=%d,group=%s,source=%s)",
|
"%s %s: Unable to add static route(iif=%d,oif=%d,group=%pPAs,source=%pPAs)",
|
||||||
__FILE__, __func__, iif_index, oif_index, gifaddr_str,
|
__FILE__, __func__, iif_index, oif_index, &group,
|
||||||
sifaddr_str);
|
&source);
|
||||||
|
|
||||||
/* Need to put s_route back to the way it was */
|
/* Need to put s_route back to the way it was */
|
||||||
if (original_s_route) {
|
if (original_s_route) {
|
||||||
@ -213,24 +200,17 @@ int pim_static_add(struct pim_instance *pim, struct interface *iif,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (PIM_DEBUG_STATIC) {
|
if (PIM_DEBUG_STATIC) {
|
||||||
char gifaddr_str[INET_ADDRSTRLEN];
|
|
||||||
char sifaddr_str[INET_ADDRSTRLEN];
|
|
||||||
pim_inet4_dump("<ifaddr?>", group, gifaddr_str,
|
|
||||||
sizeof(gifaddr_str));
|
|
||||||
pim_inet4_dump("<ifaddr?>", source, sifaddr_str,
|
|
||||||
sizeof(sifaddr_str));
|
|
||||||
zlog_debug(
|
zlog_debug(
|
||||||
"%s: Static route added(iif=%d,oif=%d,group=%s,source=%s)",
|
"%s: Static route added(iif=%d,oif=%d,group=%pPAs,source=%pPAs)",
|
||||||
__func__, iif_index, oif_index, gifaddr_str,
|
__func__, iif_index, oif_index, &group,
|
||||||
sifaddr_str);
|
&source);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int pim_static_del(struct pim_instance *pim, struct interface *iif,
|
int pim_static_del(struct pim_instance *pim, struct interface *iif,
|
||||||
struct interface *oif, struct in_addr group,
|
struct interface *oif, pim_addr group, pim_addr source)
|
||||||
struct in_addr source)
|
|
||||||
{
|
{
|
||||||
struct listnode *node = NULL;
|
struct listnode *node = NULL;
|
||||||
struct listnode *nextnode = 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)) {
|
for (ALL_LIST_ELEMENTS(pim->static_routes, node, nextnode, s_route)) {
|
||||||
if (s_route->iif == iif_index
|
if (s_route->iif == iif_index
|
||||||
&& s_route->group.s_addr == group.s_addr
|
&& !pim_addr_cmp(s_route->group, group)
|
||||||
&& s_route->source.s_addr == source.s_addr
|
&& !pim_addr_cmp(s_route->source, source)
|
||||||
&& s_route->oif_ttls[oif_index]) {
|
&& s_route->oif_ttls[oif_index]) {
|
||||||
s_route->oif_ttls[oif_index] = 0;
|
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;
|
--s_route->c_oil.oil_ref_count;
|
||||||
|
|
||||||
/* If there are no more outputs then delete the whole
|
/* 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_mroute_del(&s_route->c_oil, __func__)
|
||||||
: pim_static_mroute_add(&s_route->c_oil,
|
: pim_static_mroute_add(&s_route->c_oil,
|
||||||
__func__)) {
|
__func__)) {
|
||||||
char gifaddr_str[INET_ADDRSTRLEN];
|
|
||||||
char sifaddr_str[INET_ADDRSTRLEN];
|
|
||||||
pim_inet4_dump("<ifaddr?>", group, gifaddr_str,
|
|
||||||
sizeof(gifaddr_str));
|
|
||||||
pim_inet4_dump("<ifaddr?>", source, sifaddr_str,
|
|
||||||
sizeof(sifaddr_str));
|
|
||||||
zlog_warn(
|
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,
|
__FILE__, __func__, iif_index,
|
||||||
oif_index, gifaddr_str, sifaddr_str);
|
oif_index, &group, &source);
|
||||||
|
|
||||||
s_route->oif_ttls[oif_index] = 1;
|
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;
|
++s_route->c_oil.oil_ref_count;
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
@ -289,16 +263,10 @@ int pim_static_del(struct pim_instance *pim, struct interface *iif,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (PIM_DEBUG_STATIC) {
|
if (PIM_DEBUG_STATIC) {
|
||||||
char gifaddr_str[INET_ADDRSTRLEN];
|
|
||||||
char sifaddr_str[INET_ADDRSTRLEN];
|
|
||||||
pim_inet4_dump("<ifaddr?>", group, gifaddr_str,
|
|
||||||
sizeof(gifaddr_str));
|
|
||||||
pim_inet4_dump("<ifaddr?>", source, sifaddr_str,
|
|
||||||
sizeof(sifaddr_str));
|
|
||||||
zlog_debug(
|
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,
|
__func__, iif_index, oif_index,
|
||||||
gifaddr_str, sifaddr_str);
|
&group, &source);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@ -306,16 +274,10 @@ int pim_static_del(struct pim_instance *pim, struct interface *iif,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!node) {
|
if (!node) {
|
||||||
char gifaddr_str[INET_ADDRSTRLEN];
|
|
||||||
char sifaddr_str[INET_ADDRSTRLEN];
|
|
||||||
pim_inet4_dump("<ifaddr?>", group, gifaddr_str,
|
|
||||||
sizeof(gifaddr_str));
|
|
||||||
pim_inet4_dump("<ifaddr?>", source, sifaddr_str,
|
|
||||||
sizeof(sifaddr_str));
|
|
||||||
zlog_warn(
|
zlog_warn(
|
||||||
"%s %s: Unable to remove static route: Route does not exist(iif=%d,oif=%d,group=%s,source=%s)",
|
"%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, gifaddr_str,
|
__FILE__, __func__, iif_index, oif_index, &group,
|
||||||
sifaddr_str);
|
&source);
|
||||||
return -3;
|
return -3;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -329,15 +291,11 @@ int pim_static_write_mroute(struct pim_instance *pim, struct vty *vty,
|
|||||||
struct listnode *node;
|
struct listnode *node;
|
||||||
struct static_route *sroute;
|
struct static_route *sroute;
|
||||||
int count = 0;
|
int count = 0;
|
||||||
char sbuf[INET_ADDRSTRLEN];
|
|
||||||
char gbuf[INET_ADDRSTRLEN];
|
|
||||||
|
|
||||||
if (!pim_ifp)
|
if (!pim_ifp)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
for (ALL_LIST_ELEMENTS_RO(pim->static_routes, 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) {
|
if (sroute->iif == pim_ifp->mroute_vif_index) {
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < MAXVIFS; 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 =
|
struct interface *oifp =
|
||||||
pim_if_find_by_vif_index(pim,
|
pim_if_find_by_vif_index(pim,
|
||||||
i);
|
i);
|
||||||
if (sroute->source.s_addr == INADDR_ANY)
|
if (pim_addr_is_any(sroute->source))
|
||||||
vty_out(vty,
|
vty_out(vty,
|
||||||
" ip mroute %s %s\n",
|
" ip mroute %s %pPA\n",
|
||||||
oifp->name, gbuf);
|
oifp->name, &sroute->group);
|
||||||
else
|
else
|
||||||
vty_out(vty,
|
vty_out(vty,
|
||||||
" ip mroute %s %s %s\n",
|
" ip mroute %s %pPA %pPA\n",
|
||||||
oifp->name, gbuf, sbuf);
|
oifp->name, &sroute->group,
|
||||||
|
&sroute->source);
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -26,8 +26,8 @@
|
|||||||
|
|
||||||
struct static_route {
|
struct static_route {
|
||||||
/* Each static route is unique by these pair of addresses */
|
/* Each static route is unique by these pair of addresses */
|
||||||
struct in_addr group;
|
pim_addr group;
|
||||||
struct in_addr source;
|
pim_addr source;
|
||||||
|
|
||||||
struct channel_oil c_oil;
|
struct channel_oil c_oil;
|
||||||
ifindex_t iif;
|
ifindex_t iif;
|
||||||
@ -37,11 +37,9 @@ struct static_route {
|
|||||||
void pim_static_route_free(struct static_route *s_route);
|
void pim_static_route_free(struct static_route *s_route);
|
||||||
|
|
||||||
int pim_static_add(struct pim_instance *pim, struct interface *iif,
|
int pim_static_add(struct pim_instance *pim, struct interface *iif,
|
||||||
struct interface *oif, struct in_addr group,
|
struct interface *oif, pim_addr group, pim_addr source);
|
||||||
struct in_addr source);
|
|
||||||
int pim_static_del(struct pim_instance *pim, struct interface *iif,
|
int pim_static_del(struct pim_instance *pim, struct interface *iif,
|
||||||
struct interface *oif, struct in_addr group,
|
struct interface *oif, pim_addr group, pim_addr source);
|
||||||
struct in_addr source);
|
|
||||||
int pim_static_write_mroute(struct pim_instance *pim, struct vty *vty,
|
int pim_static_write_mroute(struct pim_instance *pim, struct vty *vty,
|
||||||
struct interface *ifp);
|
struct interface *ifp);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user