]> git.puffer.fish Git - mirror/frr.git/commitdiff
bgpd: Restore bgp_routemap logic
authorDonald Lee <dlqs@gmx.com>
Wed, 30 Jun 2021 15:15:42 +0000 (23:15 +0800)
committerDonald Lee <dlqs@gmx.com>
Wed, 30 Jun 2021 15:55:40 +0000 (23:55 +0800)
Signed-off-by: Donald Lee <dlqs@gmx.com>
bgpd/bgp_routemap.c

index c298b8d8ccef261179abc0ee0c1ad53971f3231f..4d67fb66dbee812f9ffecdf9b8c3d589655e9ce9 100644 (file)
@@ -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;