diff options
| -rw-r--r-- | bgpd/bgp_route.c | 35 | ||||
| -rw-r--r-- | ldpd/l2vpn.c | 12 | ||||
| -rw-r--r-- | ldpd/lde.c | 2 | ||||
| -rw-r--r-- | ldpd/lde.h | 5 | ||||
| -rw-r--r-- | ldpd/lde_lib.c | 17 | ||||
| -rw-r--r-- | lib/stream.c | 14 | ||||
| -rw-r--r-- | ospfd/ospf_vty.c | 6 | ||||
| -rwxr-xr-x | tools/frr-reload.py | 31 | ||||
| -rwxr-xr-x | vtysh/extract.pl.in | 2 |
9 files changed, 104 insertions, 20 deletions
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index 545e140028..90ae6af204 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -10610,6 +10610,8 @@ DEFUN (show_ip_bgp_large_community, bgp_show_type_lcommunity_all, NULL, uj); } +static int bgp_table_stats_single(struct vty *vty, struct bgp *bgp, afi_t afi, + safi_t safi, struct json_object *json_array); static int bgp_table_stats(struct vty *vty, struct bgp *bgp, afi_t afi, safi_t safi, struct json_object *json); @@ -10629,7 +10631,7 @@ DEFUN(show_ip_bgp_statistics_all, show_ip_bgp_statistics_all_cmd, bgp_vty_find_and_parse_afi_safi_bgp(vty, argv, argc, &idx, &afi, &safi, &bgp, false); - if (!bgp) + if (!idx) return CMD_WARNING; if (uj) @@ -11387,8 +11389,18 @@ static int bgp_table_stats_walker(struct thread *t) return 0; } -static int bgp_table_stats(struct vty *vty, struct bgp *bgp, afi_t afi, - safi_t safi, struct json_object *json_array) +static void bgp_table_stats_all(struct vty *vty, afi_t afi, safi_t safi, + struct json_object *json_array) +{ + struct listnode *node, *nnode; + struct bgp *bgp; + + for (ALL_LIST_ELEMENTS(bm->bgp, node, nnode, bgp)) + bgp_table_stats_single(vty, bgp, afi, safi, json_array); +} + +static int bgp_table_stats_single(struct vty *vty, struct bgp *bgp, afi_t afi, + safi_t safi, struct json_object *json_array) { struct bgp_table_stats ts; unsigned int i; @@ -11416,8 +11428,10 @@ static int bgp_table_stats(struct vty *vty, struct bgp *bgp, afi_t afi, } if (!json) - vty_out(vty, "BGP %s RIB statistics\n", - get_afi_safi_str(afi, safi, false)); + vty_out(vty, "BGP %s RIB statistics (%s)\n", + get_afi_safi_str(afi, safi, false), bgp->name_pretty); + else + json_object_string_add(json, "instance", bgp->name_pretty); /* labeled-unicast routes live in the unicast table */ if (safi == SAFI_LABELED_UNICAST) @@ -11606,6 +11620,17 @@ end_table_stats: return ret; } +static int bgp_table_stats(struct vty *vty, struct bgp *bgp, afi_t afi, + safi_t safi, struct json_object *json_array) +{ + if (!bgp) { + bgp_table_stats_all(vty, afi, safi, json_array); + return CMD_SUCCESS; + } + + return bgp_table_stats_single(vty, bgp, afi, safi, json_array); +} + enum bgp_pcounts { PCOUNT_ADJ_IN = 0, PCOUNT_DAMPED, diff --git a/ldpd/l2vpn.c b/ldpd/l2vpn.c index 0d479e77ba..2c68f3edbd 100644 --- a/ldpd/l2vpn.c +++ b/ldpd/l2vpn.c @@ -294,6 +294,16 @@ l2vpn_pw_reset(struct l2vpn_pw *pw) pw->flags |= F_PW_STATUSTLV; else pw->flags &= ~F_PW_STATUSTLV; + + if (pw->flags & F_PW_STATUSTLV_CONF) { + struct fec_node *fn; + struct fec fec; + l2vpn_pw_fec(pw, &fec); + fn = (struct fec_node *)fec_find(&ft, &fec); + if (fn) + pw->remote_status = fn->pw_remote_status; + } + } int @@ -433,6 +443,8 @@ l2vpn_recv_pw_status(struct lde_nbr *ln, struct notify_msg *nm) /* unknown fec */ return; + fn->pw_remote_status = nm->pw_status; + pw = (struct l2vpn_pw *) fn->data; if (pw == NULL) return; diff --git a/ldpd/lde.c b/ldpd/lde.c index 4fca4b0962..734c1ea230 100644 --- a/ldpd/lde.c +++ b/ldpd/lde.c @@ -296,7 +296,7 @@ lde_dispatch_imsg(struct thread *thread) switch (imsg.hdr.type) { case IMSG_LABEL_MAPPING: - lde_check_mapping(map, ln); + lde_check_mapping(map, ln, 1); break; case IMSG_LABEL_REQUEST: lde_check_request(map, ln); diff --git a/ldpd/lde.h b/ldpd/lde.h index 2895e00ae5..9e6db3a90b 100644 --- a/ldpd/lde.h +++ b/ldpd/lde.h @@ -125,6 +125,9 @@ struct fec_node { struct lde_map_head upstream; /* sent mappings */ uint32_t local_label; + + uint32_t pw_remote_status; + void *data; /* fec specific data */ }; @@ -209,7 +212,7 @@ void lde_kernel_insert(struct fec *, int, union ldpd_addr *, void lde_kernel_remove(struct fec *, int, union ldpd_addr *, ifindex_t, uint8_t, unsigned short); void lde_kernel_update(struct fec *); -void lde_check_mapping(struct map *, struct lde_nbr *); +void lde_check_mapping(struct map *, struct lde_nbr *, int); void lde_check_request(struct map *, struct lde_nbr *); void lde_check_request_wcard(struct map *, struct lde_nbr *); void lde_check_release(struct map *, struct lde_nbr *); diff --git a/ldpd/lde_lib.c b/ldpd/lde_lib.c index 8f524e0aa9..71fb0c7bf2 100644 --- a/ldpd/lde_lib.c +++ b/ldpd/lde_lib.c @@ -267,6 +267,9 @@ fec_add(struct fec *fec) RB_INIT(lde_map_head, &fn->downstream); LIST_INIT(&fn->nexthops); + if (fec->type == FEC_TYPE_PWID) + fn->pw_remote_status = PW_FORWARDING; + if (fec_insert(&ft, &fn->fec)) log_warnx("failed to add %s to ft tree", log_fec(&fn->fec)); @@ -455,13 +458,13 @@ lde_kernel_update(struct fec *fec) me = (struct lde_map *)fec_find(&ln->recv_map, &fn->fec); if (me) /* FEC.5 */ - lde_check_mapping(&me->map, ln); + lde_check_mapping(&me->map, ln, 0); } } } void -lde_check_mapping(struct map *map, struct lde_nbr *ln) +lde_check_mapping(struct map *map, struct lde_nbr *ln, int rcvd_label_mapping) { struct fec fec; struct fec_node *fn; @@ -507,8 +510,12 @@ lde_check_mapping(struct map *map, struct lde_nbr *ln) lde_req_del(ln, lre, 1); /* RFC 4447 control word and status tlv negotiation */ - if (map->type == MAP_TYPE_PWID && l2vpn_pw_negotiate(ln, fn, map)) + if (map->type == MAP_TYPE_PWID && l2vpn_pw_negotiate(ln, fn, map)) { + if (rcvd_label_mapping && map->flags & F_MAP_PW_STATUS) + fn->pw_remote_status = map->pw_status; + return; + } /* * LMp.3 - LMp.8: loop detection - unnecessary for frame-mode @@ -570,8 +577,10 @@ lde_check_mapping(struct map *map, struct lde_nbr *ln) pw->remote_group = map->fec.pwid.group_id; if (map->flags & F_MAP_PW_IFMTU) pw->remote_mtu = map->fec.pwid.ifmtu; - if (map->flags & F_MAP_PW_STATUS) + if (rcvd_label_mapping && map->flags & F_MAP_PW_STATUS) { pw->remote_status = map->pw_status; + fn->pw_remote_status = map->pw_status; + } else pw->remote_status = PW_FORWARDING; fnh->remote_label = map->label; diff --git a/lib/stream.c b/lib/stream.c index 17520f978e..d3afebbf13 100644 --- a/lib/stream.c +++ b/lib/stream.c @@ -55,15 +55,19 @@ DEFINE_MTYPE_STATIC(LIB, STREAM_FIFO, "Stream FIFO") * using stream_put..._at() functions. */ #define STREAM_WARN_OFFSETS(S) \ - flog_warn(EC_LIB_STREAM, \ - "&(struct stream): %p, size: %lu, getp: %lu, endp: %lu\n", \ - (void *)(S), (unsigned long)(S)->size, \ - (unsigned long)(S)->getp, (unsigned long)(S)->endp) + do { \ + flog_warn(EC_LIB_STREAM, \ + "&(struct stream): %p, size: %lu, getp: %lu, endp: %lu\n", \ + (void *)(S), (unsigned long)(S)->size, \ + (unsigned long)(S)->getp, (unsigned long)(S)->endp); \ + zlog_backtrace(LOG_WARNING); \ + } while (0) #define STREAM_VERIFY_SANE(S) \ do { \ - if (!(GETP_VALID(S, (S)->getp) && ENDP_VALID(S, (S)->endp))) \ + if (!(GETP_VALID(S, (S)->getp) && ENDP_VALID(S, (S)->endp))) { \ STREAM_WARN_OFFSETS(S); \ + } \ assert(GETP_VALID(S, (S)->getp)); \ assert(ENDP_VALID(S, (S)->endp)); \ } while (0) diff --git a/ospfd/ospf_vty.c b/ospfd/ospf_vty.c index 08736b555f..e8cc50c8d0 100644 --- a/ospfd/ospf_vty.c +++ b/ospfd/ospf_vty.c @@ -1177,9 +1177,9 @@ DEFUN (no_ospf_area_vlink, "no area <A.B.C.D|(0-4294967295)> virtual-link A.B.C.D [authentication [<message-digest|null>]] [<message-digest-key (1-255) md5 KEY|authentication-key AUTH_KEY>]", NO_STR VLINK_HELPSTR_IPADDR - "Enable authentication on this virtual link\n" \ - "Use message-digest authentication\n" \ - "Use null authentication\n" \ + "Enable authentication on this virtual link\n" + "Use message-digest authentication\n" + "Use null authentication\n" VLINK_HELPSTR_AUTH_MD5 VLINK_HELPSTR_AUTH_SIMPLE) { diff --git a/tools/frr-reload.py b/tools/frr-reload.py index 9e86cf2156..4c637d84bc 100755 --- a/tools/frr-reload.py +++ b/tools/frr-reload.py @@ -729,6 +729,36 @@ def line_exist(lines, target_ctx_keys, target_line, exact_match=True): return True return False +def check_for_exit_vrf(lines_to_add, lines_to_del): + + # exit-vrf is a bit tricky. If the new config is missing it but we + # have configs under a vrf, we need to add it at the end to do the + # right context changes. If exit-vrf exists in both the running and + # new config, we cannot delete it or it will break context changes. + add_exit_vrf = False + index = 0 + + for (ctx_keys, line) in lines_to_add: + if add_exit_vrf == True: + if ctx_keys[0] != prior_ctx_key: + insert_key=(prior_ctx_key), + lines_to_add.insert(index, ((insert_key, "exit-vrf"))) + add_exit_vrf = False + + if ctx_keys[0].startswith('vrf') and line: + if line is not "exit-vrf": + add_exit_vrf = True + prior_ctx_key = (ctx_keys[0]) + else: + add_exit_vrf = False + index+=1 + + for (ctx_keys, line) in lines_to_del: + if line == "exit-vrf": + if (line_exist(lines_to_add, ctx_keys, line)): + lines_to_del.remove((ctx_keys, line)) + + return (lines_to_add, lines_to_del) def ignore_delete_re_add_lines(lines_to_add, lines_to_del): @@ -1156,6 +1186,7 @@ def compare_context_objects(newconf, running): for line in newconf_ctx.lines: lines_to_add.append((newconf_ctx_keys, line)) + (lines_to_add, lines_to_del) = check_for_exit_vrf(lines_to_add, lines_to_del) (lines_to_add, lines_to_del) = ignore_delete_re_add_lines(lines_to_add, lines_to_del) (lines_to_add, lines_to_del) = ignore_unconfigurable_lines(lines_to_add, lines_to_del) diff --git a/vtysh/extract.pl.in b/vtysh/extract.pl.in index 061f7b0ffe..346061d7ca 100755 --- a/vtysh/extract.pl.in +++ b/vtysh/extract.pl.in @@ -40,7 +40,7 @@ sub scan_file { $cppadd = $fabricd ? "-DFABRICD=1" : ""; - open (FH, "@CPP@ -DHAVE_CONFIG_H -DVTYSH_EXTRACT_PL -Ivtysh/@top_builddir@ -Ivtysh/@top_srcdir@ -Ivtysh/@top_srcdir@/lib -Ivtysh/@top_builddir@/lib -Ivtysh/@top_srcdir@/bgpd -Ivtysh/@top_srcdir@/bgpd/rfapi @LUA_INCLUDE@ @CPPFLAGS@ $cppadd $file |"); + open (FH, "@CPP@ -P -DHAVE_CONFIG_H -DVTYSH_EXTRACT_PL -Ivtysh/@top_builddir@ -Ivtysh/@top_srcdir@ -Ivtysh/@top_srcdir@/lib -Ivtysh/@top_builddir@/lib -Ivtysh/@top_srcdir@/bgpd -Ivtysh/@top_srcdir@/bgpd/rfapi @LUA_INCLUDE@ @CPPFLAGS@ $cppadd $file |"); local $/; undef $/; $line = <FH>; if (!close (FH)) { |
