diff --git a/dmtree/tr181/ethernet.c b/dmtree/tr181/ethernet.c
index 3bf40a82c7e9eaef8225455fcd09c81a46475017..67ea7cb4127a6fb84b753741dd6d542834d1abe3 100644
--- a/dmtree/tr181/ethernet.c
+++ b/dmtree/tr181/ethernet.c
@@ -322,7 +322,7 @@ int get_linker_interface(char *refparam, struct dmctx *dmctx, void *data, char *
 
 int get_linker_link(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker)
 {
-	dmuci_get_value_by_section_string(((struct dm_args *)data)->section, "mac", linker);
+	dmuci_get_value_by_section_string(((struct dm_args *)data)->section, "section_name", linker);
 	return 0;
 }
 
@@ -973,7 +973,7 @@ int get_EthernetLink_LastChange(char *refparam, struct dmctx *ctx, void *data, c
 int get_EthernetLink_LowerLayers(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
 {
 	struct uci_section *s = NULL;
-	char *link_mac, *type, *ifname, *mac, *br_inst, *mg, *wanifname, *wanlinker, linker[64] = "";
+	char *link_mac, *type, *ifname, *mac, *br_inst, *mg, *p, linker[64] = "";
 	struct uci_section *dmmap_section, *port;
 
 	dmuci_get_value_by_section_string(((struct dm_args *)data)->section, "mac", &link_mac);
@@ -1005,16 +1005,16 @@ int get_EthernetLink_LowerLayers(char *refparam, struct dmctx *ctx, void *data,
 			}
 		}
 		else {
-			dmuci_get_option_value_string("ports", "WAN", "ifname", &wanifname);
 			/* for upstream interface, set the lowerlayer to wan port of Ethernet.Interface */
-			if(strstr(ifname, wanifname)) {
-				dmasprintf(&wanlinker, "%s.1", wanifname);
-				adm_entry_get_linker_param(ctx, dm_print_path("%s%cEthernet%cInterface%c", dmroot, dm_delim, dm_delim, dm_delim), wanlinker, value);
-				dmfree(wanlinker);
-				if (*value == NULL)
-					*value = "";
+			p = strchr(ifname, '.');
+			if (p) {
+				/*linker of wan port of interface is eth0.1*/
+				*(p+1) = '1';
+				*(p+2) = '\0';
+				adm_entry_get_linker_param(ctx, dm_print_path("%s%cEthernet%cInterface%c", dmroot, dm_delim, dm_delim, dm_delim), ifname, value);
 			}
 		}
+		break;
 	}
 	return 0;
 }
@@ -1246,21 +1246,17 @@ int get_EthernetVLANTermination_LastChange(char *refparam, struct dmctx *ctx, vo
 
 int get_EthernetVLANTermination_LowerLayers(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
 {
-	char *pch, *spch, *devifname, *ifname, *mac;
+	char *pch, *spch, *devifname, *ifname, *dupifname;
 	struct uci_section *section;
 	
 	dmuci_get_value_by_section_string(((struct dm_args *)data)->section, "name", &devifname);
 	uci_foreach_sections("network", "interface", section) {
 		dmuci_get_value_by_section_string(section, "ifname", &ifname);
-		for (pch = strtok_r(ifname, " ", &spch); pch != NULL; pch = strtok_r(NULL, " ", &spch)) {
-			if(strcmp(pch, devifname) == 0) {
-				mac = get_macaddr(section_name(section));
-				if (mac[0] != '\0') {
-					adm_entry_get_linker_param(ctx, dm_print_path("%s%cEthernet%cLink%c", dmroot, dm_delim, dm_delim, dm_delim), mac, value);
-					if (*value == NULL)
-						*value = "";
-					break;
-				}
+		dupifname = dmstrdup(ifname);
+		for (pch = strtok_r(dupifname, " ", &spch); pch != NULL; pch = strtok_r(NULL, " ", &spch)) {
+			if(strcmp(pch, devifname) == 0){
+				adm_entry_get_linker_param(ctx, dm_print_path("%s%cEthernet%cLink%c", dmroot, dm_delim, dm_delim, dm_delim), section_name(section), value);
+				break;
 			}
 		}
 	}