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 <sharpd@cumulusnetworks.com>
This commit is contained in:
Donald Sharp 2018-05-25 10:54:50 -04:00
parent 1e88567226
commit ebecd64913
4 changed files with 19 additions and 10 deletions

View File

@ -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 * goes in the rule to denote relative ordering; it may or may not be the
* same as the rule's user-defined sequence number. * 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; int ret = 0;
@ -150,12 +150,14 @@ void kernel_add_pbr_rule(struct zebra_pbr_rule *rule)
kernel_pbr_rule_add_del_status(rule, kernel_pbr_rule_add_del_status(rule,
(!ret) ? DP_INSTALL_SUCCESS (!ret) ? DP_INSTALL_SUCCESS
: DP_INSTALL_FAILURE); : DP_INSTALL_FAILURE);
return DP_REQUEST_SUCCESS;
} }
/* /*
* Uninstall specified rule for a specific interface. * 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; int ret = 0;
@ -163,6 +165,8 @@ void kernel_del_pbr_rule(struct zebra_pbr_rule *rule)
kernel_pbr_rule_add_del_status(rule, kernel_pbr_rule_add_del_status(rule,
(!ret) ? DP_DELETE_SUCCESS (!ret) ? DP_DELETE_SUCCESS
: DP_DELETE_FAILURE); : DP_DELETE_FAILURE);
return DP_REQUEST_SUCCESS;
} }
/* /*

View File

@ -41,11 +41,16 @@
#include "zebra/rule_netlink.h" #include "zebra/rule_netlink.h"
#include "zebra/zebra_pbr.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 #endif

View File

@ -78,7 +78,7 @@ void zebra_pbr_rules_free(void *arg)
rule = (struct zebra_pbr_rule *)arg; rule = (struct zebra_pbr_rule *)arg;
kernel_del_pbr_rule(rule); (void)kernel_del_pbr_rule(rule);
XFREE(MTYPE_TMP, 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); pbr_rule_lookup_unique(zns, rule->rule.unique, rule->ifp);
(void)hash_get(zns->rules_hash, rule, pbr_rule_alloc_intern); (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 * Rule Replace semantics, if we have an old, install the
* new rule, look above, and then delete the old * 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; struct zebra_pbr_rule *lookup;
lookup = hash_lookup(zns->rules_hash, rule); lookup = hash_lookup(zns->rules_hash, rule);
kernel_del_pbr_rule(rule); (void)kernel_del_pbr_rule(rule);
if (lookup) { if (lookup) {
hash_release(zns->rules_hash, 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; int *sock = data;
if (rule->sock == *sock) { if (rule->sock == *sock) {
kernel_del_pbr_rule(rule); (void)kernel_del_pbr_rule(rule);
hash_release(zns->rules_hash, rule); hash_release(zns->rules_hash, rule);
XFREE(MTYPE_TMP, rule); XFREE(MTYPE_TMP, rule);
} }

View File

@ -162,12 +162,12 @@ void zebra_pbr_del_iptable(struct zebra_ns *zns,
* forwarding plane may not coincide, hence the API requires a separate * forwarding plane may not coincide, hence the API requires a separate
* rule priority - maps to preference/FRA_PRIORITY on Linux. * 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. * 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. * Get to know existing PBR rules in the kernel - typically called at startup.