diff options
Diffstat (limited to 'ospf6d')
| -rw-r--r-- | ospf6d/ospf6_asbr.c | 71 | ||||
| -rw-r--r-- | ospf6d/ospf6_asbr.h | 3 | ||||
| -rw-r--r-- | ospf6d/ospf6_top.c | 6 | ||||
| -rw-r--r-- | ospf6d/ospf6_top.h | 6 | ||||
| -rw-r--r-- | ospf6d/ospf6_zebra.c | 11 |
5 files changed, 51 insertions, 46 deletions
diff --git a/ospf6d/ospf6_asbr.c b/ospf6d/ospf6_asbr.c index d7307fe375..d4e52f0ede 100644 --- a/ospf6d/ospf6_asbr.c +++ b/ospf6d/ospf6_asbr.c @@ -556,7 +556,7 @@ void ospf6_asbr_lsa_add(struct ospf6_lsa *lsa) + OSPF6_PREFIX_SPACE(external->prefix.prefix_length); memset(&fwd_addr, 0, sizeof(struct prefix)); fwd_addr.family = AF_INET6; - fwd_addr.prefixlen = IPV6_MAX_PREFIXLEN; + fwd_addr.prefixlen = IPV6_MAX_BITLEN; memcpy(&fwd_addr.u.prefix6, (caddr_t)external + offset, sizeof(struct in6_addr)); @@ -1010,53 +1010,55 @@ static void ospf6_asbr_routemap_unset(struct ospf6_redist *red) static int ospf6_asbr_routemap_update_timer(struct thread *thread) { - void **arg; - int arg_type; - struct ospf6 *ospf6; + struct ospf6 *ospf6 = THREAD_ARG(thread); struct ospf6_redist *red; - - arg = THREAD_ARG(thread); - ospf6 = (struct ospf6 *)arg[0]; - arg_type = (int)(intptr_t)arg[1]; + int type; ospf6->t_distribute_update = NULL; - red = ospf6_redist_lookup(ospf6, arg_type, 0); + for (type = 0; type < ZEBRA_ROUTE_MAX; type++) { + red = ospf6_redist_lookup(ospf6, type, 0); - if (red && ROUTEMAP_NAME(red)) - ROUTEMAP(red) = route_map_lookup_by_name(ROUTEMAP_NAME(red)); - if (red && ROUTEMAP(red)) { - if (IS_OSPF6_DEBUG_ASBR) - zlog_debug("%s: route-map %s update, reset redist %s", - __func__, ROUTEMAP_NAME(red), - ZROUTE_NAME(arg_type)); + if (!red) + continue; + + if (!CHECK_FLAG(red->flag, OSPF6_IS_RMAP_CHANGED)) + continue; + + if (ROUTEMAP_NAME(red)) + ROUTEMAP(red) = + route_map_lookup_by_name(ROUTEMAP_NAME(red)); + + if (ROUTEMAP(red)) { + if (IS_OSPF6_DEBUG_ASBR) + zlog_debug( + "%s: route-map %s update, reset redist %s", + __func__, ROUTEMAP_NAME(red), + ZROUTE_NAME(type)); + + ospf6_zebra_no_redistribute(type, ospf6->vrf_id); + ospf6_zebra_redistribute(type, ospf6->vrf_id); + } - ospf6_zebra_no_redistribute(arg_type, ospf6->vrf_id); - ospf6_zebra_redistribute(arg_type, ospf6->vrf_id); + UNSET_FLAG(red->flag, OSPF6_IS_RMAP_CHANGED); } - XFREE(MTYPE_OSPF6_DIST_ARGS, arg); return 0; } -void ospf6_asbr_distribute_list_update(int type, struct ospf6 *ospf6) +void ospf6_asbr_distribute_list_update(struct ospf6 *ospf6, + struct ospf6_redist *red) { - void **args = NULL; + SET_FLAG(red->flag, OSPF6_IS_RMAP_CHANGED); if (ospf6->t_distribute_update) return; - args = XCALLOC(MTYPE_OSPF6_DIST_ARGS, sizeof(void *) * 2); - - args[0] = ospf6; - args[1] = (void *)((ptrdiff_t)type); - if (IS_OSPF6_DEBUG_ASBR) - zlog_debug("%s: trigger redistribute %s reset thread", __func__, - ZROUTE_NAME(type)); + zlog_debug("%s: trigger redistribute reset thread", __func__); ospf6->t_distribute_update = NULL; - thread_add_timer_msec(master, ospf6_asbr_routemap_update_timer, args, + thread_add_timer_msec(master, ospf6_asbr_routemap_update_timer, ospf6, OSPF_MIN_LS_INTERVAL, &ospf6->t_distribute_update); } @@ -1092,8 +1094,7 @@ void ospf6_asbr_routemap_update(const char *mapname) type)); route_map_counter_increment(ROUTEMAP(red)); - - ospf6_asbr_distribute_list_update(type, ospf6); + ospf6_asbr_distribute_list_update(ospf6, red); } else { /* * if the mapname matches a @@ -1131,7 +1132,7 @@ static void ospf6_asbr_routemap_event(const char *name) red = ospf6_redist_lookup(ospf6, type, 0); if (red && ROUTEMAP_NAME(red) && (strcmp(ROUTEMAP_NAME(red), name) == 0)) - ospf6_asbr_distribute_list_update(type, ospf6); + ospf6_asbr_distribute_list_update(ospf6, red); } } } @@ -1399,7 +1400,7 @@ void ospf6_asbr_redistribute_add(int type, ifindex_t ifindex, /* create/update binding in external_id_table */ prefix_id.family = AF_INET; - prefix_id.prefixlen = 32; + prefix_id.prefixlen = IPV4_MAX_BITLEN; prefix_id.u.prefix4.s_addr = htonl(info->id); node = route_node_get(ospf6->external_id_table, &prefix_id); node->info = match; @@ -1464,7 +1465,7 @@ void ospf6_asbr_redistribute_add(int type, ifindex_t ifindex, /* create/update binding in external_id_table */ prefix_id.family = AF_INET; - prefix_id.prefixlen = 32; + prefix_id.prefixlen = IPV4_MAX_BITLEN; prefix_id.u.prefix4.s_addr = htonl(info->id); node = route_node_get(ospf6->external_id_table, &prefix_id); node->info = route; @@ -1547,7 +1548,7 @@ void ospf6_asbr_redistribute_remove(int type, ifindex_t ifindex, /* remove binding in external_id_table */ prefix_id.family = AF_INET; - prefix_id.prefixlen = 32; + prefix_id.prefixlen = IPV4_MAX_BITLEN; prefix_id.u.prefix4.s_addr = htonl(info->id); node = route_node_lookup(ospf6->external_id_table, &prefix_id); assert(node); diff --git a/ospf6d/ospf6_asbr.h b/ospf6d/ospf6_asbr.h index 8f2135ef30..7ccd1c992b 100644 --- a/ospf6d/ospf6_asbr.h +++ b/ospf6d/ospf6_asbr.h @@ -105,7 +105,8 @@ extern void install_element_ospf6_debug_asbr(void); extern void ospf6_asbr_update_route_ecmp_path(struct ospf6_route *old, struct ospf6_route *route, struct ospf6 *ospf6); -extern void ospf6_asbr_distribute_list_update(int type, struct ospf6 *ospf6); +extern void ospf6_asbr_distribute_list_update(struct ospf6 *ospf6, + struct ospf6_redist *red); struct ospf6_redist *ospf6_redist_lookup(struct ospf6 *ospf6, int type, unsigned short instance); extern void ospf6_asbr_routemap_update(const char *mapname); diff --git a/ospf6d/ospf6_top.c b/ospf6d/ospf6_top.c index 057f89797a..6f40989efd 100644 --- a/ospf6d/ospf6_top.c +++ b/ospf6d/ospf6_top.c @@ -602,7 +602,7 @@ void ospf6_router_id_update(struct ospf6 *ospf6) if (ospf6->router_id_static != 0) ospf6->router_id = ospf6->router_id_static; else - ospf6->router_id = om6->zebra_router_id; + ospf6->router_id = ospf6->router_id_zebra; } /* start ospf6 */ @@ -786,8 +786,8 @@ DEFUN(no_ospf6_router_id, } } o->router_id = 0; - if (o->router_id_zebra.s_addr) - o->router_id = (uint32_t)o->router_id_zebra.s_addr; + if (o->router_id_zebra) + o->router_id = o->router_id_zebra; return CMD_SUCCESS; } diff --git a/ospf6d/ospf6_top.h b/ospf6d/ospf6_top.h index 51df4b6b8e..3eb423f681 100644 --- a/ospf6d/ospf6_top.h +++ b/ospf6d/ospf6_top.h @@ -29,7 +29,6 @@ struct ospf6_master { struct list *ospf6; /* OSPFv3 thread master. */ struct thread_master *master; - in_addr_t zebra_router_id; }; /* ospf6->config_flags */ @@ -38,9 +37,12 @@ enum { OSPF6_LOG_ADJACENCY_DETAIL = (1 << 1), }; +/* For processing route-map change update in the callback */ +#define OSPF6_IS_RMAP_CHANGED 0x01 struct ospf6_redist { uint8_t instance; + uint8_t flag; /* Redistribute metric info. */ struct { int type; /* External metric type (E1 or E2). */ @@ -71,7 +73,7 @@ struct ospf6 { /* static router id */ in_addr_t router_id_static; - struct in_addr router_id_zebra; + in_addr_t router_id_zebra; /* start time */ struct timeval starttime; diff --git a/ospf6d/ospf6_zebra.c b/ospf6d/ospf6_zebra.c index 170d545c49..a7e15c68ae 100644 --- a/ospf6d/ospf6_zebra.c +++ b/ospf6d/ospf6_zebra.c @@ -90,15 +90,16 @@ static int ospf6_router_id_update_zebra(ZAPI_CALLBACK_ARGS) zebra_router_id_update_read(zclient->ibuf, &router_id); - om6->zebra_router_id = router_id.u.prefix4.s_addr; + if (IS_OSPF6_DEBUG_ZEBRA(RECV)) + zlog_debug("Zebra router-id update %pI4 vrf %s id %u", + &router_id.u.prefix4, ospf6_vrf_id_to_name(vrf_id), + vrf_id); + o = ospf6_lookup_by_vrf_id(vrf_id); if (o == NULL) return 0; - o->router_id_zebra = router_id.u.prefix4; - if (IS_OSPF6_DEBUG_ZEBRA(RECV)) - zlog_debug("%s: zebra router-id %pI4 update", __func__, - &router_id.u.prefix4); + o->router_id_zebra = router_id.u.prefix4.s_addr; ospf6_router_id_update(o); |
