diff options
| author | Donatas Abraitis <donatas@opensourcerouting.org> | 2024-12-04 08:27:13 +0200 | 
|---|---|---|
| committer | Donatas Abraitis <donatas@opensourcerouting.org> | 2024-12-04 08:27:13 +0200 | 
| commit | 5b976f00f660b97a2f812b4e061e446d0d489b74 (patch) | |
| tree | 2aa7bb8d3b2bd7628dd6afe498eb6330e9ca3723 /lib | |
| parent | 6e1eeed50754c99c5593c01cb3983ece71b0549e (diff) | |
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 120731fa61..7aaa5d3be8 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 e0f738502b..8dcc17ecc3 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  | 
