]> git.proxmox.com Git - mirror_frr.git/blobdiff - zebra/zapi_msg.c
Merge pull request #5789 from donaldsharp/bgp_ebgp_reason
[mirror_frr.git] / zebra / zapi_msg.c
index db54e6f25bda278d7014dfb8ea81857bf6a8cdfc..4d0e34561a5a8854abc889fca35eb41cc3071951 100644 (file)
@@ -65,6 +65,7 @@
 #include "zebra/zapi_msg.h"
 #include "zebra/zebra_errors.h"
 #include "zebra/zebra_mlag.h"
+#include "zebra/connected.h"
 
 /* Encoding helpers -------------------------------------------------------- */
 
@@ -1419,6 +1420,7 @@ static void zread_route_add(ZAPI_HANDLER_ARGS)
        int i, ret;
        vrf_id_t vrf_id;
        struct ipaddr vtep_ip;
+       struct interface *ifp;
 
        s = msg;
        if (zapi_route_decode(s, &api) < 0) {
@@ -1473,6 +1475,8 @@ static void zread_route_add(ZAPI_HANDLER_ARGS)
                api_nh = &api.nexthops[i];
                ifindex_t ifindex = 0;
 
+               nexthop = NULL;
+
                if (IS_ZEBRA_DEBUG_RECV)
                        zlog_debug("nh type %d", api_nh->type);
 
@@ -1511,6 +1515,9 @@ static void zread_route_add(ZAPI_HANDLER_ARGS)
                                &api_nh->gate.ipv4, NULL, ifindex,
                                api_nh->vrf_id);
 
+                       ifp = if_lookup_by_index(ifindex, api_nh->vrf_id);
+                       if (ifp && connected_is_unnumbered(ifp))
+                               SET_FLAG(nexthop->flags, NEXTHOP_FLAG_ONLINK);
                        /* Special handling for IPv4 routes sourced from EVPN:
                         * the nexthop and associated MAC need to be installed.
                         */
@@ -1768,6 +1775,8 @@ static void zread_hello(ZAPI_HANDLER_ARGS)
                client->instance = instance;
        }
 
+       /* Graceful restart processing for client connect */
+       zebra_gr_client_reconnect(client);
        zsend_capabilities(client, zvrf);
        zebra_vrf_update_all(client);
 stream_failure:
@@ -2272,6 +2281,12 @@ static void zread_vrf_label(ZAPI_HANDLER_ARGS)
        s = msg;
        STREAM_GETL(s, nlabel);
        STREAM_GETC(s, afi);
+
+       if (!(IS_VALID_AFI(afi))) {
+               zlog_warn("Invalid AFI for VRF label: %u", afi);
+               return;
+       }
+
        if (nlabel == zvrf->label[afi]) {
                /*
                 * Nothing to do here move along
@@ -2571,14 +2586,14 @@ static void zserv_error_no_vrf(ZAPI_HANDLER_ARGS)
                zlog_debug("ZAPI message specifies unknown VRF: %d",
                           hdr->vrf_id);
 
-       return zsend_error_msg(client, ZEBRA_NO_VRF, hdr);
+       zsend_error_msg(client, ZEBRA_NO_VRF, hdr);
 }
 
 static void zserv_error_invalid_msg_type(ZAPI_HANDLER_ARGS)
 {
        zlog_info("Zebra received unknown command %d", hdr->command);
 
-       return zsend_error_msg(client, ZEBRA_INVALID_MSG_TYPE, hdr);
+       zsend_error_msg(client, ZEBRA_INVALID_MSG_TYPE, hdr);
 }
 
 void (*const zserv_handlers[])(ZAPI_HANDLER_ARGS) = {
@@ -2655,6 +2670,7 @@ void (*const zserv_handlers[])(ZAPI_HANDLER_ARGS) = {
        [ZEBRA_MLAG_CLIENT_REGISTER] = zebra_mlag_client_register,
        [ZEBRA_MLAG_CLIENT_UNREGISTER] = zebra_mlag_client_unregister,
        [ZEBRA_MLAG_FORWARD_MSG] = zebra_mlag_forward_client_msg,
+       [ZEBRA_CLIENT_CAPABILITIES] = zread_client_capabilities
 };
 
 #if defined(HANDLE_ZAPI_FUZZING)