diff options
author | Russ White <russ@riw.us> | 2024-12-04 14:09:48 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-12-04 14:09:48 +0100 |
commit | f1ab0a0c2f3d8413f10e11aece80636d23a9da77 (patch) | |
tree | 7812220cfe41dba90b83a36831c9416dd8879d20 /lib | |
parent | Merge pull request #17571 from donaldsharp/fix_bsd_sockopt_problem (diff) | |
parent | lib: Print the reason why the route-map and/or the index parsing is done (diff) | |
download | frr-f1ab0a0c2f3d8413f10e11aece80636d23a9da77.tar.xz frr-f1ab0a0c2f3d8413f10e11aece80636d23a9da77.zip |
Merge pull request #17556 from opensourcerouting/fix/add_route_map_action_reason
lib: Print the reason why the route-map and/or the index parsing is done
Diffstat (limited to 'lib')
-rw-r--r-- | lib/routemap.c | 38 | ||||
-rw-r--r-- | lib/routemap.h | 11 |
2 files changed, 45 insertions, 4 deletions
diff --git a/lib/routemap.c b/lib/routemap.c index 120731fa6..7aaa5d3be 100644 --- a/lib/routemap.c +++ b/lib/routemap.c @@ -875,6 +875,28 @@ void route_map_walk_update_list(void (*route_map_update_fn)(char *name)) } } +static const char *route_map_action_reason2str(enum route_map_action_reason reason) +{ + switch (reason) { + case route_map_action_none: + return "none"; + case route_map_action_map_null: + return "route-map is null"; + case route_map_action_no_index: + return "no index"; + case route_map_action_next_deny: + return "next statement is deny"; + case route_map_action_exit: + return "exit policy"; + case route_map_action_goto_null: + return "goto index is null"; + case route_map_action_index_deny: + return "deny index"; + } + + return "Invalid reason"; +} + /* Return route map's type string. */ static const char *route_map_type_str(enum route_map_type type) { @@ -2554,6 +2576,7 @@ route_map_result_t route_map_apply_ext(struct route_map *map, RUSAGE_T mbefore, mafter; RUSAGE_T ibefore, iafter; unsigned long cputime; + enum route_map_action_reason reason = route_map_action_none; if (recursion > RMAP_RECURSION_LIMIT) { if (map) @@ -2571,6 +2594,7 @@ route_map_result_t route_map_apply_ext(struct route_map *map, if (map) map->applied++; ret = RMAP_DENYMATCH; + reason = route_map_action_map_null; goto route_map_apply_end; } @@ -2614,6 +2638,7 @@ route_map_result_t route_map_apply_ext(struct route_map *map, ret = RMAP_PERMITMATCH; else ret = RMAP_DENYMATCH; + reason = route_map_action_no_index; goto route_map_apply_end; } @@ -2701,12 +2726,15 @@ route_map_result_t route_map_apply_ext(struct route_map *map, } /* If nextrm returned 'deny', finish. */ - if (ret == RMAP_DENYMATCH) + if (ret == RMAP_DENYMATCH) { + reason = route_map_action_next_deny; goto route_map_apply_end; + } } switch (index->exitpolicy) { case RMAP_EXIT: + reason = route_map_action_exit; goto route_map_apply_end; case RMAP_NEXT: continue; @@ -2722,6 +2750,7 @@ route_map_result_t route_map_apply_ext(struct route_map *map, } if (next == NULL) { /* No clauses match! */ + reason = route_map_action_goto_null; goto route_map_apply_end; } } @@ -2730,6 +2759,7 @@ route_map_result_t route_map_apply_ext(struct route_map *map, /* 'deny' */ { ret = RMAP_DENYMATCH; + reason = route_map_action_index_deny; goto route_map_apply_end; } } @@ -2741,9 +2771,9 @@ route_map_result_t route_map_apply_ext(struct route_map *map, route_map_apply_end: if (unlikely(CHECK_FLAG(rmap_debug, DEBUG_ROUTEMAP))) - zlog_debug("Route-map: %s, prefix: %pFX, result: %s", - (map ? map->name : "null"), prefix, - route_map_result_str(ret)); + zlog_debug("Route-map: %s, prefix: %pFX, result: %s, reason: %s", + (map ? map->name : "null"), prefix, route_map_result_str(ret), + route_map_action_reason2str(reason)); if (pref) { if (index != NULL && ret == RMAP_PERMITMATCH) diff --git a/lib/routemap.h b/lib/routemap.h index e0f738502..8dcc17ecc 100644 --- a/lib/routemap.h +++ b/lib/routemap.h @@ -29,6 +29,17 @@ extern uint32_t rmap_debug; /* Route map's type. */ enum route_map_type { RMAP_PERMIT, RMAP_DENY, RMAP_ANY }; +/* Route-map's action reason */ +enum route_map_action_reason { + route_map_action_none, + route_map_action_map_null, + route_map_action_no_index, + route_map_action_next_deny, + route_map_action_exit, + route_map_action_goto_null, + route_map_action_index_deny, +}; + typedef enum { RMAP_DENYMATCH, RMAP_PERMITMATCH |