diff options
| author | Jakub Urbańczyk <xthaid@gmail.com> | 2020-07-31 00:15:51 +0200 | 
|---|---|---|
| committer | Jakub Urbańczyk <xthaid@gmail.com> | 2020-08-10 21:57:04 +0200 | 
| commit | 18f60fe9990db3c9313e579497d36e44a9818629 (patch) | |
| tree | d1225f6a7aa08e3247d866eb818409e4d732167f /zebra/kernel_socket.c | |
| parent | 67e3369ed45ba18fa035e9aecf1477d98115f305 (diff) | |
zebra: remove old kernel one-update-at-a-time api
The old one is replaced by the api that is suitable for the batching.
Signed-off-by: Jakub Urbańczyk <xthaid@gmail.com>
Diffstat (limited to 'zebra/kernel_socket.c')
| -rw-r--r-- | zebra/kernel_socket.c | 94 | 
1 files changed, 89 insertions, 5 deletions
diff --git a/zebra/kernel_socket.c b/zebra/kernel_socket.c index 896926bcbe..9e56e2988d 100644 --- a/zebra/kernel_socket.c +++ b/zebra/kernel_socket.c @@ -1466,12 +1466,96 @@ void kernel_terminate(struct zebra_ns *zns, bool complete)  void kernel_update_multi(struct dplane_ctx_q *ctx_list)  { -	/* no-op */ -} +	struct zebra_dplane_ctx *ctx; +	struct dplane_ctx_q handled_list; +	enum zebra_dplane_result res; -bool kernel_supports_batch(void) -{ -	return false; +	TAILQ_INIT(&handled_list); + +	while (true) { +		ctx = dplane_ctx_dequeue(ctx_list); +		if (ctx == NULL) +			break; + +		/* +		 * A previous provider plugin may have asked to skip the +		 * kernel update. +		 */ +		if (dplane_ctx_is_skip_kernel(ctx)) { +			res = ZEBRA_DPLANE_REQUEST_SUCCESS; +			goto skip_one; +		} + +		switch (dplane_ctx_get_op(ctx)) { + +		case DPLANE_OP_ROUTE_INSTALL: +		case DPLANE_OP_ROUTE_UPDATE: +		case DPLANE_OP_ROUTE_DELETE: +			res = kernel_route_update(ctx); +			break; + +		case DPLANE_OP_NH_INSTALL: +		case DPLANE_OP_NH_UPDATE: +		case DPLANE_OP_NH_DELETE: +			res = kernel_nexthop_update(ctx); +			break; + +		case DPLANE_OP_LSP_INSTALL: +		case DPLANE_OP_LSP_UPDATE: +		case DPLANE_OP_LSP_DELETE: +			res = kernel_lsp_update(ctx); +			break; + +		case DPLANE_OP_PW_INSTALL: +		case DPLANE_OP_PW_UNINSTALL: +			res = kernel_pw_update(ctx); +			break; + +		case DPLANE_OP_ADDR_INSTALL: +		case DPLANE_OP_ADDR_UNINSTALL: +			res = kernel_address_update_ctx(ctx); +			break; + +		case DPLANE_OP_MAC_INSTALL: +		case DPLANE_OP_MAC_DELETE: +			res = kernel_mac_update_ctx(ctx); +			break; + +		case DPLANE_OP_NEIGH_INSTALL: +		case DPLANE_OP_NEIGH_UPDATE: +		case DPLANE_OP_NEIGH_DELETE: +		case DPLANE_OP_VTEP_ADD: +		case DPLANE_OP_VTEP_DELETE: +			res = kernel_neigh_update_ctx(ctx); +			break; + +		case DPLANE_OP_RULE_ADD: +		case DPLANE_OP_RULE_DELETE: +		case DPLANE_OP_RULE_UPDATE: +			res = kernel_pbr_rule_update(ctx); +			break; + +		/* Ignore 'notifications' - no-op */ +		case DPLANE_OP_SYS_ROUTE_ADD: +		case DPLANE_OP_SYS_ROUTE_DELETE: +		case DPLANE_OP_ROUTE_NOTIFY: +		case DPLANE_OP_LSP_NOTIFY: +			res = ZEBRA_DPLANE_REQUEST_SUCCESS; +			break; + +		default: +			res = ZEBRA_DPLANE_REQUEST_FAILURE; +			break; +		} + +	skip_one: +		dplane_ctx_set_status(ctx, res); + +		dplane_ctx_enqueue_tail(&handled_list, ctx); +	} + +	TAILQ_INIT(ctx_list); +	dplane_ctx_list_append(ctx_list, &handled_list);  }  #endif /* !HAVE_NETLINK */  | 
