summaryrefslogtreecommitdiff
path: root/zebra
diff options
context:
space:
mode:
Diffstat (limited to 'zebra')
-rw-r--r--zebra/if_netlink.c8
-rw-r--r--zebra/interface.c6
-rw-r--r--zebra/zebra_dplane.c30
-rw-r--r--zebra/zebra_dplane.h4
-rw-r--r--zebra/zebra_l2.c3
5 files changed, 48 insertions, 3 deletions
diff --git a/zebra/if_netlink.c b/zebra/if_netlink.c
index 8767b2622c..ca0a354afd 100644
--- a/zebra/if_netlink.c
+++ b/zebra/if_netlink.c
@@ -635,8 +635,10 @@ static int netlink_bridge_vxlan_update(struct zebra_dplane_ctx *ctx,
struct bridge_vlan_info *vinfo;
struct zebra_dplane_bridge_vlan_info bvinfo;
- if (!af_spec)
+ if (!af_spec) {
+ dplane_ctx_set_ifp_no_afspec(ctx);
return 0;
+ }
netlink_bridge_vxlan_vlan_vni_map_update(ctx, af_spec);
@@ -644,8 +646,10 @@ static int netlink_bridge_vxlan_update(struct zebra_dplane_ctx *ctx,
* only 1 access VLAN is accepted.
*/
netlink_parse_rtattr_nested(aftb, IFLA_BRIDGE_MAX, af_spec);
- if (!aftb[IFLA_BRIDGE_VLAN_INFO])
+ if (!aftb[IFLA_BRIDGE_VLAN_INFO]) {
+ dplane_ctx_set_ifp_no_bridge_vlan_info(ctx);
return 0;
+ }
vinfo = RTA_DATA(aftb[IFLA_BRIDGE_VLAN_INFO]);
bvinfo.flags = vinfo->flags;
diff --git a/zebra/interface.c b/zebra/interface.c
index 10839e2106..90787f3aa0 100644
--- a/zebra/interface.c
+++ b/zebra/interface.c
@@ -1853,9 +1853,15 @@ static void interface_bridge_vxlan_update(struct zebra_dplane_ctx *ctx,
struct zebra_if *zif = ifp->info;
const struct zebra_dplane_bridge_vlan_info *bvinfo;
+ if (dplane_ctx_get_ifp_no_afspec(ctx))
+ return;
+
if (IS_ZEBRA_VXLAN_IF_SVD(zif))
interface_bridge_vxlan_vlan_vni_map_update(ctx, ifp);
+ if (dplane_ctx_get_ifp_no_bridge_vlan_info(ctx))
+ return;
+
bvinfo = dplane_ctx_get_ifp_bridge_vlan_info(ctx);
if (!(bvinfo->flags & DPLANE_BRIDGE_VLAN_INFO_PVID))
diff --git a/zebra/zebra_dplane.c b/zebra/zebra_dplane.c
index e527d93610..7b2f643080 100644
--- a/zebra/zebra_dplane.c
+++ b/zebra/zebra_dplane.c
@@ -197,6 +197,8 @@ struct dplane_intf_info {
bool startup;
uint8_t family;
struct zebra_vxlan_vni_array *vniarray;
+ bool no_bvinfo_avail;
+ bool no_afspec_avail;
struct zebra_dplane_bridge_vlan_info bvinfo;
struct zebra_dplane_bridge_vlan_info_array *bvarray;
@@ -1355,6 +1357,34 @@ dplane_ctx_get_ifp_vxlan_vni_array(const struct zebra_dplane_ctx *ctx)
return ctx->u.intf.vniarray;
}
+void dplane_ctx_set_ifp_no_afspec(struct zebra_dplane_ctx *ctx)
+{
+ DPLANE_CTX_VALID(ctx);
+
+ ctx->u.intf.no_afspec_avail = true;
+}
+
+bool dplane_ctx_get_ifp_no_afspec(const struct zebra_dplane_ctx *ctx)
+{
+ DPLANE_CTX_VALID(ctx);
+
+ return ctx->u.intf.no_afspec_avail;
+}
+
+void dplane_ctx_set_ifp_no_bridge_vlan_info(struct zebra_dplane_ctx *ctx)
+{
+ DPLANE_CTX_VALID(ctx);
+
+ ctx->u.intf.no_bvinfo_avail = true;
+}
+
+bool dplane_ctx_get_ifp_no_bridge_vlan_info(struct zebra_dplane_ctx *ctx)
+{
+ DPLANE_CTX_VALID(ctx);
+
+ return ctx->u.intf.no_bvinfo_avail;
+}
+
void dplane_ctx_set_ifp_bridge_vlan_info(
struct zebra_dplane_ctx *ctx,
struct zebra_dplane_bridge_vlan_info *bvinfo)
diff --git a/zebra/zebra_dplane.h b/zebra/zebra_dplane.h
index 79248a4ae4..c006522e01 100644
--- a/zebra/zebra_dplane.h
+++ b/zebra/zebra_dplane.h
@@ -429,6 +429,10 @@ struct zebra_dplane_bridge_vlan_info {
uint16_t flags;
uint16_t vid;
};
+void dplane_ctx_set_ifp_no_afspec(struct zebra_dplane_ctx *ctx);
+bool dplane_ctx_get_ifp_no_afspec(const struct zebra_dplane_ctx *ctx);
+void dplane_ctx_set_ifp_no_bridge_vlan_info(struct zebra_dplane_ctx *ctx);
+bool dplane_ctx_get_ifp_no_bridge_vlan_info(struct zebra_dplane_ctx *ctx);
void dplane_ctx_set_ifp_bridge_vlan_info(
struct zebra_dplane_ctx *ctx,
struct zebra_dplane_bridge_vlan_info *bvinfo);
diff --git a/zebra/zebra_l2.c b/zebra/zebra_l2.c
index 39c1319f31..4f7a1cd4ce 100644
--- a/zebra/zebra_l2.c
+++ b/zebra/zebra_l2.c
@@ -383,7 +383,8 @@ void zebra_l2_vxlanif_update_access_vlan(struct interface *ifp,
assert(zif);
/* This would be called only in non svd case */
- assert(IS_ZEBRA_VXLAN_IF_VNI(zif));
+ if (!IS_ZEBRA_VXLAN_IF_VNI(zif))
+ return;
old_access_vlan = zif->l2info.vxl.vni_info.vni.access_vlan;
;