]> git.proxmox.com Git - mirror_frr.git/commitdiff
Merge pull request #12704 from donaldsharp/pim6_route_map
authorDonatas Abraitis <donatas@opensourcerouting.org>
Tue, 31 Jan 2023 18:51:45 +0000 (20:51 +0200)
committerGitHub <noreply@github.com>
Tue, 31 Jan 2023 18:51:45 +0000 (20:51 +0200)
pimd: v6 intentionally turned off route-maps.  Turn it on.

67 files changed:
bfdd/bfd_packet.c
bfdd/ptm_adapter.c
bgpd/bgp_aspath.c
bgpd/bgp_aspath.h
bgpd/bgp_dump.c
bgpd/bgp_evpn.c
bgpd/bgp_evpn_mh.c
bgpd/bgp_flowspec.c
bgpd/bgp_fsm.c
bgpd/bgp_mac.c
bgpd/bgp_route.c
bgpd/bgp_route.h
bgpd/bgp_vty.c
bgpd/bgpd.c
bgpd/rfapi/rfapi_vty.c
configure.ac
debian/changelog
debian/control
debian/frr-doc.doc-base
debian/frr-doc.info
debian/frr-doc.install
debian/frr.lintian-overrides
debian/frr.manpages
debian/rules
debian/watch
debian/watchfrr.rc [deleted file]
isisd/isis_cli.c
ldpd/log.c
lib/clippy.c
lib/ferr.c
lib/ferr.h
lib/filter_cli.c
lib/filter_nb.c
lib/if.c
lib/northbound_cli.h
lib/printf/glue.c
lib/printf/vfprintf.c
lib/subdir.am
lib/termtable.c
lib/vrf.c
lib/vty.c
lib/yang.h
lib/yang_translator.c
lib/yang_wrappers.c
lib/yang_wrappers.h
lib/zlog.c
pathd/path_nb.c
pathd/path_pcep_lib.c
pceplib/pcep_utils_logging.c
pimd/pim_cmd.c
pimd/pim_cmd_common.c
staticd/static_vty.c
tests/isisd/subdir.am
tests/lib/subdir.am
tests/topotests/bgp_dont_capability_negotiate/r1/bgpd.conf
tests/topotests/bgp_dont_capability_negotiate/r2/bgpd.conf
tests/topotests/bgp_dont_capability_negotiate/test_bgp_dont_capability_negotiate.py
tests/topotests/lib/topotest.py
tests/topotests/ospf_basic_functionality/test_ospf_lan.py
tests/topotests/ospf_gr_helper/test_ospf_gr_helper1.py
tests/topotests/ospf_gr_helper/test_ospf_gr_helper2.py
tests/topotests/ospf_gr_helper/test_ospf_gr_helper3.py
vtysh/subdir.am
vtysh/vtysh.c
watchfrr/watchfrr.c
yang/embedmodel.py
zebra/zebra_rib.c

index 6397aa574735fac4d06deab68590ce54a6eb6207..30f54f130fb37eeb50f2c588abbaa8bb088bf4a9 100644 (file)
@@ -746,6 +746,7 @@ static void bfd_sd_reschedule(struct bfd_vrf_global *bvrf, int sd)
        }
 }
 
+PRINTFRR(6, 7)
 static void cp_debug(bool mhop, struct sockaddr_any *peer,
                     struct sockaddr_any *local, ifindex_t ifindex,
                     vrf_id_t vrfid, const char *fmt, ...)
@@ -844,7 +845,7 @@ void bfd_recv_cb(struct thread *t)
        /* Implement RFC 5880 6.8.6 */
        if (mlen < BFD_PKT_LEN) {
                cp_debug(is_mhop, &peer, &local, ifindex, vrfid,
-                        "too small (%ld bytes)", mlen);
+                        "too small (%zd bytes)", mlen);
                return;
        }
 
index f6259b9c3b8f70c425cc9a33ad63597a4bf1ba31..8a27fced5fac329a2cf9d2fba50a4f6bc9d60825 100644 (file)
@@ -81,6 +81,7 @@ static void bfdd_client_deregister(struct stream *msg);
 /*
  * Functions
  */
+PRINTFRR(2, 3)
 static void debug_printbpc(const struct bfd_peer_cfg *bpc, const char *fmt, ...)
 {
        char timers[3][128] = {};
index 85f09ccf0b6572b7c90566480b5e11ccca085dfd..2ae693cd306824c9d19f280b37521f595a81b4ba 100644 (file)
@@ -2122,16 +2122,12 @@ const char *aspath_print(struct aspath *as)
 }
 
 /* Printing functions */
-/* Feed the AS_PATH to the vty; the suffix string follows it only in case
+/* Feed the AS_PATH to the vty; the space suffix follows it only in case
  * AS_PATH wasn't empty.
  */
-void aspath_print_vty(struct vty *vty, const char *format, struct aspath *as,
-                     const char *suffix)
+void aspath_print_vty(struct vty *vty, struct aspath *as)
 {
-       assert(format);
-       vty_out(vty, format, as->str);
-       if (as->str_len && strlen(suffix))
-               vty_out(vty, "%s", suffix);
+       vty_out(vty, "%s%s", as->str, as->str_len ? " " : "");
 }
 
 static void aspath_show_all_iterator(struct hash_bucket *bucket,
index 97bc7c0acada5ec7fc520b1ccd798b21b1140b71..a814d73dddc640b091059b1d3527cd1dee9905a7 100644 (file)
@@ -104,8 +104,7 @@ extern void aspath_free(struct aspath *aspath);
 extern struct aspath *aspath_intern(struct aspath *aspath);
 extern void aspath_unintern(struct aspath **aspath);
 extern const char *aspath_print(struct aspath *aspath);
-extern void aspath_print_vty(struct vty *vty, const char *format,
-                            struct aspath *aspath, const char *suffix);
+extern void aspath_print_vty(struct vty *vty, struct aspath *aspath);
 extern void aspath_print_all_vty(struct vty *vty);
 extern unsigned int aspath_key_make(const void *p);
 extern unsigned int aspath_get_first_as(struct aspath *aspath);
index 254996edadd63e1ce424009026965a73222f8fd0..98a2f95eadcaf638e8d3a851d696ca006b521c09 100644 (file)
@@ -117,9 +117,13 @@ static FILE *bgp_dump_open_file(struct bgp_dump *bgp_dump)
        if (bgp_dump->filename[0] != DIRECTORY_SEP) {
                snprintf(fullpath, sizeof(fullpath), "%s/%s", vty_get_cwd(),
                         bgp_dump->filename);
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wformat-nonliteral"
+               /* user supplied date/time format string */
                ret = strftime(realpath, MAXPATHLEN, fullpath, &tm);
        } else
                ret = strftime(realpath, MAXPATHLEN, bgp_dump->filename, &tm);
+#pragma GCC diagnostic pop
 
        if (ret == 0) {
                flog_warn(EC_BGP_DUMP, "%s: strftime error", __func__);
index 155e33da91984760c8a6322c95e90b1b097fb6dd..c993707206847cdb687830006d21c157e925f8c4 100644 (file)
@@ -4429,7 +4429,7 @@ static int process_type2_route(struct peer *peer, afi_t afi, safi_t safi,
        mpls_label_t label[BGP_MAX_LABELS] = {};
        uint32_t num_labels = 0;
        uint32_t eth_tag;
-       int ret;
+       int ret = 0;
 
        /* Type-2 route should be either 33, 37 or 49 bytes or an
         * additional 3 bytes if there is a second label (VNI):
@@ -4522,13 +4522,13 @@ static int process_type2_route(struct peer *peer, afi_t afi, safi_t safi,
 
        /* Process the route. */
        if (attr)
-               ret = bgp_update(peer, (struct prefix *)&p, addpath_id, attr,
-                                afi, safi, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL,
-                                &prd, &label[0], num_labels, 0, &evpn);
+               bgp_update(peer, (struct prefix *)&p, addpath_id, attr, afi,
+                          safi, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, &prd,
+                          &label[0], num_labels, 0, &evpn);
        else
-               ret = bgp_withdraw(peer, (struct prefix *)&p, addpath_id, attr,
-                                  afi, safi, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL,
-                                  &prd, &label[0], num_labels, &evpn);
+               bgp_withdraw(peer, (struct prefix *)&p, addpath_id, attr, afi,
+                            safi, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, &prd,
+                            &label[0], num_labels, &evpn);
        goto done;
 
 fail:
@@ -4553,7 +4553,6 @@ static int process_type3_route(struct peer *peer, afi_t afi, safi_t safi,
        struct prefix_evpn p;
        uint8_t ipaddr_len;
        uint32_t eth_tag;
-       int ret;
 
        /* Type-3 route should be either 17 or 29 bytes: RD (8), Eth Tag (4),
         * IP len (1) and IP (4 or 16).
@@ -4614,14 +4613,14 @@ static int process_type3_route(struct peer *peer, afi_t afi, safi_t safi,
 
        /* Process the route. */
        if (attr)
-               ret = bgp_update(peer, (struct prefix *)&p, addpath_id, attr,
-                                afi, safi, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL,
-                                &prd, NULL, 0, 0, NULL);
+               bgp_update(peer, (struct prefix *)&p, addpath_id, attr, afi,
+                          safi, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, &prd, NULL,
+                          0, 0, NULL);
        else
-               ret = bgp_withdraw(peer, (struct prefix *)&p, addpath_id, attr,
-                                  afi, safi, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL,
-                                  &prd, NULL, 0, NULL);
-       return ret;
+               bgp_withdraw(peer, (struct prefix *)&p, addpath_id, attr, afi,
+                            safi, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, &prd,
+                            NULL, 0, NULL);
+       return 0;
 }
 
 /*
@@ -4637,7 +4636,6 @@ static int process_type5_route(struct peer *peer, afi_t afi, safi_t safi,
        uint8_t ippfx_len;
        uint32_t eth_tag;
        mpls_label_t label; /* holds the VNI as in the packet */
-       int ret;
        bool is_valid_update = true;
 
        /* Type-5 route should be 34 or 58 bytes:
@@ -4749,9 +4747,9 @@ static int process_type5_route(struct peer *peer, afi_t afi, safi_t safi,
 
        /* Process the route. */
        if (attr && is_valid_update)
-               ret = bgp_update(peer, (struct prefix *)&p, addpath_id, attr,
-                                afi, safi, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL,
-                                &prd, &label, 1, 0, &evpn);
+               bgp_update(peer, (struct prefix *)&p, addpath_id, attr, afi,
+                          safi, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, &prd,
+                          &label, 1, 0, &evpn);
        else {
                if (!is_valid_update) {
                        char attr_str[BUFSIZ] = {0};
@@ -4762,12 +4760,12 @@ static int process_type5_route(struct peer *peer, afi_t afi, safi_t safi,
                                peer->hostname, peer->bgp->vrf_id, &p,
                                attr_str);
                }
-               ret = bgp_withdraw(peer, (struct prefix *)&p, addpath_id, attr,
-                                  afi, safi, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL,
-                                  &prd, &label, 1, &evpn);
+               bgp_withdraw(peer, (struct prefix *)&p, addpath_id, attr, afi,
+                            safi, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, &prd,
+                            &label, 1, &evpn);
        }
 
-       return ret;
+       return 0;
 }
 
 static void evpn_mpattr_encode_type5(struct stream *s, const struct prefix *p,
index 7b1c7cf471ad9f47f732fea26957fb66cffd55db..7ad08166311aeb69df7ffde625dee0c619261be7 100644 (file)
@@ -706,7 +706,6 @@ int bgp_evpn_type4_route_process(struct peer *peer, afi_t afi, safi_t safi,
                struct attr *attr, uint8_t *pfx, int psize,
                uint32_t addpath_id)
 {
-       int ret;
        esi_t esi;
        uint8_t ipaddr_len;
        struct in_addr vtep_ip;
@@ -750,15 +749,15 @@ int bgp_evpn_type4_route_process(struct peer *peer, afi_t afi, safi_t safi,
        build_evpn_type4_prefix(&p, &esi, vtep_ip);
        /* Process the route. */
        if (attr) {
-               ret = bgp_update(peer, (struct prefix *)&p, addpath_id, attr,
-                               afi, safi, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL,
-                               &prd, NULL, 0, 0, NULL);
+               bgp_update(peer, (struct prefix *)&p, addpath_id, attr, afi,
+                          safi, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, &prd, NULL,
+                          0, 0, NULL);
        } else {
-               ret = bgp_withdraw(peer, (struct prefix *)&p, addpath_id, attr,
-                               afi, safi, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL,
-                               &prd, NULL, 0, NULL);
+               bgp_withdraw(peer, (struct prefix *)&p, addpath_id, attr, afi,
+                            safi, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, &prd,
+                            NULL, 0, NULL);
        }
-       return ret;
+       return 0;
 }
 
 /* Check if a prefix belongs to the local ES */
@@ -1180,7 +1179,6 @@ int bgp_evpn_type1_route_process(struct peer *peer, afi_t afi, safi_t safi,
                struct attr *attr, uint8_t *pfx, int psize,
                uint32_t addpath_id)
 {
-       int ret;
        struct prefix_rd prd;
        esi_t esi;
        uint32_t eth_tag;
@@ -1219,15 +1217,15 @@ int bgp_evpn_type1_route_process(struct peer *peer, afi_t afi, safi_t safi,
        build_evpn_type1_prefix(&p, eth_tag, &esi, vtep_ip);
        /* Process the route. */
        if (attr) {
-               ret = bgp_update(peer, (struct prefix *)&p, addpath_id, attr,
-                               afi, safi, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL,
-                               &prd, NULL, 0, 0, NULL);
+               bgp_update(peer, (struct prefix *)&p, addpath_id, attr, afi,
+                          safi, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, &prd, NULL,
+                          0, 0, NULL);
        } else {
-               ret = bgp_withdraw(peer, (struct prefix *)&p, addpath_id, attr,
-                               afi, safi, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL,
-                               &prd, NULL, 0, NULL);
+               bgp_withdraw(peer, (struct prefix *)&p, addpath_id, attr, afi,
+                            safi, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, &prd,
+                            NULL, 0, NULL);
        }
-       return ret;
+       return 0;
 }
 
 void bgp_evpn_mh_config_ead_export_rt(struct bgp *bgp,
index 39c0cfe5147ba528e40c4f9c78f092fc0a0a89ba..b07625c49e2395e17ceb32f34554eede598406ca 100644 (file)
@@ -103,7 +103,6 @@ int bgp_nlri_parse_flowspec(struct peer *peer, struct attr *attr,
        safi_t safi;
        int psize = 0;
        struct prefix p;
-       int ret;
        void *temp;
 
        /* Start processing the NLRI - there may be multiple in the MP_REACH */
@@ -190,21 +189,13 @@ int bgp_nlri_parse_flowspec(struct peer *peer, struct attr *attr,
                }
                /* Process the route. */
                if (!withdraw)
-                       ret = bgp_update(peer, &p, 0, attr,
-                                        afi, safi,
-                                        ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL,
-                                        NULL, NULL, 0, 0, NULL);
+                       bgp_update(peer, &p, 0, attr, afi, safi,
+                                  ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL,
+                                  NULL, 0, 0, NULL);
                else
-                       ret = bgp_withdraw(peer, &p, 0, attr,
-                                          afi, safi,
-                                          ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL,
-                                          NULL, NULL, 0, NULL);
-               if (ret) {
-                       flog_err(EC_BGP_FLOWSPEC_INSTALLATION,
-                                "Flowspec NLRI failed to be %s.",
-                                attr ? "added" : "withdrawn");
-                       return BGP_NLRI_PARSE_ERROR;
-               }
+                       bgp_withdraw(peer, &p, 0, attr, afi, safi,
+                                    ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL,
+                                    NULL, 0, NULL);
        }
        return BGP_NLRI_PARSE_OK;
 }
index c57e148ef8b59a9f08640ec60b352b1349946723..9624adfbe25a8aa6fb0c8bb03bd42edfd4ffbdaf 100644 (file)
@@ -279,22 +279,20 @@ static struct peer *peer_xfer_conn(struct peer *from_peer)
                }
        }
 
+       if (peer->hostname) {
+               XFREE(MTYPE_BGP_PEER_HOST, peer->hostname);
+               peer->hostname = NULL;
+       }
        if (from_peer->hostname != NULL) {
-               if (peer->hostname) {
-                       XFREE(MTYPE_BGP_PEER_HOST, peer->hostname);
-                       peer->hostname = NULL;
-               }
-
                peer->hostname = from_peer->hostname;
                from_peer->hostname = NULL;
        }
 
+       if (peer->domainname) {
+               XFREE(MTYPE_BGP_PEER_HOST, peer->domainname);
+               peer->domainname = NULL;
+       }
        if (from_peer->domainname != NULL) {
-               if (peer->domainname) {
-                       XFREE(MTYPE_BGP_PEER_HOST, peer->domainname);
-                       peer->domainname = NULL;
-               }
-
                peer->domainname = from_peer->domainname;
                from_peer->domainname = NULL;
        }
index b9649ac4da0e643b05b39289286a7aac7ca07362..52ffb103341ded9c6cd7c6354383e4a61c607574 100644 (file)
@@ -211,16 +211,10 @@ static void bgp_process_mac_rescan_table(struct bgp *bgp, struct peer *peer,
 
                        memcpy(&evpn, bgp_attr_get_evpn_overlay(pi->attr),
                               sizeof(evpn));
-                       int32_t ret = bgp_update(peer, p,
-                                                pi->addpath_rx_id,
-                                                pi->attr, AFI_L2VPN, SAFI_EVPN,
-                                                ZEBRA_ROUTE_BGP,
-                                                BGP_ROUTE_NORMAL, &prd,
-                                                label_pnt, num_labels,
-                                                1, evpn);
-
-                       if (ret < 0)
-                               bgp_dest_unlock_node(dest);
+                       bgp_update(peer, p, pi->addpath_rx_id, pi->attr,
+                                  AFI_L2VPN, SAFI_EVPN, ZEBRA_ROUTE_BGP,
+                                  BGP_ROUTE_NORMAL, &prd, label_pnt,
+                                  num_labels, 1, evpn);
                }
        }
 }
index 3f07e53bb68684b928e873c0e1d6d8c3a60cd119..c9cfc44da0bea544497040247656a533634a3718 100644 (file)
@@ -3957,11 +3957,11 @@ static bool bgp_accept_own(struct peer *peer, afi_t afi, safi_t safi,
        return false;
 }
 
-int bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id,
-              struct attr *attr, afi_t afi, safi_t safi, int type,
-              int sub_type, struct prefix_rd *prd, mpls_label_t *label,
-              uint32_t num_labels, int soft_reconfig,
-              struct bgp_route_evpn *evpn)
+void bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id,
+               struct attr *attr, afi_t afi, safi_t safi, int type,
+               int sub_type, struct prefix_rd *prd, mpls_label_t *label,
+               uint32_t num_labels, int soft_reconfig,
+               struct bgp_route_evpn *evpn)
 {
        int ret;
        int aspath_loop_count = 0;
@@ -4337,7 +4337,7 @@ int bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id,
                        bgp_dest_unlock_node(dest);
                        bgp_attr_unintern(&attr_new);
 
-                       return 0;
+                       return;
                }
 
                /* Withdraw/Announce before we fully processed the withdraw */
