diff options
Diffstat (limited to 'zebra/zebra_dplane.c')
| -rw-r--r-- | zebra/zebra_dplane.c | 231 |
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: |
