diff --git a/dmentryjson.c b/dmentryjson.c index 9c113348..58aaecfa 100644 --- a/dmentryjson.c +++ b/dmentryjson.c @@ -366,7 +366,7 @@ static int add_obj(char *refparam, struct dmctx *ctx, void *data, char **instanc dmuci_add_section_bbfdm(arg4, arg3, &dmmap, &v); dmuci_set_value_by_section(dmmap, "section_name", sect_name); - *instance = update_instance(dmmap, inst, buf_instance); + *instance = update_instance(inst, 4, dmmap, buf_instance, arg4, arg3); } } return 0; diff --git a/dmtree/tr064/upnp_configuration.c b/dmtree/tr064/upnp_configuration.c index 4ffd1d49..e97c9265 100755 --- a/dmtree/tr064/upnp_configuration.c +++ b/dmtree/tr064/upnp_configuration.c @@ -284,7 +284,7 @@ int upnp_configuration_ipinterface_createinstance(char *refparam, struct dmctx * dmuci_add_section_and_rename("network", "interface", &iface_sec, &value); dmuci_set_value("network", ip_name, "", "interface"); dmuci_set_value("network", ip_name, "proto", "dhcp"); - *instance = update_instance(iface_sec, iface_instance, "upnp_ip_iface_instance"); + *instance = update_instance(iface_instance, 4, iface_sec, "upnp_ip_iface_instance", "network", "interface"); return 0; } diff --git a/dmtree/tr064/upnp_deviceinfo.c b/dmtree/tr064/upnp_deviceinfo.c index ed775669..7e94352d 100755 --- a/dmtree/tr064/upnp_deviceinfo.c +++ b/dmtree/tr064/upnp_deviceinfo.c @@ -243,7 +243,7 @@ int upnp_deviceinfo_networkinterface_createinstance(char *refparam, struct dmctx dmuci_add_section_and_rename("network", "interface", &iface_sec, &value); dmuci_set_value("network", ip_name, "", "interface"); dmuci_set_value("network", ip_name, "proto", "dhcp"); - *instance = update_instance(iface_sec, iface_instance, "upnp_iface_int_instance"); + *instance = update_instance(iface_instance, 4, iface_sec, "upnp_iface_int_instance", "network", "interface"); return 0; } diff --git a/dmtree/tr104/voice_services.c b/dmtree/tr104/voice_services.c index 3ebce108..a47eac08 100644 --- a/dmtree/tr104/voice_services.c +++ b/dmtree/tr104/voice_services.c @@ -312,7 +312,7 @@ static int add_profile_object(char *refparam, struct dmctx *ctx, void *data, cha dmuci_add_section_bbfdm("dmmap_asterisk", "sip_service_provider", &dmmap_voice_section, &v); dmuci_set_value_by_section(dmmap_voice_section, "section_name", sname); - *instancepara = update_instance(dmmap_voice_section, instance, "profileinstance"); + *instancepara = update_instance(instance, 4, dmmap_voice_section, "profileinstance", "dmmap_asterisk", "sip_service_provider"); return 0; } diff --git a/dmtree/tr181/atm.c b/dmtree/tr181/atm.c index a3ab30fb..38b24041 100644 --- a/dmtree/tr181/atm.c +++ b/dmtree/tr181/atm.c @@ -253,9 +253,10 @@ static int add_atm_link(char *refparam, struct dmctx *ctx, void *data, char **in dmuci_set_value("dsl", atm_device, "link_type", "eoa"); dmuci_set_value("dsl", atm_device, "encapsulation", "llc"); dmuci_set_value("dsl", atm_device, "qos_class", "ubr"); + dmuci_add_section_bbfdm("dmmap_dsl", "atm-device", &dmmap_atm, &v); dmuci_set_value_by_section(dmmap_atm, "section_name", atm_device); - *instancepara = update_instance(dmmap_atm, instance, "atmlinkinstance"); + *instancepara = update_instance(instance, 4, dmmap_atm, "atmlinkinstance", "dmmap_dsl", "atm-device"); return 0; } diff --git a/dmtree/tr181/bridging.c b/dmtree/tr181/bridging.c index 245407cc..9c66c3ce 100644 --- a/dmtree/tr181/bridging.c +++ b/dmtree/tr181/bridging.c @@ -829,7 +829,7 @@ static int addObjBridgingBridge(char *refparam, struct dmctx *ctx, void *data, c dmuci_add_section_bbfdm("dmmap_network", "interface", &dmmap_bridge, &v); dmuci_set_value_by_section(dmmap_bridge, "section_name", bridge_name); dmuci_set_value_by_section(dmmap_bridge, "added_by_user", "1"); - *instance = update_instance(dmmap_bridge, last_inst, "bridge_instance"); + *instance = update_instance(last_inst, 4, dmmap_bridge, "bridge_instance", "dmmap_network", "interface"); return 0; } diff --git a/dmtree/tr181/dhcpv4.c b/dmtree/tr181/dhcpv4.c index ff3531ad..be2e5152 100644 --- a/dmtree/tr181/dhcpv4.c +++ b/dmtree/tr181/dhcpv4.c @@ -151,7 +151,7 @@ static int add_dhcp_server(char *refparam, struct dmctx *ctx, void *data, char * dmuci_add_section_bbfdm("dmmap_dhcp", "dhcp", &dmmap_dhcp, &v); dmuci_set_value_by_section(dmmap_dhcp, "section_name", section_name(s)); - *instancepara = update_instance(dmmap_dhcp, instance, "dhcp_instance"); + *instancepara = update_instance(instance, 4, dmmap_dhcp, "dhcp_instance", "dmmap_dhcp", "dhcp"); return 0; } @@ -211,7 +211,7 @@ static int add_dhcp_staticaddress(char *refparam, struct dmctx *ctx, void *data, dmuci_add_section_bbfdm("dmmap_dhcp", "host", &dmmap_dhcp_host, &v); dmuci_set_value_by_section(dmmap_dhcp_host, "section_name", section_name(s)); dmuci_set_value_by_section(dmmap_dhcp_host, "dhcp", ((struct dhcp_args *)data)->interface); - *instancepara = update_instance(dmmap_dhcp_host, instance, "ldhcpinstance"); + *instancepara = update_instance(instance, 4, dmmap_dhcp_host, "ldhcpinstance", "dmmap_dhcp", "host"); return 0; } @@ -270,9 +270,10 @@ static int addObjDHCPv4Client(char *refparam, struct dmctx *ctx, void *data, cha dmuci_set_value_by_section(s, "proto", "dhcp"); dmuci_set_value_by_section(s, "ifname", wanname); dmuci_set_value_by_section(s, "type", "anywan"); + dmuci_add_section_bbfdm("dmmap_dhcp_client", "interface", &dmmap_sect, &v); dmuci_set_value_by_section(dmmap_sect, "section_name", section_name(s)); - *instance = update_instance(dmmap_sect, instancepara, "bbf_dhcpv4client_instance"); + *instance = update_instance(instancepara, 4, dmmap_sect, "bbf_dhcpv4client_instance", "dmmap_dhcp_client", "interface"); return 0; } @@ -357,6 +358,7 @@ static int addObjDHCPv4ClientSentOption(char *refparam, struct dmctx *ctx, void { struct dhcp_client_args *dhcp_client_args = (struct dhcp_client_args*)data; struct uci_section *dmmap_sect; + struct browse_args browse_args = {0}; char *value, *instancepara; check_create_dmmap_package("dmmap_dhcp_client"); @@ -365,7 +367,11 @@ static int addObjDHCPv4ClientSentOption(char *refparam, struct dmctx *ctx, void if(dhcp_client_args->dhcp_client_conf != NULL) DMUCI_SET_VALUE_BY_SECTION(bbfdm, dmmap_sect, "section_name", section_name(dhcp_client_args->dhcp_client_conf)); DMUCI_SET_VALUE_BY_SECTION(bbfdm, dmmap_sect, "option_tag", "0"); - *instance = update_instance(dmmap_sect, instancepara, "bbf_dhcpv4_sentopt_instance"); + + browse_args.option = "section_name"; + browse_args.value = section_name(dhcp_client_args->dhcp_client_conf); + + *instance = update_instance(instancepara, 6, dmmap_sect, "bbf_dhcpv4_sentopt_instance", "dmmap_dhcp_client", "send_option", check_browse_section, (void *)&browse_args); return 0; } @@ -401,6 +407,7 @@ static int addObjDHCPv4ClientReqOption(char *refparam, struct dmctx *ctx, void * { struct dhcp_client_args *dhcp_client_args = (struct dhcp_client_args*)data; struct uci_section *dmmap_sect; + struct browse_args browse_args = {0}; char *value, *instancepara; check_create_dmmap_package("dmmap_dhcp_client"); @@ -409,7 +416,11 @@ static int addObjDHCPv4ClientReqOption(char *refparam, struct dmctx *ctx, void * if(dhcp_client_args->dhcp_client_conf != NULL) DMUCI_SET_VALUE_BY_SECTION(bbfdm, dmmap_sect, "section_name", section_name(dhcp_client_args->dhcp_client_conf)); DMUCI_SET_VALUE_BY_SECTION(bbfdm, dmmap_sect, "option_tag", "0"); - *instance = update_instance(dmmap_sect, instancepara, "bbf_dhcpv4_sentopt_instance"); + + browse_args.option = "section_name"; + browse_args.value = section_name(dhcp_client_args->dhcp_client_conf); + + *instance = update_instance(instancepara, 6, dmmap_sect, "bbf_dhcpv4_sentopt_instance", "dmmap_dhcp_client", "req_option", check_browse_section, (void *)&browse_args); return 0; } @@ -443,6 +454,7 @@ static int addObjDHCPv4ServerPoolOption(char *refparam, struct dmctx *ctx, void { struct dhcp_args *dhcp_arg = (struct dhcp_args*)data; struct uci_section *dmmap_sect; + struct browse_args browse_args = {0}; char *value, *instancepara; check_create_dmmap_package("dmmap_dhcp"); @@ -451,7 +463,11 @@ static int addObjDHCPv4ServerPoolOption(char *refparam, struct dmctx *ctx, void if(dhcp_arg->dhcp_sec != NULL) DMUCI_SET_VALUE_BY_SECTION(bbfdm, dmmap_sect, "section_name", section_name(dhcp_arg->dhcp_sec)); DMUCI_SET_VALUE_BY_SECTION(bbfdm, dmmap_sect, "option_tag", "0"); - *instance = update_instance(dmmap_sect, instancepara, "bbf_dhcpv4_servpool_option_instance"); + + browse_args.option = "section_name"; + browse_args.value = section_name(dhcp_arg->dhcp_sec); + + *instance = update_instance(instancepara, 6, dmmap_sect, "bbf_dhcpv4_servpool_option_instance", "dmmap_dhcp", "servpool_option", check_browse_section, (void *)&browse_args); return 0; } @@ -493,7 +509,7 @@ static int addObjDHCPv4RelayForwarding(char *refparam, struct dmctx *ctx, void * dmuci_set_value_by_section(s, "proto", "relay"); dmuci_add_section_bbfdm("dmmap_dhcp_relay", "interface", &dmmap_sect, &v); dmuci_set_value_by_section(dmmap_sect, "section_name", section_name(s)); - *instance = update_instance(dmmap_sect, instancepara, "bbf_dhcpv4relay_instance"); + *instance = update_instance(instancepara, 4, dmmap_sect, "bbf_dhcpv4relay_instance", "dmmap_dhcp_relay", "interface"); return 0; } diff --git a/dmtree/tr181/dhcpv6.c b/dmtree/tr181/dhcpv6.c index 8a8f89cf..7f7bfc44 100644 --- a/dmtree/tr181/dhcpv6.c +++ b/dmtree/tr181/dhcpv6.c @@ -316,7 +316,7 @@ static int addObjDHCPv6Client(char *refparam, struct dmctx *ctx, void *data, cha dmuci_set_value_by_section(s, "type", "anywan"); dmuci_add_section_bbfdm("dmmap_dhcpv6", "interface", &dmmap_sect, &v); dmuci_set_value_by_section(dmmap_sect, "section_name", section_name(s)); - *instance = update_instance(dmmap_sect, instancepara, "bbf_dhcpv6client_instance"); + *instance = update_instance(instancepara, 4, dmmap_sect, "bbf_dhcpv6client_instance", "dmmap_dhcpv6", "interface"); return 0; } @@ -381,7 +381,7 @@ static int addObjDHCPv6ServerPool(char *refparam, struct dmctx *ctx, void *data, dmuci_add_section_bbfdm("dmmap_dhcpv6", "dhcp", &dmmap_dhcp, &v); dmuci_set_value_by_section(dmmap_dhcp, "section_name", section_name(s)); - *instance = update_instance(dmmap_dhcp, instancepara, "dhcpv6_serv_pool_instance"); + *instance = update_instance(instancepara, 4, dmmap_dhcp, "dhcpv6_serv_pool_instance", "dmmap_dhcpv6", "dhcp"); return 0; } @@ -434,6 +434,7 @@ static int addObjDHCPv6ServerPoolOption(char *refparam, struct dmctx *ctx, void { struct dhcpv6_args *dhcp_arg = (struct dhcpv6_args*)data; struct uci_section *dmmap_sect; + struct browse_args browse_args = {0}; char *value, *instancepara; check_create_dmmap_package("dmmap_dhcpv6"); @@ -442,7 +443,11 @@ static int addObjDHCPv6ServerPoolOption(char *refparam, struct dmctx *ctx, void if (dhcp_arg->dhcp_sec != NULL) DMUCI_SET_VALUE_BY_SECTION(bbfdm, dmmap_sect, "section_name", section_name(dhcp_arg->dhcp_sec)); DMUCI_SET_VALUE_BY_SECTION(bbfdm, dmmap_sect, "option_tag", "0"); - *instance = update_instance(dmmap_sect, instancepara, "bbf_dhcpv6_servpool_option_instance"); + + browse_args.option = "section_name"; + browse_args.value = section_name(dhcp_arg->dhcp_sec); + + *instance = update_instance(instancepara, 6, dmmap_sect, "bbf_dhcpv6_servpool_option_instance", "dmmap_dhcpv6", "servpool_option", check_browse_section, (void *)&browse_args); return 0; } diff --git a/dmtree/tr181/dns.c b/dmtree/tr181/dns.c index 59c6a9c8..65a88e96 100644 --- a/dmtree/tr181/dns.c +++ b/dmtree/tr181/dns.c @@ -174,7 +174,7 @@ static int add_client_server(char *refparam, struct dmctx *ctx, void *data, char dmuci_set_value_by_section(s, "ip", "0.0.0.0"); dmuci_set_value_by_section(s, "interface", "lan"); dmuci_set_value_by_section(s, "enable", "1"); - *instance = update_instance(s, inst, "dns_server_instance"); + *instance = update_instance(inst, 4, s, "dns_server_instance", "dmmap_dns", "dns_server"); return 0; } @@ -190,7 +190,7 @@ static int add_relay_forwarding(char *refparam, struct dmctx *ctx, void *data, c dmuci_set_value_by_section(s, "ip", "0.0.0.0"); dmuci_set_value_by_section(s, "interface", "lan"); dmuci_set_value_by_section(s, "enable", "1"); - *instance = update_instance(s, inst, "dns_server_instance"); + *instance = update_instance(inst, 4, s, "dns_server_instance", "dmmap_dns", "dns_server"); return 0; } diff --git a/dmtree/tr181/dynamicdns.c b/dmtree/tr181/dynamicdns.c index 295766a8..ab808203 100644 --- a/dmtree/tr181/dynamicdns.c +++ b/dmtree/tr181/dynamicdns.c @@ -177,7 +177,7 @@ static int addObjDynamicDNSClient(char *refparam, struct dmctx *ctx, void *data, dmuci_add_section_bbfdm("dmmap_ddns", "service", &dmmap, &v); dmuci_set_value_by_section(dmmap, "section_name", section_name(s)); - *instance = update_instance(dmmap, last_inst, "clientinstance"); + *instance = update_instance(last_inst, 4, dmmap, "clientinstance", "dmmap_ddns", "service"); return 0; } @@ -240,7 +240,7 @@ static int addObjDynamicDNSServer(char *refparam, struct dmctx *ctx, void *data, dmuci_add_section_bbfdm("dmmap_ddns", "ddns_server", &dmmap, &v); dmuci_set_value_by_section(dmmap, "section_name", section_name(s)); - *instance = update_instance(dmmap, last_inst, "serverinstance"); + *instance = update_instance(last_inst, 4, dmmap, "serverinstance", "dmmap_ddns", "ddns_server"); return 0; } diff --git a/dmtree/tr181/ethernet.c b/dmtree/tr181/ethernet.c index 1a2f7cad..825eda77 100644 --- a/dmtree/tr181/ethernet.c +++ b/dmtree/tr181/ethernet.c @@ -205,7 +205,7 @@ static char *get_vlan_last_instance_bbfdm(char *package, char *section, char *op dmuci_set_value_by_section(s, "vlan_term_instance", ""); continue; } - inst = update_instance(s, last_inst, opt_inst); + inst = update_instance(last_inst, 4, s, opt_inst, package, section); if(last_inst) dmfree(last_inst); last_inst = dmstrdup(inst); @@ -354,7 +354,7 @@ static int addObjEthernetLink(char *refparam, struct dmctx *ctx, void *data, cha /* Add link section in dmmap file */ dmuci_add_section_bbfdm(DMMAP, "link", &dmmap_link, &v); dmuci_set_value_by_section(dmmap_link, "section_name", interface_name); - *instance = update_instance(dmmap_link, inst, "link_instance"); + *instance = update_instance(inst, 4, dmmap_link, "link_instance", "dmmap", "link"); return 0; } @@ -418,7 +418,7 @@ static int addObjEthernetVLANTermination(char *refparam, struct dmctx *ctx, void // Add device section in dmmap_network file dmuci_add_section_bbfdm("dmmap_network", "device", &dmmap_network, &v); dmuci_set_value_by_section(dmmap_network, "section_name", device_name); - *instance = update_instance(dmmap_network, inst, "vlan_term_instance"); + *instance = update_instance(inst, 4, dmmap_network, "vlan_term_instance", "dmmap_network", "device"); return 0; } diff --git a/dmtree/tr181/firewall.c b/dmtree/tr181/firewall.c index b6d72f5e..0ce6378d 100644 --- a/dmtree/tr181/firewall.c +++ b/dmtree/tr181/firewall.c @@ -77,7 +77,7 @@ static int add_firewall_rule(char *refparam, struct dmctx *ctx, void *data, char dmuci_add_section_bbfdm("dmmap_firewall", "rule", &dmmap_firewall_rule, &v); dmuci_set_value_by_section(dmmap_firewall_rule, "section_name", sect_name); - *instance = update_instance(dmmap_firewall_rule, last_inst, "firewall_chain_rule_instance"); + *instance = update_instance(last_inst, 4, dmmap_firewall_rule, "firewall_chain_rule_instance", "dmmap_firewall", "rule"); return 0; } diff --git a/dmtree/tr181/gre.c b/dmtree/tr181/gre.c index 224b4553..92b4ee7d 100644 --- a/dmtree/tr181/gre.c +++ b/dmtree/tr181/gre.c @@ -89,7 +89,7 @@ static int addObjGRETunnel(char *refparam, struct dmctx *ctx, void *data, char * dmuci_add_section_bbfdm("dmmap_network", "interface", &dmmap_sec, &v); dmuci_set_value_by_section(dmmap_sec, "section_name", section_name(gre_sec)); - *instancepara = update_instance(dmmap_sec, instance, "gretunnel_instance"); + *instancepara = update_instance(instance, 4, dmmap_sec, "gretunnel_instance", "dmmap_network", "interface"); return 0; } @@ -137,6 +137,7 @@ static int addObjGRETunnelInterface(char *refparam, struct dmctx *ctx, void *dat { char *value, *v, *instance, *ifname; struct uci_section *greiface_sec = NULL, *dmmap_sec= NULL, *route_sec= NULL; + struct browse_args browse_args = {0}; check_create_dmmap_package("dmmap_network"); instance= get_last_instance_lev2_bbfdm_dmmap_opt("dmmap_network", "interface", "greiface_instance", "gre_tunnel_sect", section_name(((struct dmmap_dup *)data)->config_section)); @@ -148,10 +149,13 @@ static int addObjGRETunnelInterface(char *refparam, struct dmctx *ctx, void *dat dmuci_add_section("network", "route", &route_sec, &value); dmuci_set_value_by_section(route_sec, "interface", section_name(greiface_sec)); + browse_args.option = "gre_tunnel_sect"; + browse_args.value = section_name(((struct dmmap_dup *)data)->config_section); + dmuci_add_section_bbfdm("dmmap_network", "interface", &dmmap_sec, &v); dmuci_set_value_by_section(dmmap_sec, "section_name", section_name(greiface_sec)); dmuci_set_value_by_section(dmmap_sec, "gre_tunnel_sect", section_name(((struct dmmap_dup *)data)->config_section)); - *instancepara = update_instance(dmmap_sec, instance, "greiface_instance"); + *instancepara = update_instance(instance, 6, dmmap_sec, "greiface_instance", "dmmap_network", "interface", check_browse_section, (void *)&browse_args); return 0; } diff --git a/dmtree/tr181/ip.c b/dmtree/tr181/ip.c index 386a3b4d..1525ecb6 100644 --- a/dmtree/tr181/ip.c +++ b/dmtree/tr181/ip.c @@ -1548,7 +1548,7 @@ static int set_IPInterfaceIPv6Prefix_Alias(char *refparam, struct dmctx *ctx, vo /************************************************************* * ADD & DEL OBJ **************************************************************/ -static char *get_last_instance_cond(char* dmmap_package, char *package, char *section, char *opt_inst, char *opt_cond, char *cond_val, char *opt_filter, char *filter_val, char *refused_interface) +static char *get_last_instance_cond(char *dmmap_package, char *package, char *section, char *opt_inst, char *opt_cond, char *cond_val, char *opt_filter, char *filter_val, char *refused_interface) { struct uci_section *s, *dmmap_section; char *inst = NULL, *val, *val_f; @@ -1584,7 +1584,7 @@ static char *get_last_instance_cond(char* dmmap_package, char *package, char *se continue; } get_dmmap_section_of_config_section(dmmap_package, section, section_name(s), &dmmap_section); - inst = update_instance(dmmap_section, inst, opt_inst); + inst = update_instance(inst, 4, dmmap_section, opt_inst, dmmap_package, section); } return inst; } @@ -1606,7 +1606,7 @@ static int add_ip_interface(char *refparam, struct dmctx *ctx, void *data, char dmuci_add_section_bbfdm("dmmap_network", "interface", &dmmap_ip_interface, &v); dmuci_set_value_by_section(dmmap_ip_interface, "section_name", ip_name); - *instance = update_instance(dmmap_ip_interface, last_inst, "ip_int_instance"); + *instance = update_instance(last_inst, 4, dmmap_ip_interface, "ip_int_instance", "dmmap_network", "interface"); return 0; } @@ -1660,7 +1660,7 @@ static int add_ipv4(char *refparam, struct dmctx *ctx, void *data, char **instan get_dmmap_section_of_config_section("dmmap_network", "interface", section_name(((struct ip_args *)data)->ip_sec), &dmmap_section); dmuci_get_value_by_section_string(dmmap_section, "ipv4_instance", &instance); - *instancepara = update_instance(dmmap_section, instance, "ipv4_instance"); + *instancepara = update_instance(instance, 4, dmmap_section, "ipv4_instance", "dmmap_network", "interface"); if(instance[0] == '\0') { dmuci_set_value_by_section(dmmap_section, "ipv4_instance", *instancepara); dmuci_set_value_by_section(((struct ip_args *)data)->ip_sec, "ipaddr", "0.0.0.0"); @@ -1777,7 +1777,7 @@ static char *get_last_instance_with_option(char *package, char *section, char *o char *inst = NULL; uci_foreach_option_eq(package, section, option, val, s) { - inst = update_instance(s, inst, opt_inst); + inst = update_instance(inst, 4, s, opt_inst, package, section); } return inst; } diff --git a/dmtree/tr181/nat.c b/dmtree/tr181/nat.c index 0e0a1745..b4174857 100644 --- a/dmtree/tr181/nat.c +++ b/dmtree/tr181/nat.c @@ -33,7 +33,7 @@ static int add_NAT_InterfaceSetting(char *refparam, struct dmctx *ctx, void *dat dmuci_add_section_bbfdm("dmmap_firewall", "zone", &dmmap_firewall, &v); dmuci_set_value_by_section(dmmap_firewall, "section_name", section_name(s)); - *instance = update_instance(dmmap_firewall, inst, "interface_setting_instance"); + *instance = update_instance(inst, 4, dmmap_firewall, "interface_setting_instance", "dmmap_firewall", "zone"); return 0; } @@ -89,7 +89,7 @@ static int add_NAT_PortMapping(char *refparam, struct dmctx *ctx, void *data, ch dmuci_add_section_bbfdm("dmmap_firewall", "redirect", &dmmap_firewall, &v); dmuci_set_value_by_section(dmmap_firewall, "section_name", section_name(s)); - *instance = update_instance(dmmap_firewall, inst, "port_mapping_instance"); + *instance = update_instance(inst, 4, dmmap_firewall, "port_mapping_instance", "dmmap_firewall", "redirect"); return 0; } diff --git a/dmtree/tr181/ppp.c b/dmtree/tr181/ppp.c index ff2bddcf..8008cc8f 100644 --- a/dmtree/tr181/ppp.c +++ b/dmtree/tr181/ppp.c @@ -414,7 +414,7 @@ static int add_ppp_interface(char *refparam, struct dmctx *ctx, void *data, char dmuci_set_value("network", name, "password", name); dmuci_add_section_bbfdm("dmmap_network", "interface", &dmmap_ppp, &v); dmuci_set_value_by_section(dmmap_ppp, "section_name", name); - *instance = update_instance(dmmap_ppp, inst, "ppp_int_instance"); + *instance = update_instance(inst, 4, dmmap_ppp, "ppp_int_instance", "dmmap_network", "interface"); return 0; } diff --git a/dmtree/tr181/ptm.c b/dmtree/tr181/ptm.c index cf3ce565..c264b38e 100644 --- a/dmtree/tr181/ptm.c +++ b/dmtree/tr181/ptm.c @@ -145,7 +145,7 @@ static int add_ptm_link(char *refparam, struct dmctx *ctx, void *data, char **in dmuci_set_value("dsl", ptm_device, "portid", "1"); dmuci_add_section_bbfdm("dmmap_dsl", "ptm-device", &dmmap_ptm, &v); dmuci_set_value_by_section(dmmap_ptm, "section_name", ptm_device); - *instancepara = update_instance(dmmap_ptm, instance, "ptmlinkinstance"); + *instancepara = update_instance(instance, 4, dmmap_ptm, "ptmlinkinstance", "dmmap_dsl", "ptm-device"); return 0; } diff --git a/dmtree/tr181/qos-iopsyswrt.c b/dmtree/tr181/qos-iopsyswrt.c index 06bcb4f6..50bbea6b 100644 --- a/dmtree/tr181/qos-iopsyswrt.c +++ b/dmtree/tr181/qos-iopsyswrt.c @@ -157,7 +157,7 @@ int os_addObjQoSClassification(char *refparam, struct dmctx *ctx, void *data, ch dmuci_add_section_bbfdm("dmmap_qos", "classify", &dmmap, &v); dmuci_set_value_by_section(dmmap, "section_name", section_name(s)); - *instance = update_instance(dmmap, inst, "classify_instance"); + *instance = update_instance(inst, 4, dmmap, "classify_instance", "dmmap_qos", "classify"); return 0; } @@ -277,7 +277,7 @@ int os_addObjQoSQueue(char *refparam, struct dmctx *ctx, void *data, char **inst dmuci_add_section_bbfdm("dmmap_qos", "queue", &dmmap, &v); dmuci_set_value_by_section(dmmap, "section_name", section_name(s)); - *instance = update_instance(dmmap, inst, "queueinstance"); + *instance = update_instance(inst, 4, dmmap, "queueinstance", "dmmap_qos", "queue"); return 0; } @@ -356,7 +356,7 @@ int os_addObjQoSShaper(char *refparam, struct dmctx *ctx, void *data, char **ins dmuci_add_section_bbfdm("dmmap_qos", "shaper", &dmmap, &v); dmuci_set_value_by_section(dmmap, "section_name", section_name(s)); - *instance = update_instance(dmmap, inst, "shaperinstance"); + *instance = update_instance(inst, 4, dmmap, "shaperinstance", "dmmap_qos", "shaper"); return 0; } diff --git a/dmtree/tr181/qos-openwrt.c b/dmtree/tr181/qos-openwrt.c index f26c590f..109f3c2f 100644 --- a/dmtree/tr181/qos-openwrt.c +++ b/dmtree/tr181/qos-openwrt.c @@ -189,7 +189,7 @@ int os_addObjQoSClassification(char *refparam, struct dmctx *ctx, void *data, ch dmuci_add_section_bbfdm("dmmap_qos", "classify", &dmmap_qos_classify, &v); dmuci_set_value_by_section(dmmap_qos_classify, "section_name", sect_name); - *instance = update_instance(dmmap_qos_classify, last_inst, "classifinstance"); + *instance = update_instance(last_inst, 4, dmmap_qos_classify, "classifinstance", "dmmap_qos", "classify"); return 0; } @@ -310,7 +310,7 @@ int os_addObjQoSQueue(char *refparam, struct dmctx *ctx, void *data, char **inst dmuci_add_section_bbfdm("dmmap_qos", "class", &dmmap_qos_class, &v); dmuci_set_value_by_section(dmmap_qos_class, "section_name", sect_name); - *instance = update_instance(dmmap_qos_class, last_inst, "queueinstance"); + *instance = update_instance(last_inst, 4, dmmap_qos_class, "queueinstance", "dmmap_qos", "class"); return 0; } @@ -407,7 +407,7 @@ int addObjQoSShaper(char *refparam, struct dmctx *ctx, void *data, char **instan dmuci_add_section_bbfdm("dmmap_qos", "class", &dmmap_qos_class, &v); dmuci_set_value_by_section(dmmap_qos_class, "section_name", sect_name); - *instance = update_instance(dmmap_qos_class, last_inst, "shaperinstance"); + *instance = update_instance(last_inst, 4, dmmap_qos_class, "shaperinstance", "dmmap_qos", "class"); return 0; } diff --git a/dmtree/tr181/routing.c b/dmtree/tr181/routing.c index 62a10f40..459d989a 100644 --- a/dmtree/tr181/routing.c +++ b/dmtree/tr181/routing.c @@ -1108,7 +1108,7 @@ static int add_ipv4forwarding(char *refparam, struct dmctx *ctx, void *data, cha dmuci_add_section_bbfdm("dmmap_route_forwarding", "route", &dmmap_route, &v); dmuci_set_value_by_section(dmmap_route, "section_name", section_name(s)); - *instancepara = update_instance(dmmap_route, instance, "routeinstance"); + *instancepara = update_instance(instance, 4, dmmap_route, "routeinstance", "dmmap_route_forwarding", "route"); return 0; } @@ -1148,7 +1148,7 @@ static int add_ipv6Forwarding(char *refparam, struct dmctx *ctx, void *data, cha dmuci_add_section_bbfdm("dmmap_route_forwarding", "route6", &dmmap_route, &v); dmuci_set_value_by_section(dmmap_route, "section_name", section_name(s)); - *instancepara = update_instance(dmmap_route, instance, "route6instance"); + *instancepara = update_instance(instance, 4, dmmap_route, "route6instance", "dmmap_route_forwarding", "route6"); return 0; } diff --git a/dmtree/tr181/users.c b/dmtree/tr181/users.c index ee068059..8d620fa0 100644 --- a/dmtree/tr181/users.c +++ b/dmtree/tr181/users.c @@ -47,8 +47,8 @@ static int add_users_user(char *refparam, struct dmctx *ctx, void *data, char ** dmuci_set_value_by_section(s, "password", username); dmuci_add_section_bbfdm("dmmap_users", "user", &dmmap_user, &v); - dmuci_set_value_by_section(dmmap_user, "section_name", sect_name); - *instance = update_instance(dmmap_user, last_inst, "user_instance"); + dmuci_set_value_by_section(dmmap_user, "section_name", username); + *instance = update_instance(last_inst, 4, dmmap_user, "user_instance", "dmmap_users", "user"); return 0; } @@ -186,12 +186,18 @@ static int set_user_enable(char *refparam, struct dmctx *ctx, void *data, char * static int set_user_username(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) { + struct uci_section *dmmap_section = NULL; + switch (action) { case VALUECHECK: if (dm_validate_string(value, -1, 64, NULL, 0, NULL, 0)) return FAULT_9007; break; case VALUESET: + // Update dmmap_users file + get_dmmap_section_of_config_section("dmmap_users", "user", section_name((struct uci_section *)data), &dmmap_section); + dmuci_set_value_by_section(dmmap_section, "section_name", value); + // Update users config dmuci_rename_section_by_section((struct uci_section *)data, value); break; } diff --git a/dmtree/tr181/wifi.c b/dmtree/tr181/wifi.c index 117949ac..24ff7f41 100644 --- a/dmtree/tr181/wifi.c +++ b/dmtree/tr181/wifi.c @@ -1995,7 +1995,7 @@ static int add_wifi_ssid(char *refparam, struct dmctx *ctx, void *data, char **i dmuci_add_section_bbfdm("dmmap_wireless", "wifi-iface", &dmmap_wifi, &v); dmuci_set_value_by_section(dmmap_wifi, "section_name", section_name(s)); - *instance = update_instance(dmmap_wifi, inst, "ssidinstance"); + *instance = update_instance(inst, 4, dmmap_wifi, "ssidinstance", "dmmap_wireless", "wifi-iface"); return 0; } @@ -2046,7 +2046,7 @@ static int add_wifi_accesspoint(char *refparam, struct dmctx *ctx, void *data, c dmuci_add_section_bbfdm("dmmap_wireless", "wifi-iface", &dmmap_wifi, &v); dmuci_set_value_by_section(dmmap_wifi, "section_name", section_name(s)); - *instance = update_instance(dmmap_wifi, inst, "ap_instance"); + *instance = update_instance(inst, 4, dmmap_wifi, "ap_instance", "dmmap_wireless", "wifi-iface"); return 0; } @@ -2089,7 +2089,7 @@ static int addObjWiFiEndPoint(char *refparam, struct dmctx *ctx, void *data, cha check_create_dmmap_package("dmmap_wireless"); instancepara1 = get_last_instance_lev2_bbfdm("wireless", "wifi-iface", "dmmap_wireless", "endpointinstance", "mode", "wet")?get_last_instance_lev2_bbfdm("wireless", "wifi-iface", "dmmap_wireless", "endpointinstance", "mode", "wet"):"0"; instancepara2 = get_last_instance_lev2_bbfdm("wireless", "wifi-iface", "dmmap_wireless", "endpointinstance", "mode", "sta")?get_last_instance_lev2_bbfdm("wireless", "wifi-iface", "dmmap_wireless", "endpointinstance", "mode", "sta"):"0"; - instancepara=atoi(instancepara1)>atoi(instancepara2)?dmstrdup(instancepara1):dmstrdup(instancepara2); + instancepara = atoi(instancepara1)>atoi(instancepara2)?dmstrdup(instancepara1):dmstrdup(instancepara2); dmuci_add_section("wireless", "wifi-iface", &endpoint_sec, &value); dmuci_set_value_by_section(endpoint_sec, "device", "wl1"); dmuci_set_value_by_section(endpoint_sec, "mode", "wet"); @@ -2097,7 +2097,7 @@ static int addObjWiFiEndPoint(char *refparam, struct dmctx *ctx, void *data, cha dmuci_add_section_bbfdm("dmmap_wireless", "wifi-iface", &dmmap_sec, &v); dmuci_set_value_by_section(dmmap_sec, "section_name", section_name(endpoint_sec)); - *instance = update_instance(dmmap_sec, instancepara, "endpointinstance"); + *instance = update_instance(instancepara, 4, dmmap_sec, "endpointinstance", "dmmap_wireless", "wifi-iface"); return 0; } diff --git a/dmtree/tr181/x_iopsys_eu_dropbear.c b/dmtree/tr181/x_iopsys_eu_dropbear.c index 8339bcca..7a209f5a 100644 --- a/dmtree/tr181/x_iopsys_eu_dropbear.c +++ b/dmtree/tr181/x_iopsys_eu_dropbear.c @@ -342,7 +342,7 @@ int add_dropbear_instance(char *refparam, struct dmctx *ctx, void *data, char ** dmuci_add_section_bbfdm("dmmap_dropbear", "dropbear", &dmmap_sec, &v); dmuci_set_value_by_section(dmmap_sec, "section_name", section_name(dropbear_sec)); - *instancepara = update_instance(dmmap_sec, instance, "dropbearinstance"); + *instancepara = update_instance(instance, 4, dmmap_sec, "dropbearinstance", "dmmap_dropbear", "dropbear"); return 0; } diff --git a/dmtree/tr181/x_iopsys_eu_igmp.c b/dmtree/tr181/x_iopsys_eu_igmp.c index 2484a2a7..72522f39 100644 --- a/dmtree/tr181/x_iopsys_eu_igmp.c +++ b/dmtree/tr181/x_iopsys_eu_igmp.c @@ -273,14 +273,11 @@ static int add_igmp_proxy_obj(char *refparam, struct dmctx *ctx, void *data, cha { char *inst, *value, *v, *s_name; struct uci_section *dmmap = NULL, *s = NULL; - char i_no[16]; + struct browse_args browse_args = {0}; check_create_dmmap_package("dmmap_mcast"); - inst = get_last_instance_lev2_bbfdm_dmmap_opt("dmmap_mcast", "proxy", "proxy_instance", - "proto", "igmp"); - snprintf(i_no, sizeof(i_no), "%d", inst ? atoi(inst)+1 : 1); - - dmasprintf(&s_name, "igmp_proxy_%s", i_no); + inst = get_last_instance_lev2_bbfdm_dmmap_opt("dmmap_mcast", "proxy", "proxy_instance", "proto", "igmp"); + dmasprintf(&s_name, "igmp_proxy_%d", inst ? atoi(inst)+1 : 1); dmuci_add_section("mcast", "proxy", &s, &value); dmuci_rename_section_by_section(s, s_name); @@ -290,10 +287,13 @@ static int add_igmp_proxy_obj(char *refparam, struct dmctx *ctx, void *data, cha dmuci_set_value_by_section(s, "robustness", "2"); dmuci_set_value_by_section(s, "aggregation", "0"); + browse_args.option = "proto"; + browse_args.value = "igmp"; + dmuci_add_section_bbfdm("dmmap_mcast", "proxy", &dmmap, &v); dmuci_set_value_by_section(dmmap, "section_name", section_name(s)); dmuci_set_value_by_section(dmmap, "proto", "igmp"); - *instance = update_instance(dmmap, inst, "proxy_instance"); + *instance = update_instance(inst, 6, dmmap, "proxy_instance", "dmmap_mcast", "proxy", check_browse_section, (void *)&browse_args); return 0; } @@ -346,14 +346,19 @@ static int del_igmp_proxy_obj(char *refparam, struct dmctx *ctx, void *data, cha static int browse_igmp_proxy_inst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance) { char *inst = NULL, *max_inst = NULL; + struct browse_args browse_args = {0}; struct dmmap_dup *p; LIST_HEAD(dup_list); synchronize_specific_config_sections_with_dmmap_cont("mcast", "proxy", "dmmap_mcast", "proto", "igmp", &dup_list); list_for_each_entry(p, &dup_list, list) { - inst = handle_update_instance(1, dmctx, &max_inst, update_instance_alias, 5, - p->dmmap_section, "proxy_instance", "proxy_alias", "dmmap_mcast", "proxy"); + browse_args.option = "proto"; + browse_args.value = "igmp"; + + inst = handle_update_instance(1, dmctx, &max_inst, update_instance_alias, 7, + p->dmmap_section, "proxy_instance", "proxy_alias", "dmmap_mcast", "proxy", + check_browse_section, (void *)&browse_args); if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)p->config_section, inst) == DM_STOP) break; @@ -367,14 +372,11 @@ static int add_igmp_snooping_obj(char *refparam, struct dmctx *ctx, void *data, { char *inst, *value, *v, *s_name; struct uci_section *dmmap = NULL, *s = NULL; - char i_no[16]; + struct browse_args browse_args = {0}; check_create_dmmap_package("dmmap_mcast"); - inst = get_last_instance_lev2_bbfdm_dmmap_opt("dmmap_mcast", "snooping", - "snooping_instance", "proto", "igmp"); - snprintf(i_no, sizeof(i_no), "%d", inst ? atoi(inst)+1 : 1); - - dmasprintf(&s_name, "igmp_snoop_%s", i_no); + inst = get_last_instance_lev2_bbfdm_dmmap_opt("dmmap_mcast", "snooping", "snooping_instance", "proto", "igmp"); + dmasprintf(&s_name, "igmp_snoop_%d", inst ? atoi(inst)+1 : 1); dmuci_add_section("mcast", "snooping", &s, &value); dmuci_rename_section_by_section(s, s_name); @@ -384,10 +386,13 @@ static int add_igmp_snooping_obj(char *refparam, struct dmctx *ctx, void *data, dmuci_set_value_by_section(s, "robustness", "2"); dmuci_set_value_by_section(s, "aggregation", "0"); + browse_args.option = "proto"; + browse_args.value = "igmp"; + dmuci_add_section_bbfdm("dmmap_mcast", "snooping", &dmmap, &v); dmuci_set_value_by_section(dmmap, "section_name", section_name(s)); dmuci_set_value_by_section(dmmap, "proto", "igmp"); - *instance = update_instance(dmmap, inst, "snooping_instance"); + *instance = update_instance(inst, 6, dmmap, "snooping_instance", "dmmap_mcast", "snooping", check_browse_section, (void *)&browse_args); return 0; } @@ -438,14 +443,19 @@ static int del_igmp_snooping_obj(char *refparam, struct dmctx *ctx, void *data, static int browse_igmp_snooping_inst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance) { char *inst = NULL, *max_inst = NULL; + struct browse_args browse_args = {0}; struct dmmap_dup *p; LIST_HEAD(dup_list); synchronize_specific_config_sections_with_dmmap_cont("mcast", "snooping", "dmmap_mcast", "proto", "igmp", &dup_list); list_for_each_entry(p, &dup_list, list) { - inst = handle_update_instance(1, dmctx, &max_inst, update_instance_alias, 5, - p->dmmap_section, "snooping_instance", "snooping_alias", "dmmap_mcast", "snooping"); + browse_args.option = "proto"; + browse_args.value = "igmp"; + + inst = handle_update_instance(1, dmctx, &max_inst, update_instance_alias, 7, + p->dmmap_section, "snooping_instance", "snooping_alias", "dmmap_mcast", "snooping", + check_browse_section, (void *)&browse_args); if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)p->config_section, inst) == DM_STOP) break; @@ -503,6 +513,7 @@ static int add_igmps_filter_obj(char *refparam, struct dmctx *ctx, void *data, c { char *last_inst, *v; struct uci_section *dmmap_igmps_filter = NULL; + struct browse_args browse_args = {0}; last_inst = get_last_instance_lev2_bbfdm_dmmap_opt("dmmap_mcast", "snooping_filter", "filter_instance", "section_name", section_name((struct uci_section *)data)); @@ -510,7 +521,11 @@ static int add_igmps_filter_obj(char *refparam, struct dmctx *ctx, void *data, c dmuci_add_section_bbfdm("dmmap_mcast", "snooping_filter", &dmmap_igmps_filter, &v); dmuci_set_value_by_section(dmmap_igmps_filter, "section_name", section_name((struct uci_section *)data)); dmuci_set_value_by_section(dmmap_igmps_filter, "enable", "0"); - *instance = update_instance(dmmap_igmps_filter, last_inst, "filter_instance"); + + browse_args.option = "section_name"; + browse_args.value = section_name((struct uci_section *)data); + + *instance = update_instance(last_inst, 6, dmmap_igmps_filter, "filter_instance", "dmmap_mcast", "snooping_filter", check_browse_section, (void *)&browse_args); return 0; } @@ -942,6 +957,7 @@ static int add_igmpp_interface_obj(char *refparam, struct dmctx *ctx, void *data // This section works but commented for now as it is tested not much yet. char *last_inst, *v; struct uci_section *dmmap_igmpp_interface = NULL; + struct browse_args browse_args = {0}; last_inst = get_last_instance_lev2_bbfdm_dmmap_opt("dmmap_mcast", "proxy_interface", "iface_instance", "section_name", section_name((struct uci_section *)data)); @@ -952,7 +968,10 @@ static int add_igmpp_interface_obj(char *refparam, struct dmctx *ctx, void *data dmuci_set_value_by_section(dmmap_igmpp_interface, "upstream", "0"); dmuci_set_value_by_section(dmmap_igmpp_interface, "snooping_mode", "0"); - *instance = update_instance(dmmap_igmpp_interface, last_inst, "iface_instance"); + browse_args.option = "section_name"; + browse_args.value = section_name((struct uci_section *)data); + + *instance = update_instance(last_inst, 6, dmmap_igmpp_interface, "iface_instance", "dmmap_mcast", "proxy_interface", check_browse_section, (void *)&browse_args); return 0; } @@ -1079,6 +1098,7 @@ static int add_igmpp_filter_obj(char *refparam, struct dmctx *ctx, void *data, c { char *last_inst, *v; struct uci_section *dmmap_igmpp_filter = NULL; + struct browse_args browse_args = {0}; last_inst = get_last_instance_lev2_bbfdm_dmmap_opt("dmmap_mcast", "proxy_filter", "filter_instance", "section_name", section_name((struct uci_section *)data)); @@ -1088,7 +1108,10 @@ static int add_igmpp_filter_obj(char *refparam, struct dmctx *ctx, void *data, c section_name((struct uci_section *)data)); dmuci_set_value_by_section(dmmap_igmpp_filter, "enable", "0"); - *instance = update_instance(dmmap_igmpp_filter, last_inst, "filter_instance"); + browse_args.option = "section_name"; + browse_args.value = section_name((struct uci_section *)data); + + *instance = update_instance(last_inst, 6, dmmap_igmpp_filter, "filter_instance", "dmmap_mcast", "proxy_filter", check_browse_section, (void *)&browse_args); return 0; } diff --git a/dmtree/tr181/x_iopsys_eu_mld.c b/dmtree/tr181/x_iopsys_eu_mld.c index 01303d9a..5dbe73ca 100644 --- a/dmtree/tr181/x_iopsys_eu_mld.c +++ b/dmtree/tr181/x_iopsys_eu_mld.c @@ -17,14 +17,11 @@ static int add_mld_proxy_obj(char *refparam, struct dmctx *ctx, void *data, char { char *inst, *value, *v, *s_name; struct uci_section *dmmap = NULL, *s = NULL; - char i_no[16]; + struct browse_args browse_args = {0}; check_create_dmmap_package("dmmap_mcast"); - inst = get_last_instance_lev2_bbfdm_dmmap_opt("dmmap_mcast", "proxy", "proxy_instance", - "proto", "mld"); - snprintf(i_no, sizeof(i_no), "%d", inst ? atoi(inst)+1 : 1); - - dmasprintf(&s_name, "mld_proxy_%s", i_no); + inst = get_last_instance_lev2_bbfdm_dmmap_opt("dmmap_mcast", "proxy", "proxy_instance", "proto", "mld"); + dmasprintf(&s_name, "mld_proxy_%d", inst ? atoi(inst)+1 : 1); dmuci_add_section("mcast", "proxy", &s, &value); dmuci_rename_section_by_section(s, s_name); @@ -34,10 +31,13 @@ static int add_mld_proxy_obj(char *refparam, struct dmctx *ctx, void *data, char dmuci_set_value_by_section(s, "robustness", "2"); dmuci_set_value_by_section(s, "aggregation", "0"); + browse_args.option = "proto"; + browse_args.value = "mld"; + dmuci_add_section_bbfdm("dmmap_mcast", "proxy", &dmmap, &v); dmuci_set_value_by_section(dmmap, "section_name", section_name(s)); dmuci_set_value_by_section(dmmap, "proto", "mld"); - *instance = update_instance(dmmap, inst, "proxy_instance"); + *instance = update_instance(inst, 6, dmmap, "proxy_instance", "dmmap_mcast", "proxy", check_browse_section, (void *)&browse_args); return 0; } @@ -90,14 +90,19 @@ static int del_mld_proxy_obj(char *refparam, struct dmctx *ctx, void *data, char static int browse_mld_proxy_inst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance) { char *inst = NULL, *max_inst = NULL; + struct browse_args browse_args = {0}; struct dmmap_dup *p; LIST_HEAD(dup_list); synchronize_specific_config_sections_with_dmmap_cont("mcast", "proxy", "dmmap_mcast", "proto", "mld", &dup_list); list_for_each_entry(p, &dup_list, list) { - inst = handle_update_instance(1, dmctx, &max_inst, update_instance_alias, 5, - p->dmmap_section, "proxy_instance", "proxy_alias", "dmmap_mcast", "proxy"); + browse_args.option = "proto"; + browse_args.value = "mld"; + + inst = handle_update_instance(1, dmctx, &max_inst, update_instance_alias, 7, + p->dmmap_section, "proxy_instance", "proxy_alias", "dmmap_mcast", "proxy", + check_browse_section, (void *)&browse_args); if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)p->config_section, inst) == DM_STOP) break; @@ -111,14 +116,11 @@ static int add_mld_snooping_obj(char *refparam, struct dmctx *ctx, void *data, c { char *inst, *value, *v, *s_name; struct uci_section *dmmap = NULL, *s = NULL; - char i_no[16]; + struct browse_args browse_args = {0}; check_create_dmmap_package("dmmap_mcast"); - inst = get_last_instance_lev2_bbfdm_dmmap_opt("dmmap_mcast", "snooping", - "snooping_instance", "proto", "mld"); - snprintf(i_no, sizeof(i_no), "%d", inst ? atoi(inst)+1 : 1); - - dmasprintf(&s_name, "mld_snoop_%s", i_no); + inst = get_last_instance_lev2_bbfdm_dmmap_opt("dmmap_mcast", "snooping", "snooping_instance", "proto", "mld"); + dmasprintf(&s_name, "mld_snoop_%d", inst ? atoi(inst)+1 : 1); dmuci_add_section("mcast", "snooping", &s, &value); dmuci_rename_section_by_section(s, s_name); @@ -128,10 +130,13 @@ static int add_mld_snooping_obj(char *refparam, struct dmctx *ctx, void *data, c dmuci_set_value_by_section(s, "robustness", "2"); dmuci_set_value_by_section(s, "aggregation", "0"); + browse_args.option = "proto"; + browse_args.value = "mld"; + dmuci_add_section_bbfdm("dmmap_mcast", "snooping", &dmmap, &v); dmuci_set_value_by_section(dmmap, "section_name", section_name(s)); dmuci_set_value_by_section(dmmap, "proto", "mld"); - *instance = update_instance(dmmap, inst, "snooping_instance"); + *instance = update_instance(inst, 6, dmmap, "snooping_instance", "dmmap_mcast", "snooping", check_browse_section, (void *)&browse_args); return 0; } @@ -182,14 +187,19 @@ static int del_mld_snooping_obj(char *refparam, struct dmctx *ctx, void *data, c static int browse_mld_snooping_inst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance) { char *inst = NULL, *max_inst = NULL; + struct browse_args browse_args = {0}; struct dmmap_dup *p; LIST_HEAD(dup_list); synchronize_specific_config_sections_with_dmmap_cont("mcast", "snooping", "dmmap_mcast", "proto", "mld", &dup_list); list_for_each_entry(p, &dup_list, list) { - inst = handle_update_instance(1, dmctx, &max_inst, update_instance_alias, 5, - p->dmmap_section, "snooping_instance", "snooping_alias", "dmmap_mcast", "snooping"); + browse_args.option = "proto"; + browse_args.value = "mld"; + + inst = handle_update_instance(1, dmctx, &max_inst, update_instance_alias, 7, + p->dmmap_section, "snooping_instance", "snooping_alias", "dmmap_mcast", "snooping", + check_browse_section, (void *)&browse_args); if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)p->config_section, inst) == DM_STOP) break; @@ -242,6 +252,7 @@ static int add_mlds_filter_obj(char *refparam, struct dmctx *ctx, void *data, ch { char *last_inst, *v; struct uci_section *dmmap_mlds_filter = NULL; + struct browse_args browse_args = {0}; last_inst = get_last_instance_lev2_bbfdm_dmmap_opt("dmmap_mcast", "snooping_filter", "filter_instance", "section_name", section_name((struct uci_section *)data)); @@ -249,7 +260,11 @@ static int add_mlds_filter_obj(char *refparam, struct dmctx *ctx, void *data, ch dmuci_add_section_bbfdm("dmmap_mcast", "snooping_filter", &dmmap_mlds_filter, &v); dmuci_set_value_by_section(dmmap_mlds_filter, "section_name", section_name((struct uci_section *)data)); dmuci_set_value_by_section(dmmap_mlds_filter, "enable", "0"); - *instance = update_instance(dmmap_mlds_filter, last_inst, "filter_instance"); + + browse_args.option = "section_name"; + browse_args.value = section_name((struct uci_section *)data); + + *instance = update_instance(last_inst, 6, dmmap_mlds_filter, "filter_instance", "dmmap_mcast", "snooping_filter", check_browse_section, (void *)&browse_args); return 0; } @@ -310,6 +325,7 @@ static int add_mldp_interface_obj(char *refparam, struct dmctx *ctx, void *data, // This section works but commented for now as it is tested not much yet. char *last_inst, *v; struct uci_section *dmmap_mldp_interface = NULL; + struct browse_args browse_args = {0}; last_inst = get_last_instance_lev2_bbfdm_dmmap_opt("dmmap_mcast", "proxy_interface", "iface_instance", "section_name", section_name((struct uci_section *)data)); @@ -319,7 +335,10 @@ static int add_mldp_interface_obj(char *refparam, struct dmctx *ctx, void *data, dmuci_set_value_by_section(dmmap_mldp_interface, "upstream", "0"); dmuci_set_value_by_section(dmmap_mldp_interface, "snooping_mode", "0"); - *instance = update_instance(dmmap_mldp_interface, last_inst, "iface_instance"); + browse_args.option = "section_name"; + browse_args.value = section_name((struct uci_section *)data); + + *instance = update_instance(last_inst, 6, dmmap_mldp_interface, "iface_instance", "dmmap_mcast", "proxy_interface", check_browse_section, (void *)&browse_args); return 0; } @@ -407,6 +426,7 @@ static int add_mldp_filter_obj(char *refparam, struct dmctx *ctx, void *data, ch { char *last_inst, *v; struct uci_section *dmmap_mldp_filter = NULL; + struct browse_args browse_args = {0}; last_inst = get_last_instance_lev2_bbfdm_dmmap_opt("dmmap_mcast", "proxy_filter", "filter_instance", "section_name", section_name((struct uci_section *)data)); @@ -415,7 +435,10 @@ static int add_mldp_filter_obj(char *refparam, struct dmctx *ctx, void *data, ch dmuci_set_value_by_section(dmmap_mldp_filter, "section_name", section_name((struct uci_section *)data)); dmuci_set_value_by_section(dmmap_mldp_filter, "enable", "0"); - *instance = update_instance(dmmap_mldp_filter, last_inst, "filter_instance"); + browse_args.option = "section_name"; + browse_args.value = section_name((struct uci_section *)data); + + *instance = update_instance(last_inst, 6, dmmap_mldp_filter, "filter_instance", "dmmap_mcast", "proxy_filter", check_browse_section, (void *)&browse_args); return 0; } diff --git a/dmtree/tr181/x_iopsys_eu_owsd.c b/dmtree/tr181/x_iopsys_eu_owsd.c index 63374ee9..239e3bfc 100644 --- a/dmtree/tr181/x_iopsys_eu_owsd.c +++ b/dmtree/tr181/x_iopsys_eu_owsd.c @@ -401,7 +401,7 @@ static int add_owsd_listen(char *refparam, struct dmctx *ctx, void *data, char * dmuci_add_section_bbfdm("dmmap_owsd", "owsd-listen", &dmmap_sec, &v); dmuci_set_value_by_section(dmmap_sec, "section_name", section_name(listen_sec)); - *instancepara = update_instance(dmmap_sec, instance, "olisteninstance"); + *instancepara = update_instance(instance, 4, dmmap_sec, "olisteninstance", "dmmap_owsd", "owsd-listen"); return 0; } diff --git a/json/generate_source_code.py b/json/generate_source_code.py index a07154b2..2b1ce336 100755 --- a/json/generate_source_code.py +++ b/json/generate_source_code.py @@ -410,7 +410,7 @@ def cprintAddDelObj( faddobj, fdelobj, name, mappingobj, dmobject ): print >> fp, "" print >> fp, " dmuci_add_section_bbfdm(\"%s\", \"%s\", &dmmap, &v);" % (dmmapfile, sectiontype) print >> fp, " dmuci_set_value_by_section(dmmap, \"section_name\", section_name(s));" - print >> fp, " *instance = update_instance(dmmap, inst, \"%s\");" % (name+"instance") + print >> fp, " *instance = update_instance(inst, 4, dmmap, \"%s\");" % (name+"instance") else: print >> fp, " //TODO" print >> fp, " return 0;" diff --git a/libbbf_api/dmbbf.c b/libbbf_api/dmbbf.c index c74b07be..93373f2f 100644 --- a/libbbf_api/dmbbf.c +++ b/libbbf_api/dmbbf.c @@ -620,16 +620,22 @@ char *handle_update_instance(int instance_ranck, struct dmctx *ctx, char **last_ return instance; } -char *update_instance(struct uci_section *s, char *last_inst, char *inst_opt) +char *update_instance(char *last_inst, int argc, ...) { + va_list arg; char *instance; - void *argv[3]; + int i = 0; + void *argv[argc+1]; - argv[0] = s; - argv[1] = inst_opt; - argv[2] = ""; + va_start(arg, argc); + for (i = 0; i < argc; i++) { + argv[i] = va_arg(arg, void*); + } + argv[argc] = NULL; + va_end(arg); instance = update_instance_alias(0, &last_inst, argv); + return instance; } @@ -714,11 +720,12 @@ char *get_last_instance_bbfdm(char *package, char *section, char *opt_inst) char *inst = NULL, *last_inst = NULL; uci_path_foreach_sections(bbfdm, package, section, s) { - inst = update_instance(s, last_inst, opt_inst); + inst = update_instance(last_inst, 4, s, opt_inst, package, section); if(last_inst) dmfree(last_inst); last_inst = dmstrdup(inst); } + return inst; } @@ -743,33 +750,37 @@ char *get_last_instance(char *package, char *section, char *opt_inst) if (strcmp(package, DMMAP) == 0) { uci_path_foreach_sections(bbfdm, "dmmap", section, s) { - inst = update_instance(s, last_inst, opt_inst); + inst = update_instance(last_inst, 4, s, opt_inst, package, section); if(last_inst) dmfree(last_inst); last_inst = dmstrdup(inst); } } else { uci_foreach_sections(package, section, s) { - inst = update_instance(s, inst, opt_inst); + inst = update_instance(inst, 4, s, opt_inst, package, section); } } return inst; } -char *get_last_instance_lev2_bbfdm_dmmap_opt(char* dmmap_package, char *section, char *opt_inst, char *opt_check, char *value_check) +char *get_last_instance_lev2_bbfdm_dmmap_opt(char *dmmap_package, char *section, char *opt_inst, char *opt_check, char *value_check) { struct uci_section *s; - char *instance = NULL, *section_name = NULL, *last_inst = NULL; + char *instance = NULL, *last_inst = NULL; + struct browse_args browse_args = {0}; + + browse_args.option = opt_check; + browse_args.value = value_check; uci_path_foreach_option_eq(bbfdm, dmmap_package, section, opt_check, value_check, s) { - dmuci_get_value_by_section_string(s, "section_name", §ion_name); - instance = update_instance(s, last_inst, opt_inst); + instance = update_instance(last_inst, 6, s, opt_inst, dmmap_package, section, check_browse_section, (void *)&browse_args); if(last_inst) dmfree(last_inst); last_inst = dmstrdup(instance); } return instance; } + char *get_last_instance_lev2_bbfdm(char *package, char *section, char* dmmap_package, char *opt_inst, char *opt_check, char *value_check) { struct uci_section *s, *dmmap_section; @@ -778,11 +789,11 @@ char *get_last_instance_lev2_bbfdm(char *package, char *section, char* dmmap_pac check_create_dmmap_package(dmmap_package); uci_foreach_option_cont(package, section, opt_check, value_check, s) { get_dmmap_section_of_config_section(dmmap_package, section, section_name(s), &dmmap_section); - if(dmmap_section == NULL){ + if (dmmap_section == NULL) { dmuci_add_section_bbfdm(dmmap_package, section, &dmmap_section, &v); dmuci_set_value_by_section(dmmap_section, "section_name", section_name(s)); } - instance = update_instance(dmmap_section, last_inst, opt_inst); + instance = update_instance(last_inst, 4, dmmap_section, opt_inst, dmmap_package, section); if(last_inst) dmfree(last_inst); last_inst = dmstrdup(instance); @@ -797,14 +808,14 @@ char *get_last_instance_lev2(char *package, char *section, char *opt_inst, char if (strcmp(package, DMMAP) == 0) { uci_path_foreach_option_cont(bbfdm, package, section, opt_check, value_check, s) { - instance = update_instance(s, last_inst, opt_inst); + instance = update_instance(last_inst, 4, s, opt_inst, package, section); if(last_inst) dmfree(last_inst); last_inst = dmstrdup(instance); } } else { uci_foreach_option_cont(package, section, opt_check, value_check, s) { - instance = update_instance(s, instance, opt_inst); + instance = update_instance(instance, 4, s, opt_inst, package, section); } } return instance; diff --git a/libbbf_api/dmbbf.h b/libbbf_api/dmbbf.h index 56dbc5d9..0fa5c765 100644 --- a/libbbf_api/dmbbf.h +++ b/libbbf_api/dmbbf.h @@ -538,8 +538,7 @@ extern char dm_delim; extern char dmroot[64]; extern int bbfdatamodel_type; - -char *update_instance(struct uci_section *s, char *last_inst, char *inst_opt); +char *update_instance(char *last_inst, int argc, ...); char *update_instance_alias(int action, char **last_inst , void *argv[]); char *update_instance_without_section(int action, char **last_inst, void *argv[]); int get_empty(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value);