@@ -4551,7 +4551,7 @@ int bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id,
                        ret = bgp_damp_update(pi, dest, afi, safi);
                        if (ret == BGP_DAMP_SUPPRESSED) {
                                bgp_dest_unlock_node(dest);
-                               return 0;
+                               return;
                        }
                }
 
@@ -4671,7 +4671,7 @@ int bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id,
                        bgp_unlink_nexthop(pi);
                        bgp_path_info_delete(dest, pi);
                }
-               return 0;
+               return;
        } // End of implicit withdraw
 
        /* Received Logging. */
@@ -4834,7 +4834,7 @@ int bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id,
                bgp_path_info_delete(dest, new);
        }
 
-       return 0;
+       return;
 
 /* This BGP update is filtered.  Log the reason then update BGP
    entry.  */
@@ -4897,13 +4897,14 @@ filtered:
        }
 #endif
 
-       return 0;
+       return;
 }
 
-int bgp_withdraw(struct peer *peer, const struct prefix *p, uint32_t addpath_id,
-                struct attr *attr, afi_t afi, safi_t safi, int type,
-                int sub_type, struct prefix_rd *prd, mpls_label_t *label,
-                uint32_t num_labels, struct bgp_route_evpn *evpn)
+void bgp_withdraw(struct peer *peer, const struct prefix *p,
+                 uint32_t addpath_id, struct attr *attr, afi_t afi,
+                 safi_t safi, int type, int sub_type, struct prefix_rd *prd,
+                 mpls_label_t *label, uint32_t num_labels,
+                 struct bgp_route_evpn *evpn)
 {
        struct bgp *bgp;
        char pfx_buf[BGP_PRD_PATH_STRLEN];
@@ -4948,7 +4949,7 @@ int bgp_withdraw(struct peer *peer, const struct prefix *p, uint32_t addpath_id,
                                        peer->host, pfx_buf);
                        }
                        bgp_dest_unlock_node(dest);
-                       return 0;
+                       return;
                }
 
        /* Lookup withdrawn route. */
@@ -4990,7 +4991,7 @@ int bgp_withdraw(struct peer *peer, const struct prefix *p, uint32_t addpath_id,
        /* Unlock bgp_node_get() lock. */
        bgp_dest_unlock_node(dest);
 
-       return 0;
+       return;
 }
 
 void bgp_default_originate(struct peer *peer, afi_t afi, safi_t safi,
@@ -5122,10 +5123,10 @@ static void bgp_soft_reconfig_table_flag(struct bgp_table *table, bool flag)
        }
 }
 
