summaryrefslogtreecommitdiff
path: root/zebra/zebra_dplane.c
diff options
context:
space:
mode:
Diffstat (limited to 'zebra/zebra_dplane.c')
-rw-r--r--zebra/zebra_dplane.c231
1 files changed, 113 insertions, 118 deletions
diff --git a/zebra/zebra_dplane.c b/zebra/zebra_dplane.c
index 00e990e856..88c1a04938 100644
--- a/zebra/zebra_dplane.c
+++ b/zebra/zebra_dplane.c
@@ -35,6 +35,8 @@ DEFINE_MTYPE_STATIC(ZEBRA, DP_PROV, "Zebra DPlane Provider");
DEFINE_MTYPE_STATIC(ZEBRA, DP_NETFILTER, "Zebra Netfilter Internal Object");
DEFINE_MTYPE_STATIC(ZEBRA, DP_NS, "DPlane NSes");
+DEFINE_MTYPE(ZEBRA, VLAN_CHANGE_ARR, "Vlan Change Array");
+
#ifndef AOK
# define AOK 0
#endif
@@ -371,6 +373,14 @@ struct dplane_srv6_encap_ctx {
};
/*
+ * VLAN info for the dataplane
+ */
+struct dplane_vlan_info {
+ ifindex_t ifindex;
+ struct zebra_vxlan_vlan_array *vlan_array;
+};
+
+/*
* The context block used to exchange info about route updates across
* the boundary between the zebra main context (and pthread) and the
* dataplane layer (and pthread).
@@ -416,6 +426,7 @@ struct zebra_dplane_ctx {
struct dplane_pw_info pw;
struct dplane_br_port_info br_port;
struct dplane_intf_info intf;
+ struct dplane_vlan_info vlan_info;
struct dplane_mac_info macinfo;
struct dplane_neigh_info neigh;
struct dplane_rule_info rule;
@@ -885,6 +896,11 @@ static void dplane_ctx_free_internal(struct zebra_dplane_ctx *ctx)
case DPLANE_OP_STARTUP_STAGE:
case DPLANE_OP_SRV6_ENCAP_SRCADDR_SET:
break;
+ case DPLANE_OP_VLAN_INSTALL:
+ if (ctx->u.vlan_info.vlan_array)
+ XFREE(MTYPE_VLAN_CHANGE_ARR,
+ ctx->u.vlan_info.vlan_array);
+ break;
}
}
@@ -1030,144 +1046,102 @@ enum dplane_op_e dplane_ctx_get_op(const struct zebra_dplane_ctx *ctx)
const char *dplane_op2str(enum dplane_op_e op)
{
- const char *ret = "UNKNOWN";
-
switch (op) {
case DPLANE_OP_NONE:
- ret = "NONE";
- break;
+ return "NONE";
/* Route update */
case DPLANE_OP_ROUTE_INSTALL:
- ret = "ROUTE_INSTALL";
- break;
+ return "ROUTE_INSTALL";
case DPLANE_OP_ROUTE_UPDATE:
- ret = "ROUTE_UPDATE";
- break;
+ return "ROUTE_UPDATE";
case DPLANE_OP_ROUTE_DELETE:
- ret = "ROUTE_DELETE";
- break;
+ return "ROUTE_DELETE";
case DPLANE_OP_ROUTE_NOTIFY:
- ret = "ROUTE_NOTIFY";
- break;
+ return "ROUTE_NOTIFY";
/* Nexthop update */
case DPLANE_OP_NH_INSTALL:
- ret = "NH_INSTALL";
- break;
+ return "NH_INSTALL";
case DPLANE_OP_NH_UPDATE:
- ret = "NH_UPDATE";
- break;
+ return "NH_UPDATE";
case DPLANE_OP_NH_DELETE:
- ret = "NH_DELETE";
- break;
+ return "NH_DELETE";
case DPLANE_OP_LSP_INSTALL:
- ret = "LSP_INSTALL";
- break;
+ return "LSP_INSTALL";
case DPLANE_OP_LSP_UPDATE:
- ret = "LSP_UPDATE";
- break;
+ return "LSP_UPDATE";
case DPLANE_OP_LSP_DELETE:
- ret = "LSP_DELETE";
- break;
+ return "LSP_DELETE";
case DPLANE_OP_LSP_NOTIFY:
- ret = "LSP_NOTIFY";
- break;
+ return "LSP_NOTIFY";
case DPLANE_OP_PW_INSTALL:
- ret = "PW_INSTALL";
- break;
+ return "PW_INSTALL";
case DPLANE_OP_PW_UNINSTALL:
- ret = "PW_UNINSTALL";
- break;
+ return "PW_UNINSTALL";
case DPLANE_OP_SYS_ROUTE_ADD:
- ret = "SYS_ROUTE_ADD";
- break;
+ return "SYS_ROUTE_ADD";
case DPLANE_OP_SYS_ROUTE_DELETE:
- ret = "SYS_ROUTE_DEL";
- break;
+ return "SYS_ROUTE_DEL";
case DPLANE_OP_BR_PORT_UPDATE:
- ret = "BR_PORT_UPDATE";
- break;
+ return "BR_PORT_UPDATE";
case DPLANE_OP_ADDR_INSTALL:
- ret = "ADDR_INSTALL";
- break;
+ return "ADDR_INSTALL";
case DPLANE_OP_ADDR_UNINSTALL:
- ret = "ADDR_UNINSTALL";
- break;
+ return "ADDR_UNINSTALL";
case DPLANE_OP_MAC_INSTALL:
- ret = "MAC_INSTALL";
- break;
+ return "MAC_INSTALL";
case DPLANE_OP_MAC_DELETE:
- ret = "MAC_DELETE";
- break;
+ return "MAC_DELETE";
case DPLANE_OP_NEIGH_INSTALL:
- ret = "NEIGH_INSTALL";
- break;
+ return "NEIGH_INSTALL";
case DPLANE_OP_NEIGH_UPDATE:
- ret = "NEIGH_UPDATE";
- break;
+ return "NEIGH_UPDATE";
case DPLANE_OP_NEIGH_DELETE:
- ret = "NEIGH_DELETE";
- break;
+ return "NEIGH_DELETE";
case DPLANE_OP_VTEP_ADD:
- ret = "VTEP_ADD";
- break;
+ return "VTEP_ADD";
case DPLANE_OP_VTEP_DELETE:
- ret = "VTEP_DELETE";
- break;
+ return "VTEP_DELETE";
case DPLANE_OP_RULE_ADD:
- ret = "RULE_ADD";
- break;
+ return "RULE_ADD";
case DPLANE_OP_RULE_DELETE:
- ret = "RULE_DELETE";
- break;
+ return "RULE_DELETE";
case DPLANE_OP_RULE_UPDATE:
- ret = "RULE_UPDATE";
- break;
+ return "RULE_UPDATE";
case DPLANE_OP_NEIGH_DISCOVER:
- ret = "NEIGH_DISCOVER";
- break;
+ return "NEIGH_DISCOVER";
case DPLANE_OP_IPTABLE_ADD:
- ret = "IPTABLE_ADD";
- break;
+ return "IPTABLE_ADD";
case DPLANE_OP_IPTABLE_DELETE:
- ret = "IPTABLE_DELETE";
- break;
+ return "IPTABLE_DELETE";
case DPLANE_OP_IPSET_ADD:
- ret = "IPSET_ADD";
- break;
+ return "IPSET_ADD";
case DPLANE_OP_IPSET_DELETE:
- ret = "IPSET_DELETE";
- break;
+ return "IPSET_DELETE";
case DPLANE_OP_IPSET_ENTRY_ADD:
- ret = "IPSET_ENTRY_ADD";
- break;
+ return "IPSET_ENTRY_ADD";
case DPLANE_OP_IPSET_ENTRY_DELETE:
- ret = "IPSET_ENTRY_DELETE";
- break;
+ return "IPSET_ENTRY_DELETE";
case DPLANE_OP_NEIGH_IP_INSTALL:
- ret = "NEIGH_IP_INSTALL";
- break;
+ return "NEIGH_IP_INSTALL";
case DPLANE_OP_NEIGH_IP_DELETE:
- ret = "NEIGH_IP_DELETE";
- break;
+ return "NEIGH_IP_DELETE";
case DPLANE_OP_NEIGH_TABLE_UPDATE:
- ret = "NEIGH_TABLE_UPDATE";
- break;
+ return "NEIGH_TABLE_UPDATE";
case DPLANE_OP_GRE_SET:
- ret = "GRE_SET";
- break;
+ return "GRE_SET";
case DPLANE_OP_INTF_ADDR_ADD:
return "INTF_ADDR_ADD";
@@ -1179,68 +1153,53 @@ const char *dplane_op2str(enum dplane_op_e op)
return "INTF_NETCONFIG";
case DPLANE_OP_INTF_INSTALL:
- ret = "INTF_INSTALL";
- break;
+ return "INTF_INSTALL";
case DPLANE_OP_INTF_UPDATE:
- ret = "INTF_UPDATE";
- break;
+ return "INTF_UPDATE";
case DPLANE_OP_INTF_DELETE:
- ret = "INTF_DELETE";
- break;
+ return "INTF_DELETE";
case DPLANE_OP_TC_QDISC_INSTALL:
- ret = "TC_QDISC_INSTALL";
- break;
+ return "TC_QDISC_INSTALL";
case DPLANE_OP_TC_QDISC_UNINSTALL:
- ret = "TC_QDISC_UNINSTALL";
- break;
+ return "TC_QDISC_UNINSTALL";
case DPLANE_OP_TC_CLASS_ADD:
- ret = "TC_CLASS_ADD";
- break;
+ return "TC_CLASS_ADD";
case DPLANE_OP_TC_CLASS_DELETE:
- ret = "TC_CLASS_DELETE";
- break;
+ return "TC_CLASS_DELETE";
case DPLANE_OP_TC_CLASS_UPDATE:
- ret = "TC_CLASS_UPDATE";
- break;
+ return "TC_CLASS_UPDATE";
case DPLANE_OP_TC_FILTER_ADD:
- ret = "TC_FILTER_ADD";
- break;
+ return "TC_FILTER_ADD";
case DPLANE_OP_TC_FILTER_DELETE:
- ret = "TC_FILTER_DELETE";
- break;
+ return "TC_FILTER_DELETE";
case DPLANE_OP_TC_FILTER_UPDATE:
- ret = "TC__FILTER_UPDATE";
- break;
+ return "TC__FILTER_UPDATE";
case DPLANE_OP_STARTUP_STAGE:
- ret = "STARTUP_STAGE";
- break;
+ return "STARTUP_STAGE";
case DPLANE_OP_SRV6_ENCAP_SRCADDR_SET:
- ret = "SRV6_ENCAP_SRCADDR_SET";
- break;
+ return "SRV6_ENCAP_SRCADDR_SET";
+
+ case DPLANE_OP_VLAN_INSTALL:
+ return "NEW_VLAN";
}
- return ret;
+ return "UNKNOWN";
}
const char *dplane_res2str(enum zebra_dplane_result res)
{
- const char *ret = "<Unknown>";
-
switch (res) {
case ZEBRA_DPLANE_REQUEST_FAILURE:
- ret = "FAILURE";
- break;
+ return "FAILURE";
case ZEBRA_DPLANE_REQUEST_QUEUED:
- ret = "QUEUED";
- break;
+ return "QUEUED";
case ZEBRA_DPLANE_REQUEST_SUCCESS:
- ret = "SUCCESS";
- break;
+ return "SUCCESS";
}
- return ret;
+ return "<Unknown>";
}
void dplane_ctx_set_dest(struct zebra_dplane_ctx *ctx,
@@ -3321,6 +3280,35 @@ uint32_t dplane_get_in_queue_len(void)
memory_order_seq_cst);
}
+void dplane_ctx_set_vlan_ifindex(struct zebra_dplane_ctx *ctx, ifindex_t ifindex)
+{
+ DPLANE_CTX_VALID(ctx);
+ ctx->u.vlan_info.ifindex = ifindex;
+}
+
+ifindex_t dplane_ctx_get_vlan_ifindex(struct zebra_dplane_ctx *ctx)
+{
+ DPLANE_CTX_VALID(ctx);
+
+ return ctx->u.vlan_info.ifindex;
+}
+
+void dplane_ctx_set_vxlan_vlan_array(struct zebra_dplane_ctx *ctx,
+ struct zebra_vxlan_vlan_array *vlan_array)
+{
+ DPLANE_CTX_VALID(ctx);
+
+ ctx->u.vlan_info.vlan_array = vlan_array;
+}
+
+const struct zebra_vxlan_vlan_array *
+dplane_ctx_get_vxlan_vlan_array(struct zebra_dplane_ctx *ctx)
+{
+ DPLANE_CTX_VALID(ctx);
+
+ return ctx->u.vlan_info.vlan_array;
+}
+
/*
* Internal helper that copies information from a zebra ns object; this is
* called in the zebra main pthread context as part of dplane ctx init.
@@ -6720,6 +6708,12 @@ static void kernel_dplane_log_detail(struct zebra_dplane_ctx *ctx)
dplane_op2str(dplane_ctx_get_op(ctx)),
&ctx->u.srv6_encap.srcaddr);
break;
+
+ case DPLANE_OP_VLAN_INSTALL:
+ zlog_debug("Dplane %s on idx %u",
+ dplane_op2str(dplane_ctx_get_op(ctx)),
+ dplane_ctx_get_vlan_ifindex(ctx));
+ break;
}
}
@@ -6888,6 +6882,7 @@ static void kernel_dplane_handle_result(struct zebra_dplane_ctx *ctx)
case DPLANE_OP_INTF_ADDR_ADD:
case DPLANE_OP_INTF_ADDR_DEL:
case DPLANE_OP_INTF_NETCONFIG:
+ case DPLANE_OP_VLAN_INSTALL:
break;
case DPLANE_OP_SRV6_ENCAP_SRCADDR_SET: