From 539c23695a086fd3d628da7b0f0de764726cfa09 Mon Sep 17 00:00:00 2001
From: Vivek Kumar Dutta <vivek.dutta@iopsys.eu>
Date: Thu, 28 Nov 2024 18:14:50 +0530
Subject: [PATCH] Updated logic for IP Interface status

---
 src/ip.c | 28 ++++++++++++++++++++++++++--
 1 file changed, 26 insertions(+), 2 deletions(-)

diff --git a/src/ip.c b/src/ip.c
index 40953fb..49defbe 100644
--- a/src/ip.c
+++ b/src/ip.c
@@ -1257,10 +1257,34 @@ static int set_IPInterface_ULAEnable(char *refparam, struct dmctx *ctx, void *da
 	return 0;
 }
 
+// ifstatus = Down and devstatus = Down => Status=Down
+// ifstatus = Down and devstatus = Up => Status=Dormant
+// ifstatus = Up and devstatus = Up => Status=Up
+// ifstatus not available => Status=Unknown
+// devstatus != Up => Status=LowerLayerDown
 static int get_IPInterface_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
 {
-	char *device = get_device(section_name(((struct dm_data *)data)->config_section));
-	return get_net_device_status(device, value);
+	json_object *res = NULL;
+	char *if_name = section_name(((struct dm_data *)data)->config_section);
+	char *device = get_device(if_name);
+	char *devstatus = NULL;
+	bool ifstatus = false;
+
+	dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", if_name, String}}, 1, &res);
+	DM_ASSERT(res, *value = dmstrdup("Unknown"));
+	string_to_bool(dmjson_get_value(res, 1, "up"), &ifstatus);
+
+	get_net_device_status(device, &devstatus);
+
+	if ((ifstatus == false) && (DM_STRNCMP(devstatus, "Up", 2) == 0)) {
+		*value = dmstrdup("Dormant");
+	} else if (DM_STRNCMP(devstatus, "Up", 2) != 0) {
+		*value = dmstrdup("LowerLayerDown");
+	} else {
+		*value = devstatus;
+	}
+
+	return 0;
 }
 
 /*#Device.IP.Interface.{i}.Alias!UCI:dmmap_network/interface,@i-1/ip_int_alias*/
-- 
GitLab