diff options
Diffstat (limited to 'ospfd/ospf_zebra.c')
-rw-r--r-- | ospfd/ospf_zebra.c | 237 |
1 files changed, 106 insertions, 131 deletions
diff --git a/ospfd/ospf_zebra.c b/ospfd/ospf_zebra.c index a8e1630e..baba11d7 100644 --- a/ospfd/ospf_zebra.c +++ b/ospfd/ospf_zebra.c @@ -59,6 +59,7 @@ int ospf_interface_add (int command, struct zclient *zclient, zebra_size_t length) { struct interface *ifp; + struct ospf *ospf = ospf_top; ifp = zebra_interface_add_read (zclient->ibuf); @@ -81,7 +82,7 @@ ospf_interface_add (int command, struct zclient *zclient, zebra_size_t length) IF_DEF_PARAMS (ifp)->type = OSPF_IFTYPE_LOOPBACK; } - ospf_if_update (); + ospf_if_update (ospf); #ifdef HAVE_SNMP ospf_snmp_if_update (ifp); @@ -245,6 +246,7 @@ int ospf_interface_address_add (int command, struct zclient *zclient, zebra_size_t length) { + struct ospf *ospf = ospf_top; struct connected *c; c = zebra_interface_address_add_read (zclient->ibuf); @@ -252,19 +254,7 @@ ospf_interface_address_add (int command, struct zclient *zclient, if (c == NULL) return 0; -#if 0 - if (IS_DEBUG_OSPF (zebra, ZEBRA_INTERFACE)) - { - struct prefix *p; - - p = c->address; - if (p->family == AF_INET) - zlog_info (" connected address %s/%d", - inet_atop (p->u.prefix4), p->prefixlen); - } -#endif - - ospf_if_update (); + ospf_if_update (ospf); #ifdef HAVE_SNMP ospf_snmp_if_update (c->ifp); @@ -277,6 +267,7 @@ int ospf_interface_address_delete (int command, struct zclient *zclient, zebra_size_t length) { + struct ospf *ospf = ospf_top; struct connected *c; struct interface *ifp; struct ospf_interface *oi; @@ -308,7 +299,7 @@ ospf_interface_address_delete (int command, struct zclient *zclient, connected_free (c); - ospf_if_update(); + ospf_if_update (ospf); return 0; } @@ -482,42 +473,43 @@ ospf_is_type_redistributed (int type) int ospf_redistribute_set (int type, int mtype, int mvalue) { + struct ospf *ospf = ospf_top; int force = 0; if (ospf_is_type_redistributed (type)) { - if (mtype != ospf_top->dmetric[type].type) + if (mtype != ospf->dmetric[type].type) { - ospf_top->dmetric[type].type = mtype; + ospf->dmetric[type].type = mtype; force = LSA_REFRESH_FORCE; } - if (mvalue != ospf_top->dmetric[type].value) + if (mvalue != ospf->dmetric[type].value) { - ospf_top->dmetric[type].value = mvalue; + ospf->dmetric[type].value = mvalue; force = LSA_REFRESH_FORCE; } - ospf_external_lsa_refresh_type (type, force); + ospf_external_lsa_refresh_type (ospf, type, force); if (IS_DEBUG_OSPF (zebra, ZEBRA_REDISTRIBUTE)) zlog_info ("Redistribute[%s]: Refresh Type[%d], Metric[%d]", LOOKUP (ospf_redistributed_proto, type), - metric_type (type), metric_value (type)); + metric_type (ospf, type), metric_value (ospf, type)); return CMD_SUCCESS; } - ospf_top->dmetric[type].type = mtype; - ospf_top->dmetric[type].value = mvalue; + ospf->dmetric[type].type = mtype; + ospf->dmetric[type].value = mvalue; zclient_redistribute_set (zclient, type); if (IS_DEBUG_OSPF (zebra, ZEBRA_REDISTRIBUTE)) zlog_info ("Redistribute[%s]: Start Type[%d], Metric[%d]", LOOKUP (ospf_redistributed_proto, type), - metric_type (type), metric_value (type)); + metric_type (ospf, type), metric_value (ospf, type)); - ospf_asbr_status_update (++ospf_top->redistribute); + ospf_asbr_status_update (ospf, ++ospf->redistribute); return CMD_SUCCESS; } @@ -525,6 +517,8 @@ ospf_redistribute_set (int type, int mtype, int mvalue) int ospf_redistribute_unset (int type) { + struct ospf *ospf = ospf_top; + if (type == zclient->redist_default) return CMD_SUCCESS; @@ -537,13 +531,13 @@ ospf_redistribute_unset (int type) zlog_info ("Redistribute[%s]: Stop", LOOKUP (ospf_redistributed_proto, type)); - ospf_top->dmetric[type].type = -1; - ospf_top->dmetric[type].value = -1; + ospf->dmetric[type].type = -1; + ospf->dmetric[type].value = -1; /* Remove the routes from OSPF table. */ ospf_redistribute_withdraw (type); - ospf_asbr_status_update (--ospf_top->redistribute); + ospf_asbr_status_update (ospf, --ospf->redistribute); return CMD_SUCCESS; } @@ -551,48 +545,50 @@ ospf_redistribute_unset (int type) int ospf_redistribute_default_set (int originate, int mtype, int mvalue) { + struct ospf *ospf = ospf_top; + int force = 0; if (ospf_is_type_redistributed (DEFAULT_ROUTE)) { - if (mtype != ospf_top->dmetric[DEFAULT_ROUTE].type) + if (mtype != ospf->dmetric[DEFAULT_ROUTE].type) { - ospf_top->dmetric[DEFAULT_ROUTE].type = mtype; + ospf->dmetric[DEFAULT_ROUTE].type = mtype; force = 1; } - if (mvalue != ospf_top->dmetric[DEFAULT_ROUTE].value) + if (mvalue != ospf->dmetric[DEFAULT_ROUTE].value) { force = 1; - ospf_top->dmetric[DEFAULT_ROUTE].value = mvalue; + ospf->dmetric[DEFAULT_ROUTE].value = mvalue; } - ospf_external_lsa_refresh_default (); + ospf_external_lsa_refresh_default (ospf); if (IS_DEBUG_OSPF (zebra, ZEBRA_REDISTRIBUTE)) zlog_info ("Redistribute[%s]: Refresh Type[%d], Metric[%d]", LOOKUP (ospf_redistributed_proto, DEFAULT_ROUTE), - metric_type (DEFAULT_ROUTE), - metric_value (DEFAULT_ROUTE)); + metric_type (ospf, DEFAULT_ROUTE), + metric_value (ospf, DEFAULT_ROUTE)); return CMD_SUCCESS; } - ospf_top->default_originate = originate; - ospf_top->dmetric[DEFAULT_ROUTE].type = mtype; - ospf_top->dmetric[DEFAULT_ROUTE].value = mvalue; + ospf->default_originate = originate; + ospf->dmetric[DEFAULT_ROUTE].type = mtype; + ospf->dmetric[DEFAULT_ROUTE].value = mvalue; zclient_redistribute_default_set (zclient); if (IS_DEBUG_OSPF (zebra, ZEBRA_REDISTRIBUTE)) zlog_info ("Redistribute[DEFAULT]: Start Type[%d], Metric[%d]", - metric_type (DEFAULT_ROUTE), metric_value (DEFAULT_ROUTE)); - + metric_type (ospf, DEFAULT_ROUTE), + metric_value (ospf, DEFAULT_ROUTE)); - if (ospf_top->router_id.s_addr == 0) - ospf_top->external_origin |= (1 << DEFAULT_ROUTE); + if (ospf->router_id.s_addr == 0) + ospf->external_origin |= (1 << DEFAULT_ROUTE); else thread_add_timer (master, ospf_default_originate_timer, - &ospf_top->default_originate, 1); + &ospf->default_originate, 1); - ospf_asbr_status_update (++ospf_top->redistribute); + ospf_asbr_status_update (ospf, ++ospf->redistribute); return CMD_SUCCESS; } @@ -600,19 +596,21 @@ ospf_redistribute_default_set (int originate, int mtype, int mvalue) int ospf_redistribute_default_unset () { + struct ospf *ospf = ospf_top; + if (!ospf_is_type_redistributed (DEFAULT_ROUTE)) return CMD_SUCCESS; - ospf_top->default_originate = DEFAULT_ORIGINATE_NONE; - ospf_top->dmetric[DEFAULT_ROUTE].type = -1; - ospf_top->dmetric[DEFAULT_ROUTE].value = -1; + ospf->default_originate = DEFAULT_ORIGINATE_NONE; + ospf->dmetric[DEFAULT_ROUTE].type = -1; + ospf->dmetric[DEFAULT_ROUTE].value = -1; zclient_redistribute_default_unset (zclient); if (IS_DEBUG_OSPF (zebra, ZEBRA_REDISTRIBUTE)) zlog_info ("Redistribute[DEFAULT]: Stop"); - ospf_asbr_status_update (--ospf_top->redistribute); + ospf_asbr_status_update (ospf, --ospf->redistribute); return CMD_SUCCESS; } @@ -620,6 +618,8 @@ ospf_redistribute_default_unset () int ospf_external_lsa_originate_check (struct external_info *ei) { + struct ospf *ospf = ospf_top; + /* If prefix is multicast, then do not originate LSA. */ if (IN_MULTICAST (htonl (ei->p.prefix.s_addr))) { @@ -630,7 +630,7 @@ ospf_external_lsa_originate_check (struct external_info *ei) /* Take care of default-originate. */ if (is_prefix_default (&ei->p)) - if (ospf_top->default_originate == DEFAULT_ORIGINATE_NONE) + if (ospf->default_originate == DEFAULT_ORIGINATE_NONE) { zlog_info ("LSA[Type5:0.0.0.0]: Not originate AS-exntenal-LSA " "for default"); @@ -642,21 +642,26 @@ ospf_external_lsa_originate_check (struct external_info *ei) /* If connected prefix is OSPF enable interface, then do not announce. */ int -ospf_distribute_check_connected (struct external_info *ei) +ospf_distribute_check_connected (struct ospf *ospf, + struct external_info *ei) { struct route_node *rn; - for (rn = route_top (ospf_top->networks); rn; rn = route_next (rn)) + for (rn = route_top (ospf->networks); rn; rn = route_next (rn)) if (rn->info != NULL) if (prefix_match (&rn->p, (struct prefix *)&ei->p)) - return 0; + { + route_unlock_node (rn); + return 0; + } return 1; } /* return 1 if external LSA must be originated, 0 otherwise */ int -ospf_redistribute_check (struct external_info *ei, int *changed) +ospf_redistribute_check (struct ospf *ospf, + struct external_info *ei, int *changed) { struct route_map_set_values save_values; struct prefix_ipv4 *p = &ei->p; @@ -669,7 +674,8 @@ ospf_redistribute_check (struct external_info *ei, int *changed) return 0; /* Take care connected route. */ - if (type == ZEBRA_ROUTE_CONNECT && !ospf_distribute_check_connected (ei)) + if (type == ZEBRA_ROUTE_CONNECT && + !ospf_distribute_check_connected (ospf, ei)) return 0; if (!DEFAULT_ROUTE_TYPE (type) && DISTRIBUTE_NAME (type)) @@ -746,6 +752,7 @@ ospf_zebra_read_ipv4 (int command, struct zclient *zclient, struct in_addr nexthop; struct prefix_ipv4 p; struct external_info *ei; + struct ospf *ospf = ospf_top; s = zclient->ibuf; ifindex = 0; @@ -782,25 +789,26 @@ ospf_zebra_read_ipv4 (int command, struct zclient *zclient, { ei = ospf_external_info_add (api.type, p, ifindex, nexthop); - if (ospf_top->router_id.s_addr == 0) + if (ospf->router_id.s_addr == 0) /* Set flags to generate AS-external-LSA originate event for each redistributed protocols later. */ - ospf_top->external_origin |= (1 << api.type); + ospf->external_origin |= (1 << api.type); else { if (ei) { if (is_prefix_default (&p)) - ospf_external_lsa_refresh_default (); + ospf_external_lsa_refresh_default (ospf); else { struct ospf_lsa *current; - current = ospf_external_info_find_lsa (&ei->p); + current = ospf_external_info_find_lsa (ospf, &ei->p); if (!current) - ospf_external_lsa_originate (ei); + ospf_external_lsa_originate (ospf, ei); else if (IS_LSA_MAXAGE (current)) - ospf_external_lsa_refresh (current, ei, LSA_REFRESH_FORCE); + ospf_external_lsa_refresh (ospf, current, + ei, LSA_REFRESH_FORCE); else zlog_warn ("ospf_zebra_read_ipv4() : %s already exists", inet_ntoa (p.prefix)); @@ -812,9 +820,9 @@ ospf_zebra_read_ipv4 (int command, struct zclient *zclient, { ospf_external_info_delete (api.type, p); if ( !is_prefix_default (&p)) - ospf_external_lsa_flush (api.type, &p, ifindex, nexthop); + ospf_external_lsa_flush (ospf, api.type, &p, ifindex, nexthop); else - ospf_external_lsa_refresh_default (); + ospf_external_lsa_refresh_default (ospf); } return 0; @@ -822,7 +830,7 @@ ospf_zebra_read_ipv4 (int command, struct zclient *zclient, int -ospf_distribute_list_out_set (int type, char *name) +ospf_distribute_list_out_set (struct ospf *ospf, int type, char *name) { /* Lookup access-list for distribute-list. */ DISTRIBUTE_LIST (type) = access_list_lookup (AFI_IP, name); @@ -836,17 +844,17 @@ ospf_distribute_list_out_set (int type, char *name) /* If access-list have been set, schedule update timer. */ if (DISTRIBUTE_LIST (type)) - ospf_distribute_list_update (type); + ospf_distribute_list_update (ospf, type); return CMD_SUCCESS; } int -ospf_distribute_list_out_unset (int type, char *name) +ospf_distribute_list_out_unset (struct ospf *ospf, int type, char *name) { /* Schedule update timer. */ if (DISTRIBUTE_LIST (type)) - ospf_distribute_list_update (type); + ospf_distribute_list_update (ospf, type); /* Unset distribute-list. */ DISTRIBUTE_LIST (type) = NULL; @@ -869,11 +877,12 @@ ospf_distribute_list_update_timer (struct thread *thread) struct route_table *rt; struct ospf_lsa *lsa; u_char type; + struct ospf *ospf = ospf_top; type = (int) THREAD_ARG (thread); rt = EXTERNAL_INFO (type); - ospf_top->t_distribute_update = NULL; + ospf->t_distribute_update = NULL; zlog_info ("Zebra[Redistribute]: distribute-list update timer fired!"); @@ -883,11 +892,11 @@ ospf_distribute_list_update_timer (struct thread *thread) if ((ei = rn->info) != NULL) { if (is_prefix_default (&ei->p)) - ospf_external_lsa_refresh_default (); - else if ((lsa = ospf_external_info_find_lsa (&ei->p))) - ospf_external_lsa_refresh (lsa, ei, LSA_REFRESH_IF_CHANGED); + ospf_external_lsa_refresh_default (ospf); + else if ((lsa = ospf_external_info_find_lsa (ospf, &ei->p))) + ospf_external_lsa_refresh (ospf, lsa, ei, LSA_REFRESH_IF_CHANGED); else - ospf_external_lsa_originate (ei); + ospf_external_lsa_originate (ospf, ei); } return 0; } @@ -896,49 +905,45 @@ ospf_distribute_list_update_timer (struct thread *thread) /* Update distribute-list and set timer to apply access-list. */ void -ospf_distribute_list_update (int type) +ospf_distribute_list_update (struct ospf *ospf, int type) { struct route_table *rt; - zlog_info ("ospf_distribute_list_update(): start"); - /* External info does not exist. */ if (!(rt = EXTERNAL_INFO (type))) return; /* If exists previously invoked thread, then cancel it. */ - if (ospf_top->t_distribute_update) - OSPF_TIMER_OFF (ospf_top->t_distribute_update); + if (ospf->t_distribute_update) + OSPF_TIMER_OFF (ospf->t_distribute_update); /* Set timer. */ - ospf_top->t_distribute_update = + ospf->t_distribute_update = thread_add_timer (master, ospf_distribute_list_update_timer, (void *) type, OSPF_DISTRIBUTE_UPDATE_DELAY); - - zlog_info ("ospf_distribute_list_update(): stop"); } /* If access-list is updated, apply some check. */ void ospf_filter_update (struct access_list *access) { + struct ospf *ospf = ospf_top; int type; int abr_inv = 0; struct ospf_area *area; listnode node; /* If OSPF instatnce does not exist, return right now. */ - if (!ospf_top) + if (ospf == NULL) return; - /* Update distribute-list, and apply filter. */ for (type = 0; type < ZEBRA_ROUTE_MAX; type++) { if (ROUTEMAP (type) != NULL) { /* if route-map is not NULL it may be using this access list */ - ospf_distribute_list_update (type); + ospf_distribute_list_update (ospf, type); continue; } @@ -959,12 +964,12 @@ ospf_filter_update (struct access_list *access) /* Schedule distribute-list update timer. */ if (DISTRIBUTE_LIST (type) == NULL || strcmp (DISTRIBUTE_NAME (type), access->name) == 0) - ospf_distribute_list_update (type); + ospf_distribute_list_update (ospf, type); } } /* Update Area access-list. */ - for (node = listhead (ospf_top->areas); node; nextnode (node)) + for (node = listhead (ospf->areas); node; nextnode (node)) if ((area = getdata (node)) != NULL) { if (EXPORT_NAME (area)) @@ -982,7 +987,7 @@ ospf_filter_update (struct access_list *access) /* Schedule ABR tasks -- this will be changed -- takada. */ if (OSPF_IS_ABR && abr_inv) - ospf_schedule_abr_task (); + ospf_schedule_abr_task (ospf); } @@ -1010,6 +1015,7 @@ ospf_distance_set (struct vty *vty, char *distance_str, char *ip_str, u_char distance; struct route_node *rn; struct ospf_distance *odistance; + struct ospf *ospf = ospf_top; ret = str2prefix_ipv4 (ip_str, &p); if (ret == 0) @@ -1021,7 +1027,7 @@ ospf_distance_set (struct vty *vty, char *distance_str, char *ip_str, distance = atoi (distance_str); /* Get OSPF distance node. */ - rn = route_node_get (ospf_top->distance_table, (struct prefix *) &p); + rn = route_node_get (ospf->distance_table, (struct prefix *) &p); if (rn->info) { odistance = rn->info; @@ -1057,6 +1063,7 @@ ospf_distance_unset (struct vty *vty, char *distance_str, char *ip_str, u_char distance; struct route_node *rn; struct ospf_distance *odistance; + struct ospf *ospf = ospf_top; ret = str2prefix_ipv4 (ip_str, &p); if (ret == 0) @@ -1067,7 +1074,7 @@ ospf_distance_unset (struct vty *vty, char *distance_str, char *ip_str, distance = atoi (distance_str); - rn = route_node_lookup (ospf_top->distance_table, (struct prefix *)&p); + rn = route_node_lookup (ospf->distance_table, (struct prefix *)&p); if (! rn) { vty_out (vty, "Can't find specified prefix%s", VTY_NEWLINE); @@ -1088,12 +1095,12 @@ ospf_distance_unset (struct vty *vty, char *distance_str, char *ip_str, } void -ospf_distance_reset () +ospf_distance_reset (struct ospf *ospf) { struct route_node *rn; struct ospf_distance *odistance; - for (rn = route_top (ospf_top->distance_table); rn; rn = route_next (rn)) + for (rn = route_top (ospf->distance_table); rn; rn = route_next (rn)) if ((odistance = rn->info) != NULL) { if (odistance->access_list) @@ -1107,58 +1114,26 @@ ospf_distance_reset () u_char ospf_distance_apply (struct prefix_ipv4 *p, struct ospf_route *or) { -#if 0 - struct route_node *rn; - struct ospf_distance *odistance; - struct access_list *alist; - struct prefix_ipv4 q; - - memset (&q, 0, sizeof (struct prefix_ipv4)); - q.family = AF_INET; - /* q.prefix = */ - q.prefixlen = IPV4_MAX_BITLEN; -#endif /* 0 */ + struct ospf *ospf = ospf_top; - if (! ospf_top) + if (ospf == NULL) return 0; -#if 0 - rn = route_node_match (ospf_top->distance_table, (struct prefix *) &q); - if (rn) - { - odistance = rn->info; - route_unlock_node (rn); - - if (odistance->access_list) - { - alist = access_list_lookup (AFI_IP, odistance->access_list); - if (alist == NULL) - return 0; - if (access_list_apply (alist, (struct prefix *) p) == FILTER_DENY) - return 0; - - return odistance->distance; - } - else - return odistance->distance; - } -#endif /* 0 */ - - if (ospf_top->distance_intra) + if (ospf->distance_intra) if (or->path_type == OSPF_PATH_INTRA_AREA) - return ospf_top->distance_intra; + return ospf->distance_intra; - if (ospf_top->distance_inter) + if (ospf->distance_inter) if (or->path_type == OSPF_PATH_INTER_AREA) - return ospf_top->distance_inter; + return ospf->distance_inter; - if (ospf_top->distance_external) + if (ospf->distance_external) if (or->path_type == OSPF_PATH_TYPE1_EXTERNAL || or->path_type == OSPF_PATH_TYPE2_EXTERNAL) - return ospf_top->distance_external; + return ospf->distance_external; - if (ospf_top->distance_all) - return ospf_top->distance_all; + if (ospf->distance_all) + return ospf->distance_all; return 0; } |