summaryrefslogtreecommitdiff
path: root/zebra/kernel_netlink.c
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@nvidia.com>2021-11-10 14:12:39 -0500
committerDonald Sharp <sharpd@nvidia.com>2022-02-04 15:33:58 -0500
commit00249e255ee651eefb027f3a3c8deb0f130f6193 (patch)
treebe1692ca048495f9c9a61f1fc1ecddc7344f8020 /zebra/kernel_netlink.c
parentd058d106f0e04d4fb531a2466c0e2d9a5a559663 (diff)
zebra: When we get an implicit or ack or full failure mark status
When nl_batch_read_resp gets a full on failure -1 or an implicit ack 0 from the kernel for a batch of code. Let's immediately mark all of those in the batch pass/fail as needed. Instead of having them marked else where. Signed-off-by: Donald Sharp <sharpd@nvidia.com>
Diffstat (limited to 'zebra/kernel_netlink.c')
-rw-r--r--zebra/kernel_netlink.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/zebra/kernel_netlink.c b/zebra/kernel_netlink.c
index d614aa26d0..26ceea2057 100644
--- a/zebra/kernel_netlink.c
+++ b/zebra/kernel_netlink.c
@@ -1125,8 +1125,25 @@ static int nl_batch_read_resp(struct nl_batch *bth)
while (true) {
status = netlink_recv_msg(nl, msg, nl_batch_rx_buf,
sizeof(nl_batch_rx_buf));
- if (status == -1 || status == 0)
+ /*
+ * status == -1 is a full on failure somewhere
+ * since we don't know where the problem happened
+ * we must mark all as failed
+ *
+ * Else we mark everything as worked
+ *
+ */
+ if (status == -1 || status == 0) {
+ while ((ctx = dplane_ctx_dequeue(&(bth->ctx_list))) !=
+ NULL) {
+ if (status == -1)
+ dplane_ctx_set_status(
+ ctx,
+ ZEBRA_DPLANE_REQUEST_FAILURE);
+ dplane_ctx_enqueue_tail(bth->ctx_out_q, ctx);
+ }
return status;
+ }
h = (struct nlmsghdr *)nl_batch_rx_buf;
ignore_msg = false;