From b16a58fc77748441e1175374b6fd875ec641e630 Mon Sep 17 00:00:00 2001 From: Donald Lee Date: Wed, 30 Jun 2021 23:15:42 +0800 Subject: [PATCH] bgpd: Restore bgp_routemap logic Signed-off-by: Donald Lee --- bgpd/bgp_routemap.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/bgpd/bgp_routemap.c b/bgpd/bgp_routemap.c index c298b8d8cc..4d67fb66db 100644 --- a/bgpd/bgp_routemap.c +++ b/bgpd/bgp_routemap.c @@ -379,13 +379,15 @@ route_match_script(void *rule, const struct prefix *prefix, void *object) status_match = LUA_RM_MATCH, status_match_and_change = LUA_RM_MATCH_AND_CHANGE; + struct attr newattr = *path->attr; + int result = frrscript_call( fs, ("RM_FAILURE", (long long *)&lrm_status), ("RM_NOMATCH", (long long *)&status_nomatch), ("RM_MATCH", (long long *)&status_match), ("RM_MATCH_AND_CHANGE", (long long *)&status_match_and_change), ("action", (long long *)&lrm_status), ("prefix", prefix), - ("attributes", path->attr), ("peer", path->peer)); + ("attributes", &newattr), ("peer", path->peer)); if (result) { zlog_err("Issue running script rule; defaulting to no match"); @@ -407,9 +409,18 @@ route_match_script(void *rule, const struct prefix *prefix, void *object) case LUA_RM_MATCH_AND_CHANGE: status = RMAP_MATCH; zlog_debug("Updating attribute based on script's values"); - if (path->attr->local_pref != 0) + + uint32_t locpref = 0; + + path->attr->med = newattr.med; + + if (path->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_LOCAL_PREF)) + locpref = path->attr->local_pref; + if (locpref != newattr.local_pref) { SET_FLAG(path->attr->flag, ATTR_FLAG_BIT(BGP_ATTR_LOCAL_PREF)); + path->attr->local_pref = newattr.local_pref; + } break; case LUA_RM_MATCH: status = RMAP_MATCH; -- 2.39.5