From ebecd64913d21197465de56bbc69bdb61d265f2a Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Fri, 25 May 2018 10:54:50 -0400 Subject: [PATCH] zebra: Add knowledge of request success/failure for pbr rules Add some nascent code to handle success/failure of the rule installation. Signed-off-by: Donald Sharp --- zebra/rule_netlink.c | 8 ++++++-- zebra/rule_socket.c | 9 +++++++-- zebra/zebra_pbr.c | 8 ++++---- zebra/zebra_pbr.h | 4 ++-- 4 files changed, 19 insertions(+), 10 deletions(-) diff --git a/zebra/rule_netlink.c b/zebra/rule_netlink.c index fdafb2286c..bcffdf4722 100644 --- a/zebra/rule_netlink.c +++ b/zebra/rule_netlink.c @@ -142,7 +142,7 @@ static int netlink_rule_update(int cmd, struct zebra_pbr_rule *rule) * goes in the rule to denote relative ordering; it may or may not be the * same as the rule's user-defined sequence number. */ -void kernel_add_pbr_rule(struct zebra_pbr_rule *rule) +enum dp_req_result kernel_add_pbr_rule(struct zebra_pbr_rule *rule) { int ret = 0; @@ -150,12 +150,14 @@ void kernel_add_pbr_rule(struct zebra_pbr_rule *rule) kernel_pbr_rule_add_del_status(rule, (!ret) ? DP_INSTALL_SUCCESS : DP_INSTALL_FAILURE); + + return DP_REQUEST_SUCCESS; } /* * Uninstall specified rule for a specific interface. */ -void kernel_del_pbr_rule(struct zebra_pbr_rule *rule) +enum dp_req_result kernel_del_pbr_rule(struct zebra_pbr_rule *rule) { int ret = 0; @@ -163,6 +165,8 @@ void kernel_del_pbr_rule(struct zebra_pbr_rule *rule) kernel_pbr_rule_add_del_status(rule, (!ret) ? DP_DELETE_SUCCESS : DP_DELETE_FAILURE); + + return DP_REQUEST_SUCCESS; } /* diff --git a/zebra/rule_socket.c b/zebra/rule_socket.c index 46c53f9e02..ecd642d807 100644 --- a/zebra/rule_socket.c +++ b/zebra/rule_socket.c @@ -41,11 +41,16 @@ #include "zebra/rule_netlink.h" #include "zebra/zebra_pbr.h" -void kernel_add_pbr_rule(struct zebra_pbr_rule *rule) +enum dp_req_result kernel_add_pbr_rule(struct zebra_pbr_rule *rule) { + zlog_err("%s not Implemented for this platform", __PRETTY_FUNCTION__); + return DP_REQUEST_FAILURE; } -void kernel_del_pbr_rule(struct zebra_pbr_rule *rule) + +enum dp_req_result kernel_del_pbr_rule(struct zebra_pbr_rule *rule) { + zlog_err("%s not Implemented for this platform", __PRETTY_FUNCTION__); + return DP_REQUEST_FAILURE; } #endif diff --git a/zebra/zebra_pbr.c b/zebra/zebra_pbr.c index 84fb3d76a2..775b205513 100644 --- a/zebra/zebra_pbr.c +++ b/zebra/zebra_pbr.c @@ -78,7 +78,7 @@ void zebra_pbr_rules_free(void *arg) rule = (struct zebra_pbr_rule *)arg; - kernel_del_pbr_rule(rule); + (void)kernel_del_pbr_rule(rule); XFREE(MTYPE_TMP, rule); } @@ -368,7 +368,7 @@ void zebra_pbr_add_rule(struct zebra_ns *zns, struct zebra_pbr_rule *rule) pbr_rule_lookup_unique(zns, rule->rule.unique, rule->ifp); (void)hash_get(zns->rules_hash, rule, pbr_rule_alloc_intern); - kernel_add_pbr_rule(rule); + (void)kernel_add_pbr_rule(rule); /* * Rule Replace semantics, if we have an old, install the * new rule, look above, and then delete the old @@ -382,7 +382,7 @@ void zebra_pbr_del_rule(struct zebra_ns *zns, struct zebra_pbr_rule *rule) struct zebra_pbr_rule *lookup; lookup = hash_lookup(zns->rules_hash, rule); - kernel_del_pbr_rule(rule); + (void)kernel_del_pbr_rule(rule); if (lookup) { hash_release(zns->rules_hash, lookup); @@ -399,7 +399,7 @@ static void zebra_pbr_cleanup_rules(struct hash_backet *b, void *data) int *sock = data; if (rule->sock == *sock) { - kernel_del_pbr_rule(rule); + (void)kernel_del_pbr_rule(rule); hash_release(zns->rules_hash, rule); XFREE(MTYPE_TMP, rule); } diff --git a/zebra/zebra_pbr.h b/zebra/zebra_pbr.h index bd942b9ae6..6cbafd6daa 100644 --- a/zebra/zebra_pbr.h +++ b/zebra/zebra_pbr.h @@ -162,12 +162,12 @@ void zebra_pbr_del_iptable(struct zebra_ns *zns, * forwarding plane may not coincide, hence the API requires a separate * rule priority - maps to preference/FRA_PRIORITY on Linux. */ -extern void kernel_add_pbr_rule(struct zebra_pbr_rule *rule); +extern enum dp_req_result kernel_add_pbr_rule(struct zebra_pbr_rule *rule); /* * Uninstall specified rule for a specific interface. */ -extern void kernel_del_pbr_rule(struct zebra_pbr_rule *rule); +extern enum dp_req_result kernel_del_pbr_rule(struct zebra_pbr_rule *rule); /* * Get to know existing PBR rules in the kernel - typically called at startup. -- 2.39.5