From 6a0545cf50b2d1c5c4e63b0640f1733e59d0ee34 Mon Sep 17 00:00:00 2001 From: Amin Ben Ramdhane Date: Fri, 10 Jul 2020 14:26:28 +0100 Subject: [PATCH] TR181 : issues related to Lowerlayers management and order dependency --- dmtree/tr181/ethernet.c | 57 +++++++++++++++++++++++++++++++++++++++-- dmtree/tr181/ip.c | 39 ++++++++++++++++++++++++++++ 2 files changed, 94 insertions(+), 2 deletions(-) diff --git a/dmtree/tr181/ethernet.c b/dmtree/tr181/ethernet.c index be85b491..e7953afe 100644 --- a/dmtree/tr181/ethernet.c +++ b/dmtree/tr181/ethernet.c @@ -166,12 +166,21 @@ static void create_link(char *sec_name, char *mac_addr) static int dmmap_synchronizeEthernetLink(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance) { struct uci_section *s = NULL; - char *ifname, *macaddr; + char *ifname, *macaddr, *type, *proto; uci_foreach_sections("network", "interface", s) { + + // Skip this interface section if its name=loopback if (strcmp(section_name(s), "loopback") == 0) continue; + // Skip this interface section if type=bridge and proto is empty + dmuci_get_value_by_section_string(s, "type", &type); + dmuci_get_value_by_section_string(s, "proto", &proto); + if ((strcmp(type, "bridge") == 0) && *proto == '\0') + continue; + + // Skip this interface section if ifname is empty dmuci_get_value_by_section_string(s, "ifname", &ifname); if (*ifname == '\0') continue; @@ -963,7 +972,7 @@ static int get_EthernetLink_LowerLayers(char *refparam, struct dmctx *ctx, void static int set_EthernetLink_LowerLayers(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) { - char lower_layer[250] = {0}; + char lower_layer[256] = {0}; switch (action) { case VALUECHECK: @@ -992,6 +1001,50 @@ static int set_EthernetLink_LowerLayers(char *refparam, struct dmctx *ctx, void break; } } + } else if (strncmp(lower_layer, "Device.Bridging.Bridge.", 23) == 0) { + char *linker; + adm_entry_get_linker_value(ctx, lower_layer, &linker); + + if (linker == NULL || *linker == '\0') + return -1; + + char br_linker[250] = {0}; + strncpy(br_linker, linker, sizeof(br_linker) - 1); + + char *bridge = strchr(br_linker, ':'); + if (bridge) { + *bridge = '\0'; + char br_inst[8] = {0}; + strncpy(br_inst, br_linker+3, sizeof(br_inst) - 1); + + struct uci_section *port; + char *interface, *curr_interface; + + // Remove the network section corresponding to this dmmap interface if exists + dmuci_get_value_by_section_string(((struct dm_args *)data)->section, "section_name", &curr_interface); + struct uci_section *s, *tmp; + uci_foreach_sections_safe("network", "interface", tmp, s) { + if (strcmp(section_name(s), curr_interface) == 0) { + char *proto; + dmuci_get_value_by_section_string(s, "proto", &proto); + if (*proto == '\0') dmuci_delete_by_section(s, NULL, NULL); + break; + } + } + + // Get the interface bridge name + uci_path_foreach_option_eq(bbfdm, "dmmap_bridge_port", "bridge_port", "br_inst", br_inst, port) { + dmuci_get_value_by_section_string(port, "interface", &interface); + break; + } + + // Get the device name + char *device = get_device(interface); + + // Get dmmap section + dmuci_set_value_by_section(((struct dm_args *)data)->section, "device", device); + dmuci_set_value_by_section(((struct dm_args *)data)->section, "section_name", interface); + } } break; } diff --git a/dmtree/tr181/ip.c b/dmtree/tr181/ip.c index a6c2557e..e607140f 100644 --- a/dmtree/tr181/ip.c +++ b/dmtree/tr181/ip.c @@ -773,6 +773,45 @@ static int set_IPInterface_LowerLayers(char *refparam, struct dmctx *ctx, void * // Update ifname list dmuci_set_value_by_section(((struct ip_args *)data)->ip_sec, "ifname", linker); + + } else if (strncmp(lower_layer, "Device.Ethernet.Link.", 21) == 0) { + adm_entry_get_linker_value(ctx, lower_layer, &linker); + + if (linker == NULL || *linker == '\0') + return -1; + + // Get interface name from Ethernet.Link. object + struct uci_section *s = NULL; + char *interface; + get_dmmap_section_of_config_section_eq("dmmap", "link", "device", linker, &s); + dmuci_get_value_by_section_string(s, "section_name", &interface); + + // Update the new interface section with proto=dhcp + uci_foreach_sections("network", "interface", s) { + if (strcmp(section_name(s), interface) == 0) { + dmuci_set_value_by_section(s, "proto", "dhcp"); + break; + } + } + + // Get dmmap section related to this interface section and remove it + struct uci_section *dmmap_section = NULL; + get_dmmap_section_of_config_section("dmmap_network", "interface", section_name(((struct ip_args *)data)->ip_sec), &dmmap_section); + + // Get the current ip instance + char *ip_int_instance; + dmuci_get_value_by_section_string(dmmap_section, "ip_int_instance", &ip_int_instance); + + // Get the new dmmap section related to the new interface section and update ip instance option + struct uci_section *new_dmmap_section = NULL; + get_dmmap_section_of_config_section("dmmap_network", "interface", interface, &new_dmmap_section); + dmuci_set_value_by_section(new_dmmap_section, "ip_int_instance", ip_int_instance); + + // remove dmmap section + dmuci_delete_by_section(dmmap_section, NULL, NULL); + + // remove the current interface section + dmuci_delete_by_section(((struct ip_args *)data)->ip_sec, NULL, NULL); } return 0; }