From 14b106dfd8874aac7b9fd5b4ff2b3828b706a7d8 Mon Sep 17 00:00:00 2001 From: Amin Ben Romdhane Date: Mon, 13 Nov 2023 11:45:45 +0100 Subject: [PATCH] Set method: Don't return error if one of the entries is dynamically created --- libbbfdm/dmtree/tr181/firewall.c | 126 ++++++++++++++++++++----------- libbbfdm/dmtree/tr181/routing.c | 92 ++++++++++++---------- libbbfdm/dmtree/tr181/routing.h | 2 - 3 files changed, 137 insertions(+), 83 deletions(-) diff --git a/libbbfdm/dmtree/tr181/firewall.c b/libbbfdm/dmtree/tr181/firewall.c index 49df91ef..3d11f0db 100644 --- a/libbbfdm/dmtree/tr181/firewall.c +++ b/libbbfdm/dmtree/tr181/firewall.c @@ -46,15 +46,6 @@ static void create_portmapping_section(bool b) dmuci_set_value_by_section(s, "reload", "1"); } -static char *get_rule_perm(char *refparam, struct dmctx *dmctx, void *data, char *instance) -{ - struct rule_sec *rule_args = (struct rule_sec *)data; - - return (!rule_args || rule_args->is_dynamic_rule) ? "0" : "1"; -} - -struct dm_permession_s DMRule = {"1", &get_rule_perm}; - static void add_firewall_config_dup_list(struct list_head *dup_list, struct uci_section *config_section, struct uci_section *dmmap_section, bool is_dynamic_rule) { struct rule_sec *rule_args; @@ -468,7 +459,7 @@ static int add_firewall_rule(char *refparam, struct dmctx *ctx, void *data, char static int delete_firewall_rule(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action) { - struct uci_section *s = NULL, *stmp = NULL; + struct uci_section *s = NULL; char *order = NULL, *rules_num = NULL; char buf[8] = {0}; @@ -493,14 +484,6 @@ static int delete_firewall_rule(char *refparam, struct dmctx *ctx, void *data, c dmuci_delete_by_section(((struct rule_sec *)data)->dmmap_section, NULL, NULL); break; case DEL_ALL: - uci_foreach_sections_safe("firewall", "rule", stmp, s) { - struct uci_section *dmmap_section = NULL; - - get_dmmap_section_of_config_section("dmmap_firewall", "rule", section_name(s), &dmmap_section); - dmuci_delete_by_section(dmmap_section, NULL, NULL); - - dmuci_delete_by_section(s, NULL, NULL); - } break; } return 0; @@ -865,6 +848,9 @@ static int set_FirewallChainRule_ExpiryDate(char *refparam, struct dmctx *ctx, v return FAULT_9007; break; case VALUESET: + if (((struct rule_sec *)data)->is_dynamic_rule) + break; + strptime(value, "%Y-%m-%dT%H:%M:%SZ", &tm); snprintf(expiry_date, sizeof(expiry_date), "%lld", (long long)timegm(&tm)); dmuci_set_value_by_section(rule_args->config_section, "expiry", expiry_date); @@ -1469,11 +1455,14 @@ static int set_rule_enable(char *refparam, struct dmctx *ctx, void *data, char * return FAULT_9007; break; case VALUESET: + if (((struct rule_sec *)data)->is_dynamic_rule) + break; + string_to_bool(value, &b); dmuci_set_value_by_section(((struct rule_sec *)data)->config_section, "enabled", b ? "1" : "0"); break; } - return 0; + return 0; } static int set_rule_order(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) @@ -1499,6 +1488,9 @@ static int set_rule_order(char *refparam, struct dmctx *ctx, void *data, char *i break; case VALUESET: + if (((struct rule_sec *)data)->is_dynamic_rule) + break; + dmuci_get_value_by_section_string(((struct rule_sec *)data)->dmmap_section, "order", &curr_order); if (DM_STRTOUL(curr_order) > DM_STRTOUL(value)) update_rule_order(value, curr_order, true); @@ -1512,7 +1504,7 @@ static int set_rule_order(char *refparam, struct dmctx *ctx, void *data, char *i dmuci_set_value_by_section(((struct rule_sec *)data)->dmmap_section, "order", value); break; } - return 0; + return 0; } static int set_rule_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) @@ -1528,10 +1520,13 @@ static int set_rule_description(char *refparam, struct dmctx *ctx, void *data, c return FAULT_9007; break; case VALUESET: + if (((struct rule_sec *)data)->is_dynamic_rule) + break; + dmuci_set_value_by_section(((struct rule_sec *)data)->config_section, "name", value); break; } - return 0; + return 0; } static int set_rule_target(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) @@ -1542,6 +1537,9 @@ static int set_rule_target(char *refparam, struct dmctx *ctx, void *data, char * return FAULT_9007; break; case VALUESET: + if (((struct rule_sec *)data)->is_dynamic_rule) + break; + if (strcasecmp(value, "Accept") == 0) dmuci_set_value_by_section(((struct rule_sec *)data)->config_section, "target", "ACCEPT"); else if (strcasecmp(value, "Reject") == 0) @@ -1565,6 +1563,9 @@ static int set_rule_log(char *refparam, struct dmctx *ctx, void *data, char *ins return FAULT_9007; break; case VALUESET: + if (((struct rule_sec *)data)->is_dynamic_rule) + break; + string_to_bool(value, &b); dmuci_set_value_by_section(((struct rule_sec *)data)->config_section, "log", b ? "1" : ""); break; @@ -1590,6 +1591,9 @@ static int set_rule_interface(struct dmctx *ctx, void *data, char *type, char *v break; case VALUESET: + if (((struct rule_sec *)data)->is_dynamic_rule) + break; + dmuci_get_value_by_section_string(((struct rule_sec *)data)->config_section, type, &option); if (DM_STRLEN(reference.path) == 0) { @@ -1625,6 +1629,9 @@ static int set_rule_source_all_interfaces(char *refparam, struct dmctx *ctx, voi return FAULT_9007; break; case VALUESET: + if (((struct rule_sec *)data)->is_dynamic_rule) + break; + string_to_bool(value, &b); if (b) { // Get the current 'src' option @@ -1663,6 +1670,9 @@ static int set_rule_dest_all_interfaces(char *refparam, struct dmctx *ctx, void return FAULT_9007; break; case VALUESET: + if (((struct rule_sec *)data)->is_dynamic_rule) + break; + string_to_bool(value, &b); if (b) { // Get the current 'dest' option @@ -1693,6 +1703,9 @@ static int set_rule_i_p_version(char *refparam, struct dmctx *ctx, void *data, c return FAULT_9007; break; case VALUESET: + if (((struct rule_sec *)data)->is_dynamic_rule) + break; + if (DM_LSTRCMP(value, "4") == 0) dmuci_set_value_by_section(((struct rule_sec *)data)->config_section, "family", "ipv4"); else if (DM_LSTRCMP(value, "6") == 0) @@ -1714,6 +1727,9 @@ static int set_rule_dest_ip(char *refparam, struct dmctx *ctx, void *data, char return FAULT_9007; break; case VALUESET: + if (((struct rule_sec *)data)->is_dynamic_rule) + break; + dmuci_get_value_by_section_string(((struct rule_sec *)data)->config_section, "dest_ip", &destip); DM_STRNCPY(buf, destip, sizeof(buf)); pch = DM_STRCHR(buf, '/'); @@ -1737,6 +1753,9 @@ static int set_rule_dest_mask(char *refparam, struct dmctx *ctx, void *data, cha return FAULT_9007; break; case VALUESET: + if (((struct rule_sec *)data)->is_dynamic_rule) + break; + dmuci_get_value_by_section_string(((struct rule_sec *)data)->config_section, "dest_ip", &destip); pch = DM_STRCHR(destip, '/'); if (pch) @@ -1763,6 +1782,9 @@ static int set_rule_source_ip(char *refparam, struct dmctx *ctx, void *data, cha return FAULT_9007; break; case VALUESET: + if (((struct rule_sec *)data)->is_dynamic_rule) + break; + dmuci_get_value_by_section_string(((struct rule_sec *)data)->config_section, "src_ip", &srcip); DM_STRNCPY(buf, srcip, sizeof(buf)); pch = DM_STRCHR(buf, '/'); @@ -1786,6 +1808,9 @@ static int set_rule_source_mask(char *refparam, struct dmctx *ctx, void *data, c return FAULT_9007; break; case VALUESET: + if (((struct rule_sec *)data)->is_dynamic_rule) + break; + dmuci_get_value_by_section_string(((struct rule_sec *)data)->config_section, "src_ip", &srcip); pch = DM_STRCHR(srcip, '/'); if (pch) @@ -1810,6 +1835,9 @@ static int set_rule_protocol(char *refparam, struct dmctx *ctx, void *data, char return FAULT_9007; break; case VALUESET: + if (((struct rule_sec *)data)->is_dynamic_rule) + break; + dmuci_set_value_by_section(((struct rule_sec *)data)->config_section, "proto", (*value == '-') ? "0" : value); break; } @@ -1826,6 +1854,9 @@ static int set_rule_dest_port(char *refparam, struct dmctx *ctx, void *data, cha return FAULT_9007; break; case VALUESET: + if (((struct rule_sec *)data)->is_dynamic_rule) + break; + if (*value == '-') value = ""; dmuci_get_value_by_section_string(((struct rule_sec *)data)->config_section, "dest_port", &v); @@ -1852,6 +1883,9 @@ static int set_rule_dest_port_range_max(char *refparam, struct dmctx *ctx, void return FAULT_9007; break; case VALUESET: + if (((struct rule_sec *)data)->is_dynamic_rule) + break; + dmuci_get_value_by_section_string(((struct rule_sec *)data)->config_section, "dest_port", &v); buf = dmstrdup(v); v = buf; @@ -1881,6 +1915,9 @@ static int set_rule_source_port(char *refparam, struct dmctx *ctx, void *data, c return FAULT_9007; break; case VALUESET: + if (((struct rule_sec *)data)->is_dynamic_rule) + break; + if (*value == '-') value = ""; dmuci_get_value_by_section_string(((struct rule_sec *)data)->config_section, "src_port", &v); @@ -1907,6 +1944,9 @@ static int set_rule_source_port_range_max(char *refparam, struct dmctx *ctx, voi return FAULT_9007; break; case VALUESET: + if (((struct rule_sec *)data)->is_dynamic_rule) + break; + dmuci_get_value_by_section_string(((struct rule_sec *)data)->config_section, "src_port", &v); buf = dmstrdup(v); v = buf; @@ -2430,30 +2470,30 @@ DMLEAF tFirewallChainParams[] = { /* *** Device.Firewall.Chain.{i}.Rule.{i}. *** */ DMLEAF tFirewallChainRuleParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"Enable", &DMRule, DMT_BOOL, get_rule_enable, set_rule_enable, BBFDM_BOTH}, +{"Enable", &DMWRITE, DMT_BOOL, get_rule_enable, set_rule_enable, BBFDM_BOTH}, {"Status", &DMREAD, DMT_STRING, get_rule_status, NULL, BBFDM_BOTH}, -{"Order", &DMRule, DMT_UNINT, get_rule_order, set_rule_order, BBFDM_BOTH}, -{"Alias", &DMRule, DMT_STRING, get_rule_alias, set_rule_alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, -{"Description", &DMRule, DMT_STRING, get_rule_description, set_rule_description, BBFDM_BOTH}, -{"Target", &DMRule, DMT_STRING, get_rule_target, set_rule_target, BBFDM_BOTH}, -//{"TargetChain", &DMRule, DMT_STRING, get_rule_target_chain, set_rule_target_chain, BBFDM_BOTH}, -{"Log", &DMRule, DMT_BOOL, get_rule_log, set_rule_log, BBFDM_BOTH}, +{"Order", &DMWRITE, DMT_UNINT, get_rule_order, set_rule_order, BBFDM_BOTH}, +{"Alias", &DMWRITE, DMT_STRING, get_rule_alias, set_rule_alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"Description", &DMWRITE, DMT_STRING, get_rule_description, set_rule_description, BBFDM_BOTH}, +{"Target", &DMWRITE, DMT_STRING, get_rule_target, set_rule_target, BBFDM_BOTH}, +//{"TargetChain", &DMWRITE, DMT_STRING, get_rule_target_chain, set_rule_target_chain, BBFDM_BOTH}, +{"Log", &DMWRITE, DMT_BOOL, get_rule_log, set_rule_log, BBFDM_BOTH}, {"CreationDate", &DMREAD, DMT_TIME, get_FirewallChainRule_CreationDate, NULL, BBFDM_BOTH}, -{"ExpiryDate", &DMRule, DMT_TIME, get_FirewallChainRule_ExpiryDate, set_FirewallChainRule_ExpiryDate, BBFDM_BOTH}, -{"SourceInterface", &DMRule, DMT_STRING, get_rule_source_interface, set_rule_source_interface, BBFDM_BOTH, DM_FLAG_REFERENCE}, -{"SourceAllInterfaces", &DMRule, DMT_BOOL, get_rule_source_all_interfaces, set_rule_source_all_interfaces, BBFDM_BOTH}, -{"DestInterface", &DMRule, DMT_STRING, get_rule_dest_interface, set_rule_dest_interface, BBFDM_BOTH, DM_FLAG_REFERENCE}, -{"DestAllInterfaces", &DMRule, DMT_BOOL, get_rule_dest_all_interfaces, set_rule_dest_all_interfaces, BBFDM_BOTH}, -{"IPVersion", &DMRule, DMT_INT, get_rule_i_p_version, set_rule_i_p_version, BBFDM_BOTH}, -{"DestIP", &DMRule, DMT_STRING, get_rule_dest_ip, set_rule_dest_ip, BBFDM_BOTH}, -{"DestMask", &DMRule, DMT_STRING, get_rule_dest_mask, set_rule_dest_mask, BBFDM_BOTH}, -{"SourceIP", &DMRule, DMT_STRING, get_rule_source_ip, set_rule_source_ip, BBFDM_BOTH}, -{"SourceMask", &DMRule, DMT_STRING, get_rule_source_mask, set_rule_source_mask, BBFDM_BOTH}, -{"Protocol", &DMRule, DMT_INT, get_rule_protocol, set_rule_protocol, BBFDM_BOTH}, -{"DestPort", &DMRule, DMT_INT, get_rule_dest_port, set_rule_dest_port, BBFDM_BOTH}, -{"DestPortRangeMax", &DMRule, DMT_INT, get_rule_dest_port_range_max, set_rule_dest_port_range_max, BBFDM_BOTH}, -{"SourcePort", &DMRule, DMT_INT, get_rule_source_port, set_rule_source_port, BBFDM_BOTH}, -{"SourcePortRangeMax", &DMRule, DMT_INT, get_rule_source_port_range_max, set_rule_source_port_range_max, BBFDM_BOTH}, +{"ExpiryDate", &DMWRITE, DMT_TIME, get_FirewallChainRule_ExpiryDate, set_FirewallChainRule_ExpiryDate, BBFDM_BOTH}, +{"SourceInterface", &DMWRITE, DMT_STRING, get_rule_source_interface, set_rule_source_interface, BBFDM_BOTH, DM_FLAG_REFERENCE}, +{"SourceAllInterfaces", &DMWRITE, DMT_BOOL, get_rule_source_all_interfaces, set_rule_source_all_interfaces, BBFDM_BOTH}, +{"DestInterface", &DMWRITE, DMT_STRING, get_rule_dest_interface, set_rule_dest_interface, BBFDM_BOTH, DM_FLAG_REFERENCE}, +{"DestAllInterfaces", &DMWRITE, DMT_BOOL, get_rule_dest_all_interfaces, set_rule_dest_all_interfaces, BBFDM_BOTH}, +{"IPVersion", &DMWRITE, DMT_INT, get_rule_i_p_version, set_rule_i_p_version, BBFDM_BOTH}, +{"DestIP", &DMWRITE, DMT_STRING, get_rule_dest_ip, set_rule_dest_ip, BBFDM_BOTH}, +{"DestMask", &DMWRITE, DMT_STRING, get_rule_dest_mask, set_rule_dest_mask, BBFDM_BOTH}, +{"SourceIP", &DMWRITE, DMT_STRING, get_rule_source_ip, set_rule_source_ip, BBFDM_BOTH}, +{"SourceMask", &DMWRITE, DMT_STRING, get_rule_source_mask, set_rule_source_mask, BBFDM_BOTH}, +{"Protocol", &DMWRITE, DMT_INT, get_rule_protocol, set_rule_protocol, BBFDM_BOTH}, +{"DestPort", &DMWRITE, DMT_INT, get_rule_dest_port, set_rule_dest_port, BBFDM_BOTH}, +{"DestPortRangeMax", &DMWRITE, DMT_INT, get_rule_dest_port_range_max, set_rule_dest_port_range_max, BBFDM_BOTH}, +{"SourcePort", &DMWRITE, DMT_INT, get_rule_source_port, set_rule_source_port, BBFDM_BOTH}, +{"SourcePortRangeMax", &DMWRITE, DMT_INT, get_rule_source_port_range_max, set_rule_source_port_range_max, BBFDM_BOTH}, {0} }; diff --git a/libbbfdm/dmtree/tr181/routing.c b/libbbfdm/dmtree/tr181/routing.c index bbe10a04..16dc4ec2 100644 --- a/libbbfdm/dmtree/tr181/routing.c +++ b/libbbfdm/dmtree/tr181/routing.c @@ -30,7 +30,6 @@ struct route6_args { struct routingfwdargs { - char *permission; struct uci_section *routefwdsection; int type; }; @@ -45,17 +44,8 @@ enum enum_route_type { /******************************** * init function ********************************/ -static inline int init_args_ipv4forward(struct routingfwdargs *args, struct uci_section *s, char *permission, int type) +static inline int init_args_route_forwarding(struct routingfwdargs *args, struct uci_section *s, int type) { - args->permission = permission; - args->routefwdsection = s; - args->type = type; - return 0; -} - -static inline int init_args_ipv6forward(struct routingfwdargs *args, struct uci_section *s, char *permission, int type) -{ - args->permission = permission; args->routefwdsection = s; args->type = type; return 0; @@ -419,7 +409,7 @@ static int browseIPv4ForwardingInst(struct dmctx *dmctx, DMNODE *parent_node, vo if (DM_STRCMP(rt_table, table) != 0 || (DM_STRLEN(table) == 0 && DM_STRCMP(rt_table, "254") != 0)) continue; - init_args_ipv4forward(&curr_routefwdargs, p->config_section, "1", ROUTE_STATIC); + init_args_route_forwarding(&curr_routefwdargs, p->config_section, ROUTE_STATIC); inst = handle_instance(dmctx, parent_node, p->dmmap_section, "route_instance", "route_alias"); @@ -432,7 +422,7 @@ static int browseIPv4ForwardingInst(struct dmctx *dmctx, DMNODE *parent_node, vo dmmap_synchronizeRoutingRouterIPv4Forwarding(dmctx, parent_node, prev_data, prev_instance); uci_path_foreach_option_eq(bbfdm, "dmmap_routing", "route_dynamic", "table", rt_table, s) { - init_args_ipv4forward(&curr_routefwdargs, s, "0", ROUTE_DYNAMIC); + init_args_route_forwarding(&curr_routefwdargs, s, ROUTE_DYNAMIC); inst = handle_instance(dmctx, parent_node, s, "route_instance", "route_alias"); @@ -466,7 +456,7 @@ static int browseIPv6ForwardingInst(struct dmctx *dmctx, DMNODE *parent_node, vo if (DM_STRCMP(rt_table, table) != 0 || (DM_STRLEN(table) == 0 && DM_STRCMP(rt_table, "254") != 0)) continue; - init_args_ipv6forward(&curr_route6fwdargs, p->config_section, "1", ROUTE_STATIC); + init_args_route_forwarding(&curr_route6fwdargs, p->config_section, ROUTE_STATIC); inst = handle_instance(dmctx, parent_node, p->dmmap_section, "route6_instance", "route6_alias"); @@ -479,7 +469,7 @@ static int browseIPv6ForwardingInst(struct dmctx *dmctx, DMNODE *parent_node, vo dmmap_synchronizeRoutingRouterIPv6Forwarding(dmctx, parent_node, prev_data, prev_instance); uci_path_foreach_option_eq(bbfdm, "dmmap_routing", "route6_dynamic", "table", rt_table, s) { - init_args_ipv6forward(&curr_route6fwdargs, s, "0", ROUTE_DYNAMIC); + init_args_route_forwarding(&curr_route6fwdargs, s, ROUTE_DYNAMIC); inst = handle_instance(dmctx, parent_node, s, "route6_instance", "route6_alias"); @@ -590,6 +580,9 @@ static int set_router_ipv4forwarding_enable(char *refparam, struct dmctx *ctx, v return FAULT_9007; return 0; case VALUESET: + if (((struct routingfwdargs *)data)->type == ROUTE_DYNAMIC) + return 0; + string_to_bool(value, &b); dmuci_set_value_by_section(((struct routingfwdargs *)data)->routefwdsection, "disabled", b ? "0" : "1"); return 0; @@ -619,6 +612,9 @@ static int set_router_ipv4forwarding_destip(char *refparam, struct dmctx *ctx, v return FAULT_9007; return 0; case VALUESET: + if (((struct routingfwdargs *)data)->type == ROUTE_DYNAMIC) + return 0; + dmuci_set_value_by_section(((struct routingfwdargs *)data)->routefwdsection, "target", value); return 0; } @@ -640,6 +636,9 @@ static int set_router_ipv4forwarding_destmask(char *refparam, struct dmctx *ctx, return FAULT_9007; return 0; case VALUESET: + if (((struct routingfwdargs *)data)->type == ROUTE_DYNAMIC) + return 0; + dmuci_set_value_by_section(((struct routingfwdargs *)data)->routefwdsection, "netmask", value); return 0; } @@ -678,6 +677,9 @@ static int set_router_ipv4forwarding_forwarding_policy(char *refparam, struct dm bbfdm_set_fault_message(ctx, "Route table '%s' value doesn't exist on the device. It's only allowed to set an available route table."); return FAULT_9007; case VALUESET: + if (((struct routingfwdargs *)data)->type == ROUTE_DYNAMIC) + return 0; + dmuci_set_value_by_section(((struct routingfwdargs *)data)->routefwdsection, "table", value); get_dmmap_section_of_config_section("dmmap_routing", "route", section_name(((struct routingfwdargs *)data)->routefwdsection), &dmmap_section); @@ -719,6 +721,9 @@ static int set_router_ipv4forwarding_gatewayip(char *refparam, struct dmctx *ctx return FAULT_9007; return 0; case VALUESET: + if (((struct routingfwdargs *)data)->type == ROUTE_DYNAMIC) + return 0; + dmuci_set_value_by_section(((struct routingfwdargs *)data)->routefwdsection, "gateway", value); return 0; } @@ -751,6 +756,9 @@ static int set_RoutingRouterForwarding_Interface(char *refparam, struct dmctx *c return 0; case VALUESET: + if (((struct routingfwdargs *)data)->type == ROUTE_DYNAMIC) + return 0; + dmuci_set_value_by_section(((struct routingfwdargs *)data)->routefwdsection, "interface", reference.value); return 0; } @@ -772,6 +780,9 @@ static int set_router_ipv4forwarding_metric(char *refparam, struct dmctx *ctx, v return FAULT_9007; return 0; case VALUESET: + if (((struct routingfwdargs *)data)->type == ROUTE_DYNAMIC) + return 0; + dmuci_set_value_by_section(((struct routingfwdargs *)data)->routefwdsection, "metric", value); return 0; } @@ -801,6 +812,9 @@ static int set_RoutingRouterIPv6Forwarding_Enable(char *refparam, struct dmctx * return FAULT_9007; break; case VALUESET: + if (((struct routingfwdargs *)data)->type == ROUTE_DYNAMIC) + return 0; + string_to_bool(value, &b); dmuci_set_value_by_section(((struct routingfwdargs *)data)->routefwdsection, "disabled", b ? "0" : "1"); break; @@ -830,6 +844,9 @@ static int set_RoutingRouterIPv6Forwarding_DestIPPrefix(char *refparam, struct d return FAULT_9007; return 0; case VALUESET: + if (((struct routingfwdargs *)data)->type == ROUTE_DYNAMIC) + return 0; + dmuci_set_value_by_section(((struct routingfwdargs *)data)->routefwdsection, "target", value); return 0; } @@ -862,6 +879,9 @@ static int set_RoutingRouterIPv6Forwarding_ForwardingPolicy(char *refparam, stru bbfdm_set_fault_message(ctx, "Route table '%s' value doesn't exist on the device. It's only allowed to set an available route table."); return FAULT_9007; case VALUESET: + if (((struct routingfwdargs *)data)->type == ROUTE_DYNAMIC) + return 0; + dmuci_set_value_by_section(((struct routingfwdargs *)data)->routefwdsection, "table", value); get_dmmap_section_of_config_section("dmmap_routing", "route6", section_name(((struct routingfwdargs *)data)->routefwdsection), &dmmap_section); @@ -886,6 +906,9 @@ static int set_RoutingRouterIPv6Forwarding_NextHop(char *refparam, struct dmctx return FAULT_9007; return 0; case VALUESET: + if (((struct routingfwdargs *)data)->type == ROUTE_DYNAMIC) + return 0; + dmuci_set_value_by_section(((struct routingfwdargs *)data)->routefwdsection, "gateway", value); return 0; } @@ -913,6 +936,9 @@ static int set_RoutingRouterIPv6Forwarding_ForwardingMetric(char *refparam, stru return FAULT_9007; return 0; case VALUESET: + if (((struct routingfwdargs *)data)->type == ROUTE_DYNAMIC) + return 0; + dmuci_set_value_by_section(((struct routingfwdargs *)data)->routefwdsection, "metric", value); return 0; } @@ -1142,16 +1168,6 @@ static int set_RoutingRouterIPv6Forwarding_Alias(char *refparam, struct dmctx *c return 0; } -static char *get_routing_perm(char *refparam, struct dmctx *dmctx, void *data, char *instance) -{ - if (data != NULL) - return ((struct routingfwdargs *)data)->permission; - - return NULL; -} - -struct dm_permession_s DMRouting = {"1", &get_routing_perm}; - /************************************************************* * ADD DEL OBJ **************************************************************/ @@ -1353,32 +1369,32 @@ DMLEAF tRoutingRouterParams[] = { /* *** Device.Routing.Router.{i}.IPv4Forwarding.{i}. *** */ DMLEAF tRoutingRouterIPv4ForwardingParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"Enable", &DMRouting, DMT_BOOL, get_router_ipv4forwarding_enable, set_router_ipv4forwarding_enable, BBFDM_BOTH}, +{"Enable", &DMWRITE, DMT_BOOL, get_router_ipv4forwarding_enable, set_router_ipv4forwarding_enable, BBFDM_BOTH}, {"Status", &DMREAD, DMT_STRING, get_router_ipv4forwarding_status, NULL, BBFDM_BOTH}, {"Alias", &DMWRITE, DMT_STRING, get_router_ipv4forwarding_alias, set_router_ipv4forwarding_alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"StaticRoute", &DMREAD, DMT_BOOL, get_router_ipv4forwarding_static_route, NULL, BBFDM_BOTH}, -{"DestIPAddress", &DMRouting, DMT_STRING, get_router_ipv4forwarding_destip, set_router_ipv4forwarding_destip, BBFDM_BOTH, DM_FLAG_UNIQUE}, -{"DestSubnetMask", &DMRouting, DMT_STRING, get_router_ipv4forwarding_destmask, set_router_ipv4forwarding_destmask, BBFDM_BOTH, DM_FLAG_UNIQUE}, -{"ForwardingPolicy", &DMRouting, DMT_INT, get_router_ipv4forwarding_forwarding_policy, set_router_ipv4forwarding_forwarding_policy, BBFDM_BOTH, DM_FLAG_UNIQUE}, -{"GatewayIPAddress", &DMRouting, DMT_STRING, get_router_ipv4forwarding_gatewayip, set_router_ipv4forwarding_gatewayip, BBFDM_BOTH, DM_FLAG_UNIQUE}, -{"Interface", &DMRouting, DMT_STRING, get_RoutingRouterForwarding_Interface, set_RoutingRouterForwarding_Interface, BBFDM_BOTH, DM_FLAG_UNIQUE|DM_FLAG_REFERENCE}, +{"DestIPAddress", &DMWRITE, DMT_STRING, get_router_ipv4forwarding_destip, set_router_ipv4forwarding_destip, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"DestSubnetMask", &DMWRITE, DMT_STRING, get_router_ipv4forwarding_destmask, set_router_ipv4forwarding_destmask, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"ForwardingPolicy", &DMWRITE, DMT_INT, get_router_ipv4forwarding_forwarding_policy, set_router_ipv4forwarding_forwarding_policy, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"GatewayIPAddress", &DMWRITE, DMT_STRING, get_router_ipv4forwarding_gatewayip, set_router_ipv4forwarding_gatewayip, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"Interface", &DMWRITE, DMT_STRING, get_RoutingRouterForwarding_Interface, set_RoutingRouterForwarding_Interface, BBFDM_BOTH, DM_FLAG_UNIQUE|DM_FLAG_REFERENCE}, {"Origin", &DMREAD, DMT_STRING, get_router_ipv4forwarding_origin, NULL, BBFDM_BOTH}, -{"ForwardingMetric", &DMRouting, DMT_INT, get_router_ipv4forwarding_metric, set_router_ipv4forwarding_metric, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"ForwardingMetric", &DMWRITE, DMT_INT, get_router_ipv4forwarding_metric, set_router_ipv4forwarding_metric, BBFDM_BOTH, DM_FLAG_UNIQUE}, {0} }; /* *** Device.Routing.Router.{i}.IPv6Forwarding.{i}. *** */ DMLEAF tRoutingRouterIPv6ForwardingParams[] = { /* PARAM, permission, type, getvalue, setvalue, bbfdm_type, version*/ -{"Enable", &DMRouting, DMT_BOOL, get_RoutingRouterIPv6Forwarding_Enable, set_RoutingRouterIPv6Forwarding_Enable, BBFDM_BOTH}, +{"Enable", &DMWRITE, DMT_BOOL, get_RoutingRouterIPv6Forwarding_Enable, set_RoutingRouterIPv6Forwarding_Enable, BBFDM_BOTH}, {"Status", &DMREAD, DMT_STRING, get_RoutingRouterIPv6Forwarding_Status, NULL, BBFDM_BOTH}, {"Alias", &DMWRITE, DMT_STRING, get_RoutingRouterIPv6Forwarding_Alias, set_RoutingRouterIPv6Forwarding_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE}, -{"DestIPPrefix", &DMRouting, DMT_STRING, get_RoutingRouterIPv6Forwarding_DestIPPrefix, set_RoutingRouterIPv6Forwarding_DestIPPrefix, BBFDM_BOTH, DM_FLAG_UNIQUE}, -{"ForwardingPolicy", &DMRouting, DMT_INT, get_RoutingRouterIPv6Forwarding_ForwardingPolicy, set_RoutingRouterIPv6Forwarding_ForwardingPolicy, BBFDM_BOTH, DM_FLAG_UNIQUE}, -{"NextHop", &DMRouting, DMT_STRING, get_RoutingRouterIPv6Forwarding_NextHop, set_RoutingRouterIPv6Forwarding_NextHop, BBFDM_BOTH, DM_FLAG_UNIQUE}, -{"Interface", &DMRouting, DMT_STRING, get_RoutingRouterForwarding_Interface, set_RoutingRouterForwarding_Interface, BBFDM_BOTH, DM_FLAG_UNIQUE|DM_FLAG_REFERENCE}, +{"DestIPPrefix", &DMWRITE, DMT_STRING, get_RoutingRouterIPv6Forwarding_DestIPPrefix, set_RoutingRouterIPv6Forwarding_DestIPPrefix, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"ForwardingPolicy", &DMWRITE, DMT_INT, get_RoutingRouterIPv6Forwarding_ForwardingPolicy, set_RoutingRouterIPv6Forwarding_ForwardingPolicy, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"NextHop", &DMWRITE, DMT_STRING, get_RoutingRouterIPv6Forwarding_NextHop, set_RoutingRouterIPv6Forwarding_NextHop, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"Interface", &DMWRITE, DMT_STRING, get_RoutingRouterForwarding_Interface, set_RoutingRouterForwarding_Interface, BBFDM_BOTH, DM_FLAG_UNIQUE|DM_FLAG_REFERENCE}, {"Origin", &DMREAD, DMT_STRING, get_RoutingRouterIPv6Forwarding_Origin, NULL, BBFDM_BOTH}, -{"ForwardingMetric", &DMRouting, DMT_INT, get_RoutingRouterIPv6Forwarding_ForwardingMetric, set_RoutingRouterIPv6Forwarding_ForwardingMetric, BBFDM_BOTH, DM_FLAG_UNIQUE}, +{"ForwardingMetric", &DMWRITE, DMT_INT, get_RoutingRouterIPv6Forwarding_ForwardingMetric, set_RoutingRouterIPv6Forwarding_ForwardingMetric, BBFDM_BOTH, DM_FLAG_UNIQUE}, {"ExpirationTime", &DMREAD, DMT_TIME, get_RoutingRouterIPv6Forwarding_ExpirationTime, NULL, BBFDM_BOTH}, {0} }; diff --git a/libbbfdm/dmtree/tr181/routing.h b/libbbfdm/dmtree/tr181/routing.h index 35f60108..cc947b2f 100644 --- a/libbbfdm/dmtree/tr181/routing.h +++ b/libbbfdm/dmtree/tr181/routing.h @@ -15,8 +15,6 @@ #include "libbbfdm-api/dmcommon.h" -extern struct dm_permession_s DMRouting; - extern DMOBJ tRoutingObj[]; extern DMLEAF tRoutingParams[]; extern DMOBJ tRoutingRouterObj[];