]> git.proxmox.com Git - mirror_frr.git/blobdiff - zebra/zapi_msg.c
zebra: Allow ns delete to happen after under/over flow checks
[mirror_frr.git] / zebra / zapi_msg.c
index b9897bea038c6052cb08877fa49e805cec8be84d..9b84a6e58a5c5f0ca0f8b7edcabe41f9109dc921 100644 (file)
@@ -118,6 +118,7 @@ static void zserv_encode_vrf(struct stream *s, struct zebra_vrf *zvrf)
 
 static int zserv_encode_nexthop(struct stream *s, struct nexthop *nexthop)
 {
+       stream_putl(s, nexthop->vrf_id);
        stream_putc(s, nexthop->type);
        switch (nexthop->type) {
        case NEXTHOP_TYPE_IPV4:
@@ -247,7 +248,7 @@ int zsend_interface_link_params(struct zserv *client, struct interface *ifp)
  *      RTM_IFANNOUNCE or AF_NETLINK sockets is available), or when
  *      an interface is marked IFF_UP (i.e., an RTM_IFINFO message is
  *      received)
- *    - for the vty commands "ip address A.B.C.D/M [<secondary>|<label LINE>]"
+ *    - for the vty commands "ip address A.B.C.D/M [<label LINE>]"
  *      and "no bandwidth <1-10000000>", "ipv6 address X:X::X:X/M"
  *    - when an RTM_NEWADDR message is received from the kernel,
  *
@@ -268,7 +269,7 @@ int zsend_interface_link_params(struct zserv *client, struct interface *ifp)
  *             |
  *         vty commands:
  *     "no ip address A.B.C.D/M [label LINE]"
- *     "no ip address A.B.C.D/M secondary"
+ *     "no ip address A.B.C.D/M"
  *     ["no ipv6 address X:X::X:X/M"]
  *
  */
@@ -740,6 +741,20 @@ int zsend_route_notify_owner(struct route_entry *re, const struct prefix *p,
                                      re->table, note));
 }
 
