diff --git a/src/ip.c b/src/ip.c index 40953fb5778016bf0dcc310e56addad9f4bebbef..49defbe9082f1af1f4597f2ecfb3bb3b971b11a5 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*/