-static int bgp_soft_reconfig_table_update(struct peer *peer,
-                                         struct bgp_dest *dest,
-                                         struct bgp_adj_in *ain, afi_t afi,
-                                         safi_t safi, struct prefix_rd *prd)
+static void bgp_soft_reconfig_table_update(struct peer *peer,
+                                          struct bgp_dest *dest,
+                                          struct bgp_adj_in *ain, afi_t afi,
+                                          safi_t safi, struct prefix_rd *prd)
 {
        struct bgp_path_info *pi;
        uint32_t num_labels = 0;
@@ -5146,17 +5147,15 @@ static int bgp_soft_reconfig_table_update(struct peer *peer,
        else
                memset(&evpn, 0, sizeof(evpn));
 
-       return bgp_update(peer, bgp_dest_get_prefix(dest), ain->addpath_rx_id,
-                         ain->attr, afi, safi, ZEBRA_ROUTE_BGP,
-                         BGP_ROUTE_NORMAL, prd, label_pnt, num_labels, 1,
-                         &evpn);
+       bgp_update(peer, bgp_dest_get_prefix(dest), ain->addpath_rx_id,
+                  ain->attr, afi, safi, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, prd,
+                  label_pnt, num_labels, 1, &evpn);
 }
 
 static void bgp_soft_reconfig_table(struct peer *peer, afi_t afi, safi_t safi,
                                    struct bgp_table *table,
                                    struct prefix_rd *prd)
 {
-       int ret;
        struct bgp_dest *dest;
        struct bgp_adj_in *ain;
 
@@ -5168,13 +5167,8 @@ static void bgp_soft_reconfig_table(struct peer *peer, afi_t afi, safi_t safi,
                        if (ain->peer != peer)
                                continue;
 
-                       ret = bgp_soft_reconfig_table_update(peer, dest, ain,
-                                                            afi, safi, prd);
-
-                       if (ret < 0) {
-                               bgp_dest_unlock_node(dest);
-                               return;
-                       }
+                       bgp_soft_reconfig_table_update(peer, dest, ain, afi,
+                                                      safi, prd);
                }
 }
 
@@ -5189,7 +5183,6 @@ static void bgp_soft_reconfig_table(struct peer *peer, afi_t afi, safi_t safi,
 static void bgp_soft_reconfig_table_task(struct thread *thread)
 {
        uint32_t iter, max_iter;
-       int ret;
        struct bgp_dest *dest;
        struct bgp_adj_in *ain;
        struct peer *peer;
@@ -5222,27 +5215,10 @@ static void bgp_soft_reconfig_table_task(struct thread *thread)
                                if (ain->peer != peer)
                                        continue;
 
-                               ret = bgp_soft_reconfig_table_update(
+                               bgp_soft_reconfig_table_update(
                                        peer, dest, ain, table->afi,
                                        table->safi, prd);
                                iter++;
-
-                               if (ret < 0) {
-                                       bgp_dest_unlock_node(dest);
-                                       listnode_delete(
-                                               table->soft_reconfig_peers,
-                                               peer);
-                                       bgp_announce_route(peer, table->afi,
-                                                          table->safi, false);
-                                       if (list_isempty(
-                                                   table->soft_reconfig_peers)) {
-                                               list_delete(
-                                                       &table->soft_reconfig_peers);
-                                               bgp_soft_reconfig_table_flag(
-                                                       table, false);
-                                               return;
-                                       }
-                               }
                        }
                }
        }
@@ -5959,7 +5935,6 @@ int bgp_nlri_parse_ip(struct peer *peer, struct attr *attr,
        uint8_t *lim;
        struct prefix p;
        int psize;
-       int ret;
        afi_t afi;
        safi_t safi;
        bool addpath_capable;
@@ -6072,23 +6047,18 @@ int bgp_nlri_parse_ip(struct peer *peer, struct attr *attr,
 
                /* Normal process. */
                if (attr)
-                       ret = bgp_update(peer, &p, addpath_id, attr, afi, safi,
-                                        ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL,
-                                        NULL, NULL, 0, 0, NULL);
+                       bgp_update(peer, &p, addpath_id, attr, afi, safi,
+                                  ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL,
+                                  NULL, 0, 0, NULL);
                else
-                       ret = bgp_withdraw(peer, &p, addpath_id, attr, afi,
-                                          safi, ZEBRA_ROUTE_BGP,
-                                          BGP_ROUTE_NORMAL, NULL, NULL, 0,
-                                          NULL);
+                       bgp_withdraw(peer, &p, addpath_id, attr, afi, safi,
+                                    ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL,
+                                    NULL, 0, NULL);
 
                /* Do not send BGP notification twice when maximum-prefix count
                 * overflow. */
                if (CHECK_FLAG(peer->sflags, PEER_STATUS_PREFIX_OVERFLOW))
                        return BGP_NLRI_PARSE_ERROR_PREFIX_OVERFLOW;
-
-               /* Address family configuration mismatch. */
-               if (ret < 0)
-                       return BGP_NLRI_PARSE_ERROR_ADDRESS_FAMILY;
        }
 
        /* Packet length consistency check. */
@@ -9483,7 +9453,7 @@ void route_vty_out(struct vty *vty, const struct prefix *p,
                        json_object_string_add(json_path, "path",
                                               attr->aspath->str);
                else
-                       aspath_print_vty(vty, "%s", attr->aspath, " ");
+                       aspath_print_vty(vty, attr->aspath);
        }
 
        /* Print origin */
@@ -9701,7 +9671,7 @@ CPP_NOTICE("Drop `bgpOriginCodes` from JSON outputs")
 
                        /* Print aspath */
                        if (attr->aspath)
-                               aspath_print_vty(vty, "%s", attr->aspath, " ");
+                               aspath_print_vty(vty, attr->aspath);
 
                        /* Print origin */
                        vty_out(vty, "%s", bgp_origin_str[attr->origin]);
@@ -9968,7 +9938,7 @@ static void damp_route_vty_out(struct vty *vty, const struct prefix *p,
                                                use_json, NULL));
 
                if (attr->aspath)
-                       aspath_print_vty(vty, "%s", attr->aspath, " ");
+                       aspath_print_vty(vty, attr->aspath);
 
                vty_out(vty, "%s", bgp_origin_str[attr->origin]);
 
@@ -10045,7 +10015,7 @@ static void flap_route_vty_out(struct vty *vty, const struct prefix *p,
                        vty_out(vty, "%*s ", 8, " ");
 
                if (attr->aspath)
-                       aspath_print_vty(vty, "%s", attr->aspath, " ");
+                       aspath_print_vty(vty, attr->aspath);
 
                vty_out(vty, "%s", bgp_origin_str[attr->origin]);
 
@@ -10329,7 +10299,7 @@ void route_vty_out_detail(struct vty *vty, struct bgp *bgp, struct bgp_dest *bn,
                                               attr->aspath->json);
                } else {
                        if (attr->aspath->segments)
-                               aspath_print_vty(vty, "  %s", attr->aspath, "");
+                               vty_out(vty, "  %s", attr->aspath->str);
                        else
                                vty_out(vty, "  Local");
                }
index e16e077029563796fe8cf65b37138840a62e425a..452282926fc9fe3ef3a4242068ce3fc63dcb2f0c 100644 (file)
@@ -750,17 +750,17 @@ extern int bgp_static_unset_safi(afi_t afi, safi_t safi, struct vty *,
                                 const char *, const char *, const char *);
 
 /* this is primarily for MPLS-VPN */
-extern int bgp_update(struct peer *peer, const struct prefix *p,
-                     uint32_t addpath_id, struct attr *attr,
-                     afi_t afi, safi_t safi, int type, int sub_type,
-                     struct prefix_rd *prd, mpls_label_t *label,
-                     uint32_t num_labels, int soft_reconfig,
-                     struct bgp_route_evpn *evpn);
-extern int bgp_withdraw(struct peer *peer, const struct prefix *p,
-                       uint32_t addpath_id, struct attr *attr, afi_t afi,
-                       safi_t safi, int type, int sub_type,
-                       struct prefix_rd *prd, mpls_label_t *label,
-                       uint32_t num_labels, struct bgp_route_evpn *evpn);
+extern void bgp_update(struct peer *peer, const struct prefix *p,
+                      uint32_t addpath_id, struct attr *attr, afi_t afi,
+                      safi_t safi, int type, int sub_type,
+                      struct prefix_rd *prd, mpls_label_t *label,
+                      uint32_t num_labels, int soft_reconfig,
+                      struct bgp_route_evpn *evpn);
+extern void bgp_withdraw(struct peer *peer, const struct prefix *p,
+                        uint32_t addpath_id, struct attr *attr, afi_t afi,
+                        safi_t safi, int type, int sub_type,
+                        struct prefix_rd *prd, mpls_label_t *label,
+                        uint32_t num_labels, struct bgp_route_evpn *evpn);
 
 /* for bgp_nexthop and bgp_damp */
 extern void bgp_process(struct bgp *, struct bgp_dest *, afi_t, safi_t);
index 5738d9ef68b0a5148bd043bbbbd14ac7a6496e70..d837601f3264dbabc80838a25de0853230cf7837 100644 (file)
@@ -12002,7 +12002,7 @@ static void bgp_show_neighbor_graceful_restart_remote_mode(struct vty *vty,
        if (json)
                json_object_string_add(json, "remoteGrMode", mode);
        else
-               vty_out(vty, mode, "\n");
+               vty_out(vty, "%s\n", mode);
 }
 
 static void bgp_show_neighbor_graceful_restart_local_mode(struct vty *vty,
@@ -12034,7 +12034,7 @@ static void bgp_show_neighbor_graceful_restart_local_mode(struct vty *vty,
        if (json)
                json_object_string_add(json, "localGrMode", mode);
        else
-               vty_out(vty, mode, "\n");
+               vty_out(vty, "%s\n", mode);
 }
 
 static void bgp_show_neighbor_graceful_restart_capability_per_afi_safi(
index 1fd394a8496685f7136ce8d8a793a3ff865dcff9..39010e76f9d1bd164336aa29564af93b72fe9221 100644 (file)
@@ -1156,6 +1156,7 @@ static void peer_free(struct peer *peer)
 
        XFREE(MTYPE_PEER_DESC, peer->desc);
        XFREE(MTYPE_BGP_PEER_HOST, peer->host);
+       XFREE(MTYPE_BGP_PEER_HOST, peer->hostname);
        XFREE(MTYPE_BGP_PEER_HOST, peer->domainname);
        XFREE(MTYPE_BGP_PEER_IFNAME, peer->ifname);
 
index 719d898e3c99d68d3d6ff141172be4b8a1b22b90..d04d1ee7500f3ede7e87c5057812f384be1c2b02 100644 (file)
@@ -322,6 +322,7 @@ int rfapiDebugPrintf(void *dummy, const char *format, ...)
        return 0;
 }
 
+PRINTFRR(2, 3)
 static int rfapiStdioPrintf(void *stream, const char *format, ...)
 {
        FILE *file = NULL;
index 2d9d4f66b1827122c1cb79786547a2debca5f226..48ac4873b86a88b9733e990f8caa45bb5af370c1 100644 (file)
@@ -349,6 +349,8 @@ AC_C_FLAG([-fno-omit-frame-pointer])
 AC_C_FLAG([-funwind-tables])
 AC_C_FLAG([-Wall])
 AC_C_FLAG([-Wextra])
+AC_C_FLAG([-Wformat-nonliteral])
+AC_C_FLAG([-Wformat-security])
 AC_C_FLAG([-Wstrict-prototypes])
 AC_C_FLAG([-Wmissing-prototypes])
 AC_C_FLAG([-Wmissing-declarations])
index e3b66345948b1f29716d86cea222a70baa69696b..fae7924c168a865a94afc5286180f549c6894c56 100644 (file)
@@ -4,6 +4,42 @@ frr (8.5~dev-1) UNRELEASED; urgency=medium
 
  -- Donatas Abraitis <donatas@opensourcerouting.org>  Tue, 04 Oct 2022 16:00:00 +0500
 
+frr (8.4.2-1) unstable; urgency=medium
+
+  * new upstream release FRR 8.4.2
+  * drop all patches in debian/patches/, they got merged upstream
+
+ -- David Lamparter <equinox-debian@diac24.net>  Mon, 23 Jan 2023 17:32:02 +0100
+
+frr (8.4.1-2) unstable; urgency=medium
+
+  * commit to git tarball as source instead of dist tarball
+  * ditch unneeded sphinx missing files patch
+  * fix clippy symbol lookup issue (build SEGV on mips64el)
+  * correctly mark :native for libelf-dev & libpython3-dev to fix cross-build
+  * use mutex for zserv stats (atomic uint64_t is too wide for 32-bit archs)
+
+ -- David Lamparter <equinox-debian@diac24.net>  Fri, 06 Jan 2023 14:59:57 +0100
+
+frr (8.4.1-1) unstable; urgency=medium
+
+  * New upstream release FRR 8.4.1 (closes: #1017518)
+  * New frr@ systemd service unit to run inside network namespace
+  * egrep to grep -E
+  * upstream fix ospfd crash (PR 8876) (closes: #981139)
+  * upstream fix isisd parsing issues CVE-2022-26125, CVE-2022-26126 and
+    babeld parsing issues CVE-2022-26127, CVE-2022-26128, CVE-2022-26129
+    (closes: #1008010)
+  * upstream fix bgpd out-of-bounds read CVE-2022-37032 (closes: #1021016)
+  * upstream fix bgpd UAF CVE-2022-37035 (closes: #1016978)
+  * libyang-related pcre3 dep replaced with pcre2 (closes: #1000032)
+  * disable ELF magic on mips64el
+  * fixed texinfo figure installation directory
+  * enable dh_sphinxdoc to get rid of embedded javascript in frr-doc
+  * removed bogus iproute dependency choice
+
+ -- David Lamparter <equinox-debian@diac24.net>  Mon, 02 Jan 2023 14:46:06 +0100
+
 frr (8.4-0) unstable; urgency=medium
 
   * New upstream release FRR 8.4
@@ -22,6 +58,13 @@ frr (8.2-0) unstable; urgency=medium
 
  -- Jafar Al-Gharaibeh <jafar@atcorp.com>  Tue, 01 Mar 2022 10:00:00 +0500
 
+frr (8.1-1) unstable; urgency=medium
+
+  * New upstream release FRR 8.1
+  * Upload to unstable.
+
+ -- OndÅ™ej Surý <ondrej@debian.org>  Sat, 13 Nov 2021 13:32:48 +0100
+
 frr (8.1-0) unstable; urgency=medium
 
   * New upstream release FRR 8.1
@@ -1007,7 +1050,7 @@ quagga (0.98.3-6) testing-proposed-updates; urgency=high
 quagga (0.98.3-5) unstable; urgency=high
 
   * The patch which tried to remove the OpenSSL dependency, which is
-    not only unnecessary but also a violation of the licence and thus RC,
+    not only unneccessary but also a violation of the licence and thus RC,
     stopped working a while ago, since autoreconf is no longer run before
     building the binaries. So now ./configure is patched directly (thanks
     to Faidon Liambotis for reporting). Closes: #306840
@@ -1388,7 +1431,7 @@ quagga (0.96.4x-3) unstable; urgency=low
   * Made the directory (but not the config/log files!) world accessible
     again on user request (thanks to Anand Kumria)). Closes: #213129
   * No longer providing sample configuration in /etc/quagga/. They are
-    now only available in /usr/share/doc/quagga/ to avoid accidentally
+    now only available in /usr/share/doc/quagga/ to avoid accidently
     using them without changing the adresses (thanks to Marc Haber).
     Closes: #215918
 
@@ -1448,7 +1491,7 @@ quagga (0.96.3-1) unstable; urgency=medium
 
 quagga (0.96.2-9) unstable; urgency=medium
 
-  * Removed /usr/share/info/dir.* which were accidentally there and prevented
+  * Removed /usr/share/info/dir.* which were accidently there and prevented
     the installation by dpkg (thanks to Simon Raven). Closes: #212614
   * Reworded package description (thanks to Anand Kumria). Closes: #213125
   * Added french debconf translation (thanks to Christian Perrier).
index 06c16cc9450c5742059781a1255d67f883a616d0..9b7dcfe418741ddef9109dd1bbc8587ce8a7bc58 100644 (file)
@@ -13,11 +13,11 @@ Build-Depends: bison,
                install-info,
                libc-ares-dev,
                libcap-dev,
-               libelf-dev,
+               libelf-dev:native,
                libjson-c-dev | libjson0-dev,
                libpam0g-dev | libpam-dev,
                libpcre2-dev,
-               libpython3-dev,
+               libpython3-dev:native,
                libreadline-dev,
                librtr-dev (>= 0.8.0~) <!pkg.frr.nortrlib>,
                libsnmp-dev,
@@ -25,10 +25,10 @@ Build-Depends: bison,
                libyang2-dev,
                lsb-base,
                pkg-config,
-               python3,
-               python3-dev,
-               python3-pytest <!nocheck>,
-               python3-sphinx,
+               python3:native,
+               python3-dev:native,
+               python3-pytest:native <!nocheck>,
+               python3-sphinx:native,
                texinfo (>= 4.7),
                lua5.3 <pkg.frr.lua>,
                liblua5.3-dev <pkg.frr.lua>
@@ -39,7 +39,7 @@ Vcs-Git: https://github.com/FRRouting/frr.git -b debian/master
 
 Package: frr
 Architecture: linux-any
-Depends: iproute2 | iproute,
+Depends: iproute2,
          logrotate (>= 3.2-11),
          lsof,
          ${misc:Depends},
@@ -104,9 +104,8 @@ Package: frr-doc
 Section: doc
 Architecture: all
 Multi-Arch: foreign
-Depends: libjs-jquery,
-         libjs-underscore,
-         ${misc:Depends}
+Depends: ${misc:Depends},
+         ${sphinxdoc:Depends}
 Suggests: frr
 Conflicts: quagga-doc
 Description: FRRouting suite - user manual
index ec7870d7aaf16a63e9a678133ed980d0f2f685c9..af960e35f2f76f338ae1915591166bdd4c1a102d 100644 (file)
@@ -12,12 +12,12 @@ Format: info
 Index: /usr/share/info/frr.info.gz
 Files:
  /usr/share/info/frr.info.gz
- /usr/share/info/fig-normal-processing.png
- /usr/share/info/fig-rs-processing.png
- /usr/share/info/fig-vnc-commercial-route-reflector.png
- /usr/share/info/fig-vnc-frr-route-reflector.png
- /usr/share/info/fig-vnc-gw.png
- /usr/share/info/fig-vnc-mesh.png
- /usr/share/info/fig-vnc-redundant-route-reflectors.png
- /usr/share/info/fig_topologies_full.png
- /usr/share/info/fig_topologies_rs.png
+ /usr/share/info/frr-figures/fig-normal-processing.png
+ /usr/share/info/frr-figures/fig-rs-processing.png
+ /usr/share/info/frr-figures/fig-vnc-commercial-route-reflector.png
+ /usr/share/info/frr-figures/fig-vnc-frr-route-reflector.png
+ /usr/share/info/frr-figures/fig-vnc-gw.png
+ /usr/share/info/frr-figures/fig-vnc-mesh.png
+ /usr/share/info/frr-figures/fig-vnc-redundant-route-reflectors.png
+ /usr/share/info/frr-figures/fig_topologies_full.png
+ /usr/share/info/frr-figures/fig_topologies_rs.png
index a83255a24f74b87087b8cc9d82d9474fcb54d471..1976365e36b740d0dae990465b293a2d8a283578 100644 (file)
@@ -1 +1 @@
-doc/user/_build/texinfo/frr.info
+build/doc/user/_build/texinfo/frr.info
index a6661621223861234afe3864d3541a53580df60b..7cef52e91a95efce39dcf96227f592d9ead9bf04 100644 (file)
@@ -3,14 +3,14 @@
 # other
 README.md         usr/share/doc/frr
 doc/figures/*.png usr/share/doc/frr
-doc/figures/fig-normal-processing.png usr/share/info
-doc/figures/fig-rs-processing.png usr/share/info
-doc/figures/fig-vnc-commercial-route-reflector.png usr/share/info
-doc/figures/fig-vnc-frr-route-reflector.png usr/share/info
-doc/figures/fig-vnc-gw.png usr/share/info
-doc/figures/fig-vnc-mesh.png usr/share/info
-doc/figures/fig-vnc-redundant-route-reflectors.png usr/share/info
-doc/figures/fig_topologies_full.png usr/share/info
-doc/figures/fig_topologies_rs.png usr/share/info
+doc/figures/fig-normal-processing.png              usr/share/info/frr-figures
+doc/figures/fig-rs-processing.png                  usr/share/info/frr-figures
+doc/figures/fig-vnc-commercial-route-reflector.png usr/share/info/frr-figures
+doc/figures/fig-vnc-frr-route-reflector.png        usr/share/info/frr-figures
+doc/figures/fig-vnc-gw.png                         usr/share/info/frr-figures
+doc/figures/fig-vnc-mesh.png                       usr/share/info/frr-figures
+doc/figures/fig-vnc-redundant-route-reflectors.png usr/share/info/frr-figures
+doc/figures/fig_topologies_full.png                usr/share/info/frr-figures
+doc/figures/fig_topologies_rs.png                  usr/share/info/frr-figures
 usr/share/doc/frr/html
 usr/share/info/
index 616f265e0142199a1a195ab51c7a84c30ec802fa..4468ef7bc4cd867fb60afffccbf6e8ecf4be5826 100644 (file)
@@ -1,10 +1,6 @@
 # function names & co.
-frr binary: spelling-error-in-binary usr/lib/*/frr/libfrr.so.0.0.0 writen written
-frr binary: spelling-error-in-binary usr/lib/*/frr/libfrrospfapiclient.so.0.0.0 writen written
-frr binary: spelling-error-in-binary usr/lib/frr/ospfd writen written
-frr binary: spelling-error-in-binary usr/lib/frr/zebra writen written
-frr binary: spelling-error-in-binary usr/lib/frr/pimd writen written
-frr binary: spelling-error-in-binary usr/lib/frr/pimd iif if
+frr binary: spelling-error-in-binary *writen written*
+frr binary: spelling-error-in-binary *iif if*
 
 # prefixed man pages for off-PATH daemons
 manpage-without-executable
index 5075fd763df40d1d29c138b598beb36c0c1f9598..5a1b74cfcad18eae22680cd7786d4855b8de853f 100644 (file)
@@ -1,16 +1,16 @@
-doc/manpages/_build/man/frr-bgpd.8
-doc/manpages/_build/man/frr-eigrpd.8
-doc/manpages/_build/man/frr-fabricd.8
-doc/manpages/_build/man/frr-isisd.8
-doc/manpages/_build/man/frr-ldpd.8
-doc/manpages/_build/man/frr-nhrpd.8
-doc/manpages/_build/man/frr-ospf6d.8
-doc/manpages/_build/man/frr-ospfd.8
-doc/manpages/_build/man/frr-pimd.8
-doc/manpages/_build/man/frr-ripd.8
-doc/manpages/_build/man/frr-ripngd.8
-doc/manpages/_build/man/frr-watchfrr.8
-doc/manpages/_build/man/frr-zebra.8
-doc/manpages/_build/man/frr.1
-doc/manpages/_build/man/mtracebis.8
-doc/manpages/_build/man/vtysh.1
+build/doc/manpages/_build/man/frr-bgpd.8
+build/doc/manpages/_build/man/frr-eigrpd.8
+build/doc/manpages/_build/man/frr-fabricd.8
+build/doc/manpages/_build/man/frr-isisd.8
+build/doc/manpages/_build/man/frr-ldpd.8
+build/doc/manpages/_build/man/frr-nhrpd.8
+build/doc/manpages/_build/man/frr-ospf6d.8
+build/doc/manpages/_build/man/frr-ospfd.8
+build/doc/manpages/_build/man/frr-pimd.8
+build/doc/manpages/_build/man/frr-ripd.8
+build/doc/manpages/_build/man/frr-ripngd.8
+build/doc/manpages/_build/man/frr-watchfrr.8
+build/doc/manpages/_build/man/frr-zebra.8
+build/doc/manpages/_build/man/frr.1
+build/doc/manpages/_build/man/mtracebis.8
+build/doc/manpages/_build/man/vtysh.1
index 63056033415e726142cc99e6fb1acb2346887d16..43e5d7e614ad8b199725379987af60c88b2bbdab 100755 (executable)
@@ -36,7 +36,7 @@ endif
 export PYTHON=python3
 
 %:
-       dh $@
+       dh $@ -Bbuild --with=sphinxdoc
 
 override_dh_auto_configure:
        $(shell dpkg-buildflags --export=sh); \
@@ -76,11 +76,13 @@ override_dh_auto_install:
 
        sed -e '1c #!/usr/bin/python3' -i debian/tmp/usr/lib/frr/frr-reload.py
        sed -e '1c #!/usr/bin/python3' -i debian/tmp/usr/lib/frr/generate_support_bundle.py
+       sed -e '1c #!/usr/bin/python3' -i debian/tmp/usr/lib/frr/frr_babeltrace.py
+       sed -e '1c #!/usr/bin/python3' -i debian/tmp/usr/lib/frr/ospfclient.py
 
 # let dh_systemd_* and dh_installinit do their thing automatically
-       cp tools/frr.service debian/frr.service
-       cp tools/frr@.service debian/frr@.service
-       cp tools/frrinit.sh debian/frr.init
+       cp build/tools/frr.service debian/frr.service
+       cp build/tools/frr@.service debian/frr@.service
+       cp build/tools/frrinit.sh debian/frr.init
        -rm -f debian/tmp/usr/lib/frr/frr
 
 # install config files
@@ -93,12 +95,6 @@ override_dh_auto_install:
        rm -rf debian/tmp/usr/include
        -rm debian/tmp/usr/lib/frr/ssd
 
-# use installed js libraries
-       -rm -f debian/tmp/usr/share/doc/frr/html/_static/jquery.js
-       ln -s /usr/share/javascript/jquery/jquery.js debian/tmp/usr/share/doc/frr/html/_static/jquery.js
-       -rm -f debian/tmp/usr/share/doc/frr/html/_static/underscore.js
-       ln -s /usr/share/javascript/underscore/underscore.js debian/tmp/usr/share/doc/frr/html/_static/underscore.js
-
 override_dh_auto_build:
        dh_auto_build -- $(MAKE_SILENT)
 
@@ -114,6 +110,11 @@ override_dh_makeshlibs:
 override_dh_missing:
        dh_missing --fail-missing
 
+ifneq ($(filter nocheck,$(DEB_BUILD_PROFILES) $(DEB_BUILD_OPTIONS)),)
+override_dh_auto_test:
+       true
+endif
+
 override_dh_auto_clean:
 # we generally do NOT want a full distclean since that wipes both
 # debian/changelog and config.version
index f17eba41300594fc5d9e5c981e34b6e22c91c319..2485a0d7f93e9a3d9120540c2dec3628a0bc5392 100644 (file)
@@ -1,5 +1,10 @@
 version=4
 
-opts=uversionmangle=s/(\d)[_\.\-\+]?((RC|rc|pre|dev|beta|alpha)\d*)$/$1~$2/ \
+opts="\
+searchmode=plain,\
+uversionmangle=s/(\d)[_\.\-\+]?((RC|rc|pre|dev|beta|alpha)\d*)$/$1~$2/,\
+downloadurlmangle=s&releases/>FRR\s*(\d\S+)\s+Release<&archive/refs/tags/frr-$1.tar.gz&,\
+filenamemangle=s&>FRR\s*(\d\S+)\s+Release<&frr-$1.tar.gz&,\
+" \
 https://github.com/FRRouting/frr/releases/ \
-       .*/frr-(\d\S+)\.(?:zip|tgz|tbz|txz|(?:tar\.(?:gz|bz2|xz)))
+       >FRR\s*(\d\S+)\s+Release<
diff --git a/debian/watchfrr.rc b/debian/watchfrr.rc
deleted file mode 100644 (file)
index 4110b86..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-check process watchfrr with pidfile /var/run/frr/watchfrr.pid
-        start program = "/etc/init.d/frr start watchfrr" with timeout 120 seconds
-        stop program = "/etc/init.d/frr stop watchfrr"
-        if 3 restarts within 10 cycles then timeout
index 3650984f1bb749fba6c803cafe0e37645e7abb4e..cb607deb23424162865cab9e11e8ab33c3d50638 100644 (file)
@@ -61,7 +61,7 @@ DEFPY_YANG_NOSH(router_isis, router_isis_cmd,
                 vrf_name);
        nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL);
 
-       ret = nb_cli_apply_changes(vty, base_xpath);
+       ret = nb_cli_apply_changes(vty, "%s", base_xpath);
        if (ret == CMD_SUCCESS)
                VTY_PUSH_XPATH(ISIS_NODE, base_xpath);
 
@@ -1427,7 +1427,7 @@ DEFPY_YANG(
                                      overload ? "true" : "false");
        }
 
-       return nb_cli_apply_changes(vty, base_xpath);
+       return nb_cli_apply_changes(vty, "%s", base_xpath);
 }
 
 void cli_show_isis_mt_ipv4_multicast(struct vty *vty,
index 1aaad41a10edf48fb4d7f4c82d6691ca016a13c8..88ce03095ac0f6170d6afaaa8c499aaa85e08319 100644 (file)
@@ -77,7 +77,11 @@ log_warn(const char *emsg, ...)
                        vlog(LOG_ERR, emsg, ap);
                        logit(LOG_ERR, "%s", strerror(errno));
                } else {
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wformat-nonliteral"
+                       /* format extended above */
                        vlog(LOG_ERR, nfmt, ap);
+#pragma GCC diagnostic pop
                        free(nfmt);
                }
                va_end(ap);
index 7ca99c9a940191c45597c12dc3081abe71d96ac1..1c27f857ba74289dcb456a8dedcef53b0b5b5106 100644 (file)
@@ -108,6 +108,7 @@ int main(int argc, char **argv)
 
 #include "log.h"
 
+PRINTFRR(3, 0)
 void vzlogx(const struct xref_logmsg *xref, int prio,
            const char *format, va_list args)
 {
index bef7f3b209131030a8629198cbf7af7dbd4c1269..4e415262113f6ad19f0bff70c5ca21a50ea704f1 100644 (file)
@@ -219,6 +219,7 @@ ferr_r ferr_clear(void)
        return ferr_ok();
 }
 
+PRINTFRR(7, 0)
 static ferr_r ferr_set_va(const char *file, int line, const char *func,
                          enum ferr_kind kind, const char *pathname,
                          int errno_val, const char *text, va_list va)
index c27601f66c4218b5386537050bf7534f57b18849..9accde1697aab60c189407480b201fcb1519b844 100644 (file)
@@ -178,10 +178,12 @@ ferr_r ferr_clear(void);
 
 /* do NOT call these functions directly.  only for macro use! */
 ferr_r ferr_set_internal(const char *file, int line, const char *func,
-                        enum ferr_kind kind, const char *text, ...);
+                        enum ferr_kind kind, const char *text, ...)
+       PRINTFRR(5, 6);
 ferr_r ferr_set_internal_ext(const char *file, int line, const char *func,
                             enum ferr_kind kind, const char *pathname,
-                            int errno_val, const char *text, ...);
+                            int errno_val, const char *text, ...)
+       PRINTFRR(7, 8);
 
 #define ferr_ok() 0
 
@@ -221,7 +223,8 @@ ferr_r ferr_set_internal_ext(const char *file, int line, const char *func,
 
 #include "vty.h"
 /* print error message to vty;  $ERR is replaced by the error's message */
-void vty_print_error(struct vty *vty, ferr_r err, const char *msg, ...);
+void vty_print_error(struct vty *vty, ferr_r err, const char *msg, ...)
+       PRINTFRR(3, 4);
 
 #define CMD_FERR_DO(func, action, ...)                                         \
        do {                                                                   \
index 296c05b9f48890f739d1e25be731991f429038ba..5accea3f02378fbd55f0106b71df02c8f0ad4873 100644 (file)
@@ -206,7 +206,7 @@ DEFPY_YANG(
                nb_cli_enqueue_change(vty, "./source-any", NB_OP_CREATE, NULL);
        }
 
-       return nb_cli_apply_changes(vty, xpath_entry);
+       return nb_cli_apply_changes(vty, "%s", xpath_entry);
 }
 
 DEFPY_YANG(
@@ -369,7 +369,7 @@ DEFPY_YANG(
                                      NULL);
        }
 
-       return nb_cli_apply_changes(vty, xpath_entry);
+       return nb_cli_apply_changes(vty, "%s", xpath_entry);
 }
 
 DEFPY_YANG(
@@ -519,7 +519,7 @@ DEFPY_YANG(
                nb_cli_enqueue_change(vty, "./any", NB_OP_CREATE, NULL);
        }
 
-       return nb_cli_apply_changes(vty, xpath_entry);
+       return nb_cli_apply_changes(vty, "%s", xpath_entry);
 }
 
 DEFPY_YANG(
@@ -600,7 +600,7 @@ DEFPY_YANG(
 
        remark = argv_concat(argv, argc, 3);
        nb_cli_enqueue_change(vty, "./remark", NB_OP_CREATE, remark);
-       rv = nb_cli_apply_changes(vty, xpath);
+       rv = nb_cli_apply_changes(vty, "%s", xpath);
        XFREE(MTYPE_TMP, remark);
 
        return rv;
@@ -709,7 +709,7 @@ DEFPY_YANG(
                nb_cli_enqueue_change(vty, "./any", NB_OP_CREATE, NULL);
        }
 
-       return nb_cli_apply_changes(vty, xpath_entry);
+       return nb_cli_apply_changes(vty, "%s", xpath_entry);
 }
 
 DEFPY_YANG(
@@ -793,7 +793,7 @@ DEFPY_YANG(
 
        remark = argv_concat(argv, argc, 4);
        nb_cli_enqueue_change(vty, "./remark", NB_OP_CREATE, remark);
-       rv = nb_cli_apply_changes(vty, xpath);
+       rv = nb_cli_apply_changes(vty, "%s", xpath);
        XFREE(MTYPE_TMP, remark);
 
        return rv;
@@ -896,7 +896,7 @@ DEFPY_YANG(
                nb_cli_enqueue_change(vty, "./any", NB_OP_CREATE, NULL);
        }
 
-       return nb_cli_apply_changes(vty, xpath_entry);
+       return nb_cli_apply_changes(vty, "%s", xpath_entry);
 }
 
 DEFPY_YANG(
@@ -975,7 +975,7 @@ DEFPY_YANG(
 
        remark = argv_concat(argv, argc, 4);
        nb_cli_enqueue_change(vty, "./remark", NB_OP_CREATE, remark);
-       rv = nb_cli_apply_changes(vty, xpath);
+       rv = nb_cli_apply_changes(vty, "%s", xpath);
        XFREE(MTYPE_TMP, remark);
 
        return rv;
@@ -1344,7 +1344,7 @@ DEFPY_YANG(
                nb_cli_enqueue_change(vty, "./any", NB_OP_CREATE, NULL);
        }
 
-       return nb_cli_apply_changes(vty, xpath_entry);
+       return nb_cli_apply_changes(vty, "%s", xpath_entry);
 }
 
 DEFPY_YANG(
@@ -1415,7 +1415,7 @@ DEFPY_YANG(
 
        remark = argv_concat(argv, argc, 4);
        nb_cli_enqueue_change(vty, "./remark", NB_OP_CREATE, remark);
-       rv = nb_cli_apply_changes(vty, xpath);
+       rv = nb_cli_apply_changes(vty, "%s", xpath);
        XFREE(MTYPE_TMP, remark);
 
        return rv;
@@ -1548,7 +1548,7 @@ DEFPY_YANG(
                nb_cli_enqueue_change(vty, "./any", NB_OP_CREATE, NULL);
        }
 
-       return nb_cli_apply_changes(vty, xpath_entry);
+       return nb_cli_apply_changes(vty, "%s", xpath_entry);
 }
 
 DEFPY_YANG(
@@ -1619,7 +1619,7 @@ DEFPY_YANG(
 
        remark = argv_concat(argv, argc, 4);
        nb_cli_enqueue_change(vty, "./remark", NB_OP_CREATE, remark);
-       rv = nb_cli_apply_changes(vty, xpath);
+       rv = nb_cli_apply_changes(vty, "%s", xpath);
        XFREE(MTYPE_TMP, remark);
 
        return rv;
index 3ed1f3e03e96dc6737150d4799d6114e3e5e9a88..cfe3105380ed41a125e2a679d28c741f732cb361 100644 (file)
@@ -70,7 +70,7 @@ static enum nb_error prefix_list_length_validate(struct nb_cb_modify_args *args)
         * prefix length <= le.
         */
        if (yang_dnode_exists(args->dnode, xpath_le)) {
-               le = yang_dnode_get_uint8(args->dnode, xpath_le);
+               le = yang_dnode_get_uint8(args->dnode, "%s", xpath_le);
                if (p.prefixlen > le)
                        goto log_and_fail;
        }
@@ -80,7 +80,7 @@ static enum nb_error prefix_list_length_validate(struct nb_cb_modify_args *args)
         * prefix length <= ge.
         */
        if (yang_dnode_exists(args->dnode, xpath_ge)) {
-               ge = yang_dnode_get_uint8(args->dnode, xpath_ge);
+               ge = yang_dnode_get_uint8(args->dnode, "%s", xpath_ge);
                if (p.prefixlen > ge)
                        goto log_and_fail;
        }
@@ -91,8 +91,8 @@ static enum nb_error prefix_list_length_validate(struct nb_cb_modify_args *args)
         */
        if (yang_dnode_exists(args->dnode, xpath_le)
            && yang_dnode_exists(args->dnode, xpath_ge)) {
-               le = yang_dnode_get_uint8(args->dnode, xpath_le);
-               ge = yang_dnode_get_uint8(args->dnode, xpath_ge);
+               le = yang_dnode_get_uint8(args->dnode, "%s", xpath_le);
+               ge = yang_dnode_get_uint8(args->dnode, "%s", xpath_ge);
                if (ge > le)
                        goto log_and_fail;
        }
@@ -273,7 +273,8 @@ static int _acl_is_dup(const struct lyd_node *dnode, void *arg)
                        return YANG_ITER_CONTINUE;
 
                /* Check if different value. */
-               if (strcmp(yang_dnode_get_string(dnode, ada->ada_xpath[idx]),
+               if (strcmp(yang_dnode_get_string(dnode, "%s",
+                                                ada->ada_xpath[idx]),
                           ada->ada_value[idx]))
                        return YANG_ITER_CONTINUE;
        }
@@ -328,8 +329,8 @@ static bool acl_cisco_is_dup(const struct lyd_node *dnode)
                }
 
                ada.ada_xpath[arg_idx] = cisco_entries[idx];
-               ada.ada_value[arg_idx] =
-                       yang_dnode_get_string(entry_dnode, cisco_entries[idx]);
+               ada.ada_value[arg_idx] = yang_dnode_get_string(
+                       entry_dnode, "%s", cisco_entries[idx]);
                arg_idx++;
                idx++;
        }
@@ -378,8 +379,8 @@ static bool acl_zebra_is_dup(const struct lyd_node *dnode,
                }
 
                ada.ada_xpath[arg_idx] = zebra_entries[idx];
-               ada.ada_value[arg_idx] =
-                       yang_dnode_get_string(entry_dnode, zebra_entries[idx]);
+               ada.ada_value[arg_idx] = yang_dnode_get_string(
+                       entry_dnode, "%s", zebra_entries[idx]);
                arg_idx++;
                idx++;
        }
index db7321003644beca5d895ad8afa79c2f07cdd8da..b75c2a4dbe5578e795396ccb921765244edf15bc 100644 (file)
--- a/lib/if.c
+++ b/lib/if.c
@@ -1220,7 +1220,7 @@ DEFPY_YANG_NOSH (interface,
        }
 
        nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL);
-       ret = nb_cli_apply_changes_clear_pending(vty, xpath_list);
+       ret = nb_cli_apply_changes_clear_pending(vty, "%s", xpath_list);
        if (ret == CMD_SUCCESS) {
                VTY_PUSH_XPATH(INTERFACE_NODE, xpath_list);
 
@@ -1279,7 +1279,7 @@ DEFPY_YANG (no_interface,
 
        nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL);
 
-       return nb_cli_apply_changes(vty, xpath_list);
+       return nb_cli_apply_changes(vty, "%s", xpath_list);
 }
 
 static void netns_ifname_split(const char *xpath, char *ifname, char *vrfname)
index e472425447850a0b82f8e8a4dbd90a31ddffb0a3..d848507e01ddd98997c59f81ce016131444ea5ab 100644 (file)
@@ -71,7 +71,8 @@ extern void nb_cli_enqueue_change(struct vty *vty, const char *xpath,
  *    CMD_SUCCESS on success, CMD_WARNING_CONFIG_FAILED otherwise.
  */
 extern int nb_cli_apply_changes_clear_pending(struct vty *vty,
-                                             const char *xpath_base_fmt, ...);
+                                             const char *xpath_base_fmt, ...)
+       PRINTFRR(2, 3);
 
 /*
  * Apply enqueued changes to the candidate configuration, this function
@@ -89,7 +90,7 @@ extern int nb_cli_apply_changes_clear_pending(struct vty *vty,
  *    CMD_SUCCESS on success, CMD_WARNING_CONFIG_FAILED otherwise.
  */
 extern int nb_cli_apply_changes(struct vty *vty, const char *xpath_base_fmt,
-                               ...);
+                               ...) PRINTFRR(2, 3);
 
 /*
  * Execute a YANG RPC or Action.
index 6e39c2d9cfc33347d775032866b9473afe55d278..3ac6e2c0ae0678117d4f1802150c998e14458f0f 100644 (file)
@@ -293,5 +293,9 @@ static ssize_t printfrr_va(struct fbuf *buf, struct printfrr_eargs *ea,
         * when allocating a larger buffer in asnprintfrr()
         */
        va_copy(ap, *vaf->va);
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wformat-nonliteral"
+       /* can't format check this */
        return vbprintfrr(buf, vaf->fmt, ap);
+#pragma GCC diagnostic pop
 }
index 49fa2b718f0455e5297632c7ae7a200b32921fdf..cc886834faf65ccb83a141d4374e08002b02ffb4 100644 (file)
@@ -504,14 +504,20 @@ reswitch: switch (ch) {
                                fmt[4] = ch;
                                fmt[5] = '\0';
 
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wformat-nonliteral"
                                snprintf(buf, sizeof(buf), fmt, prec, arg);
+#pragma GCC diagnostic pop
                        } else {
                                double arg = GETARG(double);
                                char fmt[5] = "%.*";
                                fmt[3] = ch;
                                fmt[4] = '\0';
 
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wformat-nonliteral"
                                snprintf(buf, sizeof(buf), fmt, prec, arg);
+#pragma GCC diagnostic pop
                        }
                        cp = buf;
                        /* for proper padding */
index 754a7da638f5ab7883410dd513158b39847be771..18e9825a7a302fa5cc6a59977c6747504f6e79f1 100644 (file)
@@ -567,6 +567,7 @@ rt_enabled += --enabled zebra
 endif
 
 lib/route_types.h: $(top_srcdir)/lib/route_types.txt $(top_srcdir)/lib/route_types.pl
+       @$(MKDIR_P) lib
        $(PERL) $(top_srcdir)/lib/route_types.pl $(rt_enabled) < $(top_srcdir)/lib/route_types.txt > $@
 DISTCLEANFILES += lib/route_types.h
 
@@ -581,6 +582,7 @@ PHONY_GITVERSION=lib/gitversion.h.tmp
 .SILENT: lib/gitversion.h lib/gitversion.h.tmp
 GITH=lib/gitversion.h
 lib/gitversion.h.tmp: $(top_srcdir)/.git
+       @$(MKDIR_P) lib
        $(PERL) $(top_srcdir)/lib/gitversion.pl $(top_srcdir) > ${GITH}.tmp
 lib/gitversion.h: lib/gitversion.h.tmp
        { test -f ${GITH} && diff -s -q ${GITH}.tmp ${GITH}; } || cp ${GITH}.tmp ${GITH}
index ddf8822853775aff9854d6d41c975bcfef759cce..14362e1443ad80b904ce1395fa415859b05d4096 100644 (file)
@@ -130,6 +130,7 @@ struct ttable *ttable_new(const struct ttable_style *style)
  *
  * @return pointer to the first cell of allocated row
  */
+PRINTFRR(3, 0)
 static struct ttable_cell *ttable_insert_row_va(struct ttable *tt, int i,
                                                const char *format, va_list ap)
 {
@@ -435,13 +436,12 @@ char *ttable_dump(struct ttable *tt, const char *newline)
                                abspad -= row[j].style.border.right_on ? 1 : 0;
 
                        /* print text */
-                       const char *fmt;
                        if (row[j].style.align == LEFT)
-                               fmt = "%-*s";
+                               pos += sprintf(&buf[pos], "%-*s", abspad,
+                                              row[j].text);
                        else
-                               fmt = "%*s";
-
-                       pos += sprintf(&buf[pos], fmt, abspad, row[j].text);
+                               pos += sprintf(&buf[pos], "%*s", abspad,
+                                              row[j].text);
 
                        /* print right padding */
                        for (int k = 0; k < row[j].style.rpad; k++)
index 2ac7ef7a970cb0dcdb3ba90b0e35c332cbad2e58..7d2ca6f1e1e7f6a4d87eb0e330af50f31c742f48 100644 (file)
--- a/lib/vrf.c
+++ b/lib/vrf.c
@@ -652,7 +652,7 @@ DEFUN_YANG_NOSH (vrf,
        snprintf(xpath_list, sizeof(xpath_list), FRR_VRF_KEY_XPATH, vrfname);
 
        nb_cli_enqueue_change(vty, xpath_list, NB_OP_CREATE, NULL);
-       ret = nb_cli_apply_changes_clear_pending(vty, xpath_list);
+       ret = nb_cli_apply_changes_clear_pending(vty, "%s", xpath_list);
        if (ret == CMD_SUCCESS) {
                VTY_PUSH_XPATH(VRF_NODE, xpath_list);
                vrf = vrf_lookup_by_name(vrfname);
index 352080e580410d5951198d026c5712808f50af9a..76d907408c30aac0a8e41eca579847fd42a5678a 100644 (file)
--- a/lib/vty.c
+++ b/lib/vty.c
@@ -343,6 +343,15 @@ void vty_hello(struct vty *vty)
                vty_out(vty, "%s", host.motd);
 }
 
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wformat-nonliteral"
+/* prompt formatting has a %s in the cmd_node prompt string.
+ *
+ * Also for some reason GCC emits the warning on the end of the function
+ * (optimization maybe?) rather than on the vty_out line, so this pragma
+ * wraps the entire function rather than just the vty_out line.
+ */
+
 /* Put out prompt and wait input from user. */
 static void vty_prompt(struct vty *vty)
 {
@@ -350,6 +359,7 @@ static void vty_prompt(struct vty *vty)
                vty_out(vty, cmd_prompt(vty->node), cmd_hostname_get());
        }
 }
+#pragma GCC diagnostic pop
 
 /* Send WILL TELOPT_ECHO to remote server. */
 static void vty_will_echo(struct vty *vty)
@@ -464,8 +474,12 @@ static int vty_command(struct vty *vty, char *buf)
                         vty->address);
 
                /* format the prompt */
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wformat-nonliteral"
+               /* prompt formatting has a %s in the cmd_node prompt string */
                snprintf(prompt_str, sizeof(prompt_str), cmd_prompt(vty->node),
                         vty_str);
+#pragma GCC diagnostic pop
 
                /* now log the command */
                zlog_notice("%s%s", prompt_str, buf);
index d625b24f6a797f5ad16d2f6fb694d79bc4ae1028..8b49df5e9119f879b30ad95ba8107d9df77bb90d 100644 (file)
@@ -331,7 +331,8 @@ extern void yang_dnode_get_path(const struct lyd_node *dnode, char *xpath,
  *    Schema name of the libyang data node.
  */
 extern const char *yang_dnode_get_schema_name(const struct lyd_node *dnode,
-                                             const char *xpath_fmt, ...);
+                                             const char *xpath_fmt, ...)
+       PRINTFRR(2, 3);
 
 /*
  * Find a libyang data node by its YANG data path.
@@ -366,7 +367,8 @@ extern struct lyd_node *yang_dnode_get(const struct lyd_node *dnode,
  *    The libyang data node if found, or NULL if not found.
  */
 extern struct lyd_node *yang_dnode_getf(const struct lyd_node *dnode,
-                                       const char *path_fmt, ...);
+                                       const char *path_fmt, ...)
+       PRINTFRR(2, 3);
 
 /*
  * Check if a libyang data node exists.
@@ -400,7 +402,7 @@ extern bool yang_dnode_exists(const struct lyd_node *dnode, const char *xpath);
  *    true if a libyang data node was found, false otherwise.
  */
 extern bool yang_dnode_existsf(const struct lyd_node *dnode,
-                              const char *xpath_fmt, ...);
+                              const char *xpath_fmt, ...) PRINTFRR(2, 3);
 
 /*
  * Iterate over all libyang data nodes that satisfy an XPath query.
@@ -422,7 +424,7 @@ extern bool yang_dnode_existsf(const struct lyd_node *dnode,
  */
 void yang_dnode_iterate(yang_dnode_iter_cb cb, void *arg,
                        const struct lyd_node *dnode, const char *xpath_fmt,
-                       ...);
+                       ...) PRINTFRR(4, 5);
 
 /*
  * Check if the libyang data node contains a default value. Non-presence
@@ -459,7 +461,7 @@ extern bool yang_dnode_is_default(const struct lyd_node *dnode,
  *    true if the data node contains the default value, false otherwise.
  */
 extern bool yang_dnode_is_defaultf(const struct lyd_node *dnode,
-                                  const char *xpath_fmt, ...);
+                                  const char *xpath_fmt, ...) PRINTFRR(2, 3);
 
 /*
  * Check if the libyang data node and all of its children contain default
@@ -566,7 +568,8 @@ extern struct list *yang_data_list_new(void);
  *    Pointer to yang_data if found, NULL otherwise.
  */
 extern struct yang_data *yang_data_list_find(const struct list *list,
-                                            const char *xpath_fmt, ...);
+                                            const char *xpath_fmt, ...)
+       PRINTFRR(2, 3);
 
 /*
  * Create and set up a libyang context (for use by the translator)
index d562e4d29ea5085a7de68211171dcaeb97aa9e72..67b7f9aa700e40473c2ac3cb50d60c095c0742f3 100644 (file)
@@ -339,8 +339,12 @@ yang_translate_xpath(const struct yang_translator *translator, int dir,
        if (!mapping)
                return YANG_TRANSLATE_NOTFOUND;
 
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wformat-nonliteral"
+       /* processing format strings from mapping node... */
        n = sscanf(xpath, mapping->xpath_from_fmt, keys[0], keys[1], keys[2],
                   keys[3]);
+#pragma GCC diagnostic pop
        if (n < 0) {
                flog_warn(EC_LIB_YANG_TRANSLATION_ERROR,
                          "%s: sscanf() failed: %s", __func__,
@@ -348,8 +352,12 @@ yang_translate_xpath(const struct yang_translator *translator, int dir,
                return YANG_TRANSLATE_FAILURE;
        }
 
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wformat-nonliteral"
+       /* processing format strings from mapping node... */
        snprintf(xpath, xpath_len, mapping->xpath_to_fmt, keys[0], keys[1],
                 keys[2], keys[3]);
+#pragma GCC diagnostic pop
 
        return YANG_TRANSLATE_SUCCESS;
 }
index ea21d1324bd35c57e409803896788b2897171b78..d22379dd237e5f68b19f83b25b1d965f44552a31 100644 (file)
@@ -58,6 +58,7 @@
                }                                                              \
        } while (0)
 
+PRINTFRR(2, 0)
 static inline const char *
 yang_dnode_xpath_get_canon(const struct lyd_node *dnode, const char *xpath_fmt,
                           va_list ap)
@@ -75,6 +76,7 @@ yang_dnode_xpath_get_canon(const struct lyd_node *dnode, const char *xpath_fmt,
        return lyd_get_value(&__dleaf->node);
 }
 