+/*
+ * Route-owner notification using info from dataplane update context.
+ */
+int zsend_route_notify_owner_ctx(const struct zebra_dplane_ctx *ctx,
+                                enum zapi_route_notify_owner note)
+{
+       return (route_notify_internal(dplane_ctx_get_dest(ctx),
+                                     dplane_ctx_get_type(ctx),
+                                     dplane_ctx_get_instance(ctx),
+                                     dplane_ctx_get_vrf(ctx),
+                                     dplane_ctx_get_table(ctx),
+                                     note));
+}
+
 void zsend_rule_notify_owner(struct zebra_pbr_rule *rule,
                             enum zapi_rule_notify_owner note)
 {
@@ -1042,6 +1057,7 @@ static void zread_rnh_register(ZAPI_HANDLER_ARGS)
                STREAM_GETC(s, p.prefixlen);
                l += 4;
                if (p.family == AF_INET) {
+                       client->v4_nh_watch_add_cnt++;
                        if (p.prefixlen > IPV4_MAX_BITLEN) {
                                zlog_debug(
                                        "%s: Specified prefix hdr->length %d is too large for a v4 address",
@@ -1051,6 +1067,7 @@ static void zread_rnh_register(ZAPI_HANDLER_ARGS)
                        STREAM_GET(&p.u.prefix4.s_addr, s, IPV4_MAX_BYTELEN);
                        l += IPV4_MAX_BYTELEN;
                } else if (p.family == AF_INET6) {
+                       client->v6_nh_watch_add_cnt++;
                        if (p.prefixlen > IPV6_MAX_BITLEN) {
                                zlog_debug(
                                        "%s: Specified prefix hdr->length %d is to large for a v6 address",
@@ -1090,8 +1107,7 @@ static void zread_rnh_register(ZAPI_HANDLER_ARGS)
                zebra_add_rnh_client(rnh, client, type, zvrf_id(zvrf));
                /* Anything not AF_INET/INET6 has been filtered out above */
                if (!exist)
-                       zebra_evaluate_rnh(zvrf_id(zvrf), p.family, 1, type,
-                                          &p);
+                       zebra_evaluate_rnh(zvrf, p.family, 1, type, &p);
        }
 
 stream_failure:
@@ -1126,6 +1142,7 @@ static void zread_rnh_unregister(ZAPI_HANDLER_ARGS)
                STREAM_GETC(s, p.prefixlen);
                l += 4;
                if (p.family == AF_INET) {
+                       client->v4_nh_watch_rem_cnt++;
                        if (p.prefixlen > IPV4_MAX_BITLEN) {
                                zlog_debug(
                                        "%s: Specified prefix hdr->length %d is to large for a v4 address",
@@ -1135,6 +1152,7 @@ static void zread_rnh_unregister(ZAPI_HANDLER_ARGS)
                        STREAM_GET(&p.u.prefix4.s_addr, s, IPV4_MAX_BYTELEN);
                        l += IPV4_MAX_BYTELEN;
                } else if (p.family == AF_INET6) {
+                       client->v6_nh_watch_rem_cnt++;
                        if (p.prefixlen > IPV6_MAX_BITLEN) {
                                zlog_debug(
                                        "%s: Specified prefix hdr->length %d is to large for a v6 address",
@@ -2244,10 +2262,11 @@ static inline void zread_rule(ZAPI_HANDLER_ARGS)
                if (zpr.rule.filter.fwmark)
                        zpr.rule.filter.filter_bm |= PBR_FILTER_FWMARK;
 
+               zpr.vrf_id = zvrf->vrf->vrf_id;
                if (hdr->command == ZEBRA_RULE_ADD)
-                       zebra_pbr_add_rule(zvrf->zns, &zpr);
+                       zebra_pbr_add_rule(&zpr);
                else
-                       zebra_pbr_del_rule(zvrf->zns, &zpr);
+                       zebra_pbr_del_rule(&zpr);
        }
 
 stream_failure:
@@ -2273,9 +2292,9 @@ static inline void zread_ipset(ZAPI_HANDLER_ARGS)
                STREAM_GET(&zpi.ipset_name, s, ZEBRA_IPSET_NAME_SIZE);
 
                if (hdr->command == ZEBRA_IPSET_CREATE)
-                       zebra_pbr_create_ipset(zvrf->zns, &zpi);
+                       zebra_pbr_create_ipset(&zpi);
                else
-                       zebra_pbr_destroy_ipset(zvrf->zns, &zpi);
+                       zebra_pbr_destroy_ipset(&zpi);
        }
 
 stream_failure:
@@ -2328,12 +2347,12 @@ static inline void zread_ipset_entry(ZAPI_HANDLER_ARGS)
                        zpi.filter_bm |= PBR_FILTER_PROTO;
 
                /* calculate backpointer */
-               zpi.backpointer = zebra_pbr_lookup_ipset_pername(
-                       zvrf->zns, ipset.ipset_name);
+               zpi.backpointer =
+                       zebra_pbr_lookup_ipset_pername(ipset.ipset_name);
                if (hdr->command == ZEBRA_IPSET_ENTRY_ADD)
-                       zebra_pbr_add_ipset_entry(zvrf->zns, &zpi);
+                       zebra_pbr_add_ipset_entry(&zpi);
                else
-                       zebra_pbr_del_ipset_entry(zvrf->zns, &zpi);
+                       zebra_pbr_del_ipset_entry(&zpi);
        }
 
 stream_failure:
@@ -2368,9 +2387,9 @@ static inline void zread_iptable(ZAPI_HANDLER_ARGS)
        zebra_pbr_iptable_update_interfacelist(s, &zpi);
 
        if (hdr->command == ZEBRA_IPTABLE_ADD)
-               zebra_pbr_add_iptable(zvrf->zns, &zpi);
+               zebra_pbr_add_iptable(&zpi);
        else
-               zebra_pbr_del_iptable(zvrf->zns, &zpi);
+               zebra_pbr_del_iptable(&zpi);
 stream_failure:
        return;
 }
@@ -2424,6 +2443,7 @@ void (*zserv_handlers[])(ZAPI_HANDLER_ARGS) = {
        [ZEBRA_REMOTE_VTEP_DEL] = zebra_vxlan_remote_vtep_del,
        [ZEBRA_REMOTE_MACIP_ADD] = zebra_vxlan_remote_macip_add,
        [ZEBRA_REMOTE_MACIP_DEL] = zebra_vxlan_remote_macip_del,
+       [ZEBRA_DUPLICATE_ADDR_DETECTION] = zebra_vxlan_dup_addr_detection,
        [ZEBRA_INTERFACE_SET_MASTER] = zread_interface_set_master,
        [ZEBRA_PW_ADD] = zread_pseudowire,
        [ZEBRA_PW_DELETE] = zread_pseudowire,
@@ -2440,6 +2460,7 @@ void (*zserv_handlers[])(ZAPI_HANDLER_ARGS) = {
        [ZEBRA_IPSET_ENTRY_DELETE] = zread_ipset_entry,
        [ZEBRA_IPTABLE_ADD] = zread_iptable,
        [ZEBRA_IPTABLE_DELETE] = zread_iptable,
+       [ZEBRA_VXLAN_FLOOD_CONTROL] = zebra_vxlan_flood_control,
 };
 
 #if defined(HANDLE_ZAPI_FUZZING)