diff options
author | Donatas Abraitis <donatas@opensourcerouting.org> | 2024-12-04 07:27:13 +0100 |
---|---|---|
committer | Donatas Abraitis <donatas@opensourcerouting.org> | 2024-12-04 07:27:13 +0100 |
commit | 5b976f00f660b97a2f812b4e061e446d0d489b74 (patch) | |
tree | 2aa7bb8d3b2bd7628dd6afe498eb6330e9ca3723 /lib | |
parent | Merge pull request #17306 from pguibert6WIND/bmp_test_factorise_plus_fix (diff) | |
download | frr-5b976f00f660b97a2f812b4e061e446d0d489b74.tar.xz frr-5b976f00f660b97a2f812b4e061e446d0d489b74.zip |
lib: Print the reason why the route-map and/or the index parsing is done
This would give more details why at some point we return deny, no match, etc.
Before this we have sometimes (I don't know why), e.g.:
```
Route-map: null, prefix: 192.168.2.0/24, result: deny
```
Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
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 |