diff options
Diffstat (limited to 'lib/routemap.c')
-rw-r--r-- | lib/routemap.c | 117 |
1 files changed, 50 insertions, 67 deletions
diff --git a/lib/routemap.c b/lib/routemap.c index 4e65fa2b..b000f2fc 100644 --- a/lib/routemap.c +++ b/lib/routemap.c @@ -634,85 +634,72 @@ route_map_delete_set (struct route_map_index *index, char *set_name, return 1; } -/* Apply route map's each index to the object. - - The matrix for a route-map looks like this: - (note, this includes the description for the "NEXT" - and "GOTO" frobs now - - Match | No Match - | - permit a | c - | - ------------------+--------------- - | - deny b | d - | - - a) Apply Set statements, accept route - If NEXT is specified, goto NEXT statement - If GOTO is specified, goto the first clause where pref > nextpref - If nothing is specified, do as Cisco and finish - b) If NEXT is specified, goto NEXT statement - If nothing is specified, finally will be denied by route-map. - c) & d) Goto Next index - - If we get no matches after we've processed all updates, then the route - is dropped too. - - Some notes on the new "NEXT" and "GOTO" - on-match next - If this clause is matched, then the set statements - are executed and then we drop through to the next clause - on-match goto n - If this clause is matched, then the set statments - are executed and then we goto the nth clause, or the - first clause greater than this. In order to ensure - route-maps *always* exit, you cannot jump backwards. - Sorry ;) - - We need to make sure our route-map processing matches the above +/* Apply route map's each index to the object. */ +/* +** The matrix for a route-map looks like this: +** (note, this includes the description for the "NEXT" +** and "GOTO" frobs now +** +** Match | No Match +** | +** permit a | c +** | +** ------------------+--------------- +** | +** deny b | d +** | +** +** a) Apply Set statements, accept route +** If NEXT is specified, goto NEXT statement +** If GOTO is specified, goto the first clause where pref > nextpref +** If nothing is specified, do as Cisco and finish +** b) Finish route-map processing, and deny route +** c) & d) Goto Next index +** +** If we get no matches after we've processed all updates, then the route +** is dropped too. +** +** Some notes on the new "NEXT" and "GOTO" +** on-match next - If this clause is matched, then the set statements +** are executed and then we drop through to the next clause +** on-match goto n - If this clause is matched, then the set statments +** are executed and then we goto the nth clause, or the +** first clause greater than this. In order to ensure +** route-maps *always* exit, you cannot jump backwards. +** Sorry ;) +** +** We need to make sure our route-map processing matches the above */ route_map_result_t route_map_apply_index (struct route_map_index *index, struct prefix *prefix, route_map_object_t type, void *object) { - int ret = 0; + int ret; struct route_map_rule *match; struct route_map_rule *set; - - /* Check all match rule and if there is no match rule, go to the - set statement. */ - if (! index->match_list.head) - ret = RMAP_MATCH; - else + + /* Check all match rule and if there is no match rule return 0. */ + for (match = index->match_list.head; match; match = match->next) { - for (match = index->match_list.head; match; match = match->next) - { - /* Try each match statement in turn, If any return - RMAP_MATCH, go direct to set statement, otherwise, walk - to next match statement. */ - ret = (*match->cmd->func_apply)(match->value, prefix, type, object); - - if (ret == RMAP_MATCH) - break; - } + /* Try each match statement in turn. If any return something + other than RM_MATCH then we don't need to check anymore and can + return */ + ret = (*match->cmd->func_apply)(match->value, prefix, type, object); + if (ret != RMAP_MATCH) + return ret; } - /* If end of match statement, still can't get any RMAP_MATCH return, - just return to next rout-map statement. */ - - if (ret != RMAP_MATCH) - return ret; - /* We get here if all match statements matched From the matrix - above, if this is PERMIT we go on and apply the SET functions. - If we're deny, we return indicating we matched a deny */ + above, if this is PERMIT we go on and apply the SET functions. If + we're deny, we return indicating we matched a deny */ /* Apply set statement to the object. */ if (index->type == RMAP_PERMIT) { for (set = index->set_list.head; set; set = set->next) - ret = (*set->cmd->func_apply)(set->value, prefix, type, object); - + { + ret = (*set->cmd->func_apply)(set->value, prefix, type, object); + } return RMAP_MATCH; } else @@ -739,15 +726,11 @@ route_map_apply (struct route_map *map, struct prefix *prefix, /* Apply this index. End here if we get a RM_NOMATCH */ ret = route_map_apply_index (index, prefix, type, object); - if (ret == RMAP_MATCH || ret == RMAP_DENYMATCH) - return ret; - if (ret != RMAP_NOMATCH) { /* We now have to handle the NEXT and GOTO clauses */ if(index->exitpolicy == RMAP_EXIT) return ret; - if(index->exitpolicy == RMAP_GOTO) { /* Find the next clause to jump to */ |