+PRINTFRR(2, 0)
 static inline const struct lyd_value *
 yang_dnode_xpath_get_value(const struct lyd_node *dnode, const char *xpath_fmt,
                           va_list ap)
index 56b314876f25df0276896a30ee7becfb1cb91e97..c27e1e53721f5c097196f6bd3fa9bb38aa6d8e51 100644 (file)
@@ -30,105 +30,120 @@ extern "C" {
 extern bool yang_str2bool(const char *value);
 extern struct yang_data *yang_data_new_bool(const char *xpath, bool value);
 extern bool yang_dnode_get_bool(const struct lyd_node *dnode,
-                               const char *xpath_fmt, ...);
-extern bool yang_get_default_bool(const char *xpath_fmt, ...);
+                               const char *xpath_fmt, ...) PRINTFRR(2, 3);
+extern bool yang_get_default_bool(const char *xpath_fmt, ...) PRINTFRR(1, 2);
 
 /* dec64 */
 extern double yang_str2dec64(const char *xpath, const char *value);
 extern struct yang_data *yang_data_new_dec64(const char *xpath, double value);
 extern double yang_dnode_get_dec64(const struct lyd_node *dnode,
-                                  const char *xpath_fmt, ...);
-extern double yang_get_default_dec64(const char *xpath_fmt, ...);
+                                  const char *xpath_fmt, ...) PRINTFRR(2, 3);
+extern double yang_get_default_dec64(const char *xpath_fmt, ...) PRINTFRR(1, 2);
 
 /* enum */
 extern int yang_str2enum(const char *xpath, const char *value);
 extern struct yang_data *yang_data_new_enum(const char *xpath, int value);
 extern int yang_dnode_get_enum(const struct lyd_node *dnode,
-                              const char *xpath_fmt, ...);
-extern int yang_get_default_enum(const char *xpath_fmt, ...);
+                              const char *xpath_fmt, ...) PRINTFRR(2, 3);
+extern int yang_get_default_enum(const char *xpath_fmt, ...) PRINTFRR(1, 2);
 
 /* int8 */
 extern int8_t yang_str2int8(const char *value);
 extern struct yang_data *yang_data_new_int8(const char *xpath, int8_t value);
 extern int8_t yang_dnode_get_int8(const struct lyd_node *dnode,
-                                 const char *xpath_fmt, ...);
-extern int8_t yang_get_default_int8(const char *xpath_fmt, ...);
+                                 const char *xpath_fmt, ...) PRINTFRR(2, 3);
+extern int8_t yang_get_default_int8(const char *xpath_fmt, ...) PRINTFRR(1, 2);
 
 /* int16 */
 extern int16_t yang_str2int16(const char *value);
 extern struct yang_data *yang_data_new_int16(const char *xpath, int16_t value);
 extern int16_t yang_dnode_get_int16(const struct lyd_node *dnode,
-                                   const char *xpath_fmt, ...);
-extern int16_t yang_get_default_int16(const char *xpath_fmt, ...);
+                                   const char *xpath_fmt, ...) PRINTFRR(2, 3);
+extern int16_t yang_get_default_int16(const char *xpath_fmt, ...)
+       PRINTFRR(1, 2);
 
 /* int32 */
 extern int32_t yang_str2int32(const char *value);
 extern struct yang_data *yang_data_new_int32(const char *xpath, int32_t value);
 extern int32_t yang_dnode_get_int32(const struct lyd_node *dnode,
-                                   const char *xpath_fmt, ...);
-extern int32_t yang_get_default_int32(const char *xpath_fmt, ...);
+                                   const char *xpath_fmt, ...) PRINTFRR(2, 3);
+extern int32_t yang_get_default_int32(const char *xpath_fmt, ...)
+       PRINTFRR(1, 2);
 
 /* int64 */
 extern int64_t yang_str2int64(const char *value);
 extern struct yang_data *yang_data_new_int64(const char *xpath, int64_t value);
 extern int64_t yang_dnode_get_int64(const struct lyd_node *dnode,
-                                   const char *xpath_fmt, ...);
-extern int64_t yang_get_default_int64(const char *xpath_fmt, ...);
+                                   const char *xpath_fmt, ...) PRINTFRR(2, 3);
+extern int64_t yang_get_default_int64(const char *xpath_fmt, ...)
+       PRINTFRR(1, 2);
 
 /* uint8 */
 extern uint8_t yang_str2uint8(const char *value);
 extern struct yang_data *yang_data_new_uint8(const char *xpath, uint8_t value);
 extern uint8_t yang_dnode_get_uint8(const struct lyd_node *dnode,
-                                   const char *xpath_fmt, ...);
-extern uint8_t yang_get_default_uint8(const char *xpath_fmt, ...);
+                                   const char *xpath_fmt, ...) PRINTFRR(2, 3);
+extern uint8_t yang_get_default_uint8(const char *xpath_fmt, ...)
+       PRINTFRR(1, 2);
 
 /* uint16 */
 extern uint16_t yang_str2uint16(const char *value);
 extern struct yang_data *yang_data_new_uint16(const char *xpath,
                                              uint16_t value);
 extern uint16_t yang_dnode_get_uint16(const struct lyd_node *dnode,
-                                     const char *xpath_fmt, ...);
-extern uint16_t yang_get_default_uint16(const char *xpath_fmt, ...);
+                                     const char *xpath_fmt, ...)
+       PRINTFRR(2, 3);
+extern uint16_t yang_get_default_uint16(const char *xpath_fmt, ...)
+       PRINTFRR(1, 2);
 
 /* uint32 */
 extern uint32_t yang_str2uint32(const char *value);
 extern struct yang_data *yang_data_new_uint32(const char *xpath,
                                              uint32_t value);
 extern uint32_t yang_dnode_get_uint32(const struct lyd_node *dnode,
-                                     const char *xpath_fmt, ...);
-extern uint32_t yang_get_default_uint32(const char *xpath_fmt, ...);
+                                     const char *xpath_fmt, ...)
+       PRINTFRR(2, 3);
+extern uint32_t yang_get_default_uint32(const char *xpath_fmt, ...)
+       PRINTFRR(1, 2);
 
 /* uint64 */
 extern uint64_t yang_str2uint64(const char *value);
 extern struct yang_data *yang_data_new_uint64(const char *xpath,
                                              uint64_t value);
 extern uint64_t yang_dnode_get_uint64(const struct lyd_node *dnode,
-                                     const char *xpath_fmt, ...);
-extern uint64_t yang_get_default_uint64(const char *xpath_fmt, ...);
+                                     const char *xpath_fmt, ...)
+       PRINTFRR(2, 3);
+extern uint64_t yang_get_default_uint64(const char *xpath_fmt, ...)
+       PRINTFRR(1, 2);
 
 /* string */
 extern struct yang_data *yang_data_new_string(const char *xpath,
                                              const char *value);
 extern const char *yang_dnode_get_string(const struct lyd_node *dnode,
-                                        const char *xpath_fmt, ...);
+                                        const char *xpath_fmt, ...)
+       PRINTFRR(2, 3);
 extern void yang_dnode_get_string_buf(char *buf, size_t size,
                                      const struct lyd_node *dnode,
-                                     const char *xpath_fmt, ...);
-extern const char *yang_get_default_string(const char *xpath_fmt, ...);
+                                     const char *xpath_fmt, ...)
+       PRINTFRR(4, 5);
+extern const char *yang_get_default_string(const char *xpath_fmt, ...)
+       PRINTFRR(1, 2);
 extern void yang_get_default_string_buf(char *buf, size_t size,
-                                       const char *xpath_fmt, ...);
+                                       const char *xpath_fmt, ...)
+       PRINTFRR(3, 4);
 
 /* binary */
 extern struct yang_data *yang_data_new_binary(const char *xpath,
                                              const char *value, size_t len);
 extern size_t yang_dnode_get_binary_buf(char *buf, size_t size,
                                        const struct lyd_node *dnode,
-                                       const char *xpath_fmt, ...);
+                                       const char *xpath_fmt, ...)
+       PRINTFRR(4, 5);
 
 /* empty */
 extern struct yang_data *yang_data_new_empty(const char *xpath);
 extern bool yang_dnode_get_empty(const struct lyd_node *dnode,
-                                const char *xpath_fmt, ...);
+                                const char *xpath_fmt, ...) PRINTFRR(2, 3);
 
 /* ip prefix */
 extern void yang_str2prefix(const char *value, union prefixptr prefix);
