X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fnetifd.git;a=blobdiff_plain;f=iprule.c;h=7cf7422f4168d8c33fdb051865f7fe4846d62487;hp=0ff02ded72f8691080d08ceb7b7c31beed9fe546;hb=HEAD;hpb=0b66ee22a3a339188ab2b8661c6af62883be93c2 diff --git a/iprule.c b/iprule.c index 0ff02de..7cf7422 100644 --- a/iprule.c +++ b/iprule.c @@ -15,7 +15,6 @@ #include #include #include -#include #include @@ -28,6 +27,7 @@ #include "system.h" struct vlist_tree iprules; +static bool iprules_flushed = false; static unsigned int iprules_counter[2]; enum { @@ -42,6 +42,7 @@ enum { RULE_LOOKUP, RULE_ACTION, RULE_GOTO, + RULE_SUP_PREFIXLEN, __RULE_MAX }; @@ -55,11 +56,12 @@ static const struct blobmsg_policy rule_attr[__RULE_MAX] = { [RULE_TOS] = { .name = "tos", .type = BLOBMSG_TYPE_INT32 }, [RULE_FWMARK] = { .name = "mark", .type = BLOBMSG_TYPE_STRING }, [RULE_LOOKUP] = { .name = "lookup", .type = BLOBMSG_TYPE_STRING }, + [RULE_SUP_PREFIXLEN] = { .name = "suppress_prefixlength", .type = BLOBMSG_TYPE_INT32 }, [RULE_ACTION] = { .name = "action", .type = BLOBMSG_TYPE_STRING }, [RULE_GOTO] = { .name = "goto", .type = BLOBMSG_TYPE_INT32 }, }; -const struct config_param_list rule_attr_list = { +const struct uci_blob_param_list rule_attr_list = { .n_params = __RULE_MAX, .params = rule_attr, }; @@ -185,6 +187,11 @@ iprule_add(struct blob_attr *attr, bool v6) rule->flags |= IPRULE_LOOKUP; } + if ((cur = tb[RULE_SUP_PREFIXLEN]) != NULL) { + rule->sup_prefixlen = blobmsg_get_u32(cur); + rule->flags |= IPRULE_SUP_PREFIXLEN; + } + if ((cur = tb[RULE_ACTION]) != NULL) { if (!system_resolve_iprule_action(blobmsg_data(cur), &rule->action)) { DPRINTF("Failed to parse rule action: %s\n", (char *) blobmsg_data(cur)); @@ -208,6 +215,11 @@ error: void iprule_update_start(void) { + if (!iprules_flushed) { + system_flush_iprules(); + iprules_flushed = true; + } + iprules_counter[0] = 1; iprules_counter[1] = 1; vlist_update(&iprules); @@ -228,7 +240,7 @@ rule_cmp(const void *k1, const void *k2, void *ptr) static void iprule_update_rule(struct vlist_tree *tree, - struct vlist_node *node_new, struct vlist_node *node_old) + struct vlist_node *node_new, struct vlist_node *node_old) { struct iprule *rule_old, *rule_new; @@ -247,6 +259,5 @@ iprule_update_rule(struct vlist_tree *tree, static void __init iprule_init_list(void) { - system_flush_iprules(); vlist_init(&iprules, rule_cmp, iprule_update_rule); }