From 3e3708cbd38a8e25c2cf8bede4ea1c86a0911dac Mon Sep 17 00:00:00 2001 From: Philippe Guibert Date: Fri, 8 Feb 2019 14:48:28 +0100 Subject: [PATCH] bgpd: do not allocate lists on fs entries of bgp entries. bgp entries in bgp_extra_path structure will be allocated as lists, only when needed, that is to say when bgp fs entries will be received and installed on the underlying system. Signed-off-by: Philippe Guibert --- bgpd/bgp_flowspec_vty.c | 18 ++++++++++++------ bgpd/bgp_pbr.c | 12 ++++++++---- bgpd/bgp_route.c | 4 ++-- bgpd/bgp_zebra.c | 4 ++++ 4 files changed, 26 insertions(+), 12 deletions(-) diff --git a/bgpd/bgp_flowspec_vty.c b/bgpd/bgp_flowspec_vty.c index 72ee8bb4c..2d6523ed3 100644 --- a/bgpd/bgp_flowspec_vty.c +++ b/bgpd/bgp_flowspec_vty.c @@ -332,14 +332,12 @@ void route_vty_out_flowspec(struct vty *vty, struct prefix *p, if (display == NLRI_STRING_FORMAT_LARGE) { struct bgp_path_info_extra *extra = bgp_path_info_extra_get(path); + bool list_began = false; - if (listcount(extra->bgp_fs_pbr) || - listcount(extra->bgp_fs_iprule)) { + if (extra->bgp_fs_pbr && listcount(extra->bgp_fs_pbr)) { struct listnode *node; struct bgp_pbr_match_entry *bpme; - struct bgp_pbr_rule *bpr; struct bgp_pbr_match *bpm; - bool list_began = false; struct list *list_bpm; list_bpm = list_new(); @@ -357,6 +355,14 @@ void route_vty_out_flowspec(struct vty *vty, struct prefix *p, vty_out(vty, ", "); vty_out(vty, "%s", bpm->ipset_name); } + list_delete(&list_bpm); + } + if (extra->bgp_fs_iprule && listcount(extra->bgp_fs_iprule)) { + struct listnode *node; + struct bgp_pbr_rule *bpr; + + if (!list_began) + vty_out(vty, "\tinstalled in PBR"); for (ALL_LIST_ELEMENTS_RO(extra->bgp_fs_iprule, node, bpr)) { if (!bpr->action) @@ -373,8 +379,8 @@ void route_vty_out_flowspec(struct vty *vty, struct prefix *p, if (list_began) vty_out(vty, ")"); vty_out(vty, "\n"); - list_delete(&list_bpm); - } else + } + if (!list_began) vty_out(vty, "\tnot installed in PBR\n"); } } diff --git a/bgpd/bgp_pbr.c b/bgpd/bgp_pbr.c index c0be36ed3..27208ec99 100644 --- a/bgpd/bgp_pbr.c +++ b/bgpd/bgp_pbr.c @@ -1421,7 +1421,8 @@ static void bgp_pbr_flush_iprule(struct bgp *bgp, struct bgp_pbr_action *bpa, /* unlink path to bpme */ path = (struct bgp_path_info *)bpr->path; extra = bgp_path_info_extra_get(path); - listnode_delete(extra->bgp_fs_iprule, bpr); + if (extra->bgp_fs_iprule) + listnode_delete(extra->bgp_fs_iprule, bpr); bpr->path = NULL; } } @@ -1458,7 +1459,8 @@ static void bgp_pbr_flush_entry(struct bgp *bgp, struct bgp_pbr_action *bpa, /* unlink path to bpme */ path = (struct bgp_path_info *)bpme->path; extra = bgp_path_info_extra_get(path); - listnode_delete(extra->bgp_fs_pbr, bpme); + if (extra->bgp_fs_pbr) + listnode_delete(extra->bgp_fs_pbr, bpme); bpme->path = NULL; } } @@ -2065,7 +2067,8 @@ static void bgp_pbr_policyroute_add_to_zebra_unit(struct bgp *bgp, struct bgp_path_info_extra *extra = bgp_path_info_extra_get(path); - if (extra && listnode_lookup(extra->bgp_fs_iprule, + if (extra && extra->bgp_fs_iprule && + listnode_lookup(extra->bgp_fs_iprule, bpr)) { if (BGP_DEBUG(pbr, PBR_ERROR)) zlog_err("%s: entry %p/%p already " @@ -2213,7 +2216,8 @@ static void bgp_pbr_policyroute_add_to_zebra_unit(struct bgp *bgp, struct bgp_path_info_extra *extra = bgp_path_info_extra_get(path); - if (extra && listnode_lookup(extra->bgp_fs_pbr, bpme)) { + if (extra && extra->bgp_fs_pbr && + listnode_lookup(extra->bgp_fs_pbr, bpme)) { if (BGP_DEBUG(pbr, PBR_ERROR)) zlog_err( "%s: entry %p/%p already installed in bgp pbr", diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index eca632dd4..f172558f7 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -175,8 +175,8 @@ static struct bgp_path_info_extra *bgp_path_info_extra_new(void) sizeof(struct bgp_path_info_extra)); new->label[0] = MPLS_INVALID_LABEL; new->num_labels = 0; - new->bgp_fs_pbr = list_new(); - new->bgp_fs_iprule = list_new(); + new->bgp_fs_pbr = NULL; + new->bgp_fs_iprule = NULL; return new; } diff --git a/bgpd/bgp_zebra.c b/bgpd/bgp_zebra.c index d9749863e..5c32d3134 100644 --- a/bgpd/bgp_zebra.c +++ b/bgpd/bgp_zebra.c @@ -2156,6 +2156,8 @@ static int rule_notify_owner(int command, struct zclient *zclient, /* link bgp_info to bgp_pbr */ path = (struct bgp_path_info *)bgp_pbr->path; extra = bgp_path_info_extra_get(path); + if (!extra->bgp_fs_iprule) + extra->bgp_fs_iprule = list_new(); listnode_add(extra->bgp_fs_iprule, bgp_pbr); } if (BGP_DEBUG(zebra, ZEBRA)) @@ -2264,6 +2266,8 @@ static int ipset_entry_notify_owner(int command, struct zclient *zclient, /* link bgp_path_info to bpme */ path = (struct bgp_path_info *)bgp_pbime->path; extra = bgp_path_info_extra_get(path); + if (!extra->bgp_fs_pbr) + extra->bgp_fs_pbr = list_new(); listnode_add(extra->bgp_fs_pbr, bgp_pbime); } break; -- 2.39.2