mirror of
https://dev.iopsys.eu/bbf/bbfdm.git
synced 2025-12-10 07:44:39 +01:00
cherry-pick de0c8c93 diagnostics improvement
This commit is contained in:
parent
fc99617d4c
commit
393b206805
12 changed files with 455 additions and 61 deletions
|
|
@ -30,6 +30,14 @@ static int get_diag_enable_true(char *refparam, struct dmctx *ctx, void *data, c
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void stop_traceroute_diagnostics(void)
|
||||
{
|
||||
char cmd[256] = {0};
|
||||
|
||||
snprintf(cmd, sizeof(cmd), "sh %s '{\"proto\":\"both_proto\",\"cancel\":\"1\"}'", TRACEROUTE_DIAGNOSTIC_PATH);
|
||||
system(cmd);
|
||||
}
|
||||
|
||||
/*************************************************************
|
||||
* GET & SET PARAM
|
||||
**************************************************************/
|
||||
|
|
@ -40,7 +48,12 @@ static int get_diag_enable_true(char *refparam, struct dmctx *ctx, void *data, c
|
|||
|
||||
static int get_ip_ping_diagnostics_state(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = get_diagnostics_option_fallback_def("ipping", "DiagnosticState", "None");
|
||||
char *val = get_diagnostics_option_fallback_def("ipping", "DiagnosticState", "None");
|
||||
if (DM_STRSTR(val, "Requested") != NULL)
|
||||
*value = dmstrdup("Requested");
|
||||
else
|
||||
*value = dmstrdup(val);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -52,8 +65,12 @@ static int set_ip_ping_diagnostics_state(char *refparam, struct dmctx *ctx, void
|
|||
return FAULT_9007;
|
||||
return 0;
|
||||
case VALUESET:
|
||||
if (DM_LSTRCMP(value, "Requested") == 0)
|
||||
if (DM_LSTRCMP(value, "Requested") == 0) {
|
||||
set_diagnostics_option("ipping", "DiagnosticState", value);
|
||||
} else if (DM_LSTRCMP(value, "Canceled") == 0) {
|
||||
set_diagnostics_option("ipping", "DiagnosticState", "None");
|
||||
dmubus_call_set("bbf.diag", "ipping", UBUS_ARGS{{"cancel", "1", String},{"proto", "both_proto", String}}, 2);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
|
|
@ -84,6 +101,7 @@ static int set_ip_ping_interface(char *refparam, struct dmctx *ctx, void *data,
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("ipping");
|
||||
dmubus_call_set("bbf.diag", "ipping", UBUS_ARGS{{"cancel", "1", String},{"proto", "both_proto", String}}, 2);
|
||||
set_diagnostics_option("ipping", "interface", reference.value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -105,6 +123,7 @@ static int set_ip_ping_protocolversion(char *refparam, struct dmctx *ctx, void *
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("ipping");
|
||||
dmubus_call_set("bbf.diag", "ipping", UBUS_ARGS{{"cancel", "1", String},{"proto", "both_proto", String}}, 2);
|
||||
set_diagnostics_option("ipping", "ProtocolVersion", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -126,6 +145,7 @@ static int set_ip_ping_host(char *refparam, struct dmctx *ctx, void *data, char
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("ipping");
|
||||
dmubus_call_set("bbf.diag", "ipping", UBUS_ARGS{{"cancel", "1", String},{"proto", "both_proto", String}}, 2);
|
||||
set_diagnostics_option("ipping", "Host", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -147,6 +167,7 @@ static int set_ip_ping_repetition_number(char *refparam, struct dmctx *ctx, void
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("ipping");
|
||||
dmubus_call_set("bbf.diag", "ipping", UBUS_ARGS{{"cancel", "1", String},{"proto", "both_proto", String}}, 2);
|
||||
set_diagnostics_option("ipping", "NumberOfRepetitions", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -168,6 +189,7 @@ static int set_ip_ping_timeout(char *refparam, struct dmctx *ctx, void *data, ch
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("ipping");
|
||||
dmubus_call_set("bbf.diag", "ipping", UBUS_ARGS{{"cancel", "1", String},{"proto", "both_proto", String}}, 2);
|
||||
set_diagnostics_option("ipping", "Timeout", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -189,6 +211,7 @@ static int set_ip_ping_block_size(char *refparam, struct dmctx *ctx, void *data,
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("ipping");
|
||||
dmubus_call_set("bbf.diag", "ipping", UBUS_ARGS{{"cancel", "1", String},{"proto", "both_proto", String}}, 2);
|
||||
set_diagnostics_option("ipping", "DataBlockSize", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -210,6 +233,7 @@ static int set_ip_ping_DSCP(char *refparam, struct dmctx *ctx, void *data, char
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("ipping");
|
||||
dmubus_call_set("bbf.diag", "ipping", UBUS_ARGS{{"cancel", "1", String},{"proto", "both_proto", String}}, 2);
|
||||
set_diagnostics_option("ipping", "DSCP", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -276,7 +300,12 @@ static int get_ip_ping_MaximumResponseTimeDetailed(char *refparam, struct dmctx
|
|||
|
||||
static int get_IPDiagnosticsTraceRoute_DiagnosticsState(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = get_diagnostics_option_fallback_def("traceroute", "DiagnosticState", "None");
|
||||
char *val = get_diagnostics_option_fallback_def("traceroute", "DiagnosticState", "None");
|
||||
if (DM_STRSTR(val, "Requested") != NULL)
|
||||
*value = dmstrdup("Requested");
|
||||
else
|
||||
*value = dmstrdup(val);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -288,8 +317,12 @@ static int set_IPDiagnosticsTraceRoute_DiagnosticsState(char *refparam, struct d
|
|||
return FAULT_9007;
|
||||
return 0;
|
||||
case VALUESET:
|
||||
if (DM_LSTRCMP(value, "Requested") == 0)
|
||||
if (DM_LSTRCMP(value, "Requested") == 0) {
|
||||
set_diagnostics_option("traceroute", "DiagnosticState", value);
|
||||
} else if (DM_LSTRCMP(value, "Canceled") == 0) {
|
||||
set_diagnostics_option("traceroute", "DiagnosticState", "None");
|
||||
stop_traceroute_diagnostics();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
|
|
@ -320,6 +353,7 @@ static int set_IPDiagnosticsTraceRoute_Interface(char *refparam, struct dmctx *c
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("traceroute");
|
||||
stop_traceroute_diagnostics();
|
||||
set_diagnostics_option("traceroute", "interface", reference.value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -341,6 +375,7 @@ static int set_IPDiagnosticsTraceRoute_ProtocolVersion(char *refparam, struct dm
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("traceroute");
|
||||
stop_traceroute_diagnostics();
|
||||
set_diagnostics_option("traceroute", "ProtocolVersion", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -362,6 +397,7 @@ static int set_IPDiagnosticsTraceRoute_Host(char *refparam, struct dmctx *ctx, v
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("traceroute");
|
||||
stop_traceroute_diagnostics();
|
||||
set_diagnostics_option("traceroute", "Host", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -383,6 +419,7 @@ static int set_IPDiagnosticsTraceRoute_NumberOfTries(char *refparam, struct dmct
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("traceroute");
|
||||
stop_traceroute_diagnostics();
|
||||
set_diagnostics_option("traceroute", "NumberOfTries", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -404,6 +441,7 @@ static int set_IPDiagnosticsTraceRoute_Timeout(char *refparam, struct dmctx *ctx
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("traceroute");
|
||||
stop_traceroute_diagnostics();
|
||||
set_diagnostics_option("traceroute", "Timeout", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -425,6 +463,7 @@ static int set_IPDiagnosticsTraceRoute_DataBlockSize(char *refparam, struct dmct
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("traceroute");
|
||||
stop_traceroute_diagnostics();
|
||||
set_diagnostics_option("traceroute", "DataBlockSize", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -446,6 +485,7 @@ static int set_IPDiagnosticsTraceRoute_DSCP(char *refparam, struct dmctx *ctx, v
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("traceroute");
|
||||
stop_traceroute_diagnostics();
|
||||
set_diagnostics_option("traceroute", "DSCP", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -467,6 +507,7 @@ static int set_IPDiagnosticsTraceRoute_MaxHopCount(char *refparam, struct dmctx
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("traceroute");
|
||||
stop_traceroute_diagnostics();
|
||||
set_diagnostics_option("traceroute", "MaxHops", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1195,7 +1236,12 @@ static int get_IPDiagnosticsUploadDiagnosticsPerConnectionResult_TCPOpenResponse
|
|||
|
||||
static int get_IPDiagnosticsUDPEchoDiagnostics_DiagnosticsState(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = get_diagnostics_option_fallback_def("udpechodiag", "DiagnosticState", "None");
|
||||
char *val = get_diagnostics_option_fallback_def("udpechodiag", "DiagnosticState", "None");
|
||||
if (DM_STRSTR(val, "Requested") != NULL)
|
||||
*value = dmstrdup("Requested");
|
||||
else
|
||||
*value = dmstrdup(val);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -1207,8 +1253,12 @@ static int set_IPDiagnosticsUDPEchoDiagnostics_DiagnosticsState(char *refparam,
|
|||
return FAULT_9007;
|
||||
return 0;
|
||||
case VALUESET:
|
||||
if (DM_LSTRCMP(value, "Requested") == 0)
|
||||
if (DM_LSTRCMP(value, "Requested") == 0) {
|
||||
set_diagnostics_option("udpechodiag", "DiagnosticState", value);
|
||||
} else if (DM_LSTRCMP(value, "Canceled") == 0) {
|
||||
set_diagnostics_option("udpechodiag", "DiagnosticState", "None");
|
||||
dmubus_call_set("bbf.diag", "udpecho", UBUS_ARGS{{"cancel", "1", String},{"proto", "both_proto", String}}, 2);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
|
|
@ -1239,6 +1289,7 @@ static int set_IPDiagnosticsUDPEchoDiagnostics_Interface(char *refparam, struct
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("udpechodiag");
|
||||
dmubus_call_set("bbf.diag", "udpecho", UBUS_ARGS{{"cancel", "1", String},{"proto", "both_proto", String}}, 2);
|
||||
set_diagnostics_option("udpechodiag", "interface", reference.value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1260,6 +1311,7 @@ static int set_IPDiagnosticsUDPEchoDiagnostics_Host(char *refparam, struct dmctx
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("udpechodiag");
|
||||
dmubus_call_set("bbf.diag", "udpecho", UBUS_ARGS{{"cancel", "1", String},{"proto", "both_proto", String}}, 2);
|
||||
set_diagnostics_option("udpechodiag", "Host", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1281,6 +1333,7 @@ static int set_IPDiagnosticsUDPEchoDiagnostics_Port(char *refparam, struct dmctx
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("udpechodiag");
|
||||
dmubus_call_set("bbf.diag", "udpecho", UBUS_ARGS{{"cancel", "1", String},{"proto", "both_proto", String}}, 2);
|
||||
set_diagnostics_option("udpechodiag", "port", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1302,6 +1355,7 @@ static int set_IPDiagnosticsUDPEchoDiagnostics_NumberOfRepetitions(char *refpara
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("udpechodiag");
|
||||
dmubus_call_set("bbf.diag", "udpecho", UBUS_ARGS{{"cancel", "1", String},{"proto", "both_proto", String}}, 2);
|
||||
set_diagnostics_option("udpechodiag", "NumberOfRepetitions", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1323,6 +1377,7 @@ static int set_IPDiagnosticsUDPEchoDiagnostics_Timeout(char *refparam, struct dm
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("udpechodiag");
|
||||
dmubus_call_set("bbf.diag", "udpecho", UBUS_ARGS{{"cancel", "1", String},{"proto", "both_proto", String}}, 2);
|
||||
set_diagnostics_option("udpechodiag", "Timeout", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1344,6 +1399,7 @@ static int set_IPDiagnosticsUDPEchoDiagnostics_DataBlockSize(char *refparam, str
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("udpechodiag");
|
||||
dmubus_call_set("bbf.diag", "udpecho", UBUS_ARGS{{"cancel", "1", String},{"proto", "both_proto", String}}, 2);
|
||||
set_diagnostics_option("udpechodiag", "DataBlockSize", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1365,6 +1421,7 @@ static int set_IPDiagnosticsUDPEchoDiagnostics_DSCP(char *refparam, struct dmctx
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("udpechodiag");
|
||||
dmubus_call_set("bbf.diag", "udpecho", UBUS_ARGS{{"cancel", "1", String},{"proto", "both_proto", String}}, 2);
|
||||
set_diagnostics_option("udpechodiag", "DSCP", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1386,6 +1443,7 @@ static int set_IPDiagnosticsUDPEchoDiagnostics_InterTransmissionTime(char *refpa
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("udpechodiag");
|
||||
dmubus_call_set("bbf.diag", "udpecho", UBUS_ARGS{{"cancel", "1", String},{"proto", "both_proto", String}}, 2);
|
||||
set_diagnostics_option("udpechodiag", "InterTransmissionTime", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1407,6 +1465,7 @@ static int set_IPDiagnosticsUDPEchoDiagnostics_ProtocolVersion(char *refparam, s
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("udpechodiag");
|
||||
dmubus_call_set("bbf.diag", "udpecho", UBUS_ARGS{{"cancel", "1", String},{"proto", "both_proto", String}}, 2);
|
||||
set_diagnostics_option("udpechodiag", "ProtocolVersion", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1455,7 +1514,12 @@ static int get_IPDiagnosticsUDPEchoDiagnostics_MaximumResponseTime(char *refpara
|
|||
|
||||
static int get_IPDiagnosticsServerSelectionDiagnostics_DiagnosticsState(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = get_diagnostics_option_fallback_def("serverselection", "DiagnosticState", "None");
|
||||
char *val = get_diagnostics_option_fallback_def("serverselection", "DiagnosticState", "None");
|
||||
if (DM_STRSTR(val, "Requested") != NULL)
|
||||
*value = dmstrdup("Requested");
|
||||
else
|
||||
*value = dmstrdup(val);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -1467,8 +1531,12 @@ static int set_IPDiagnosticsServerSelectionDiagnostics_DiagnosticsState(char *re
|
|||
return FAULT_9007;
|
||||
return 0;
|
||||
case VALUESET:
|
||||
if (DM_LSTRCMP(value, "Requested") == 0)
|
||||
if (DM_LSTRCMP(value, "Requested") == 0) {
|
||||
set_diagnostics_option("serverselection", "DiagnosticState", value);
|
||||
} else if (DM_LSTRCMP(value, "Canceled") == 0) {
|
||||
set_diagnostics_option("serverselection", "DiagnosticState", "None");
|
||||
dmubus_call_set("bbf.diag", "serverselection", UBUS_ARGS{{"cancel", "1", String},{"proto", "both_proto", String}}, 2);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
|
|
@ -1499,6 +1567,7 @@ static int set_IPDiagnosticsServerSelectionDiagnostics_Interface(char *refparam,
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("serverselection");
|
||||
dmubus_call_set("bbf.diag", "serverselection", UBUS_ARGS{{"cancel", "1", String},{"proto", "both_proto", String}}, 2);
|
||||
set_diagnostics_option("serverselection", "interface", reference.value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1520,6 +1589,7 @@ static int set_IPDiagnosticsServerSelectionDiagnostics_ProtocolVersion(char *ref
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("serverselection");
|
||||
dmubus_call_set("bbf.diag", "serverselection", UBUS_ARGS{{"cancel", "1", String},{"proto", "both_proto", String}}, 2);
|
||||
set_diagnostics_option("serverselection", "ProtocolVersion", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1541,6 +1611,7 @@ static int set_IPDiagnosticsServerSelectionDiagnostics_Protocol(char *refparam,
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("serverselection");
|
||||
dmubus_call_set("bbf.diag", "serverselection", UBUS_ARGS{{"cancel", "1", String},{"proto", "both_proto", String}}, 2);
|
||||
set_diagnostics_option("serverselection", "Protocol", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1562,6 +1633,7 @@ static int set_IPDiagnosticsServerSelectionDiagnostics_HostList(char *refparam,
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("serverselection");
|
||||
dmubus_call_set("bbf.diag", "serverselection", UBUS_ARGS{{"cancel", "1", String},{"proto", "both_proto", String}}, 2);
|
||||
set_diagnostics_option("serverselection", "HostList", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1583,6 +1655,7 @@ static int set_IPDiagnosticsServerSelectionDiagnostics_NumberOfRepetitions(char
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("serverselection");
|
||||
dmubus_call_set("bbf.diag", "serverselection", UBUS_ARGS{{"cancel", "1", String},{"proto", "both_proto", String}}, 2);
|
||||
set_diagnostics_option("serverselection", "NumberOfRepetitions", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1604,6 +1677,7 @@ static int set_IPDiagnosticsServerSelectionDiagnostics_Timeout(char *refparam, s
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("serverselection");
|
||||
dmubus_call_set("bbf.diag", "serverselection", UBUS_ARGS{{"cancel", "1", String},{"proto", "both_proto", String}}, 2);
|
||||
set_diagnostics_option("serverselection", "Timeout", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -421,7 +421,12 @@ static int get_forwarding_dns_server(char *refparam, struct dmctx *ctx, void *da
|
|||
|
||||
static int get_nslookupdiagnostics_diagnostics_state(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = get_diagnostics_option_fallback_def("nslookup", "DiagnosticState", "None");
|
||||
char *val = get_diagnostics_option_fallback_def("nslookup", "DiagnosticState", "None");
|
||||
if (DM_STRSTR(val, "Requested") != NULL)
|
||||
*value = dmstrdup("Requested");
|
||||
else
|
||||
*value = dmstrdup(val);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -692,8 +697,12 @@ static int set_nslookupdiagnostics_diagnostics_state(char *refparam, struct dmct
|
|||
return FAULT_9007;
|
||||
return 0;
|
||||
case VALUESET:
|
||||
if (DM_LSTRCMP(value, "Requested") == 0)
|
||||
if (DM_LSTRCMP(value, "Requested") == 0) {
|
||||
set_diagnostics_option("nslookup", "DiagnosticState", value);
|
||||
} else if (DM_LSTRCMP(value, "Canceled") == 0) {
|
||||
set_diagnostics_option("nslookup", "DiagnosticState", "None");
|
||||
dmubus_call_set("bbf.diag", "nslookup", UBUS_ARGS{{"cancel", "1", String},{"proto", "both_proto", String}}, 2);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
|
|
@ -717,6 +726,7 @@ static int set_nslookupdiagnostics_interface(char *refparam, struct dmctx *ctx,
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("nslookup");
|
||||
dmubus_call_set("bbf.diag", "nslookup", UBUS_ARGS{{"cancel", "1", String},{"proto", "both_proto", String}}, 2);
|
||||
set_diagnostics_option("nslookup", "interface", reference.value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -732,6 +742,7 @@ static int set_nslookupdiagnostics_host_name(char *refparam, struct dmctx *ctx,
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("nslookup");
|
||||
dmubus_call_set("bbf.diag", "nslookup", UBUS_ARGS{{"cancel", "1", String},{"proto", "both_proto", String}}, 2);
|
||||
set_diagnostics_option("nslookup", "HostName", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -747,6 +758,7 @@ static int set_nslookupdiagnostics_d_n_s_server(char *refparam, struct dmctx *ct
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("nslookup");
|
||||
dmubus_call_set("bbf.diag", "nslookup", UBUS_ARGS{{"cancel", "1", String},{"proto", "both_proto", String}}, 2);
|
||||
set_diagnostics_option("nslookup", "DNSServer", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -762,6 +774,7 @@ static int set_nslookupdiagnostics_timeout(char *refparam, struct dmctx *ctx, vo
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("nslookup");
|
||||
dmubus_call_set("bbf.diag", "nslookup", UBUS_ARGS{{"cancel", "1", String},{"proto", "both_proto", String}}, 2);
|
||||
set_diagnostics_option("nslookup", "Timeout", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -777,6 +790,7 @@ static int set_nslookupdiagnostics_number_of_repetitions(char *refparam, struct
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("nslookup");
|
||||
dmubus_call_set("bbf.diag", "nslookup", UBUS_ARGS{{"cancel", "1", String},{"proto", "both_proto", String}}, 2);
|
||||
set_diagnostics_option("nslookup", "NumberOfRepetitions", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,6 +31,14 @@ static int browsePacketCaptureResultInst(struct dmctx *dmctx, DMNODE *parent_nod
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void stop_packetcapture_diagnostics(void)
|
||||
{
|
||||
char cmd[256] = {0};
|
||||
|
||||
snprintf(cmd, sizeof(cmd), "sh %s '{\"proto\":\"both_proto\",\"cancel\":\"1\"}'", PACKET_CAPTURE_DIAGNOSTIC_PATH);
|
||||
system(cmd);
|
||||
}
|
||||
|
||||
/*************************************************************
|
||||
* GET & SET PARAM
|
||||
**************************************************************/
|
||||
|
|
@ -157,7 +165,12 @@ int operate_Device_packetCapture(char *refparam, struct dmctx *ctx, void *data,
|
|||
**************************************************************/
|
||||
static int get_PacketCapture_DiagnosticsState(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = get_diagnostics_option_fallback_def("packetcapture", "DiagnosticState", "None");
|
||||
char *val = get_diagnostics_option_fallback_def("packetcapture", "DiagnosticState", "None");
|
||||
if (DM_STRSTR(val, "Requested") != NULL)
|
||||
*value = dmstrdup("Requested");
|
||||
else
|
||||
*value = dmstrdup(val);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -169,8 +182,12 @@ static int set_PacketCapture_DiagnosticsState(char *refparam, struct dmctx *ctx,
|
|||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
if (DM_LSTRCMP(value, "Requested") == 0)
|
||||
if (DM_LSTRCMP(value, "Requested") == 0) {
|
||||
set_diagnostics_option("packetcapture", "DiagnosticState", value);
|
||||
} else if (DM_LSTRCMP(value, "Canceled") == 0) {
|
||||
set_diagnostics_option("packetcapture", "DiagnosticState", "None");
|
||||
stop_packetcapture_diagnostics();
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -200,6 +217,7 @@ static int set_PacketCapture_Interface(char *refparam, struct dmctx *ctx, void *
|
|||
break;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("packetcapture");
|
||||
stop_packetcapture_diagnostics();
|
||||
set_diagnostics_option("packetcapture", "Interface", reference.value);
|
||||
}
|
||||
return 0;
|
||||
|
|
@ -223,6 +241,7 @@ static int set_PacketCapture_Format(char *refparam, struct dmctx *ctx, void *dat
|
|||
break;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("packetcapture");
|
||||
stop_packetcapture_diagnostics();
|
||||
set_diagnostics_option("packetcapture", "Format", value);
|
||||
}
|
||||
return 0;
|
||||
|
|
@ -243,6 +262,7 @@ static int set_PacketCapture_Duration(char *refparam, struct dmctx *ctx, void *d
|
|||
break;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("packetcapture");
|
||||
stop_packetcapture_diagnostics();
|
||||
set_diagnostics_option("packetcapture", "Duration", value);
|
||||
}
|
||||
return 0;
|
||||
|
|
@ -263,6 +283,7 @@ static int set_PacketCapture_PacketCount(char *refparam, struct dmctx *ctx, void
|
|||
break;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("packetcapture");
|
||||
stop_packetcapture_diagnostics();
|
||||
set_diagnostics_option("packetcapture", "PacketCount", value);
|
||||
}
|
||||
return 0;
|
||||
|
|
@ -283,6 +304,7 @@ static int set_PacketCapture_FileTarget(char *refparam, struct dmctx *ctx, void
|
|||
break;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("packetcapture");
|
||||
stop_packetcapture_diagnostics();
|
||||
set_diagnostics_option("packetcapture", "FileTarget", value);
|
||||
}
|
||||
return 0;
|
||||
|
|
@ -303,6 +325,7 @@ static int set_PacketCapture_FilterExpression(char *refparam, struct dmctx *ctx,
|
|||
break;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("packetcapture");
|
||||
stop_packetcapture_diagnostics();
|
||||
set_diagnostics_option("packetcapture", "FilterExpression", value);
|
||||
}
|
||||
return 0;
|
||||
|
|
@ -323,6 +346,7 @@ static int set_PacketCapture_Username(char *refparam, struct dmctx *ctx, void *d
|
|||
break;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("packetcapture");
|
||||
stop_packetcapture_diagnostics();
|
||||
set_diagnostics_option("packetcapture", "Username", value);
|
||||
}
|
||||
return 0;
|
||||
|
|
@ -343,6 +367,7 @@ static int set_PacketCapture_Password(char *refparam, struct dmctx *ctx, void *d
|
|||
break;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("packetcapture");
|
||||
stop_packetcapture_diagnostics();
|
||||
set_diagnostics_option("packetcapture", "Password", value);
|
||||
}
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -14,6 +14,15 @@
|
|||
|
||||
#define IPLAYER_CAP_DIAGNOSTIC_PATH "/usr/share/bbfdm/iplayercap"
|
||||
|
||||
|
||||
static void stop_iplayercap_diagnostics()
|
||||
{
|
||||
char cmd[256] = {0};
|
||||
|
||||
snprintf(cmd, sizeof(cmd), "sh %s '{\"proto\":\"both_proto\",\"cancel\":\"1\"}'", IPLAYER_CAP_DIAGNOSTIC_PATH);
|
||||
system(cmd);
|
||||
}
|
||||
|
||||
/*
|
||||
* *** Device.IP.Diagnostics.IPLayerCapacityMetrics. ***
|
||||
*/
|
||||
|
|
@ -46,7 +55,12 @@ static int browseIPLayerCapacityIncrementalResultInst(struct dmctx *dmctx, DMNOD
|
|||
|
||||
static int get_IPDiagnosticsIPLayerCapacity_DiagnosticsState(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = get_diagnostics_option_fallback_def("iplayercapacity", "DiagnosticState", "None");
|
||||
char *val = get_diagnostics_option_fallback_def("iplayercapacity", "DiagnosticState", "None");
|
||||
if (DM_STRSTR(val, "Requested") != NULL)
|
||||
*value = dmstrdup("Requested");
|
||||
else
|
||||
*value = dmstrdup(val);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -58,8 +72,12 @@ static int set_IPDiagnosticsIPLayerCapacity_DiagnosticsState(char *refparam, str
|
|||
return FAULT_9007;
|
||||
return 0;
|
||||
case VALUESET:
|
||||
if (DM_LSTRCMP(value, "Requested") == 0)
|
||||
if (DM_LSTRCMP(value, "Requested") == 0) {
|
||||
set_diagnostics_option("iplayercapacity", "DiagnosticState", value);
|
||||
} else if (DM_LSTRCMP(value, "Canceled") == 0) {
|
||||
set_diagnostics_option("iplayercapacity", "DiagnosticState", "None");
|
||||
stop_iplayercap_diagnostics();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
|
|
@ -120,6 +138,7 @@ static int set_IPDiagnosticsIPLayerCapacity_Interface(char *refparam, struct dmc
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("iplayercapacity");
|
||||
stop_iplayercap_diagnostics();
|
||||
set_diagnostics_option("iplayercapacity", "interface", reference.value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -142,6 +161,7 @@ static int set_IPDiagnosticsIPLayerCapacity_Role(char *refparam, struct dmctx *c
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("iplayercapacity");
|
||||
stop_iplayercap_diagnostics();
|
||||
set_diagnostics_option("iplayercapacity", "Role", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -163,6 +183,7 @@ static int set_IPDiagnosticsIPLayerCapacity_Host(char *refparam, struct dmctx *c
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("iplayercapacity");
|
||||
stop_iplayercap_diagnostics();
|
||||
set_diagnostics_option("iplayercapacity", "Host", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -184,6 +205,7 @@ static int set_IPDiagnosticsIPLayerCapacity_Port(char *refparam, struct dmctx *c
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("iplayercapacity");
|
||||
stop_iplayercap_diagnostics();
|
||||
set_diagnostics_option("iplayercapacity", "Port", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -207,6 +229,7 @@ static int set_IPDiagnosticsIPLayerCapacity_JumboFramesPermitted(char *refparam,
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("iplayercapacity");
|
||||
stop_iplayercap_diagnostics();
|
||||
string_to_bool(value, &b);
|
||||
set_diagnostics_option("iplayercapacity", "JumboFramesPermitted", b ? "1" : "0");
|
||||
return 0;
|
||||
|
|
@ -229,6 +252,7 @@ static int set_IPDiagnosticsIPLayerCapacity_DSCP(char *refparam, struct dmctx *c
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("iplayercapacity");
|
||||
stop_iplayercap_diagnostics();
|
||||
set_diagnostics_option("iplayercapacity", "DSCP", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -250,6 +274,7 @@ static int set_IPDiagnosticsIPLayerCapacity_ProtocolVersion(char *refparam, stru
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("iplayercapacity");
|
||||
stop_iplayercap_diagnostics();
|
||||
set_diagnostics_option("iplayercapacity", "ProtocolVersion", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -271,6 +296,7 @@ static int set_IPDiagnosticsIPLayerCapacity_UDPPayloadContent(char *refparam, st
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("iplayercapacity");
|
||||
stop_iplayercap_diagnostics();
|
||||
set_diagnostics_option("iplayercapacity", "UDPPayloadContent", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -292,6 +318,7 @@ static int set_IPDiagnosticsIPLayerCapacity_TestType(char *refparam, struct dmct
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("iplayercapacity");
|
||||
stop_iplayercap_diagnostics();
|
||||
set_diagnostics_option("iplayercapacity", "TestType", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -315,6 +342,7 @@ static int set_IPDiagnosticsIPLayerCapacity_IPDVEnable(char *refparam, struct dm
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("iplayercapacity");
|
||||
stop_iplayercap_diagnostics();
|
||||
string_to_bool(value, &b);
|
||||
set_diagnostics_option("iplayercapacity", "IPDVEnable", b ? "1" : "0");
|
||||
return 0;
|
||||
|
|
@ -338,6 +366,7 @@ static int set_IPDiagnosticsIPLayerCapacity_StartSendingRateIndex(char *refparam
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("iplayercapacity");
|
||||
stop_iplayercap_diagnostics();
|
||||
set_diagnostics_option("iplayercapacity", "StartSendingRateIndex", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -359,6 +388,7 @@ static int set_IPDiagnosticsIPLayerCapacity_NumberFirstModeTestSubIntervals(char
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("iplayercapacity");
|
||||
stop_iplayercap_diagnostics();
|
||||
set_diagnostics_option("iplayercapacity", "NumberFirstModeTestSubIntervals", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -384,6 +414,7 @@ static int set_IPDiagnosticsIPLayerCapacity_NumberTestSubIntervals(char *refpara
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("iplayercapacity");
|
||||
stop_iplayercap_diagnostics();
|
||||
set_diagnostics_option("iplayercapacity", "NumberTestSubIntervals", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -406,6 +437,7 @@ static int set_IPDiagnosticsIPLayerCapacity_TestSubInterval(char *refparam, stru
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("iplayercapacity");
|
||||
stop_iplayercap_diagnostics();
|
||||
set_diagnostics_option("iplayercapacity", "TestSubInterval", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -427,6 +459,7 @@ static int set_IPDiagnosticsIPLayerCapacity_StatusFeedbackInterval(char *refpara
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("iplayercapacity");
|
||||
stop_iplayercap_diagnostics();
|
||||
set_diagnostics_option("iplayercapacity", "StatusFeedbackInterval", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -448,6 +481,7 @@ static int set_IPDiagnosticsIPLayerCapacity_SeqErrThresh(char *refparam, struct
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("iplayercapacity");
|
||||
stop_iplayercap_diagnostics();
|
||||
set_diagnostics_option("iplayercapacity", "SeqErrThresh", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -471,6 +505,7 @@ static int set_IPDiagnosticsIPLayerCapacity_ReordDupIgnoreEnable(char *refparam,
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("iplayercapacity");
|
||||
stop_iplayercap_diagnostics();
|
||||
string_to_bool(value, &b);
|
||||
set_diagnostics_option("iplayercapacity", "ReordDupIgnoreEnable", b ? "1" : "0");
|
||||
return 0;
|
||||
|
|
@ -493,6 +528,7 @@ static int set_IPDiagnosticsIPLayerCapacity_LowerThresh(char *refparam, struct d
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("iplayercapacity");
|
||||
stop_iplayercap_diagnostics();
|
||||
set_diagnostics_option("iplayercapacity", "LowerThresh", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -514,6 +550,7 @@ static int set_IPDiagnosticsIPLayerCapacity_UpperThresh(char *refparam, struct d
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("iplayercapacity");
|
||||
stop_iplayercap_diagnostics();
|
||||
set_diagnostics_option("iplayercapacity", "UpperThresh", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -535,6 +572,7 @@ static int set_IPDiagnosticsIPLayerCapacity_HighSpeedDelta(char *refparam, struc
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("iplayercapacity");
|
||||
stop_iplayercap_diagnostics();
|
||||
set_diagnostics_option("iplayercapacity", "HighSpeedDelta", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -556,6 +594,7 @@ static int set_IPDiagnosticsIPLayerCapacity_RateAdjAlgorithm(char *refparam, str
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("iplayercapacity");
|
||||
stop_iplayercap_diagnostics();
|
||||
set_diagnostics_option("iplayercapacity", "RateAdjAlgorithm", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -571,6 +610,7 @@ static int set_IPDiagnosticsIPLayerCapacity_SlowAdjThresh(char *refparam, struct
|
|||
return 0;
|
||||
case VALUESET:
|
||||
reset_diagnostic_state("iplayercapacity");
|
||||
stop_iplayercap_diagnostics();
|
||||
set_diagnostics_option("iplayercapacity", "SlowAdjThresh", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,10 +5,10 @@ BBF_SCRIPTS="/usr/share/bbfdm"
|
|||
|
||||
case "$1" in
|
||||
list)
|
||||
echo '{ "ipping" : { "host": "str", "iface": "str", "ip_proto": "str", "nbr_of_rep": "str", "timeout": "str", "data_size": "str", "dscp": "str", "proto": "str" },
|
||||
"nslookup" : { "host": "str", "dns_serevr": "str", "iface": "str", "nbr_of_rep": "str", "timeout": "str", "proto": "str" },
|
||||
"udpecho" : { "host": "str", "port":"str", "iface": "str", "ip_proto": "str", "nbr_of_rep": "str", "timeout": "str", "data_size": "str", "dscp": "str", "inter_trans_time":"str", "proto": "str" },
|
||||
"serverselection" : { "hostlist": "str", "port":"str", "iface": "str", "ip_proto": "str", "nbr_of_rep": "str", "timeout": "str", "protocol_used": "str", "proto": "str" },
|
||||
echo '{ "ipping" : { "host": "str", "iface": "str", "ip_proto": "str", "nbr_of_rep": "str", "timeout": "str", "data_size": "str", "dscp": "str", "proto": "str", "cancel": "str" },
|
||||
"nslookup" : { "host": "str", "dns_serevr": "str", "iface": "str", "nbr_of_rep": "str", "timeout": "str", "proto": "str", "cancel": "str" },
|
||||
"udpecho" : { "host": "str", "port":"str", "iface": "str", "ip_proto": "str", "nbr_of_rep": "str", "timeout": "str", "data_size": "str", "dscp": "str", "inter_trans_time":"str", "proto": "str", "cancel": "str" },
|
||||
"serverselection" : { "hostlist": "str", "port":"str", "iface": "str", "ip_proto": "str", "nbr_of_rep": "str", "timeout": "str", "protocol_used": "str", "proto": "str", "cancel": "str" },
|
||||
}'
|
||||
;;
|
||||
call)
|
||||
|
|
|
|||
|
|
@ -7,6 +7,38 @@
|
|||
ROOT="$(dirname "${0}")"
|
||||
. "${ROOT}"/bbf_api
|
||||
|
||||
clear_iplayercapacity_output() {
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.DiagnosticState="${1}"
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.SoftwareVersion=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.BOMTime=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.EOMTime=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.TmaxUsed=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.TestInterval=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.TmaxRTTUsed=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.TimestampResolutionUsed=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.MaxIPLayerCapacity=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.TimeOfMax=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.MaxETHCapacityNoFCS=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.MaxETHCapacityWithFCS=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.MaxETHCapacityWithFCSVLAN=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.LossRatioAtMax=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.RTTRangeAtMax=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.PDVRangeAtMax=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.MinOnewayDelayAtMax=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.ReorderedRatioAtMax=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.ReplicatedRatioAtMax=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.InterfaceEthMbpsAtMax=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.IPLayerCapacitySummary=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.LossRatioSummary=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.RTTRangeSummary=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.PDVRangeSummary=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.MinOnewayDelaySummary=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.MinRTTSummary=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.ReorderedRatioSummary=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.ReplicatedRatioSummary=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.InterfaceEthMbpsSummary=""
|
||||
}
|
||||
|
||||
iplayercap_error() {
|
||||
json_init
|
||||
json_add_string "Status" "$1"
|
||||
|
|
@ -14,35 +46,7 @@ iplayercap_error() {
|
|||
|
||||
# Store data in dmmap
|
||||
[ "$2" = "both_proto" ] && {
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.DiagnosticState="${1}"
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.SoftwareVersion=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.BOMTime=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.EOMTime=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.TmaxUsed=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.TestInterval=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.TmaxRTTUsed=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.TimestampResolutionUsed=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.MaxIPLayerCapacity=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.TimeOfMax=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.MaxETHCapacityNoFCS=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.MaxETHCapacityWithFCS=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.MaxETHCapacityWithFCSVLAN=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.LossRatioAtMax=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.RTTRangeAtMax=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.PDVRangeAtMax=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.MinOnewayDelayAtMax=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.ReorderedRatioAtMax=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.ReplicatedRatioAtMax=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.InterfaceEthMbpsAtMax=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.IPLayerCapacitySummary=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.LossRatioSummary=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.RTTRangeSummary=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.PDVRangeSummary=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.MinOnewayDelaySummary=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.MinRTTSummary=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.ReorderedRatioSummary=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.ReplicatedRatioSummary=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.InterfaceEthMbpsSummary=""
|
||||
clear_iplayercapacity_output "$1"
|
||||
|
||||
# Clear all incremental & modal result instances
|
||||
res=$($UCI_SHOW_BBF_DMMAP dmmap_diagnostics | grep -E "=modalresult$" | cut -d= -f 1)
|
||||
|
|
@ -89,6 +93,40 @@ iplayercap_launch() {
|
|||
json_get_var slow_adj_thresh slow_adj_thresh
|
||||
json_get_var proto proto
|
||||
|
||||
[ "${proto}" = "both_proto" ] && {
|
||||
old_pid=$(cat /tmp/iplayercap_pid)
|
||||
|
||||
[ -n "${old_pid}" ] && {
|
||||
cmd=$(cat /proc/$old_pid/cmdline)
|
||||
}
|
||||
|
||||
if [[ "${cmd}" = *iplayercap* ]]; then
|
||||
kill -9 $old_pid
|
||||
fi
|
||||
|
||||
# Clear all incremental & modal result instances
|
||||
res=$($UCI_SHOW_BBF_DMMAP dmmap_diagnostics | grep -E "=modalresult$" | cut -d= -f 1)
|
||||
for i in $res; do
|
||||
$UCI_DELETE_BBF_DMMAP "${i}"
|
||||
done
|
||||
|
||||
res=$($UCI_SHOW_BBF_DMMAP dmmap_diagnostics | grep -E "=incrementalresult$" | cut -d= -f 1)
|
||||
for i in $res; do
|
||||
$UCI_DELETE_BBF_DMMAP "${i}"
|
||||
done
|
||||
|
||||
if [ "${cancel}" -eq "1" ]; then
|
||||
clear_iplayercapacity_output "None"
|
||||
$UCI_COMMIT_BBF_DMMAP
|
||||
|
||||
return
|
||||
else
|
||||
echo $$ > /tmp/iplayercap_pid
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.DiagnosticState="Requested_running"
|
||||
$UCI_COMMIT_BBF_DMMAP
|
||||
fi
|
||||
}
|
||||
|
||||
# Fail if host is empty
|
||||
[ -z "${host}" ] && {
|
||||
iplayercap_error "Error_Internal" "${proto}"
|
||||
|
|
@ -307,17 +345,6 @@ iplayercap_launch() {
|
|||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.iplayercapacity.InterfaceEthMbpsSummary="${InterfaceEthMbps}"
|
||||
json_select ..
|
||||
|
||||
# Clear all existing incremental & modal result instances
|
||||
res=$($UCI_SHOW_BBF_DMMAP dmmap_diagnostics | grep -E "=modalresult$" | cut -d= -f 1)
|
||||
for i in $res; do
|
||||
$UCI_DELETE_BBF_DMMAP "${i}"
|
||||
done
|
||||
|
||||
res=$($UCI_SHOW_BBF_DMMAP dmmap_diagnostics | grep -E "=incrementalresult$" | cut -d= -f 1)
|
||||
for i in $res; do
|
||||
$UCI_DELETE_BBF_DMMAP "${i}"
|
||||
done
|
||||
|
||||
failed=0
|
||||
if json_is_a ModalResult array; then
|
||||
json_select ModalResult
|
||||
|
|
|
|||
|
|
@ -51,6 +51,51 @@ ipping_launch() {
|
|||
json_get_var dsize data_size
|
||||
json_get_var dscp dscp
|
||||
json_get_var proto proto
|
||||
json_get_var cancel cancel
|
||||
|
||||
if [ "${proto}" = "both_proto" ]; then
|
||||
old_pid=$(cat /tmp/ipping_pid)
|
||||
[ -n "${old_pid}" ] && {
|
||||
cmd=$(cat /proc/$old_pid/cmdline)
|
||||
}
|
||||
|
||||
if [[ "${cmd}" = *ipping* ]]; then
|
||||
kill -9 $old_pid
|
||||
fi
|
||||
|
||||
if [ "${cancel}" -eq "1" ]; then
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.ipping.DiagnosticState="None"
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.ipping.IPAddressUsed=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.ipping.SuccessCount=0
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.ipping.FailureCount="0"
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.ipping.AverageResponseTime=0
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.ipping.MinimumResponseTime=9999
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.ipping.MaximumResponseTime=0
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.ipping.AverageResponseTimeDetailed=0
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.ipping.MinimumResponseTimeDetailed=999999999
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.ipping.MaximumResponseTimeDetailed=0
|
||||
$UCI_COMMIT_BBF_DMMAP
|
||||
|
||||
json_init
|
||||
json_add_string "Status" "None"
|
||||
json_add_string "IPAddressUsed" ""
|
||||
json_add_int "MinimumResponseTime" "9999"
|
||||
json_add_int "AverageResponseTime" "0"
|
||||
json_add_int "MaximumResponseTime" "0"
|
||||
json_add_int "MinimumResponseTimeDetailed" "999999999"
|
||||
json_add_int "AverageResponseTimeDetailed" "0"
|
||||
json_add_int "MaximumResponseTimeDetailed" "0"
|
||||
json_add_int "SuccessCount" "0"
|
||||
json_add_int "FailureCount" "0"
|
||||
json_dump
|
||||
|
||||
return
|
||||
else
|
||||
echo $$ > /tmp/ipping_pid
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.ipping.DiagnosticState="Requested_running"
|
||||
$UCI_COMMIT_BBF_DMMAP
|
||||
fi
|
||||
fi
|
||||
|
||||
# Assign default value
|
||||
[ -z "${nbr_of_rep}" ] && nbr_of_rep=3
|
||||
|
|
|
|||
|
|
@ -43,6 +43,7 @@ nslookup_launch() {
|
|||
json_get_var iface iface
|
||||
json_get_var cnt nbr_of_rep
|
||||
json_get_var proto proto
|
||||
json_get_var cancel cancel
|
||||
|
||||
LOG_FILE=$(get_nslookup_log_file)
|
||||
|
||||
|
|
@ -51,11 +52,34 @@ nslookup_launch() {
|
|||
|
||||
# Clear all nslookup result instances
|
||||
[ "$proto" = "both_proto" ] && {
|
||||
old_pid=$(cat /tmp/nslookup_pid)
|
||||
[ -n "${old_pid}" ] && {
|
||||
cmd=$(cat /proc/$old_pid/cmdline)
|
||||
}
|
||||
|
||||
if [[ "${cmd}" = *nslookup* ]]; then
|
||||
kill -9 $old_pid
|
||||
fi
|
||||
|
||||
res=$($UCI_SHOW_BBF_DMMAP dmmap_diagnostics | grep -E "=NSLookupResult$" | cut -d= -f 1)
|
||||
for i in $res; do
|
||||
$UCI_DELETE_BBF_DMMAP "${i}"
|
||||
done
|
||||
$UCI_COMMIT_BBF_DMMAP
|
||||
|
||||
if [ "${cancel}" -eq "1" ]; then
|
||||
json_init
|
||||
json_add_string "Status" "None"
|
||||
json_add_int "SuccessCount" "0"
|
||||
json_dump
|
||||
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.nslookup.DiagnosticState="None"
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.nslookup.SuccessCount=0
|
||||
$UCI_COMMIT_BBF_DMMAP
|
||||
else
|
||||
echo $$ > /tmp/nslookup_pid
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.nslookup.DiagnosticState="Requested_running"
|
||||
$UCI_COMMIT_BBF_DMMAP
|
||||
fi
|
||||
}
|
||||
|
||||
# Fail if hostname is empty
|
||||
|
|
|
|||
|
|
@ -47,6 +47,42 @@ packet_capture_launch() {
|
|||
json_get_var username username
|
||||
json_get_var password password
|
||||
json_get_var proto proto
|
||||
json_get_var cancel cancel
|
||||
|
||||
[ "$proto" = "both_proto" ] && {
|
||||
old_pid=$(cat /tmp/packetcapture_pid)
|
||||
|
||||
[ -n "${old_pid}" ] && {
|
||||
cmd=$(cat /proc/$old_pid/cmdline)
|
||||
}
|
||||
|
||||
if [[ "${cmd}" = *packetcapture* ]]; then
|
||||
kill -9 ${old_pid}
|
||||
fi
|
||||
|
||||
if [ "${cancel}" -eq "1" ]; then
|
||||
json_init
|
||||
json_add_string "Status" "None"
|
||||
json_add_string "FileLocation" ""
|
||||
json_add_string "StartTime" "0"
|
||||
json_add_string "EndTime" "0"
|
||||
json_add_string "Count" "0"
|
||||
json_dump
|
||||
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.packetcapture.DiagnosticState="None"
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.packetcapture.FileLocation=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.packetcapture.StartTime=0
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.packetcapture.EndTime=0
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.packetcapture.Count=0
|
||||
$UCI_COMMIT_BBF_DMMAP
|
||||
|
||||
return
|
||||
else
|
||||
echo $$ > /tmp/packetcapture_pid
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.packetcapture.DiagnosticState="Requested_running"
|
||||
$UCI_COMMIT_BBF_DMMAP
|
||||
fi
|
||||
}
|
||||
|
||||
if [ -n "${format}" ] && [ "${format}" != "libpcap" ]; then
|
||||
# Error
|
||||
|
|
|
|||
|
|
@ -24,6 +24,7 @@ serverselection_error() {
|
|||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.serverselection.MinimumResponseTime=9999
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.serverselection.AverageResponseTime=0
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.serverselection.MaximumResponseTime=0
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.serverselection.IPAddressUsed=""
|
||||
$UCI_COMMIT_BBF_DMMAP
|
||||
}
|
||||
}
|
||||
|
|
@ -41,6 +42,44 @@ serverselection_launch() {
|
|||
json_get_var timeout timeout
|
||||
json_get_var protocol_used protocol_used
|
||||
json_get_var proto proto
|
||||
json_get_var cancel cancel
|
||||
|
||||
if [ "${proto}" = "both_proto" ]; then
|
||||
old_pid=$(cat /tmp/serverselection_pid)
|
||||
|
||||
[ -n "${old_pid}" ] && {
|
||||
cmd=$(cat /proc/$old_pid/cmdline)
|
||||
}
|
||||
|
||||
if [[ "${cmd}" = *serverselection* ]]; then
|
||||
kill -9 $old_pid
|
||||
fi
|
||||
|
||||
if [ "${cancel}" -eq "1" ]; then
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.serverselection.DiagnosticState="None"
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.serverselection.FastestHost=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.serverselection.MinimumResponseTime=9999
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.serverselection.AverageResponseTime=0
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.serverselection.MaximumResponseTime=0
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.serverselection.IPAddressUsed=""
|
||||
$UCI_COMMIT_BBF_DMMAP
|
||||
|
||||
json_init
|
||||
json_add_string "Status" "None"
|
||||
json_add_string "FastestHost" ""
|
||||
json_add_string "IPAddressUsed" ""
|
||||
json_add_int "MinimumResponseTime" "9999"
|
||||
json_add_int "AverageResponseTime" "0"
|
||||
json_add_int "MaximumResponseTime" "0"
|
||||
json_dump
|
||||
|
||||
return
|
||||
else
|
||||
echo $$ > /tmp/serverselection_pid
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.serverselection.DiagnosticState="Requested_running"
|
||||
$UCI_COMMIT_BBF_DMMAP
|
||||
fi
|
||||
fi
|
||||
|
||||
# Assign default value
|
||||
[ -z "${nbr_of_rep}" ] && nbr_of_rep=3
|
||||
|
|
|
|||
|
|
@ -51,7 +51,8 @@ traceroute_launch() {
|
|||
json_get_var dscp dscp
|
||||
json_get_var maxhop max_hop_cnt
|
||||
json_get_var proto proto
|
||||
|
||||
json_get_var cancel cancel
|
||||
|
||||
LOG_FILE=$(get_traceroute_log_file)
|
||||
|
||||
# Assign default value
|
||||
|
|
@ -64,11 +65,40 @@ traceroute_launch() {
|
|||
|
||||
# Clear all route hops instances
|
||||
[ "$proto" = "both_proto" ] && {
|
||||
old_pid=$(cat /tmp/traceroute_pid)
|
||||
|
||||
[ -n "${old_pid}" ] && {
|
||||
cmd=$(cat /proc/$old_pid/cmdline)
|
||||
}
|
||||
|
||||
if [[ "${cmd}" = *traceroute* ]]; then
|
||||
kill -9 ${old_pid}
|
||||
fi
|
||||
|
||||
res=$($UCI_SHOW_BBF_DMMAP dmmap_diagnostics | grep -E "=RouteHops$" | cut -d= -f 1)
|
||||
for i in $res; do
|
||||
$UCI_DELETE_BBF_DMMAP "${i}"
|
||||
done
|
||||
$UCI_COMMIT_BBF_DMMAP
|
||||
|
||||
if [ "${cancel}" -eq "1" ]; then
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.traceroute.DiagnosticState="None"
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.traceroute.IPAddressUsed=""
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.traceroute.NumberOfHops="0"
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.traceroute.ResponseTime="0"
|
||||
$UCI_COMMIT_BBF_DMMAP
|
||||
|
||||
json_init
|
||||
json_add_string "Status" "None"
|
||||
json_add_string "IPAddressUsed" ""
|
||||
json_add_int "ResponseTime" "0"
|
||||
json_dump
|
||||
|
||||
return
|
||||
else
|
||||
echo $$ > /tmp/traceroute_pid
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.traceroute.DiagnosticState="Requested_running"
|
||||
$UCI_COMMIT_BBF_DMMAP
|
||||
fi
|
||||
}
|
||||
|
||||
# Fail if host is empty
|
||||
|
|
|
|||
|
|
@ -46,6 +46,46 @@ udpecho_launch() {
|
|||
json_get_var dscp dscp
|
||||
json_get_var inter_time inter_trans_time
|
||||
json_get_var proto proto
|
||||
json_get_var cancel cancel
|
||||
|
||||
[ "${proto}" = "both_proto" ] && {
|
||||
old_pid=$(cat /tmp/udpecho_pid)
|
||||
|
||||
[ -n "${old_pid}" ] && {
|
||||
cmd=$(cat /proc/$old_pid/cmdline)
|
||||
}
|
||||
|
||||
if [[ "${cmd}" = *udpecho* ]]; then
|
||||
kill -9 $old_pid
|
||||
fi
|
||||
|
||||
if [ "${cancel}" -eq "1" ]; then
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.udpechodiag.DiagnosticState="None"
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.udpechodiag.SuccessCount="0"
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.udpechodiag.FailureCount="0"
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.udpechodiag.MinimumResponseTime="9999"
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.udpechodiag.AverageResponseTime="0"
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.udpechodiag.MaximumResponseTime="0"
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.udpechodiag.IPAddressUsed=""
|
||||
$UCI_COMMIT_BBF_DMMAP
|
||||
|
||||
json_init
|
||||
json_add_string "Status" "None"
|
||||
json_add_string "IPAddressUsed" ""
|
||||
json_add_int "SuccessCount" "0"
|
||||
json_add_int "FailureCount" "0"
|
||||
json_add_int "MinimumResponseTime" "9999"
|
||||
json_add_int "AverageResponseTime" "0"
|
||||
json_add_int "MaximumResponseTime" "0"
|
||||
json_dump
|
||||
|
||||
return
|
||||
else
|
||||
echo $$ > /tmp/udpecho_pid
|
||||
$UCI_SET_BBF_DMMAP dmmap_diagnostics.udpechodiag.DiagnosticState="Requested_running"
|
||||
$UCI_COMMIT_BBF_DMMAP
|
||||
fi
|
||||
}
|
||||
|
||||
# Assign default value
|
||||
[ -z "${nbr_of_rep}" ] && nbr_of_rep=1
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue