diff --git a/src/nat_porttrigger.c b/src/nat_porttrigger.c index 919ace6aad5657fb080ad2eb342c7245c6f3eb7e..2fb5f76b5b178efb37d9d95ba55d819080e56e58 100644 --- a/src/nat_porttrigger.c +++ b/src/nat_porttrigger.c @@ -18,52 +18,40 @@ /*#Device.NAT.PortTrigger.{i}.!UCI:port-trigger/port_trigger/dmmap_port_trigger*/ int browseNATPortTriggerInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance) { - struct uci_section *p = NULL; - struct dm_data data = {0}; - char *name = NULL; - char *buf = NULL; - - uci_foreach_sections("port-trigger", "port_trigger", p) { - int inst = 0; - dmuci_get_section_name(section_name(p),&name); - if (name) { - sscanf(name, "port_trigger_%d",&inst); - if (inst == 0) { - continue; - } - dmasprintf(&buf, "%d", inst); - data.config_section = p; - if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&data, buf) == DM_STOP) - break; - } + struct dm_data *curr_data = NULL; + LIST_HEAD(dup_list); + char *inst = NULL; + + synchronize_specific_config_sections_with_dmmap("port-trigger", "port_trigger", "dmmap_port_trigger", &dup_list); + list_for_each_entry(curr_data, &dup_list, list) { + + inst = handle_instance(dmctx, parent_node, curr_data->dmmap_section, "port_trigger_instance", "port_trigger_alias"); + + if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)curr_data, inst) == DM_STOP) + break; } + free_dmmap_config_dup_list(&dup_list); return 0; } static int browseNATPortTriggerRuleInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance) { - struct uci_section *p = NULL; - struct dm_data data = {0}; - char *name = NULL; - char *buf = NULL; - int parent_inst = (int)strtol(prev_instance, NULL, 10); - - uci_foreach_sections("port-trigger", "rule", p) { - int inst = 0; - int ptg_inst = 0; - dmuci_get_section_name(section_name(p), &name); - if (name) { - sscanf(name, "port_trigger_%d_rule_%d",&ptg_inst, &inst); - if ((inst == 0) || (ptg_inst != parent_inst)) - continue; - dmasprintf(&buf, "%d", inst); - data.config_section = p; - - if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&data, buf) == DM_STOP) - break; - } + struct dm_data *curr_data = NULL; + LIST_HEAD(dup_list); + char *inst = NULL; + + synchronize_specific_config_sections_with_dmmap_eq("port-trigger", "rule", "dmmap_port_trigger", + "port_trigger", section_name(((struct dm_data *)prev_data)->config_section), &dup_list); + list_for_each_entry(curr_data, &dup_list, list) { + + inst = handle_instance(dmctx, parent_node, curr_data->dmmap_section, "rule_instance", "rule_alias"); + + if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)curr_data, inst) == DM_STOP) + break; } + free_dmmap_config_dup_list(&dup_list); + return 0; } @@ -72,16 +60,17 @@ static int browseNATPortTriggerRuleInst(struct dmctx *dmctx, DMNODE *parent_node **************************************************************/ int addObjNATPortTrigger(char *refparam, struct dmctx *ctx, void *data, char **instance) { - struct uci_section *s = NULL; - char port_trigger_name[16] = {0}; - char name[16] = {0}; + struct uci_section *s = NULL, *dmmap_s = NULL; + char port_trigger_name[32] = {0}; snprintf(port_trigger_name, sizeof(port_trigger_name), "port_trigger_%s", *instance); - snprintf(name, sizeof(name), "trigger_%s", *instance); dmuci_add_section("port-trigger", "port_trigger", &s); dmuci_rename_section_by_section(s, port_trigger_name); - dmuci_set_value_by_section(s, "name", name); + + dmuci_add_section_bbfdm("dmmap_port_trigger", "port_trigger", &dmmap_s); + dmuci_set_value_by_section(dmmap_s, "section_name", port_trigger_name); + dmuci_set_value_by_section(dmmap_s, "port_trigger_instance", *instance); return 0; } @@ -89,31 +78,37 @@ int addObjNATPortTrigger(char *refparam, struct dmctx *ctx, void *data, char **i int delObjNATPortTrigger(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action) { struct uci_section *s = NULL, *stmp = NULL; - char *name = NULL; - dmuci_get_value_by_section_string(((struct dm_data *)data)->config_section, "name", &name); - uci_foreach_option_eq_safe("port-trigger", "rule", "port_trigger", name, stmp, s) { + uci_foreach_option_eq_safe("port-trigger", "rule", "port_trigger", section_name(((struct dm_data *)data)->config_section), stmp, s) { + struct uci_section *dmmap_s = NULL; + + /* remove dmmap section related to each rule section */ + get_dmmap_section_of_config_section("dmmap_port_trigger", "rule", section_name(s), &dmmap_s); + dmuci_delete_by_section(dmmap_s, NULL, NULL); + dmuci_delete_by_section(s, NULL, NULL); } dmuci_delete_by_section(((struct dm_data *)data)->config_section, NULL, NULL); + dmuci_delete_by_section(((struct dm_data *)data)->dmmap_section, NULL, NULL); + return 0; } static int addObjNATPortTriggerRule(char *refparam, struct dmctx *ctx, void *data, char **instance) { - struct uci_section *port_trigger = ((struct dm_data *)data)->config_section; - struct uci_section *s = NULL; - char s_name[50] = {0}; - char *name = NULL; + struct uci_section *s = NULL, *dmmap_s = NULL; + char s_name[64] = {0}; - snprintf(s_name, sizeof(s_name), "%s_rule_%s", section_name(port_trigger),*instance); + snprintf(s_name, sizeof(s_name), "%s_rule_%s", section_name(((struct dm_data *)data)->config_section), *instance); dmuci_add_section("port-trigger", "rule", &s); dmuci_rename_section_by_section(s, s_name); + dmuci_set_value_by_section(s, "port_trigger", section_name(((struct dm_data *)data)->config_section)); - dmuci_get_value_by_section_string(((struct dm_data *)data)->config_section, "name", &name); - dmuci_set_value_by_section(s, "port_trigger", name); + dmuci_add_section_bbfdm("dmmap_port_trigger", "rule", &dmmap_s); + dmuci_set_value_by_section(dmmap_s, "section_name", s_name); + dmuci_set_value_by_section(dmmap_s, "rule_instance", *instance); return 0; } @@ -121,6 +116,7 @@ static int addObjNATPortTriggerRule(char *refparam, struct dmctx *ctx, void *dat static int delObjNATPortTriggerRule(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action) { dmuci_delete_by_section(((struct dm_data *)data)->config_section, NULL, NULL); + dmuci_delete_by_section(((struct dm_data *)data)->dmmap_section, NULL, NULL); return 0; } @@ -137,8 +133,12 @@ int get_NAT_PortTriggerNumberOfEntries(char *refparam, struct dmctx *ctx, void * static int get_NATPortTrigger_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { - dmuci_get_section_name(section_name(((struct dm_data *)data)->config_section),value); - return 0; + return bbf_get_alias(ctx, ((struct dm_data *)data)->dmmap_section, "port_trigger_alias", instance, value); +} + +static int set_NATPortTrigger_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) +{ + return bbf_set_alias(ctx, ((struct dm_data *)data)->dmmap_section, "port_trigger_alias", instance, value); } static int get_NATPortTrigger_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) @@ -382,8 +382,12 @@ static int get_NATPortTrigger_RuleNumberOfEntries(char *refparam, struct dmctx * static int get_NATPortTriggerRule_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) { - dmuci_get_section_name(section_name(((struct dm_data *)data)->config_section),value); - return 0; + return bbf_get_alias(ctx, ((struct dm_data *)data)->dmmap_section, "rule_alias", instance, value); +} + +static int set_NATPortTriggerRule_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) +{ + return bbf_set_alias(ctx, ((struct dm_data *)data)->dmmap_section, "rule_alias", instance, value); } static int get_NATPortTriggerRule_Port(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) @@ -463,7 +467,7 @@ static int set_NATPortTriggerRule_Protocol(char *refparam, struct dmctx *ctx, vo DMLEAF tNATPortTriggerParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type */ -{"Alias", &DMREAD, DMT_STRING, get_NATPortTrigger_Alias, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"Alias", &DMWRITE, DMT_STRING, get_NATPortTrigger_Alias, set_NATPortTrigger_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"Enable", &DMWRITE, DMT_BOOL, get_NATPortTrigger_Enable, set_NATPortTrigger_Enable, BBFDM_BOTH}, {"Status", &DMREAD, DMT_STRING, get_NATPortTrigger_Status, NULL, BBFDM_BOTH}, {"Origin", &DMWRITE, DMT_STRING, get_NATPortTrigger_Origin, set_NATPortTrigger_Origin, BBFDM_BOTH}, @@ -481,7 +485,7 @@ DMLEAF tNATPortTriggerParams[] = { /* *** Device.NAT.PortTrigger.{i}.Rule.{i}. *** */ DMLEAF tNATPortTriggerRuleParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type */ -{"Alias", &DMREAD, DMT_STRING, get_NATPortTriggerRule_Alias, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"Alias", &DMREAD, DMT_STRING, get_NATPortTriggerRule_Alias, set_NATPortTriggerRule_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"Port", &DMWRITE, DMT_UNINT, get_NATPortTriggerRule_Port, set_NATPortTriggerRule_Port, BBFDM_BOTH}, {"PortEndRange", &DMWRITE, DMT_UNINT, get_NATPortTriggerRule_PortEndRange, set_NATPortTriggerRule_PortEndRange, BBFDM_BOTH}, {"Protocol", &DMWRITE, DMT_STRING, get_NATPortTriggerRule_Protocol, set_NATPortTriggerRule_Protocol, BBFDM_BOTH},