@@ -136,9 +151,9 @@ extern struct yang_data *yang_data_new_prefix(const char *xpath,
                                              union prefixconstptr prefix);
 extern void yang_dnode_get_prefix(struct prefix *prefix,
                                  const struct lyd_node *dnode,
-                                 const char *xpath_fmt, ...);
+                                 const char *xpath_fmt, ...) PRINTFRR(3, 4);
 extern void yang_get_default_prefix(union prefixptr var, const char *xpath_fmt,
-                                   ...);
+                                   ...) PRINTFRR(2, 3);
 
 /* ipv4 */
 extern void yang_str2ipv4(const char *value, struct in_addr *addr);
@@ -146,9 +161,9 @@ extern struct yang_data *yang_data_new_ipv4(const char *xpath,
                                            const struct in_addr *addr);
 extern void yang_dnode_get_ipv4(struct in_addr *addr,
                                const struct lyd_node *dnode,
-                               const char *xpath_fmt, ...);
+                               const char *xpath_fmt, ...) PRINTFRR(3, 4);
 extern void yang_get_default_ipv4(struct in_addr *var, const char *xpath_fmt,
-                                 ...);
+                                 ...) PRINTFRR(2, 3);
 
 /* ipv4p */
 extern void yang_str2ipv4p(const char *value, union prefixptr prefix);
