]> 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 651babdebac59b82483c5aa67a959d9c330f447c..4d0e34561a5a8854abc889fca35eb41cc3071951 100644 (file)
@@ -41,6 +41,7 @@
 #include "lib/vrf.h"
 #include "lib/libfrr.h"
 #include "lib/sockopt.h"
+#include "lib/lib_errors.h"
 
 #include "zebra/zebra_router.h"
 #include "zebra/rib.h"
@@ -64,6 +65,7 @@
 #include "zebra/zapi_msg.h"
 #include "zebra/zebra_errors.h"
 #include "zebra/zebra_mlag.h"
+#include "zebra/connected.h"
 
 /* Encoding helpers -------------------------------------------------------- */
 
@@ -1416,8 +1418,9 @@ static void zread_route_add(ZAPI_HANDLER_ARGS)
        struct nexthop *nexthop = NULL;
        struct nexthop_group *ng = NULL;
        int i, ret;
-       vrf_id_t vrf_id = 0;
+       vrf_id_t vrf_id;
        struct ipaddr vtep_ip;
+       struct interface *ifp;
 
        s = msg;
        if (zapi_route_decode(s, &api) < 0) {
@@ -1472,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);
 
@@ -1510,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.
                         */
@@ -1612,6 +1620,14 @@ static void zread_route_add(ZAPI_HANDLER_ARGS)
        if (CHECK_FLAG(api.message, ZAPI_MESSAGE_SRCPFX))
                src_p = &api.src_prefix;
 
+       if (api.safi != SAFI_UNICAST && api.safi != SAFI_MULTICAST) {
+               flog_warn(EC_LIB_ZAPI_MISSMATCH,
+                         "%s: Received safi: %d but we can only accept UNICAST or MULTICAST",
+                         __func__, api.safi);
+               nexthop_group_delete(&ng);
+               XFREE(MTYPE_RE, re);
+               return;
+       }
        ret = rib_add_multipath(afi, api.safi, &api.prefix, src_p, re, ng);
 
        /* Stats */
@@ -1759,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:
@@ -2263,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
@@ -2382,14 +2406,19 @@ static inline void zread_rule(ZAPI_HANDLER_ARGS)
 
                if (!(zpr.rule.filter.src_ip.family == AF_INET
                      || zpr.rule.filter.src_ip.family == AF_INET6)) {
-                       zlog_warn("Unsupported PBR source IP family: %s\n",
-                                 family2str(zpr.rule.filter.src_ip.family));
+                       zlog_warn(
+                               "Unsupported PBR source IP family: %s (%" PRIu8
+                               ")\n",
+                               family2str(zpr.rule.filter.src_ip.family),
+                               zpr.rule.filter.src_ip.family);
                        return;
                }
                if (!(zpr.rule.filter.dst_ip.family == AF_INET
                      || zpr.rule.filter.dst_ip.family == AF_INET6)) {
-                       zlog_warn("Unsupported PBR dest IP family: %s\n",
-                                 family2str(zpr.rule.filter.dst_ip.family));
+                       zlog_warn("Unsupported PBR IP family: %s (%" PRIu8
+                                 ")\n",
+                                 family2str(zpr.rule.filter.dst_ip.family),
+                                 zpr.rule.filter.dst_ip.family);
                        return;
                }
 
@@ -2557,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) = {
@@ -2641,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)