diff --git a/bgpd/bgp_bfd.c b/bgpd/bgp_bfd.c index b64fbee04d..b8b0053695 100644 --- a/bgpd/bgp_bfd.c +++ b/bgpd/bgp_bfd.c @@ -711,7 +711,4 @@ bgp_bfd_init(void) install_element (BGP_NODE, &no_neighbor_bfd_cmd); install_element (BGP_NODE, &no_neighbor_bfd_val_cmd); install_element (BGP_NODE, &no_neighbor_bfd_type_cmd); - - /* Send the client registration */ - bfd_client_sendmsg(zclient, ZEBRA_BFD_CLIENT_REGISTER); } diff --git a/bgpd/bgp_zebra.c b/bgpd/bgp_zebra.c index ceded236cd..4a39bc2b2e 100644 --- a/bgpd/bgp_zebra.c +++ b/bgpd/bgp_zebra.c @@ -32,6 +32,7 @@ Boston, MA 02111-1307, USA. */ #include "queue.h" #include "memory.h" #include "lib/json.h" +#include "lib/bfd.h" #include "bgpd/bgpd.h" #include "bgpd/bgp_route.h" @@ -43,7 +44,6 @@ Boston, MA 02111-1307, USA. */ #include "bgpd/bgp_mpath.h" #include "bgpd/bgp_nexthop.h" #include "bgpd/bgp_nht.h" -#include "bgpd/bgp_bfd.h" /* All information about zebra. */ struct zclient *zclient = NULL; @@ -2057,6 +2057,9 @@ bgp_zebra_connected (struct zclient *zclient) bgp_zebra_instance_register (bgp); + /* Send the client registration */ + bfd_client_sendmsg(zclient, ZEBRA_BFD_CLIENT_REGISTER); + /* TODO - What if we have peers and networks configured, do we have to * kick-start them? */ diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c index 243e800a89..05f1751e53 100644 --- a/bgpd/bgpd.c +++ b/bgpd/bgpd.c @@ -6630,9 +6630,17 @@ bgp_config_write_peer_af (struct vty *vty, struct bgp *bgp, { if (peer->afc[afi][safi]) { - afi_header_vty_out (vty, afi, safi, write, - " neighbor %s activate%s", - addr, VTY_NEWLINE); + if ((afi == AFI_IP) && (safi == SAFI_UNICAST)) + { + if (bgp_flag_check (bgp, BGP_FLAG_NO_DEFAULT_IPV4)) + { + vty_out (vty, " neighbor %s activate%s", addr, VTY_NEWLINE); + } + } + else + afi_header_vty_out (vty, afi, safi, write, + " neighbor %s activate%s", + addr, VTY_NEWLINE); } } diff --git a/configure.ac b/configure.ac index 1f7d59d3aa..5c9b2e552a 100755 --- a/configure.ac +++ b/configure.ac @@ -329,6 +329,12 @@ if test $ac_cv_lib_json_c_json_object_get = no; then AC_MSG_ERROR([lib json is needed to compile]) fi +AC_CHECK_HEADERS(json-c/json.h) +AC_CHECK_LIB(json-c, json_object_get, LIBS="$LIBS -ljson-c") +if test $ac_cv_lib_json_c_json_object_get = no; then + AC_MSG_ERROR([lib json is needed to compile]) +fi + if test x"${enable_gcc_rdynamic}" != x"no" ; then if test x"${enable_gcc_rdynamic}" = x"yes" -o x"$COMPILER" = x"GCC"; then LDFLAGS="${LDFLAGS} -rdynamic" diff --git a/debian/rules b/debian/rules index e5e3ad8c11..7a48448068 100755 --- a/debian/rules +++ b/debian/rules @@ -39,6 +39,8 @@ override_dh_auto_configure: --sysconfdir=/etc/quagga \ $(USE_SNMP) \ --enable-ospfapi=yes \ + --enable-vtysh=yes \ + --enable-isisd=yes \ --enable-multipath=256 \ --enable-user=quagga \ --enable-group=quagga \ diff --git a/ospf6d/ospf6_bfd.c b/ospf6d/ospf6_bfd.c index 503c7e0cd7..f9bb6f0031 100644 --- a/ospf6d/ospf6_bfd.c +++ b/ospf6d/ospf6_bfd.c @@ -420,7 +420,4 @@ ospf6_bfd_init(void) install_element (INTERFACE_NODE, &ipv6_ospf6_bfd_cmd); install_element (INTERFACE_NODE, &ipv6_ospf6_bfd_param_cmd); install_element (INTERFACE_NODE, &no_ipv6_ospf6_bfd_cmd); - - /* Send the client registration */ - bfd_client_sendmsg(zclient, ZEBRA_BFD_CLIENT_REGISTER); } diff --git a/ospf6d/ospf6_zebra.c b/ospf6d/ospf6_zebra.c index 93ec1f2ce0..0395b082da 100644 --- a/ospf6d/ospf6_zebra.c +++ b/ospf6d/ospf6_zebra.c @@ -28,6 +28,7 @@ #include "stream.h" #include "zclient.h" #include "memory.h" +#include "lib/bfd.h" #include "ospf6_proto.h" #include "ospf6_top.h" @@ -656,6 +657,9 @@ DEFUN (no_redistribute_ospf6, static void ospf6_zebra_connected (struct zclient *zclient) { + /* Send the client registration */ + bfd_client_sendmsg(zclient, ZEBRA_BFD_CLIENT_REGISTER); + zclient_send_reg_requests (zclient, VRF_DEFAULT); } diff --git a/ospfd/ospf_bfd.c b/ospfd/ospf_bfd.c index ec486c4688..c87bcb0afb 100644 --- a/ospfd/ospf_bfd.c +++ b/ospfd/ospf_bfd.c @@ -452,7 +452,4 @@ ospf_bfd_init(void) install_element (INTERFACE_NODE, &ip_ospf_bfd_param_cmd); install_element (INTERFACE_NODE, &no_ip_ospf_bfd_cmd); install_element (INTERFACE_NODE, &no_ip_ospf_bfd_param_cmd); - - /* Send the client registration */ - bfd_client_sendmsg(zclient, ZEBRA_BFD_CLIENT_REGISTER); } diff --git a/ospfd/ospf_zebra.c b/ospfd/ospf_zebra.c index c7bf38eb68..f945a4acb7 100644 --- a/ospfd/ospf_zebra.c +++ b/ospfd/ospf_zebra.c @@ -34,6 +34,7 @@ #include "filter.h" #include "plist.h" #include "log.h" +#include "lib/bfd.h" #include "ospfd/ospfd.h" #include "ospfd/ospf_interface.h" @@ -1558,6 +1559,9 @@ ospf_distance_apply (struct prefix_ipv4 *p, struct ospf_route *or) static void ospf_zebra_connected (struct zclient *zclient) { + /* Send the client registration */ + bfd_client_sendmsg(zclient, ZEBRA_BFD_CLIENT_REGISTER); + zclient_send_reg_requests (zclient, VRF_DEFAULT); } diff --git a/redhat/quagga.spec.in b/redhat/quagga.spec.in index c1d5f00167..9ff65e9a22 100644 --- a/redhat/quagga.spec.in +++ b/redhat/quagga.spec.in @@ -71,7 +71,6 @@ %define daemon_list zebra ripd ospfd bgpd isisd pimd ripngd ospfd6d - %if %{with_watchquagga} %define daemon_watchquagga watchquagga %else @@ -220,6 +219,7 @@ developing OSPF-API and quagga applications. --disable-watchquagga \ %endif --enable-gcc-rdynamic \ + --enable-isisd=yes \ --enable-systemd=yes \ --enable-poll=yes diff --git a/tools/quagga-reload.py b/tools/quagga-reload.py index 9c0cbb48d6..9650822d1e 100755 --- a/tools/quagga-reload.py +++ b/tools/quagga-reload.py @@ -624,13 +624,14 @@ if __name__ == '__main__': group.add_argument('--reload', action='store_true', help='Apply the deltas', default=False) group.add_argument('--test', action='store_true', help='Show the deltas', default=False) parser.add_argument('--debug', action='store_true', help='Enable debugs', default=False) + parser.add_argument('--stdout', action='store_true', help='Log to STDOUT', default=False) parser.add_argument('filename', help='Location of new quagga config file') args = parser.parse_args() # Logging # For --test log to stdout # For --reload log to /var/log/quagga/quagga-reload.log - if args.test: + if args.test or args.stdout: logging.basicConfig(level=logging.INFO, format='%(asctime)s %(levelname)5s: %(message)s') elif args.reload: diff --git a/zebra/zebra_ptm.c b/zebra/zebra_ptm.c index bf6afb0216..931fc73e43 100644 --- a/zebra/zebra_ptm.c +++ b/zebra/zebra_ptm.c @@ -131,11 +131,13 @@ zebra_ptm_init (void) void zebra_ptm_finish(void) { - if (ptm_cb.ptm_sock != -1) - close(ptm_cb.ptm_sock); + int proto; - if (ptm_cb.wb) - buffer_free(ptm_cb.wb); + for (proto = 0; proto < ZEBRA_ROUTE_MAX; proto++) + if (CHECK_FLAG(ptm_cb.client_flags[proto], ZEBRA_PTM_BFD_CLIENT_FLAG_REG)) + zebra_ptm_bfd_client_deregister(proto); + + buffer_flush_all(ptm_cb.wb, ptm_cb.ptm_sock); if (ptm_cb.out_data) free(ptm_cb.out_data); @@ -150,6 +152,12 @@ zebra_ptm_finish(void) thread_cancel (ptm_cb.t_write); if (ptm_cb.t_timer) thread_cancel (ptm_cb.t_timer); + + if (ptm_cb.wb) + buffer_free(ptm_cb.wb); + + if (ptm_cb.ptm_sock != -1) + close(ptm_cb.ptm_sock); } static int @@ -999,24 +1007,26 @@ zebra_ptm_bfd_client_register (struct zserv *client, int sock, u_short length) zlog_debug ("%s: Sent message (%d) %s", __func__, data_len, ptm_cb.out_data); zebra_ptm_send_message(ptm_cb.out_data, data_len); + + SET_FLAG(ptm_cb.client_flags[client->proto], ZEBRA_PTM_BFD_CLIENT_FLAG_REG); return 0; } /* BFD client deregister */ void -zebra_ptm_bfd_client_deregister (struct zserv *client) +zebra_ptm_bfd_client_deregister (int proto) { void *out_ctxt; char tmp_buf[64]; int data_len = ZEBRA_PTM_SEND_MAX_SOCKBUF; - if (client->proto != ZEBRA_ROUTE_OSPF && client->proto != ZEBRA_ROUTE_BGP - && client->proto != ZEBRA_ROUTE_OSPF6) + if (proto != ZEBRA_ROUTE_OSPF && proto != ZEBRA_ROUTE_BGP + && proto != ZEBRA_ROUTE_OSPF6) return; if (IS_ZEBRA_DEBUG_EVENT) - zlog_debug("bfd_client_deregister msg for client %s", - zebra_route_string(client->proto)); + zlog_err("bfd_client_deregister msg for client %s", + zebra_route_string(proto)); if (ptm_cb.ptm_sock == -1) { @@ -1030,7 +1040,7 @@ zebra_ptm_bfd_client_deregister (struct zserv *client) sprintf(tmp_buf, "%s", ZEBRA_PTM_BFD_CLIENT_DEREG_CMD); ptm_lib_append_msg(ptm_hdl, out_ctxt, ZEBRA_PTM_CMD_STR, tmp_buf); - sprintf(tmp_buf, "%s", zebra_route_string(client->proto)); + sprintf(tmp_buf, "%s", zebra_route_string(proto)); ptm_lib_append_msg(ptm_hdl, out_ctxt, ZEBRA_PTM_BFD_CLIENT_FIELD, tmp_buf); @@ -1039,7 +1049,9 @@ zebra_ptm_bfd_client_deregister (struct zserv *client) if (IS_ZEBRA_DEBUG_SEND) zlog_debug ("%s: Sent message (%d) %s", __func__, data_len, ptm_cb.out_data); + zebra_ptm_send_message(ptm_cb.out_data, data_len); + UNSET_FLAG(ptm_cb.client_flags[proto], ZEBRA_PTM_BFD_CLIENT_FLAG_REG); } int diff --git a/zebra/zebra_ptm.h b/zebra/zebra_ptm.h index 27c0e42f99..71c85d9094 100644 --- a/zebra/zebra_ptm.h +++ b/zebra/zebra_ptm.h @@ -27,6 +27,8 @@ extern const char ZEBRA_PTM_SOCK_NAME[]; #define ZEBRA_PTM_MAX_SOCKBUF 3200 /* 25B *128 ports */ #define ZEBRA_PTM_SEND_MAX_SOCKBUF 512 +#define ZEBRA_PTM_BFD_CLIENT_FLAG_REG (1 << 1) /* client registered with BFD */ + /* Zebra ptm context block */ struct zebra_ptm_cb { @@ -44,6 +46,7 @@ struct zebra_ptm_cb int ptm_enable; int pid; + u_int8_t client_flags[ZEBRA_ROUTE_MAX]; }; #define ZEBRA_PTM_STATUS_DOWN 0 @@ -72,5 +75,5 @@ int zebra_ptm_bfd_client_register (struct zserv *client, int sock, void zebra_ptm_if_init(struct zebra_if *zebra_ifp); void zebra_ptm_if_set_ptm_state(struct interface *ifp, struct zebra_if *zebra_ifp); void zebra_ptm_if_write (struct vty *vty, struct zebra_if *zebra_ifp); -void zebra_ptm_bfd_client_deregister (struct zserv *client); +void zebra_ptm_bfd_client_deregister (int proto); #endif diff --git a/zebra/zserv.c b/zebra/zserv.c index daecaf5e10..886cd1b395 100644 --- a/zebra/zserv.c +++ b/zebra/zserv.c @@ -1832,7 +1832,7 @@ static void zebra_client_close (struct zserv *client) { /* Send client de-registration to BFD */ - zebra_ptm_bfd_client_deregister(client); + zebra_ptm_bfd_client_deregister(client->proto); /* Cleanup any registered nexthops - across all VRFs. */ zebra_client_close_cleanup_rnh (client);