@@ -156,9 +171,9 @@ extern struct yang_data *yang_data_new_ipv4p(const char *xpath,
                                             union prefixconstptr prefix);
 extern void yang_dnode_get_ipv4p(union prefixptr prefix,
                                 const struct lyd_node *dnode,
-                                const char *xpath_fmt, ...);
+                                const char *xpath_fmt, ...) PRINTFRR(3, 4);
 extern void yang_get_default_ipv4p(union prefixptr var, const char *xpath_fmt,
-                                  ...);
+                                  ...) PRINTFRR(2, 3);
 
 /* ipv6 */
 extern void yang_str2ipv6(const char *value, struct in6_addr *addr);
@@ -166,9 +181,9 @@ extern struct yang_data *yang_data_new_ipv6(const char *xpath,
                                            const struct in6_addr *addr);
 extern void yang_dnode_get_ipv6(struct in6_addr *addr,
                                const struct lyd_node *dnode,
-                               const char *xpath_fmt, ...);
+                               const char *xpath_fmt, ...) PRINTFRR(3, 4);
 extern void yang_get_default_ipv6(struct in6_addr *var, const char *xpath_fmt,
-                                 ...);
+                                 ...) PRINTFRR(2, 3);
 
 /* ipv6p */
 extern void yang_str2ipv6p(const char *value, union prefixptr prefix);
@@ -176,17 +191,18 @@ extern struct yang_data *yang_data_new_ipv6p(const char *xpath,
                                             union prefixconstptr prefix);
 extern void yang_dnode_get_ipv6p(union prefixptr prefix,
                                 const struct lyd_node *dnode,
-                                const char *xpath_fmt, ...);
+                                const char *xpath_fmt, ...) PRINTFRR(3, 4);
 extern void yang_get_default_ipv6p(union prefixptr var, const char *xpath_fmt,
-                                  ...);
+                                  ...) PRINTFRR(2, 3);
 
 /* ip */
 extern void yang_str2ip(const char *value, struct ipaddr *addr);
 extern struct yang_data *yang_data_new_ip(const char *xpath,
                                          const struct ipaddr *addr);
 extern void yang_dnode_get_ip(struct ipaddr *addr, const struct lyd_node *dnode,
-                             const char *xpath_fmt, ...);
-extern void yang_get_default_ip(struct ipaddr *var, const char *xpath_fmt, ...);
+                             const char *xpath_fmt, ...) PRINTFRR(3, 4);
+extern void yang_get_default_ip(struct ipaddr *var, const char *xpath_fmt, ...)
+       PRINTFRR(2, 3);
 
 /* mac */
 extern struct yang_data *yang_data_new_mac(const char *xpath,
index 6a36a0b123197b7c86feeb52fb355718d8b6e68b..e08d22b2b93451ca6325b8ed3ecd2ddb5a548cdc 100644 (file)
@@ -743,7 +743,11 @@ const char *zlog_msg_text(struct zlog_msg *msg, size_t *textlen)
                fb.outpos_i = 0;
 
                va_copy(args, msg->args);
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wformat-nonliteral"
+               /* format-string checking is done further up the chain */
                need += vbprintfrr(&fb, msg->fmt, args);
+#pragma GCC diagnostic pop
                va_end(args);
 
                msg->textlen = need;
@@ -762,7 +766,11 @@ const char *zlog_msg_text(struct zlog_msg *msg, size_t *textlen)
                        fb.outpos_i = 0;
 
                        va_copy(args, msg->args);
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wformat-nonliteral"
+                       /* same as above */
                        vbprintfrr(&fb, msg->fmt, args);
+#pragma GCC diagnostic pop
                        va_end(args);
 
                        bputch(&fb, '\n');
index 1ab8b7f39bc494597c17f07c50c26f527e410ea9..137e64d12ca6ff65b5f47c733620ca9a69b36b74 100644 (file)
@@ -310,7 +310,7 @@ void iter_objfun_prefs(const struct lyd_node *dnode, const char* path,
        struct of_cb_args args = {0};
        struct of_cb_pref *p;
 
-       yang_dnode_iterate(iter_objfun_cb, &args, dnode, path);
+       yang_dnode_iterate(iter_objfun_cb, &args, dnode, "%s", path);
        for (p = args.first; p != NULL; p = p->next)
                fun(p->type, arg);
 }
index 8e3565d72d48037e31615606b2e38b4d8045a46c..6b247b705f0b450b6e07a7ff81478f507e1a45d0 100644 (file)
@@ -38,7 +38,8 @@ DEFINE_MTYPE_STATIC(PATHD, PCEPLIB_MESSAGES, "PCEPlib PCEP Messages");
 #define MAX_PATH_NAME_SIZE 255
 
 /* pceplib logging callback */
-static int pceplib_logging_cb(int level, const char *fmt, va_list args);
+static int pceplib_logging_cb(int level, const char *fmt, va_list args)
+       PRINTFRR(2, 0);
 
 /* Socket callbacks */
 static int pcep_lib_pceplib_socket_read_cb(void *fpt, void **thread, int fd,
index c9b2588b4bd66fca973edbe769f3b441d9f534a4..7afe55f125e43d077e6379b3582a7bbe3897f42f 100644 (file)
 
 #include <stdarg.h>
 #include <stdio.h>
+#include "compiler.h"
 #include "pcep_utils_logging.h"
 
 /* Forward declaration */
-int pcep_stdout_logger(int priority, const char *format, va_list args);
+int pcep_stdout_logger(int priority, const char *format, va_list args)
+       PRINTFRR(2, 0);
 
 static pcep_logger_func logger_func = pcep_stdout_logger;
 static int logging_level_ = LOG_INFO;
index 306891c0e0ea4133ad73a7fb3495adc3b8c44de1..d73ec2990d8bbb6f753bfa76938b672907b7c197 100644 (file)
@@ -4777,14 +4777,11 @@ DEFPY(ip_msdp_timers, ip_msdp_timers_cmd,
       "Connection retry period (in seconds)\n")
 {
        const char *vrfname;
-       char xpath[XPATH_MAXLEN];
 
        vrfname = pim_cli_get_vrf_name(vty);
        if (vrfname == NULL)
                return CMD_WARNING_CONFIG_FAILED;
 
-       snprintf(xpath, sizeof(xpath), FRR_PIM_MSDP_XPATH, "frr-pim:pimd",
-                "pim", vrfname, "frr-routing:ipv4");
        nb_cli_enqueue_change(vty, "./hold-time", NB_OP_MODIFY, holdtime_str);
        nb_cli_enqueue_change(vty, "./keep-alive", NB_OP_MODIFY, keepalive_str);
        if (connretry_str)
@@ -4794,8 +4791,8 @@ DEFPY(ip_msdp_timers, ip_msdp_timers_cmd,
                nb_cli_enqueue_change(vty, "./connection-retry", NB_OP_DESTROY,
                                      NULL);
 
-       nb_cli_apply_changes(vty, xpath);
-
+       nb_cli_apply_changes(vty, FRR_PIM_MSDP_XPATH, "frr-pim:pimd", "pim",
+                            vrfname, "frr-routing:ipv4");
        return CMD_SUCCESS;
 }
 
@@ -4810,20 +4807,17 @@ DEFPY(no_ip_msdp_timers, no_ip_msdp_timers_cmd,
       IGNORED_IN_NO_STR)
 {
        const char *vrfname;
-       char xpath[XPATH_MAXLEN];
 
        vrfname = pim_cli_get_vrf_name(vty);
        if (vrfname == NULL)
                return CMD_WARNING_CONFIG_FAILED;
 
-       snprintf(xpath, sizeof(xpath), FRR_PIM_MSDP_XPATH, "frr-pim:pimd",
-                "pim", vrfname, "frr-routing:ipv4");
-
        nb_cli_enqueue_change(vty, "./hold-time", NB_OP_DESTROY, NULL);
        nb_cli_enqueue_change(vty, "./keep-alive", NB_OP_DESTROY, NULL);
        nb_cli_enqueue_change(vty, "./connection-retry", NB_OP_DESTROY, NULL);
 
-       nb_cli_apply_changes(vty, xpath);
+       nb_cli_apply_changes(vty, FRR_PIM_MSDP_XPATH, "frr-pim:pimd", "pim",
+                            vrfname, "frr-routing:ipv4");
 
        return CMD_SUCCESS;
 }
index 28e4c488f389c745b65c1cb8a20fba6b6a6c9d43..d220ae082f5c0b0645039a0105a3000b641cbb23 100644 (file)
@@ -299,7 +299,7 @@ int pim_process_no_rp_kat_cmd(struct vty *vty)
                sizeof(rs_timer_xpath));
 
        /* RFC4601 */
-       v = yang_dnode_get_uint16(vty->candidate_config->dnode,
+       v = yang_dnode_get_uint16(vty->candidate_config->dnode, "%s",
                                  rs_timer_xpath);
        v = 3 * v + PIM_REGISTER_PROBE_TIME_DEFAULT;
        if (v > UINT16_MAX)
@@ -688,7 +688,7 @@ int pim_process_no_rp_plist_cmd(struct vty *vty, const char *rp_str,
                return NB_OK;
        }
 
-       plist = yang_dnode_get_string(plist_dnode, plist_xpath);
+       plist = yang_dnode_get_string(plist_dnode, "%s", plist_xpath);
        if (strcmp(prefix_list, plist)) {
                vty_out(vty, "%% Unable to find specified RP\n");
                return NB_OK;
index ff79622038d26c64cbf3bf2471444947c1d98407..c5bea755ec19c1437c52ea297e2a64d88f57d1ad 100644 (file)
@@ -377,7 +377,7 @@ static int static_route_nb_run(struct vty *vty, struct static_route_args *args)
                        }
                }
 
-               ret = nb_cli_apply_changes(vty, xpath_prefix);
+               ret = nb_cli_apply_changes(vty, "%s", xpath_prefix);
        } else {
                if (args->source)
                        snprintf(ab_xpath, sizeof(ab_xpath),
@@ -411,7 +411,7 @@ static int static_route_nb_run(struct vty *vty, struct static_route_args *args)
                yang_dnode_get_path(dnode, ab_xpath, XPATH_MAXLEN);
 
                nb_cli_enqueue_change(vty, ab_xpath, NB_OP_DESTROY, NULL);
-               ret = nb_cli_apply_changes(vty, ab_xpath);
+               ret = nb_cli_apply_changes(vty, "%s", ab_xpath);
        }
 
        return ret;
index 2f9ce81f168c86b73b71e0d2a544c38132db3557..5adc162fea273af11f00a030483cb5873bedf8d0 100644 (file)
@@ -21,7 +21,7 @@ EXTRA_DIST += \
        # end
 
 tests/isisd/test_fuzz_isis_tlv_tests.h: $(top_srcdir)/tests/isisd/test_fuzz_isis_tlv_tests.h.gz
-       @mkdir -p tests/isisd
+       @$(MKDIR_P) tests/isisd
        $(AM_V_GEN)gzip -d < $(top_srcdir)/tests/isisd/test_fuzz_isis_tlv_tests.h.gz > "$@"
 CLEANFILES += tests/isisd/test_fuzz_isis_tlv_tests.h
 
index 62b194439fb210e5cb3dd1cebd942cead409d838..1bc092a49e6185a941ef97346667e7b95dcd3d81 100644 (file)
@@ -93,7 +93,7 @@ tests_lib_cli_test_commands_LDADD = $(ALL_TESTS_LDADD)
 nodist_tests_lib_cli_test_commands_SOURCES = tests/lib/cli/test_commands_defun.c
 tests_lib_cli_test_commands_SOURCES = tests/lib/cli/test_commands.c tests/helpers/c/prng.c
 tests/lib/cli/test_commands_defun.c: vtysh/vtysh_cmd.c
-       @mkdir -p tests/lib/cli
+       @$(MKDIR_P) tests/lib/cli
        $(AM_V_GEN)sed \
                -e 's%"vtysh/vtysh\.h"%"tests/helpers/c/tests.h"%' \
                -e 's/vtysh_init_cmd/test_init_cmd/' \
index b429efe076bedf132dd7d34629318b4c234bdefc..e2ff1df9657fbda8f24bddcceda0fe79aa1ba24d 100644 (file)
@@ -1,6 +1,12 @@
 !
+debug bgp neighbor
+!
 router bgp 65001
  no bgp ebgp-requires-policy
+ bgp default show-hostname
+ bgp default show-nexthop-hostname
  neighbor 192.168.1.2 remote-as external
+ neighbor 192.168.1.2 timers 1 3
+ neighbor 192.168.1.2 timers connect 1
  neighbor 192.168.1.2 dont-capability-negotiate
 !
index 4af2cd6a80bf9ff54ac29bfded2a199d12d79c38..06e1e54b6f900225c08fa7d41b9dc134fdb9a3b8 100644 (file)
@@ -1,6 +1,8 @@
 router bgp 65002
  no bgp ebgp-requires-policy
  neighbor 192.168.1.1 remote-as external
+ neighbor 192.168.1.1 timers 1 3
+ neighbor 192.168.1.1 timers connect 1
  address-family ipv4 unicast
   redistribute connected
  exit-address-family
index 272fdd334afe301d7bc4f1489d396698490799b5..211472e57d267fd3d323b06039a99aa745e93656 100644 (file)
@@ -37,6 +37,7 @@ sys.path.append(os.path.join(CWD, "../"))
 # pylint: disable=C0413
 from lib import topotest
 from lib.topogen import Topogen, TopoRouter, get_topogen
+from lib.common_config import step
 
 pytestmark = [pytest.mark.bgpd]
 
@@ -64,32 +65,104 @@ def teardown_module(mod):
     tgen.stop_topology()
 
 
+def bgp_converge(router):
+    output = json.loads(router.vtysh_cmd("show bgp ipv4 unicast summary json"))
+    expected = {
+        "peers": {
+            "192.168.1.2": {
+                "pfxRcd": 2,
+                "pfxSnt": 2,
+                "state": "Established",
+                "peerState": "OK",
+            }
+        }
+    }
+    return topotest.json_cmp(output, expected)
+
+
 def test_bgp_dont_capability_negotiate():
     tgen = get_topogen()
 
     if tgen.routers_have_failure():
         pytest.skip(tgen.errors)
 
-    router = tgen.gears["r1"]
+    r1 = tgen.gears["r1"]
+
+    test_func = functools.partial(bgp_converge, r1)
+    _, result = topotest.run_and_expect(test_func, None, count=60, wait=0.5)
+    assert result is None, "Can't converge with dont-capability-negotiate"
+
+
+def test_bgp_check_fqdn():
+    tgen = get_topogen()
 
-    def _bgp_converge(router):
-        output = json.loads(router.vtysh_cmd("show bgp ipv4 unicast summary json"))
+    if tgen.routers_have_failure():
+        pytest.skip(tgen.errors)
+
+    r1 = tgen.gears["r1"]
+    r2 = tgen.gears["r2"]
+
+    def _bgp_check_fqdn(fqdn=None):
+        output = json.loads(r1.vtysh_cmd("show bgp ipv4 unicast 172.16.16.1/32 json"))
         expected = {
-            "peers": {
-                "192.168.1.2": {
-                    "pfxRcd": 2,
-                    "pfxSnt": 2,
-                    "state": "Established",
-                    "peerState": "OK",
+            "paths": [
+                {
+                    "nexthops": [
+                        {
+                            "hostname": fqdn,
+                        }
+                    ],
+                    "peer": {
+                        "hostname": fqdn,
+                    },
                 }
-            }
+            ]
         }
         return topotest.json_cmp(output, expected)
 
-    test_func = functools.partial(_bgp_converge, router)
-    success, result = topotest.run_and_expect(test_func, None, count=60, wait=0.5)
+    step("Enable all capabilities")
+    r1.vtysh_cmd(
+        """
+    configure terminal
+        router bgp
+            address-family ipv4 unicast
+                no neighbor 192.168.1.2 dont-capability-negotiate
+    end
+    clear bgp 192.168.1.2
+    """
+    )
+
+    step("Wait to converge")
+    test_func = functools.partial(bgp_converge, r1)
+    _, result = topotest.run_and_expect(test_func, None, count=60, wait=0.5)
+    assert result is None, "Can't converge with dont-capability-negotiate"
+
+    test_func = functools.partial(_bgp_check_fqdn, "r2")
+    _, result = topotest.run_and_expect(test_func, None, count=60, wait=0.5)
+    assert result is None, "FQDN capability enabled, but r1 can't see it"
+
+    step("Disable sending any capabilities from r2")
+    r2.vtysh_cmd(
+        """
+    configure terminal
+        router bgp
+            address-family ipv4 unicast
+                neighbor 192.168.1.1 dont-capability-negotiate
+    end
+    clear bgp 192.168.1.1
+    """
+    )
+
+    step("Wait to converge")
+    test_func = functools.partial(bgp_converge, r1)
+    _, result = topotest.run_and_expect(test_func, None, count=60, wait=0.5)
     assert result is None, "Can't converge with dont-capability-negotiate"
 
+    step("Make sure FQDN capability is reset")
+    test_func = functools.partial(_bgp_check_fqdn)
+    _, result = topotest.run_and_expect(test_func, None, count=60, wait=0.5)
+    assert result is None, "FQDN capability disabled, but we still have a hostname"
+
 
 if __name__ == "__main__":
     args = ["-s"] + sys.argv[1:]
index 61cf16944ff52e2a64be2bfa52eed588ca7baab3..7f68b4ccf3e2760faf5d4c3ae27794ad41198e26 100644 (file)
@@ -1888,15 +1888,16 @@ class Router(Node):
                 # Exclude empty string at end of list
                 for d in dmns[:-1]:
                     if re.search(r"%s" % daemon, d):
-                        daemonpid = self.cmd("cat %s" % d.rstrip()).rstrip()
+                        daemonpidfile = d.rstrip()
+                        daemonpid = self.cmd("cat %s" % daemonpidfile).rstrip()
                         if daemonpid.isdigit() and pid_exists(int(daemonpid)):
                             logger.info(
                                 "{}: killing {}".format(
                                     self.name,
-                                    os.path.basename(d.rstrip().rsplit(".", 1)[0]),
+                                    os.path.basename(daemonpidfile.rsplit(".", 1)[0]),
                                 )
                             )
-                            self.cmd("kill -9 %s" % daemonpid)
+                            os.kill(int(daemonpid), signal.SIGKILL)
                             if pid_exists(int(daemonpid)):
                                 numRunning += 1
                         while wait and numRunning > 0:
@@ -1922,12 +1923,12 @@ class Router(Node):
                                                 ),
                                             )
                                         )
-                                        self.cmd("kill -9 %s" % daemonpid)
+                                        os.kill(int(daemonpid), signal.SIGKILL)
                                     if daemonpid.isdigit() and not pid_exists(
                                         int(daemonpid)
                                     ):
                                         numRunning -= 1
-                        self.cmd("rm -- {}".format(d.rstrip()))
+                        self.cmd("rm -- {}".format(daemonpidfile))
                     if wait:
                         errors = self.checkRouterCores(reportOnce=True)
                         if self.checkRouterVersion("<", minErrorVersion):
index 80ca0c8b04b58c73c8d231ba9a8799a58506ecf1..773e83bd95504c8bab1bf45887ac7ce00906db60 100644 (file)
@@ -143,7 +143,7 @@ def teardown_module():
 
     try:
         # Stop toplogy and Remove tmp files
-        tgen.stop_topology
+        tgen.stop_topology()
 
     except OSError:
         # OSError exception is raised when mininet tries to stop switch
index a7ab29d791da88aa8c921e6644e11259ca9c6fad..f72cac4f1f797373fe27e5f7ad578907763b5975 100644 (file)
@@ -153,7 +153,7 @@ def teardown_module():
 
     try:
         # Stop toplogy and Remove tmp files
-        tgen.stop_topology
+        tgen.stop_topology()
 
     except OSError:
         # OSError exception is raised when mininet tries to stop switch
index b78fd235d76475e58e155a03a1d775c8be2ead4b..a6b993d147af8c126256a0914929729d3b9bb031 100644 (file)
@@ -153,7 +153,7 @@ def teardown_module():
 
     try:
         # Stop toplogy and Remove tmp files
-        tgen.stop_topology
+        tgen.stop_topology()
 
     except OSError:
         # OSError exception is raised when mininet tries to stop switch
index f4e366031f44bbd7e55bf167e5afdaf6a6ea70f3..0d3baeb15d02803cc1fca613d3b6342888c86e16 100644 (file)
@@ -153,7 +153,7 @@ def teardown_module():
 
     try:
         # Stop toplogy and Remove tmp files
-        tgen.stop_topology
+        tgen.stop_topology()
 
     except OSError:
         # OSError exception is raised when mininet tries to stop switch
index 72204201d9249285892ff1049d7d47e91028ec3f..a1b81f598a0e9810bd027ae448c279857545f421 100644 (file)
@@ -37,5 +37,5 @@ $(vtysh_vtysh_OBJECTS): vtysh/vtysh_daemons.h
 
 CLEANFILES += vtysh/vtysh_daemons.h
 vtysh/vtysh_daemons.h:
-       mkdir -p vtysh
+       @$(MKDIR_P) vtysh
        $(PERL) $(top_srcdir)/vtysh/daemons.pl $(vtysh_daemons) > vtysh/vtysh_daemons.h
index dea09fa151a889ad80abf880d38e26fd25df89b0..788518848378c1ac766d765501792147bf4f800b 100644 (file)
@@ -2759,6 +2759,15 @@ static char *do_prepend(struct vty *vty, struct cmd_token **argv, int argc)
        return frrstr_join(argstr, argc + off, " ");
 }
 
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wformat-nonliteral"
+/* 'headline' is a format string with a %s for the daemon name
+ *
+ * Also for some reason GCC emits the warning on the end of the function
+ * (optimization maybe?) rather than on the vty_out line, so this pragma
+ * wraps the entire function rather than just the vty_out line.
+ */
+
 static int show_per_daemon(struct vty *vty, struct cmd_token **argv, int argc,
                           const char *headline)
 {
@@ -2777,6 +2786,7 @@ static int show_per_daemon(struct vty *vty, struct cmd_token **argv, int argc,
 
        return ret;
 }
+#pragma GCC diagnostic pop
 
 static int show_one_daemon(struct vty *vty, struct cmd_token **argv, int argc,
                           const char *name)
@@ -4353,7 +4363,11 @@ char *vtysh_prompt(void)
 {
        static char buf[512];
 
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wformat-nonliteral"
+       /* prompt formatting has a %s in the cmd_node prompt string. */
        snprintf(buf, sizeof(buf), cmd_prompt(vty->node), cmd_hostname_get());
+#pragma GCC diagnostic pop
        return buf;
 }
 
index 2b0fec1b23d8dffb27bee4c1dd8396b26fd1824d..c37626ccc66ec280511d8a3e779aa77916f8e13a 100644 (file)
@@ -512,7 +512,11 @@ static int run_job(struct restart_info *restart, const char *cmdtype,
        restart->kills = 0;
        {
                char cmd[strlen(command) + strlen(restart->name) + 1];
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wformat-nonliteral"
+               /* user supplied command string has a %s for the daemon name */
                snprintf(cmd, sizeof(cmd), command, restart->name);
+#pragma GCC diagnostic pop
                if ((restart->pid = run_background(cmd)) > 0) {
                        thread_add_timer(master, restart_kill, restart,
                                         gs.restart_timeout, &restart->t_kill);
index a77a81363fa5748cad86fa7772580a25310ccd8c..c532973d7cee77f69d50e65820ab4f154ed08e62 100644 (file)
@@ -12,8 +12,10 @@ inname = sys.argv[1]
 outname = sys.argv[2]
 
 outdir = os.path.dirname(os.path.abspath(outname))
-if not os.path.isdir(outdir):
+try:
     os.makedirs(outdir)
+except FileExistsError:
+    pass
 
 # these are regexes to avoid a compile-time/host dependency on yang-tools
 # or python-yang.  Cross-compiling FRR is already somewhat involved, no need
index fb684c3ecc388e265324ad3c5b3971400ce39650..2f71a10d3d249198e244ae2c126ec1737e391678 100644 (file)
@@ -1788,9 +1788,12 @@ no_nexthops:
                        ctxnhg->nexthop != NULL ? "" : " (empty)");
 
        /* Set the flag about the dedicated fib list */
-       SET_FLAG(re->status, ROUTE_ENTRY_USE_FIB_NHG);
-       if (ctxnhg->nexthop)
-               copy_nexthops(&(re->fib_ng.nexthop), ctxnhg->nexthop, NULL);
+       if (zrouter.asic_notification_nexthop_control) {
+               SET_FLAG(re->status, ROUTE_ENTRY_USE_FIB_NHG);
+               if (ctxnhg->nexthop)
+                       copy_nexthops(&(re->fib_ng.nexthop), ctxnhg->nexthop,
+                                     NULL);
+       }
 
 check_backups: