mirror of
https://dev.iopsys.eu/bbf/bbfdm.git
synced 2025-12-10 07:44:39 +01:00
Move tr104 out to run it as dm micro-service
This commit is contained in:
parent
f82803d91d
commit
ea0b14e838
36 changed files with 40 additions and 6657 deletions
|
|
@ -20,8 +20,8 @@ install_libwifi_dataelements ${1}
|
|||
|
||||
# Install datamodel plugins only when pipeline trigger for bbfdm
|
||||
if [ -z "${1}" ]; then
|
||||
git clone --depth 1 https://dev.iopsys.eu/feed/iopsys.git /opt/dev/iopsys
|
||||
git clone --depth 1 https://dev.iopsys.eu/bbf/bulkdata.git /opt/dev/bulkdata
|
||||
git clone --depth 1 https://gitlab-ci-token:${CI_JOB_TOKEN}@dev.iopsys.eu/feed/iopsys.git /opt/dev/iopsys
|
||||
git clone --depth 1 https://gitlab-ci-token:${CI_JOB_TOKEN}@dev.iopsys.eu/bbf/bulkdata.git /opt/dev/bulkdata
|
||||
|
||||
cp -f /opt/dev/iopsys/urlfilter/files/etc/bbfdm/json/urlfilter.json /etc/bbfdm/json
|
||||
cp -f /opt/dev/iopsys/obuspa/files/etc/bbfdm/json/USPAgent.json /etc/bbfdm/json
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ function install_libusermngr()
|
|||
{
|
||||
# clone and compile libusermngr
|
||||
rm -rf /opt/dev/usermngr
|
||||
exec_cmd git clone -b devel https://dev.iopsys.eu/bbf/usermngr.git /opt/dev/usermngr
|
||||
exec_cmd git clone -b devel https://gitlab-ci-token:${CI_JOB_TOKEN}@dev.iopsys.eu/bbf/usermngr.git /opt/dev/usermngr
|
||||
|
||||
echo "Compiling libusermngr"
|
||||
exec_cmd_verbose make clean -C /opt/dev/usermngr/src/
|
||||
|
|
@ -110,7 +110,7 @@ function install_libperiodicstats()
|
|||
{
|
||||
# clone and compile libperiodicstats
|
||||
rm -rf /opt/dev/periodicstats
|
||||
exec_cmd git clone -b devel https://dev.iopsys.eu/bbf/periodicstats.git /opt/dev/periodicstats
|
||||
exec_cmd git clone -b devel https://gitlab-ci-token:${CI_JOB_TOKEN}@dev.iopsys.eu/bbf/periodicstats.git /opt/dev/periodicstats
|
||||
|
||||
echo "Compiling libperiodicstats"
|
||||
exec_cmd_verbose make clean -C /opt/dev/periodicstats/
|
||||
|
|
@ -126,7 +126,7 @@ function install_libcwmpdm()
|
|||
{
|
||||
# clone and compile libcwmpdm
|
||||
rm -rf /opt/dev/icwmp
|
||||
exec_cmd git clone -b devel --depth 1 https://dev.iopsys.eu/bbf/icwmp.git /opt/dev/icwmp
|
||||
exec_cmd git clone -b devel --depth 1 https://gitlab-ci-token:${CI_JOB_TOKEN}@dev.iopsys.eu/bbf/icwmp.git /opt/dev/icwmp
|
||||
|
||||
echo "Compiling libcwmpdm"
|
||||
cd /opt/dev/icwmp
|
||||
|
|
|
|||
|
|
@ -62,6 +62,11 @@ check_ret $?
|
|||
|
||||
|
||||
echo "********* Validate XML File *********"
|
||||
if [ -n "${CI_SERVER_HOST}" ]; then
|
||||
echo "machine ${CI_SERVER_HOST}" >>~/.netrc
|
||||
echo "login gitlab-ci-token" >>~/.netrc
|
||||
echo "password ${CI_JOB_TOKEN}" >>~/.netrc
|
||||
fi
|
||||
|
||||
cd tools
|
||||
./generate_dm.py tools_input.json
|
||||
|
|
|
|||
|
|
@ -9,7 +9,6 @@ ADD_DEFINITIONS(-DBBF_VENDOR_PREFIX="${BBF_VENDOR_PREFIX}")
|
|||
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I${CMAKE_SOURCE_DIR} -I${CMAKE_CURRENT_SOURCE_DIR} -I${CMAKE_CURRENT_SOURCE_DIR}/dmtree")
|
||||
|
||||
OPTION(BBF_TR181 "build with tr181 datamodel" ON)
|
||||
OPTION(BBF_TR104 "build with tr104 datamodel" ON)
|
||||
OPTION(BBF_TR143 "build with tr143 datamodel" ON)
|
||||
OPTION(BBF_TR471 "build with tr471 datamodel" ON)
|
||||
OPTION(BBF_VENDOR_EXTENSION "build with vendor extension enabled" ON)
|
||||
|
|
@ -33,12 +32,6 @@ IF(BBF_TR181)
|
|||
ENDIF(BBF_WIFI_DATAELEMENTS)
|
||||
ENDIF(BBF_TR181)
|
||||
|
||||
IF(BBF_TR104)
|
||||
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I${CMAKE_CURRENT_SOURCE_DIR}/dmtree/tr104")
|
||||
FILE(GLOB BBF_TR104_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/dmtree/tr104/*.c)
|
||||
add_compile_definitions(BBF_TR104)
|
||||
ENDIF(BBF_TR104)
|
||||
|
||||
IF(BBF_TR143)
|
||||
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I${CMAKE_CURRENT_SOURCE_DIR}/dmtree/tr143")
|
||||
FILE(GLOB BBF_TR143_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/dmtree/tr143/*.c)
|
||||
|
|
@ -91,7 +84,7 @@ IF(BBF_VENDOR_EXTENSION)
|
|||
endforeach()
|
||||
ENDIF(BBF_VENDOR_EXTENSION)
|
||||
|
||||
ADD_LIBRARY(bbfdm SHARED ${BBF_DM_SOURCES} ${BBF_TR181_SOURCES} ${BBF_TR104_SOURCES} ${BBF_TR143_SOURCES} ${BBF_TR471_SOURCES} ${BBF_VENDOR_EXTENSION_SOURCES})
|
||||
ADD_LIBRARY(bbfdm SHARED ${BBF_DM_SOURCES} ${BBF_TR181_SOURCES} ${BBF_TR143_SOURCES} ${BBF_TR471_SOURCES} ${BBF_VENDOR_EXTENSION_SOURCES})
|
||||
|
||||
TARGET_LINK_LIBRARIES(bbfdm uci ubus ubox json-c blobmsg_json curl bbfdm-api ${SSL_LIBS} ${CRYPTO_LIBS})
|
||||
|
||||
|
|
|
|||
|
|
@ -1,762 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License version 2.1
|
||||
* as published by the Free Software Foundation
|
||||
*
|
||||
* Author: Yalu Zhang, yalu.zhang@iopsys.eu
|
||||
*/
|
||||
|
||||
#include "common.h"
|
||||
|
||||
char *RFPowerControl[] = {"Normal", "Reduced", NULL};
|
||||
char *ProxyServerTransport[] = {"UDP", "TCP", "TLS", "SCTP", NULL};
|
||||
char *RegistrarServerTransport[] = {"UDP", "TCP", "TLS", "SCTP", NULL};
|
||||
char *DTMFMethod[] = {"InBand", "RFC4733", "SIPInfo", NULL};
|
||||
char *JitterBufferType[] = {"Static", "Dynamic", NULL};
|
||||
char *KeyingMethods[] = {"Null", "Static", "SDP", "IKE", NULL};
|
||||
char *FacilityAction[] = {"AA_REGISTER", "AA_ERASE", "AA_INTERROGATE", "CA_ACTIVATE", "CCBS_ACTIVATE", "CCBS_DEACTIVATE", "CCBS_INTERROGATE", "CCNR_ACTIVATE", "CCNR_DEACTIVATE", "CCNR_INTERROGATE", "CFB_REGISTER", "CFB_ACTIVATE", "CFB_DEACTIVATE", "CFB_ERASE", "CFB_INTERROGATE", "CFNR_REGISTER", "CFNR_ACTIVATE", "CFNR_DEACTIVATE", "CFNR_ERASE", "CFNR_INTERROGATE", "CFNR_TIMER", "CFT_ACTIVATE", "CFT_DEACTIVATE", "CFT_INTERROGATE", "CFU_REGISTER", "CFU_ACTIVATE", "CFU_DEACTIVATE", "CFU_ERASE", "CFU_INTERROGATE", "CLIR_ACTIVATE", "CLIR_DEACTIVATE", "CLIR_INTERROGATE", "CP_INVOKE", "CW_ACTIVATE", "CW_DEACTIVATE", "CW_INVOKE", "DND_ACTIVATE", "DND_DEACTIVATE", "DND_INTERROGATE", "EXT_INVOKE", "LINE_INVOKE", "MAILBOX_INVOKE", "OCB_ACTIVATE", "OCB_DEACTIVATE", "OCB_INTERROGATE", "PSO_ACTIVATE", "PW_SET", "SCF_ACTIVATE", "SCF_DEACTIVATE", "SCF_INTERROGATE", "SCREJ_ACTIVATE", "SCREJ_DEACTIVATE", "SCREJ_INTERROGATE", "SR_ACTIVATE", "SR_DEACTIVATE", "SR_INTERROGATE", NULL};
|
||||
struct codec_info supported_codecs[MAX_SUPPORTED_CODECS];
|
||||
int codecs_num;
|
||||
extern struct list_head global_memhead;
|
||||
LIST_HEAD(call_log_list);
|
||||
static struct stat prev_stat = { 0 };
|
||||
static int call_log_list_size = 0;
|
||||
int call_log_count = 0;
|
||||
|
||||
int init_supported_codecs(void)
|
||||
{
|
||||
json_object *res = NULL;
|
||||
|
||||
dmubus_call("voice.asterisk", "codecs", UBUS_ARGS{0}, 0, &res);
|
||||
if (!res)
|
||||
return -1;
|
||||
|
||||
int num = json_object_object_length(res);
|
||||
if (num <= 0)
|
||||
return -1;
|
||||
|
||||
json_object_object_foreach(res, key, value) {
|
||||
if (value) {
|
||||
const char *codec = NULL;
|
||||
int min = 0, max = 0, increment = 0, ptime_default = 0;
|
||||
int size = sizeof(supported_codecs[codecs_num].packetization_period);
|
||||
|
||||
DM_STRNCPY(supported_codecs[codecs_num].uci_name, key, sizeof(supported_codecs[codecs_num].uci_name) - 1);
|
||||
json_object_object_foreach(value, sub_key, sub_value) {
|
||||
if (sub_value && !strcasecmp(sub_key, "name") && (codec = json_object_get_string(sub_value)) != NULL) {
|
||||
DM_STRNCPY(supported_codecs[codecs_num].codec, codec, sizeof(supported_codecs[codecs_num].codec));
|
||||
} else if (sub_value && !strcasecmp(sub_key, "bitrate")) {
|
||||
supported_codecs[codecs_num].bit_rate = json_object_get_int(sub_value);
|
||||
} else if (sub_value && !strcasecmp(sub_key, "ptime_min")) {
|
||||
min = json_object_get_int(sub_value);
|
||||
} else if (sub_value && !strcasecmp(sub_key, "ptime_max")) {
|
||||
max = json_object_get_int(sub_value);
|
||||
} else if (sub_value && !strcasecmp(sub_key, "ptime_increment")) {
|
||||
increment = json_object_get_int(sub_value);
|
||||
} else if (sub_value && !strcasecmp(sub_key, "ptime_default")) {
|
||||
ptime_default = json_object_get_int(sub_value);
|
||||
}
|
||||
}
|
||||
|
||||
// Construct packetization period
|
||||
if (min > 0 && max > min) {
|
||||
int duration = 0, total_len = 0;
|
||||
|
||||
if (increment <= 0)
|
||||
increment = 10;
|
||||
for (total_len = 0, duration = min; duration <= max; duration += increment) {
|
||||
supported_codecs[codecs_num].ptime_default = (unsigned int)ptime_default;
|
||||
int len = snprintf(supported_codecs[codecs_num].packetization_period + total_len, size,
|
||||
"%s%d", (duration == min) ? "" : ",", duration);
|
||||
if (len > 0 && len < size) {
|
||||
total_len += len;
|
||||
size -= len;
|
||||
} else {
|
||||
BBF_DEBUG("supported_codecs[codecs_num].packetization_period = %s, "
|
||||
"the size is too small\n", supported_codecs[codecs_num].packetization_period);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
++codecs_num;
|
||||
if (codecs_num >= num || codecs_num >= MAX_SUPPORTED_CODECS)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Convert the format of source/destination/used_line in a call log to which is defined in TR-104
|
||||
#define TEL_LINE_PREFIX "TELCHAN/"
|
||||
#define SIP_ACCOUNT_PREFIX "SIP/sip"
|
||||
static void convert_src_dst(char *src_or_dst, size_t buf_size)
|
||||
{
|
||||
char *token;
|
||||
int inst;
|
||||
|
||||
// Examples, "TELCHAN/5/2", "SIP/sip0-00000000",
|
||||
if ((token = DM_LSTRSTR(src_or_dst, TEL_LINE_PREFIX))) {
|
||||
inst = DM_STRTOL(token + strlen(TEL_LINE_PREFIX)) + 1;
|
||||
snprintf(src_or_dst, buf_size, "Device.Services.VoiceService.1.CallControl.Extension.%d", inst);
|
||||
} else if ((token = DM_LSTRSTR(src_or_dst, SIP_ACCOUNT_PREFIX))) {
|
||||
inst = DM_STRTOL(token + strlen(SIP_ACCOUNT_PREFIX)) + 1;
|
||||
snprintf(src_or_dst, buf_size, "Device.Services.VoiceService.1.SIP.Client.%d", inst);
|
||||
}
|
||||
}
|
||||
// TODO Convert used line from "SIP/sip0-00000000" to sip{i} then to correspond line{i}
|
||||
static void convert_sip_line(char *sip_line, size_t buf_size)
|
||||
{
|
||||
char *token;
|
||||
// Examples, "SIP/sip0-00000000",
|
||||
if ((token = DM_LSTRSTR(sip_line, SIP_ACCOUNT_PREFIX))) {
|
||||
int inst = DM_STRTOL(token + strlen(SIP_ACCOUNT_PREFIX)) + 1;
|
||||
//snprintf(sip_line, buf_size, "sip%d", inst); // sip{i}
|
||||
// TODO Convert sip{i} to correspond line{i}, hard mapping at the moment (sip1->line1)
|
||||
snprintf(sip_line, buf_size, "Device.Services.VoiceService.1.CallControl.Line.%d", inst);
|
||||
|
||||
}
|
||||
}
|
||||
#define EXTENSION_PREFIX "TELCHAN"
|
||||
// convert_used_extensions
|
||||
static void convert_used_extensions(char *used_extensions, size_t buf_size)
|
||||
{
|
||||
char *token;
|
||||
int inst;
|
||||
char buf[512] = {0};
|
||||
|
||||
// Examples, if "TELCHAN/1" else if "TELCHAN\/3&&TELCHAN\/2,,tF(hangup,h,2)" else "PJSIP/57007@sip2,,gT",
|
||||
if ((token = DM_LSTRSTR(used_extensions, TEL_LINE_PREFIX))) {
|
||||
inst = DM_STRTOL(token + strlen(TEL_LINE_PREFIX)) + 1;
|
||||
snprintf(used_extensions, buf_size, "Device.Services.VoiceService.1.CallControl.Extension.%d", inst);
|
||||
} else {
|
||||
unsigned pos = 0;
|
||||
if ((token = DM_LSTRSTR(used_extensions, EXTENSION_PREFIX))) {
|
||||
do {
|
||||
token += strlen(EXTENSION_PREFIX);
|
||||
inst = DM_STRTOL(token+2) + 1;
|
||||
pos += snprintf(&buf[pos], sizeof(buf) - pos, "Device.Services.VoiceService.1.CallControl.Extension.%d,", inst);
|
||||
}while ((token = DM_LSTRSTR(token, EXTENSION_PREFIX)));
|
||||
}
|
||||
if (pos) {
|
||||
buf[pos - 1] = 0;
|
||||
}
|
||||
token = (buf[0] != '\0') ? dmstrdup(buf) : "";
|
||||
snprintf(used_extensions, buf_size, "%s", token);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// return true is having successful responses 2xx
|
||||
bool sip_response_checker(char *response_code) {
|
||||
int code;
|
||||
code = atoi(response_code);
|
||||
if (code>=200 && code<=299) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
#define CALL_LOG_FILE "/var/log/asterisk/cdr-csv/Master.csv"
|
||||
#define SEPARATOR "\",\""
|
||||
#define SEPARATOR_SIZE strlen(SEPARATOR)
|
||||
int init_call_log(void)
|
||||
{
|
||||
#define CHECK_RESULT(cond) if (!(cond)) { \
|
||||
BBF_DEBUG("Invalid cdr [%s]\ncalling_number = [%s], called_number = [%s], " \
|
||||
"start_time = [%s], end_time = %s\n", line, \
|
||||
cdr.calling_num, cdr.called_num, cdr.start_time, end_time); \
|
||||
continue; \
|
||||
}
|
||||
struct stat cur_stat;
|
||||
int res = 0, i = 0;
|
||||
struct call_log_entry *entry;
|
||||
struct list_head *pos = NULL;
|
||||
FILE *fp = NULL;
|
||||
char line[1024];
|
||||
|
||||
// Check if there are any new call logs since the last time
|
||||
if (stat(CALL_LOG_FILE, &cur_stat) == 0) {
|
||||
if (memcmp(&cur_stat, &prev_stat, sizeof(cur_stat)) == 0) {
|
||||
return 0;
|
||||
} else {
|
||||
prev_stat = cur_stat;
|
||||
}
|
||||
}
|
||||
|
||||
// Master.csv
|
||||
fp = fopen(CALL_LOG_FILE, "r");
|
||||
if (!fp) {
|
||||
BBF_DEBUG("Call log file %s doesn't exist\n", CALL_LOG_FILE);
|
||||
res = -1;
|
||||
goto __ret;
|
||||
}
|
||||
|
||||
struct call_log_entry buf_cdr = { {NULL, NULL}, };
|
||||
DM_STRNCPY(buf_cdr.sessionId, "First", sizeof(buf_cdr.sessionId));
|
||||
bool line_record = false;
|
||||
do {
|
||||
if(fgets(line, sizeof(line), fp) != NULL) {
|
||||
line_record = true;
|
||||
} else if (!line_record) {
|
||||
// empty file, jump out without write
|
||||
continue;
|
||||
} else {
|
||||
line_record = false; // reaching the end, no new record from file.
|
||||
// last buf need to be written.
|
||||
}
|
||||
struct call_log_entry cdr = { {NULL, NULL}, };
|
||||
if ( line_record ){
|
||||
char end_time[sizeof(cdr.start_time)] = "";
|
||||
char *token, *end;
|
||||
/*
|
||||
* Parse the line for one call record. Examples of call log is below
|
||||
*
|
||||
* Tel 1 --> Tel 2, busy
|
||||
* "","8001","8002","sip0","""8001"" <8001>","TELCHAN/5/22","SIP/sip0-00000013","Dial","SIP/8002@sip0,,gT", \
|
||||
* "2020-08-27 11:02:40",,"2020-08-27 11:02:40",0,0,"BUSY","DOCUMENTATION","1598518960.99",""
|
||||
*
|
||||
* Tel 1 --> Tel 2
|
||||
* "","8001","8002","sip0","""8001"" <8001>","TELCHAN/5/19","SIP/sip0-00000011","Dial","SIP/8002@sip0,,gT", \
|
||||
* "2020-08-27 11:02:16","2020-08-27 11:02:20","2020-08-27 11:02:25",8,5,"ANSWERED","DOCUMENTATION", \
|
||||
* "1598518936.86",""
|
||||
*
|
||||
* External --> Tel 1
|
||||
* "","7001","8001","call_line",""""" <7001>","SIP/sip0-00000015","TELCHAN/5/25","Dial", \
|
||||
* "TELCHAN\/5,,tF(hangup,h,2)","2020-08-27 11:09:40","2020-08-27 11:09:45","2020-08-27 11:20:40", \
|
||||
* 660,654,"ANSWERED","DOCUMENTATION","1598519380.114",""
|
||||
*
|
||||
* Tel 1 --> External
|
||||
* "","8001","7001","sip0","""8001"" <8001>","TELCHAN/5/1","SIP/sip0-00000001","Dial","SIP/7001@sip0,,gT", \
|
||||
* "2020-08-25 16:11:41","2020-08-25 16:11:50","2020-08-25 16:12:02",21,11,"ANSWERED","DOCUMENTATION", \
|
||||
* "1598364701.4",""
|
||||
*/
|
||||
// calling number
|
||||
token = DM_LSTRSTR(line, SEPARATOR);
|
||||
CHECK_RESULT(token);
|
||||
token += SEPARATOR_SIZE;
|
||||
end = DM_LSTRSTR(token, SEPARATOR);
|
||||
CHECK_RESULT(end);
|
||||
DM_STRNCPY(cdr.calling_num, token, end - token + 1);
|
||||
// called number
|
||||
token = end + SEPARATOR_SIZE;
|
||||
end = DM_LSTRSTR(token, SEPARATOR);
|
||||
CHECK_RESULT(end);
|
||||
DM_STRNCPY(cdr.called_num, token, end - token + 1);
|
||||
// source
|
||||
token = end + SEPARATOR_SIZE; // sip0 in the last example
|
||||
token = DM_LSTRSTR(token, SEPARATOR);
|
||||
CHECK_RESULT(token);
|
||||
token += SEPARATOR_SIZE; // ""8001"" <8001> in the last example
|
||||
token = DM_LSTRSTR(token, SEPARATOR);
|
||||
CHECK_RESULT(token);
|
||||
token += SEPARATOR_SIZE; // TELCHAN/5/1 in the last example
|
||||
end = DM_LSTRSTR(token, SEPARATOR);
|
||||
CHECK_RESULT(end);
|
||||
DM_STRNCPY(cdr.source, token, end - token + 1);
|
||||
// destination
|
||||
token = end + SEPARATOR_SIZE; // SIP/sip0-00000001 in the last example
|
||||
end = DM_LSTRSTR(token, SEPARATOR);
|
||||
CHECK_RESULT(end);
|
||||
DM_STRNCPY(cdr.destination, token, end - token + 1);
|
||||
// start time and end time
|
||||
token = end + SEPARATOR_SIZE; // Dial in the last example
|
||||
token = DM_LSTRSTR(token, SEPARATOR);
|
||||
CHECK_RESULT(token);
|
||||
token += SEPARATOR_SIZE; // SIP/7001@sip0,,gT in the last example
|
||||
end = DM_LSTRSTR(token, SEPARATOR);
|
||||
CHECK_RESULT(end);
|
||||
DM_STRNCPY(cdr.used_extensions, token, end - token + 1);
|
||||
token = end + SEPARATOR_SIZE; // The first date
|
||||
end = DM_LSTRSTR(token, "\",,\"");
|
||||
if (end) {
|
||||
// Not answered, e.g. "2020-08-27 11:02:40",,"2020-08-27 11:02:40",21,11,
|
||||
DM_STRNCPY(cdr.start_time, token, end - token + 1);
|
||||
token = end + 4;
|
||||
} else {
|
||||
// Answered, e.g. "2020-08-25 16:11:41","2020-08-25 16:11:50","2020-08-25 16:12:02",21,11,
|
||||
end = DM_LSTRSTR(token, SEPARATOR);
|
||||
CHECK_RESULT(end);
|
||||
DM_STRNCPY(cdr.start_time, token, end - token + 1);
|
||||
token = DM_LSTRSTR(end + SEPARATOR_SIZE, SEPARATOR); // Skip the middle date and come to the last date
|
||||
CHECK_RESULT(token);
|
||||
token += SEPARATOR_SIZE;
|
||||
}
|
||||
end = DM_LSTRSTR(token, "\",");
|
||||
CHECK_RESULT(end);
|
||||
DM_STRNCPY(end_time, token, end - token + 1);
|
||||
// termination cause
|
||||
token = DM_LSTRSTR(end + 2, ",\""); // ANSWERED in the last example
|
||||
CHECK_RESULT(token);
|
||||
token += 2;
|
||||
end = DM_LSTRSTR(token, "\",");
|
||||
CHECK_RESULT(end);
|
||||
DM_STRNCPY(cdr.termination_cause, token, end - token + 1);
|
||||
|
||||
// session id
|
||||
token = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(token);
|
||||
token += 1;
|
||||
end = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(end);
|
||||
DM_STRNCPY(cdr.sessionId, token, end - token + 1);
|
||||
|
||||
// SIP Session Id
|
||||
token = DM_LSTRSTR(token, ",\"");
|
||||
CHECK_RESULT(token);
|
||||
token += 2;
|
||||
end = DM_LSTRSTR(token, "\",");
|
||||
CHECK_RESULT(end);
|
||||
DM_STRNCPY(cdr.SIPSessionId, token, end - token + 1);
|
||||
|
||||
// SIP IP Address
|
||||
token = DM_LSTRSTR(token, ",\"");
|
||||
CHECK_RESULT(token);
|
||||
token += 2;
|
||||
end = DM_LSTRSTR(token, "\",");
|
||||
CHECK_RESULT(end);
|
||||
DM_STRNCPY(cdr.sipIpAddress, token, end - token + 1);
|
||||
|
||||
// Far End IP Address
|
||||
token = DM_LSTRSTR(token, ",\"");
|
||||
CHECK_RESULT(token);
|
||||
token += 2;
|
||||
end = DM_LSTRSTR(token, "\",");
|
||||
CHECK_RESULT(end);
|
||||
DM_STRNCPY(cdr.farEndIPAddress, token, end - token + 1);
|
||||
|
||||
// Sip Response Code
|
||||
token = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(token);
|
||||
token += 1;
|
||||
end = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(end);
|
||||
DM_STRNCPY(cdr.sipResponseCode, token, end - token + 1);
|
||||
|
||||
// Codec
|
||||
token = DM_LSTRSTR(token, ",\"");
|
||||
CHECK_RESULT(token);
|
||||
token += 2;
|
||||
end = DM_LSTRSTR(token, "\",");
|
||||
CHECK_RESULT(end);
|
||||
DM_STRNCPY(cdr.codec, token, end - token + 1);
|
||||
|
||||
// RTP statistic values
|
||||
token = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(token);
|
||||
token += 1;
|
||||
end = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(end);
|
||||
DM_STRNCPY(cdr.localBurstDensity, token, end - token + 1);
|
||||
// for incoming unanswered call cdr does not contain RTP stats
|
||||
if (strcasecmp(cdr.localBurstDensity, "\"DOCUMENTATION\"") == 0) {
|
||||
cdr.localBurstDensity[0] = '\0';
|
||||
} else {
|
||||
token = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(token);
|
||||
token += 1;
|
||||
end = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(end);
|
||||
DM_STRNCPY(cdr.remoteBurstDensity, token, end - token + 1);
|
||||
|
||||
token = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(token);
|
||||
token += 1;
|
||||
end = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(end);
|
||||
DM_STRNCPY(cdr.localBurstDuration, token, end - token + 1);
|
||||
|
||||
token = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(token);
|
||||
token += 1;
|
||||
end = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(end);
|
||||
DM_STRNCPY(cdr.remoteBurstDuration, token, end - token + 1);
|
||||
|
||||
token = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(token);
|
||||
token += 1;
|
||||
end = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(end);
|
||||
DM_STRNCPY(cdr.localGapDensity, token, end - token + 1);
|
||||
|
||||
token = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(token);
|
||||
token += 1;
|
||||
end = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(end);
|
||||
DM_STRNCPY(cdr.remoteGapDensity, token, end - token + 1);
|
||||
|
||||
token = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(token);
|
||||
token += 1;
|
||||
end = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(end);
|
||||
DM_STRNCPY(cdr.localGapDuration, token, end - token + 1);
|
||||
|
||||
token = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(token);
|
||||
token += 1;
|
||||
end = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(end);
|
||||
DM_STRNCPY(cdr.remoteGapDuration, token, end - token + 1);
|
||||
|
||||
token = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(token);
|
||||
token += 1;
|
||||
end = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(end);
|
||||
DM_STRNCPY(cdr.localJbRate, token, end - token + 1);
|
||||
|
||||
token = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(token);
|
||||
token += 1;
|
||||
end = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(end);
|
||||
DM_STRNCPY(cdr.remoteJbRate, token, end - token + 1);
|
||||
|
||||
token = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(token);
|
||||
token += 1;
|
||||
end = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(end);
|
||||
DM_STRNCPY(cdr.localJbMax, token, end - token + 1);
|
||||
|
||||
token = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(token);
|
||||
token += 1;
|
||||
end = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(end);
|
||||
DM_STRNCPY(cdr.remoteJbMax, token, end - token + 1);
|
||||
|
||||
token = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(token);
|
||||
token += 1;
|
||||
end = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(end);
|
||||
DM_STRNCPY(cdr.localJbNominal, token, end - token + 1);
|
||||
|
||||
token = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(token);
|
||||
token += 1;
|
||||
end = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(end);
|
||||
DM_STRNCPY(cdr.remoteJbNominal, token, end - token + 1);
|
||||
|
||||
token = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(token);
|
||||
token += 1;
|
||||
end = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(end);
|
||||
DM_STRNCPY(cdr.localJbAbsMax, token, end - token + 1);
|
||||
|
||||
token = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(token);
|
||||
token += 1;
|
||||
end = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(end);
|
||||
DM_STRNCPY(cdr.remoteJbAbsMax, token, end - token + 1);
|
||||
|
||||
token = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(token);
|
||||
token += 1;
|
||||
end = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(end);
|
||||
DM_STRNCPY(cdr.jbAvg, token, end - token + 1);
|
||||
|
||||
token = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(token);
|
||||
token += 1;
|
||||
end = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(end);
|
||||
DM_STRNCPY(cdr.uLossRate, token, end - token + 1);
|
||||
|
||||
token = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(token);
|
||||
token += 1;
|
||||
end = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(end);
|
||||
DM_STRNCPY(cdr.discarded, token, end - token + 1);
|
||||
|
||||
token = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(token);
|
||||
token += 1;
|
||||
end = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(end);
|
||||
DM_STRNCPY(cdr.lost, token, end - token + 1);
|
||||
|
||||
token = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(token);
|
||||
token += 1;
|
||||
end = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(end);
|
||||
DM_STRNCPY(cdr.rxpkts, token, end - token + 1);
|
||||
|
||||
token = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(token);
|
||||
token += 1;
|
||||
end = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(end);
|
||||
DM_STRNCPY(cdr.txpkts, token, end - token + 1);
|
||||
|
||||
token = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(token);
|
||||
token += 1;
|
||||
end = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(end);
|
||||
DM_STRNCPY(cdr.jitter, token, end - token + 1);
|
||||
|
||||
token = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(token);
|
||||
token += 1;
|
||||
end = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(end);
|
||||
DM_STRNCPY(cdr.maxJitter, token, end - token + 1);
|
||||
|
||||
token = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(token);
|
||||
token += 1;
|
||||
end = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(end);
|
||||
DM_STRNCPY(cdr.averageRoundTripDelay, token, end - token + 1);
|
||||
|
||||
token = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(token);
|
||||
token += 1;
|
||||
end = DM_LSTRSTR(token, ",");
|
||||
CHECK_RESULT(end);
|
||||
DM_STRNCPY(cdr.averageFarEndInterarrivalJitter, token, end - token + 1);
|
||||
}
|
||||
// Skip invalid call logs
|
||||
if (cdr.called_num[0] == '\0' || cdr.start_time[0] == '\0' || end_time[0] == '\0') {
|
||||
BBF_DEBUG("Invalid CDR: [%s]\ncalled_number = [%s], start_time = [%s], end_time = [%s]\n",
|
||||
line, cdr.called_num, cdr.start_time, end_time);
|
||||
continue;
|
||||
} else if (cdr.destination[0] == '\0' && strcasecmp(cdr.called_num, "h") == 0) {
|
||||
BBF_DEBUG("Invalid CDR: [%s]\ncalled_number = [%s], destination = [%s]\n", line,
|
||||
cdr.called_num, cdr.destination);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Calculate the call duration
|
||||
struct tm tm_start, tm_end;
|
||||
char *r1 = strptime(cdr.start_time, "%Y-%m-%d %H:%M:%S", &tm_start);
|
||||
char *r2 = strptime(end_time, "%Y-%m-%d %H:%M:%S", &tm_end);
|
||||
|
||||
if (r1 && *r1 == '\0' && r2 && *r2 == '\0') {
|
||||
time_t time_start, time_end;
|
||||
time_start = timegm(&tm_start);
|
||||
time_end = timegm(&tm_end);
|
||||
snprintf(cdr.duration, sizeof(cdr.duration), "%u", (unsigned int)(time_end - time_start));
|
||||
// Convert start time to ISO 8601 date-time format as per TR-181 data model
|
||||
strftime(cdr.start_time, sizeof(cdr.start_time), "%Y-%m-%dT%H:%M:%SZ", &tm_start);
|
||||
} else {
|
||||
BBF_DEBUG("Invalid CDR: [%s]\nWrong start time and/or end time, [%s], [%s]\n",
|
||||
line, cdr.start_time, end_time);
|
||||
continue;
|
||||
}
|
||||
// Determine the call direction and used line
|
||||
char *used_line = NULL;
|
||||
if ((used_line = strcasestr(cdr.source, "TELCHAN")) != NULL) {
|
||||
DM_STRNCPY(cdr.direction, "Outgoing", sizeof(cdr.direction));
|
||||
used_line = strcasestr(cdr.destination, "SIP/sip");
|
||||
DM_STRNCPY(cdr.used_extensions, cdr.source, sizeof(cdr.used_extensions));
|
||||
} else if ((used_line = strcasestr(cdr.destination, "TELCHAN")) != NULL) {
|
||||
DM_STRNCPY(cdr.direction, "Incoming", sizeof(cdr.direction));
|
||||
used_line = strcasestr(cdr.source, "SIP/sip");
|
||||
} else if ( ((used_line = strcasestr(cdr.source, "SIP/sip")) != NULL) && ((used_line = strcasestr(cdr.destination, "SIP/sip")) != NULL) ) {
|
||||
DM_STRNCPY(cdr.direction, "", sizeof(cdr.direction)); //TODO fix this section for 3-way, call forward
|
||||
} else {
|
||||
BBF_DEBUG("Invalid CDR: [%s]\ndirection = [%s]\n", line, cdr.direction);
|
||||
continue;
|
||||
}
|
||||
if (used_line == NULL){
|
||||
// for internal call with extension number 0000/1111/2222/333
|
||||
DM_STRNCPY(cdr.used_line, "", sizeof(cdr.used_line));
|
||||
} else {
|
||||
DM_STRNCPY(cdr.used_line, used_line, sizeof(cdr.used_line)); // "SIP/sip0-00000000"
|
||||
}
|
||||
/*
|
||||
* Convert the termination cause to a value specified in TR-104.
|
||||
*
|
||||
* Note that some of the current causes provided by call log (CDR) can not be well mapped to those
|
||||
* specified in TR-104.
|
||||
*
|
||||
* TODO: Asterisk needs to be changed in order to provide more TR-104 compliant call termination causes.
|
||||
*/
|
||||
if (strcasecmp(cdr.termination_cause, "NO ANSWER") == 0)
|
||||
DM_STRNCPY(cdr.termination_cause, "LocalTimeout", sizeof(cdr.termination_cause));
|
||||
else if (strcasecmp(cdr.termination_cause, "FAILED") == 0)
|
||||
DM_STRNCPY(cdr.termination_cause, "LocalInternalError", sizeof(cdr.termination_cause));
|
||||
else if (strcasecmp(cdr.termination_cause, "BUSY") == 0)
|
||||
DM_STRNCPY(cdr.termination_cause, "RemoteBusy", sizeof(cdr.termination_cause));
|
||||
else if (strcasecmp(cdr.termination_cause, "ANSWERED") == 0)
|
||||
DM_STRNCPY(cdr.termination_cause, "RemoteDisconnect", sizeof(cdr.termination_cause));
|
||||
else if (strcasecmp(cdr.termination_cause, "CONGESTION") == 0)
|
||||
DM_STRNCPY(cdr.termination_cause, "RemoteNetworkFailure", sizeof(cdr.termination_cause));
|
||||
else
|
||||
DM_STRNCPY(cdr.termination_cause, "LocalInternalError", sizeof(cdr.termination_cause));
|
||||
// Convert source and destination
|
||||
convert_src_dst(cdr.source, sizeof(cdr.source)); // CallControl.Extension.{i} or SIP.Client.{i}
|
||||
convert_src_dst(cdr.destination, sizeof(cdr.destination)); // CallControl.Extension.{i} or SIP.Client.{i}
|
||||
// Convert used line to line{i}
|
||||
// TODO correspond CallControl.Line.{i}
|
||||
convert_sip_line(cdr.used_line, sizeof(cdr.used_line));
|
||||
convert_used_extensions(cdr.used_extensions, sizeof(cdr.used_extensions));
|
||||
|
||||
// check session id with the record in buf
|
||||
// skip for the first record, and put into buf
|
||||
if (strcmp(buf_cdr.sessionId, "First")==0) {
|
||||
buf_cdr = cdr; // first record to buf
|
||||
continue;
|
||||
}
|
||||
// if having the same session id and the same starting time, then skip writing and modify the buf
|
||||
if ( (strcmp(cdr.sessionId, buf_cdr.sessionId)==0) && (strcmp(cdr.start_time, buf_cdr.start_time)==0) ) {
|
||||
if ( (!sip_response_checker(buf_cdr.sipResponseCode)) && ( sip_response_checker(cdr.sipResponseCode) || strcmp(cdr.sipResponseCode, buf_cdr.sipResponseCode)>0) ) {
|
||||
buf_cdr = cdr; // drop the previous record as same session id and the current response code has a higher priority
|
||||
}
|
||||
continue; // continue for next record, and see if still having the same seesion id.
|
||||
} // if having a different session id, then writing the buf to entry, and move the current to buf.
|
||||
|
||||
} // if only last buf left. write directly.
|
||||
// Find out an existing call log entry or create a new one
|
||||
if (i < call_log_list_size) {
|
||||
if (i > 0) {
|
||||
pos = pos->next;
|
||||
entry = list_entry(pos, struct call_log_entry, list);
|
||||
} else {
|
||||
entry = list_first_entry(&call_log_list, struct call_log_entry, list);
|
||||
pos = &entry->list;
|
||||
}
|
||||
} else {
|
||||
entry = dm_dynamic_malloc(&global_memhead, sizeof(struct call_log_entry));
|
||||
if (!entry)
|
||||
return -1;
|
||||
|
||||
list_add_tail(&entry->list, &call_log_list);
|
||||
call_log_list_size++;
|
||||
}
|
||||
|
||||
// Fill out the entry with the record in buf
|
||||
struct list_head tmp = entry->list;
|
||||
memcpy(entry, &buf_cdr, sizeof(*entry));
|
||||
entry->list = tmp;
|
||||
// Increase the call log count
|
||||
i++;
|
||||
// put current record to buf
|
||||
buf_cdr = cdr;
|
||||
} while (line_record);
|
||||
|
||||
// The total number of call logs could be less than the list size in case that old call logs have been removed
|
||||
call_log_count = i;
|
||||
|
||||
__ret:
|
||||
if (res != 0)
|
||||
call_log_count = 0;
|
||||
if (fp)
|
||||
fclose(fp);
|
||||
return res;
|
||||
#undef CHECK_RESULT
|
||||
}
|
||||
|
||||
// Get the UCI section name of a codec, e.g. G.711ALaw --> alaw
|
||||
const char *get_codec_uci_name(const char *codec)
|
||||
{
|
||||
if (codec && *codec) {
|
||||
|
||||
// Initialize supported codecs if it has not been done
|
||||
if (codecs_num <= 0)
|
||||
init_supported_codecs();
|
||||
|
||||
for (int i = 0; i < codecs_num; i++) {
|
||||
if (!strcasecmp(supported_codecs[i].codec, codec))
|
||||
return supported_codecs[i].uci_name;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// Get the codec name in TR-104 from UCI section name, e.g. alaw --> G.711ALaw
|
||||
const char *get_codec_name(const char *codec_profile)
|
||||
{
|
||||
if (codec_profile && *codec_profile) {
|
||||
|
||||
// Initialize supported codecs if it has not been done
|
||||
if (codecs_num <= 0)
|
||||
init_supported_codecs();
|
||||
|
||||
for (int i = 0; i < codecs_num; i++) {
|
||||
if (!strcasecmp(supported_codecs[i].uci_name, codec_profile))
|
||||
return supported_codecs[i].codec;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*Get the Alias parameter value by section*/
|
||||
int get_Alias_value_by_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value, char *service_name, char* service_inst)
|
||||
{
|
||||
struct uci_section *s = NULL;
|
||||
|
||||
uci_path_foreach_option_eq(bbfdm, "dmmap", service_name, service_inst, instance, s) {
|
||||
dmuci_get_value_by_section_string(s, "alias", value);
|
||||
break;
|
||||
}
|
||||
if ((*value)[0] == '\0')
|
||||
dmasprintf(value, "cpe-%s", instance);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*Set the Alias paramter value by section*/
|
||||
int set_Alias_value_by_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action, char *service_name, char* service_inst)
|
||||
{
|
||||
|
||||
struct uci_section *s = NULL, *dmmap = NULL;
|
||||
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_string(value, -1, 64, NULL, NULL))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
uci_path_foreach_option_eq(bbfdm, "dmmap", service_name, service_inst, instance, s) {
|
||||
dmuci_set_value_by_section_bbfdm(s, "alias", value);
|
||||
return 0;
|
||||
}
|
||||
dmuci_add_section_bbfdm("dmmap", service_name, &dmmap);
|
||||
dmuci_set_value_by_section(dmmap, service_inst, instance);
|
||||
dmuci_set_value_by_section(dmmap, "alias", value);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*Get Alias parameter value by section string*/
|
||||
int get_Alias_value_by_inst(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value, char *alias_inst)
|
||||
{
|
||||
dmuci_get_value_by_section_string(((struct dmmap_dup *)data)->dmmap_section, alias_inst, value);
|
||||
if ((*value)[0] == '\0')
|
||||
dmasprintf(value, "cpe-%s", instance);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*Set Alias parameter value by section string*/
|
||||
int set_Alias_value_by_inst(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action, char *alias_inst)
|
||||
{
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_string(value, -1, 64, NULL, NULL))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
dmuci_set_value_by_section(((struct dmmap_dup *)data)->dmmap_section, alias_inst, value);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1,91 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License version 2.1
|
||||
* as published by the Free Software Foundation
|
||||
*
|
||||
* Author: Yalu Zhang, yalu.zhang@iopsys.eu
|
||||
*/
|
||||
|
||||
#include "libbbfdm-api/dmcommon.h"
|
||||
|
||||
#define TR104_UCI_PACKAGE "asterisk"
|
||||
#define DEFAULT_SIP_PORT_STR "5060"
|
||||
#define DEFAULT_SIP_REGISTER_EXPIRY_STR "300"
|
||||
|
||||
struct codec_info {
|
||||
char uci_name[16]; // Codec name used in UCI, i.e. alaw
|
||||
char codec[16]; // Codec name, i.e. G.711ALaw
|
||||
unsigned int bit_rate;
|
||||
char packetization_period[160]; // e.g. "20", "5-10,20,30"
|
||||
unsigned int ptime_default;
|
||||
};
|
||||
|
||||
struct call_log_entry {
|
||||
struct list_head list;
|
||||
|
||||
char calling_num[256], called_num[256];
|
||||
char source[256], destination[256], used_line[256], used_extensions[256];
|
||||
char direction[16];
|
||||
char start_time[32];
|
||||
char duration[8];
|
||||
char termination_cause[32];
|
||||
char sessionId[17];
|
||||
char SIPSessionId[33];
|
||||
char sipIpAddress[40];
|
||||
char farEndIPAddress[40];
|
||||
char sipResponseCode[20];
|
||||
char codec[40];
|
||||
char localBurstDensity[20];
|
||||
char remoteBurstDensity[20];
|
||||
char localBurstDuration[20];
|
||||
char remoteBurstDuration[20];
|
||||
char localGapDensity[20];
|
||||
char remoteGapDensity[20];
|
||||
char localGapDuration[20];
|
||||
char remoteGapDuration[20];
|
||||
char localJbRate[20];
|
||||
char remoteJbRate[20];
|
||||
char localJbMax[20];
|
||||
char remoteJbMax[20];
|
||||
char localJbNominal[20];
|
||||
char remoteJbNominal[20];
|
||||
char localJbAbsMax[20];
|
||||
char remoteJbAbsMax[20];
|
||||
char jbAvg[20];
|
||||
char uLossRate[20];
|
||||
char discarded[20];
|
||||
char lost[20];
|
||||
char rxpkts[20];
|
||||
char txpkts[20];
|
||||
char jitter[20];
|
||||
char maxJitter[20];
|
||||
char averageRoundTripDelay[20];
|
||||
char averageFarEndInterarrivalJitter[20];
|
||||
};
|
||||
|
||||
#define MAX_SUPPORTED_CODECS 8
|
||||
extern struct codec_info supported_codecs[MAX_SUPPORTED_CODECS];
|
||||
extern int codecs_num;
|
||||
|
||||
extern struct list_head call_log_list;
|
||||
extern int call_log_count;
|
||||
|
||||
extern char *RFPowerControl[];
|
||||
extern char *ProxyServerTransport[];
|
||||
extern char *RegistrarServerTransport[];
|
||||
extern char *DTMFMethod[];
|
||||
extern char *JitterBufferType[];
|
||||
extern char *KeyingMethods[];
|
||||
extern char *FacilityAction[];
|
||||
|
||||
int init_supported_codecs(void);
|
||||
int init_call_log(void);
|
||||
const char *get_codec_uci_name(const char *codec);
|
||||
const char *get_codec_name(const char *codec_profile);
|
||||
bool sip_response_checker(char *response_code);
|
||||
int get_Alias_value_by_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value, char *service_name, char* service_inst);
|
||||
int set_Alias_value_by_name(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action, char *service_name, char* service_inst);
|
||||
int get_Alias_value_by_inst(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value, char *alias_inst);
|
||||
int set_Alias_value_by_inst(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action, char *alias_inst);
|
||||
|
|
@ -1,274 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License version 2.1
|
||||
* as published by the Free Software Foundation
|
||||
*
|
||||
* Author: Yalu Zhang, yalu.zhang@iopsys.eu
|
||||
*/
|
||||
|
||||
#include "common.h"
|
||||
#include "servicesvoiceservice.h"
|
||||
|
||||
/*************************************************************
|
||||
* COMMON FUNCTIONS
|
||||
**************************************************************/
|
||||
int browseVoiceServiceSIPProviderInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
|
||||
{
|
||||
char *inst = NULL;
|
||||
struct dmmap_dup *p = NULL;
|
||||
LIST_HEAD(dup_list);
|
||||
|
||||
synchronize_specific_config_sections_with_dmmap("asterisk", "sip_service_provider", "dmmap_asterisk", &dup_list);
|
||||
list_for_each_entry(p, &dup_list, list) {
|
||||
|
||||
inst = handle_instance(dmctx, parent_node, p->dmmap_section, "clientinstance", "clientalias");
|
||||
|
||||
if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)p, inst) == DM_STOP)
|
||||
break;
|
||||
}
|
||||
free_dmmap_config_dup_list(&dup_list);
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
int delObjVoiceServiceSIPProvider(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
|
||||
{
|
||||
struct uci_section *s = NULL, *stmp = NULL;
|
||||
|
||||
switch (del_action) {
|
||||
case DEL_INST:
|
||||
dmuci_delete_by_section(((struct dmmap_dup *)data)->config_section, NULL, NULL);
|
||||
dmuci_delete_by_section(((struct dmmap_dup *)data)->dmmap_section, NULL, NULL);
|
||||
break;
|
||||
case DEL_ALL:
|
||||
uci_foreach_sections_safe("asterisk", "sip_service_provider", stmp, s) {
|
||||
struct uci_section *dmmap_section = NULL;
|
||||
|
||||
get_dmmap_section_of_config_section("dmmap_asterisk", "sip_service_provider", section_name(s), &dmmap_section);
|
||||
dmuci_delete_by_section(dmmap_section, NULL, NULL);
|
||||
|
||||
dmuci_delete_by_section(s, NULL, NULL);
|
||||
}
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*************************************************************
|
||||
* ENTRY METHOD
|
||||
**************************************************************/
|
||||
static int browseServicesVoiceServiceCallLogInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
|
||||
{
|
||||
struct call_log_entry *entry = NULL;
|
||||
char *inst = NULL;
|
||||
int i = 0;
|
||||
|
||||
init_call_log();
|
||||
if (call_log_count <= 0)
|
||||
return 0;
|
||||
|
||||
list_for_each_entry(entry, &call_log_list, list) {
|
||||
|
||||
inst = handle_instance_without_section(dmctx, parent_node, ++i);
|
||||
|
||||
if (DM_LINK_INST_OBJ(dmctx, parent_node, entry, inst) == DM_STOP)
|
||||
break;
|
||||
|
||||
if (i >= call_log_count)
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.VoIPProfile.{i}.!UCI:asterisk/sip_service_provider/dmmap_asterisk*/
|
||||
static int browseServicesVoiceServiceVoIPProfileInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
|
||||
{
|
||||
return browseVoiceServiceSIPProviderInst(dmctx, parent_node, prev_data, prev_instance);
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.CodecProfile.{i}.!UCI:asterisk/codec_profile/dmmap_asterisk*/
|
||||
static int browseServicesVoiceServiceCodecProfileInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
|
||||
{
|
||||
char *inst = NULL;
|
||||
struct dmmap_dup *p = NULL;
|
||||
LIST_HEAD(dup_list);
|
||||
int i, j;
|
||||
int has_codec_profile = 0;
|
||||
|
||||
// Initialize supported codecs if it has not been done
|
||||
if (codecs_num <= 0)
|
||||
init_supported_codecs();
|
||||
|
||||
// Populate all supported codecs to UCI if there is none
|
||||
for (j = 0; j < 2; j++) {
|
||||
for (i = 0; i < codecs_num; i++) {
|
||||
struct codec_info *codec = &supported_codecs[i];
|
||||
char *value = NULL;
|
||||
|
||||
dmuci_get_option_value_string(TR104_UCI_PACKAGE, codec->uci_name, "name", &value);
|
||||
if (!value || !*value) {
|
||||
if (j == 1) {
|
||||
char str[16];
|
||||
// Not found. Add this codec in the UCI
|
||||
dmuci_set_value(TR104_UCI_PACKAGE, codec->uci_name, "", "codec_profile");
|
||||
dmuci_set_value(TR104_UCI_PACKAGE, codec->uci_name, "name", codec->codec);
|
||||
snprintf(str, sizeof(str), "%u", codec->ptime_default);
|
||||
dmuci_set_value(TR104_UCI_PACKAGE, codec->uci_name, "ptime", str);
|
||||
}
|
||||
} else {
|
||||
dmfree(value);
|
||||
if (j == 0) {
|
||||
// At least there is one codec profile configured in UCI
|
||||
has_codec_profile = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Don't add any profile if there is any in UCI which has been configured
|
||||
if (has_codec_profile)
|
||||
break;
|
||||
}
|
||||
|
||||
synchronize_specific_config_sections_with_dmmap("asterisk", "codec_profile", "dmmap_asterisk", &dup_list);
|
||||
list_for_each_entry(p, &dup_list, list) {
|
||||
|
||||
inst = handle_instance(dmctx, parent_node, p->dmmap_section, "codecprofileinstance", "codecprofilealias");
|
||||
|
||||
if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)p, inst) == DM_STOP)
|
||||
break;
|
||||
}
|
||||
free_dmmap_config_dup_list(&dup_list);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int browseVoiceServiceInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
|
||||
{
|
||||
struct uci_section *s = is_dmmap_section_exist("dmmap_asterisk", "voice_service");
|
||||
if (!s) dmuci_add_section_bbfdm("dmmap_asterisk", "voice_service", &s);
|
||||
handle_instance(dmctx, parent_node, s, "vsinstance", "vsalias");
|
||||
DM_LINK_INST_OBJ(dmctx, parent_node, s, "1");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*************************************************************
|
||||
* ADD & DEL OBJ
|
||||
**************************************************************/
|
||||
static int addObjServicesVoiceServiceVoIPProfile(char *refparam, struct dmctx *ctx, void *data, char **instance)
|
||||
{
|
||||
struct uci_section *dmmap = NULL, *s = NULL;
|
||||
|
||||
dmuci_add_section("asterisk", "sip_service_provider", &s);
|
||||
|
||||
dmuci_add_section_bbfdm("dmmap_asterisk", "sip_service_provider", &dmmap);
|
||||
dmuci_set_value_by_section(dmmap, "section_name", section_name(s));
|
||||
dmuci_set_value_by_section(dmmap, "clientinstance", *instance);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int delObjServicesVoiceServiceVoIPProfile(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
|
||||
{
|
||||
return delObjVoiceServiceSIPProvider(refparam, ctx, data, instance, del_action);
|
||||
}
|
||||
|
||||
static int addObjServicesVoiceServiceCodecProfile(char *refparam, struct dmctx *ctx, void *data, char **instance)
|
||||
{
|
||||
struct uci_section *dmmap = NULL, *s = NULL;
|
||||
|
||||
dmuci_add_section("asterisk", "codec_profile", &s);
|
||||
|
||||
dmuci_add_section_bbfdm("dmmap_asterisk", "codec_profile", &dmmap);
|
||||
dmuci_set_value_by_section(dmmap, "section_name", section_name(s));
|
||||
dmuci_set_value_by_section(dmmap, "codecprofileinstance", *instance);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int delObjServicesVoiceServiceCodecProfile(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
|
||||
{
|
||||
struct uci_section *s = NULL, *stmp = NULL;
|
||||
|
||||
switch (del_action) {
|
||||
case DEL_INST:
|
||||
dmuci_delete_by_section(((struct dmmap_dup *)data)->config_section, NULL, NULL);
|
||||
dmuci_delete_by_section(((struct dmmap_dup *)data)->dmmap_section, NULL, NULL);
|
||||
break;
|
||||
case DEL_ALL:
|
||||
uci_foreach_sections_safe("asterisk", "codec_profile", stmp, s) {
|
||||
struct uci_section *dmmap_section = NULL;
|
||||
|
||||
get_dmmap_section_of_config_section("dmmap_asterisk", "codec_profile", section_name(s), &dmmap_section);
|
||||
dmuci_delete_by_section(dmmap_section, NULL, NULL);
|
||||
|
||||
dmuci_delete_by_section(s, NULL, NULL);
|
||||
}
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*************************************************************
|
||||
* GET & SET PARAM
|
||||
**************************************************************/
|
||||
static int get_service_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
dmuci_get_value_by_section_string((struct uci_section *)data, "vsalias", value);
|
||||
if ((*value)[0] == '\0')
|
||||
dmasprintf(value, "cpe-%s", instance);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_service_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_string(value, -1, 64, NULL, NULL))
|
||||
return FAULT_9007;
|
||||
return 0;
|
||||
case VALUESET:
|
||||
dmuci_set_value_by_section((struct uci_section *)data, "vsalias", value);
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceService_CallLogNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
int cnt = get_number_of_entries(ctx, data, instance, browseServicesVoiceServiceCallLogInst);
|
||||
dmasprintf(value, "%d", cnt);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**********************************************************************************************************************************
|
||||
* OBJ & PARAM DEFINITION
|
||||
***********************************************************************************************************************************/
|
||||
/* *** Device.Services. *** */
|
||||
DMOBJ tServicesObj[] = {
|
||||
/* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys*/
|
||||
{"VoiceService", &DMREAD, NULL, NULL, "file:/etc/config/asterisk", browseVoiceServiceInst, NULL, NULL, tServicesVoiceServiceObj, tServicesVoiceServiceParams, NULL, BBFDM_BOTH},
|
||||
{0}
|
||||
};
|
||||
|
||||
/* *** Device.Services.VoiceService.{i}. *** */
|
||||
DMOBJ tServicesVoiceServiceObj[] = {
|
||||
/* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys*/
|
||||
{"Capabilities", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tServicesVoiceServiceCapabilitiesObj, tServicesVoiceServiceCapabilitiesParams, NULL, BBFDM_BOTH},
|
||||
{"ReservedPorts", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tServicesVoiceServiceReservedPortsParams, NULL, BBFDM_BOTH},
|
||||
{"POTS", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tServicesVoiceServicePOTSObj, tServicesVoiceServicePOTSParams, NULL, BBFDM_BOTH},
|
||||
{"DECT", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tServicesVoiceServiceDECTObj, tServicesVoiceServiceDECTParams, NULL, BBFDM_BOTH},
|
||||
{"SIP", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tServicesVoiceServiceSIPObj, NULL, NULL, BBFDM_BOTH},
|
||||
{"CallControl", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tServicesVoiceServiceCallControlObj, NULL, NULL, BBFDM_BOTH},
|
||||
{"CallLog", &DMREAD, NULL, NULL, NULL, browseServicesVoiceServiceCallLogInst, NULL, NULL, tServicesVoiceServiceCallLogObj, tServicesVoiceServiceCallLogParams, NULL, BBFDM_BOTH, LIST_KEY{"Alias", NULL}},
|
||||
{"VoIPProfile", &DMWRITE, addObjServicesVoiceServiceVoIPProfile, delObjServicesVoiceServiceVoIPProfile, NULL, browseServicesVoiceServiceVoIPProfileInst, NULL, NULL, tServicesVoiceServiceVoIPProfileObj, tServicesVoiceServiceVoIPProfileParams, NULL, BBFDM_BOTH, LIST_KEY{"Alias", NULL}},
|
||||
{"CodecProfile", &DMWRITE, addObjServicesVoiceServiceCodecProfile, delObjServicesVoiceServiceCodecProfile, NULL, browseServicesVoiceServiceCodecProfileInst, NULL, NULL, NULL, tServicesVoiceServiceCodecProfileParams, NULL, BBFDM_BOTH, LIST_KEY{"Alias", NULL}},
|
||||
{0}
|
||||
};
|
||||
|
||||
DMLEAF tServicesVoiceServiceParams[] = {
|
||||
/* PARAM, permission, type, getvalue, setvalue, bbfdm_type*/
|
||||
{"Alias", &DMWRITE, DMT_STRING, get_service_alias, set_service_alias, BBFDM_BOTH},
|
||||
{"CallLogNumberOfEntries", &DMREAD, DMT_UNINT, get_ServicesVoiceService_CallLogNumberOfEntries, NULL, BBFDM_BOTH},
|
||||
{0}
|
||||
};
|
||||
|
|
@ -1,38 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License version 2.1
|
||||
* as published by the Free Software Foundation
|
||||
*
|
||||
* Author: Yalu Zhang, yalu.zhang@iopsys.eu
|
||||
*/
|
||||
|
||||
#ifndef __SERVICESVOICESERVICE_H
|
||||
#define __SERVICESVOICESERVICE_H
|
||||
|
||||
#include "libbbfdm-api/dmcommon.h"
|
||||
|
||||
extern DMOBJ tServicesObj[];
|
||||
extern DMOBJ tServicesVoiceServiceObj[];
|
||||
extern DMLEAF tServicesVoiceServiceParams[];
|
||||
extern DMOBJ tServicesVoiceServiceCapabilitiesObj[];
|
||||
extern DMLEAF tServicesVoiceServiceCapabilitiesParams[];
|
||||
extern DMLEAF tServicesVoiceServiceReservedPortsParams[];
|
||||
extern DMOBJ tServicesVoiceServicePOTSObj[];
|
||||
extern DMLEAF tServicesVoiceServicePOTSParams[];
|
||||
extern DMOBJ tServicesVoiceServiceSIPObj[];
|
||||
extern DMOBJ tServicesVoiceServiceCallControlObj[];
|
||||
extern DMOBJ tServicesVoiceServiceCallLogObj[];
|
||||
extern DMLEAF tServicesVoiceServiceCallLogParams[];
|
||||
extern DMOBJ tServicesVoiceServiceVoIPProfileObj[];
|
||||
extern DMLEAF tServicesVoiceServiceVoIPProfileParams[];
|
||||
extern DMLEAF tServicesVoiceServiceCodecProfileParams[];
|
||||
extern DMOBJ tServicesVoiceServiceDECTObj[];
|
||||
extern DMLEAF tServicesVoiceServiceDECTParams[];
|
||||
|
||||
int browseVoiceServiceSIPProviderInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance);
|
||||
int delObjVoiceServiceSIPProvider(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action);
|
||||
|
||||
#endif //__SERVICESVOICESERVICE_H
|
||||
|
||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,37 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License version 2.1
|
||||
* as published by the Free Software Foundation
|
||||
*
|
||||
* Author: Yalu Zhang, yalu.zhang@iopsys.eu
|
||||
*/
|
||||
|
||||
#ifndef __SERVICESVOICESERVICECALLCONTROL_H
|
||||
#define __SERVICESVOICESERVICECALLCONTROL_H
|
||||
|
||||
#include "libbbfdm-api/dmcommon.h"
|
||||
|
||||
extern DMOBJ tServicesVoiceServiceCallControlObj[];
|
||||
extern DMOBJ tServicesVoiceServiceCallControlLineObj[];
|
||||
extern DMLEAF tServicesVoiceServiceCallControlLineParams[];
|
||||
extern DMOBJ tServicesVoiceServiceCallControlLineStatsObj[];
|
||||
extern DMLEAF tServicesVoiceServiceCallControlLineStatsIncomingCallsParams[];
|
||||
extern DMLEAF tServicesVoiceServiceCallControlLineStatsOutgoingCallsParams[];
|
||||
extern DMLEAF tServicesVoiceServiceCallControlLineStatsRTPParams[];
|
||||
extern DMLEAF tServicesVoiceServiceCallControlLineStatsDSPParams[];
|
||||
extern DMLEAF tServicesVoiceServiceCallControlIncomingMapParams[];
|
||||
extern DMLEAF tServicesVoiceServiceCallControlOutgoingMapParams[];
|
||||
extern DMLEAF tServicesVoiceServiceCallControlGroupParams[];
|
||||
extern DMLEAF tServicesVoiceServiceCallControlExtensionParams[];
|
||||
extern DMLEAF tServicesVoiceServiceCallControlNumberingPlanParams[];
|
||||
extern DMOBJ tServicesVoiceServiceCallControlNumberingPlanObj[];
|
||||
extern DMLEAF tServicesVoiceServiceCallControlNumberingPlanPrefixInfoParams[];
|
||||
extern DMOBJ tServicesVoiceServiceCallControlCallingFeaturesObj[];
|
||||
extern DMOBJ tServicesVoiceServiceCallControlCallingFeaturesSetObj[];
|
||||
extern DMLEAF tServicesVoiceServiceCallControlCallingFeaturesSetParams[];
|
||||
extern DMLEAF tServicesVoiceServiceCallControlCallingFeaturesSetSCREJParams[];
|
||||
|
||||
#endif //__SERVICESVOICESERVICECALLCONTROL_H
|
||||
|
||||
|
|
@ -1,367 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License version 2.1
|
||||
* as published by the Free Software Foundation
|
||||
*
|
||||
* Author: Yalu Zhang, yalu.zhang@iopsys.eu
|
||||
* Author: Grzegorz Sluja, grzegorz.sluja@iopsys.eu
|
||||
*/
|
||||
|
||||
#include "servicesvoiceservicecalllog.h"
|
||||
#include "common.h"
|
||||
|
||||
/*************************************************************
|
||||
* ENTRY METHOD
|
||||
**************************************************************/
|
||||
static int browseServicesVoiceServiceCallLogSessionInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
|
||||
{
|
||||
// prev_data is from its parent node SIP.Client.{i}. i.e. the UCI section of asterisk.sip_service_provider
|
||||
DM_LINK_INST_OBJ(dmctx, parent_node, prev_data, "1");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*************************************************************
|
||||
* GET & SET PARAM
|
||||
**************************************************************/
|
||||
static int get_ServicesVoiceServiceCallLog_CallingPartyNumber(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
struct call_log_entry *entry = (struct call_log_entry *)data;
|
||||
|
||||
if (entry) {
|
||||
*value = dmstrdup(entry->calling_num);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCallLog_CalledPartyNumber(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
struct call_log_entry *entry = (struct call_log_entry *)data;
|
||||
|
||||
if (entry) {
|
||||
*value = dmstrdup(entry->called_num);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCallLog_Source(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
struct call_log_entry *entry = (struct call_log_entry *)data;
|
||||
|
||||
if (entry) {
|
||||
*value = dmstrdup(entry->source);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCallLog_Destination(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
struct call_log_entry *entry = (struct call_log_entry *)data;
|
||||
|
||||
if (entry) {
|
||||
*value = dmstrdup(entry->destination);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCallLog_UsedLine(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
struct call_log_entry *entry = (struct call_log_entry *)data;
|
||||
|
||||
if (entry) {
|
||||
*value = dmstrdup(entry->used_line);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCallLog_UsedExtensions(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
struct call_log_entry *entry = (struct call_log_entry *)data;
|
||||
|
||||
if (entry) {
|
||||
*value = dmstrdup(entry->used_extensions);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCallLog_Direction(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
struct call_log_entry *entry = (struct call_log_entry *)data;
|
||||
|
||||
if (entry) {
|
||||
*value = dmstrdup(entry->direction);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCallLog_Start(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
struct call_log_entry *entry = (struct call_log_entry *)data;
|
||||
|
||||
if (entry) {
|
||||
*value = dmstrdup(entry->start_time);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCallLog_Duration(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
struct call_log_entry *entry = (struct call_log_entry *)data;
|
||||
*value = (entry) ? dmstrdup(entry->duration) : "0";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCallLog_SessionId(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
struct call_log_entry *entry = (struct call_log_entry *)data;
|
||||
*value = (entry) ? dmstrdup(entry->sessionId) : "0";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCallLog_SIPSessionId(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
struct call_log_entry *entry = (struct call_log_entry *)data;
|
||||
*value = (entry) ? dmstrdup(entry->SIPSessionId) : "";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCallLog_CallTerminationCause(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
struct call_log_entry *entry = (struct call_log_entry *)data;
|
||||
*value = (entry) ? dmstrdup(entry->termination_cause) : "";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCallLog_FarEndIpAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
struct call_log_entry *entry = (struct call_log_entry *)data;
|
||||
*value = (entry) ? dmstrdup(entry->farEndIPAddress) : "";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCallLog_SessionDSPCodec(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
struct call_log_entry *entry = (struct call_log_entry *)data;
|
||||
if (entry) {
|
||||
const char *codec_name = get_codec_name(entry->codec);
|
||||
*value = codec_name ? dmstrdup(codec_name) : "";
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCallLog_Src_PacketsDiscarded(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
struct call_log_entry *entry = (struct call_log_entry *)data;
|
||||
*value = (entry) ? dmstrdup(entry->discarded) : "0";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCallLog_Src_PacketsLost(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
struct call_log_entry *entry = (struct call_log_entry *)data;
|
||||
*value = (entry) ? dmstrdup(entry->lost) : "0";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCallLog_Src_PacketsReceived(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
struct call_log_entry *entry = (struct call_log_entry *)data;
|
||||
*value = (entry) ? dmstrdup(entry->rxpkts) : "0";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCallLog_Src_PacketsSent(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
struct call_log_entry *entry = (struct call_log_entry *)data;
|
||||
*value = (entry) ? dmstrdup(entry->txpkts) : "0";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCallLog_Src_AverageReceiveInterarrivalJitter(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
struct call_log_entry *entry = (struct call_log_entry *)data;
|
||||
*value = (entry) ? dmstrdup(entry->jbAvg) : "0";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCallLog_Src_FarEndInterarrivalJitter(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
struct call_log_entry *entry = (struct call_log_entry *)data;
|
||||
*value = (entry) ? dmstrdup(entry->jitter) : "0";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCallLog_Src_FarEndPacketLossRate(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
struct call_log_entry *entry = (struct call_log_entry *)data;
|
||||
*value = (entry) ? dmstrdup(entry->uLossRate) : "0";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCallLog_Src_MaxJitter(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
struct call_log_entry *entry = (struct call_log_entry *)data;
|
||||
*value = (entry) ? dmstrdup(entry->maxJitter) : "0";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCallLog_Src_AverageRoundTripDelay(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
struct call_log_entry *entry = (struct call_log_entry *)data;
|
||||
*value = (entry) ? dmstrdup(entry->averageRoundTripDelay) : "0";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCallLog_Src_AverageFarEndInterarrivalJitter(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
struct call_log_entry *entry = (struct call_log_entry *)data;
|
||||
*value = (entry) ? dmstrdup(entry->averageFarEndInterarrivalJitter) : "0";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCallLog_Src__ReceivePacketLossRate(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = "0";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCallLogSessionDestinationRTP_ReceivePacketLossRate(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = "0";
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Get Alias - Device.Services.VoiceService.{i}.CallLog.{i}. */
|
||||
static int get_ServicesVoiceServiceCallLog_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
return get_Alias_value_by_name(refparam, ctx, data, instance, value, "callLog", "callLog_inst");
|
||||
}
|
||||
|
||||
/* Set Alias - Device.Services.VoiceService.{i}.CallLog.{i}. */
|
||||
static int set_ServicesVoiceServiceCallLog_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
return set_Alias_value_by_name(refparam, ctx, data, instance, value, action, "callLog", "callLog_inst");
|
||||
}
|
||||
/**********************************************************************************************************************************
|
||||
* OBJ & PARAM DEFINITION
|
||||
***********************************************************************************************************************************/
|
||||
/* *** Device.Services.VoiceService.{i}.CallLog.{i}. *** */
|
||||
DMOBJ tServicesVoiceServiceCallLogObj[] = {
|
||||
/* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys*/
|
||||
{"Session", &DMREAD, NULL, NULL, NULL, browseServicesVoiceServiceCallLogSessionInst, NULL, NULL, tServicesVoiceServiceCallLogSessionObj, tServicesVoiceServiceCallLogSessionParams, NULL, BBFDM_BOTH},
|
||||
{0}
|
||||
};
|
||||
|
||||
DMLEAF tServicesVoiceServiceCallLogParams[] = {
|
||||
/* PARAM, permission, type, getvalue, setvalue, bbfdm_type*/
|
||||
{"CallingPartyNumber", &DMREAD, DMT_STRING, get_ServicesVoiceServiceCallLog_CallingPartyNumber, NULL, BBFDM_BOTH},
|
||||
{"CalledPartyNumber", &DMREAD, DMT_STRING, get_ServicesVoiceServiceCallLog_CalledPartyNumber, NULL, BBFDM_BOTH},
|
||||
{"Source", &DMREAD, DMT_STRING, get_ServicesVoiceServiceCallLog_Source, NULL, BBFDM_BOTH},
|
||||
{"Destination", &DMREAD, DMT_STRING, get_ServicesVoiceServiceCallLog_Destination, NULL, BBFDM_BOTH},
|
||||
{"UsedLine", &DMREAD, DMT_STRING, get_ServicesVoiceServiceCallLog_UsedLine, NULL, BBFDM_BOTH},
|
||||
{"UsedExtensions", &DMREAD, DMT_STRING, get_ServicesVoiceServiceCallLog_UsedExtensions, NULL, BBFDM_BOTH},
|
||||
{"Direction", &DMREAD, DMT_STRING, get_ServicesVoiceServiceCallLog_Direction, NULL, BBFDM_BOTH},
|
||||
{"Start", &DMREAD, DMT_TIME, get_ServicesVoiceServiceCallLog_Start, NULL, BBFDM_BOTH},
|
||||
{"Duration", &DMREAD, DMT_UNINT, get_ServicesVoiceServiceCallLog_Duration, NULL, BBFDM_BOTH},
|
||||
{"CallTerminationCause", &DMREAD, DMT_STRING, get_ServicesVoiceServiceCallLog_CallTerminationCause, NULL, BBFDM_BOTH},
|
||||
{"Alias", &DMWRITE, DMT_STRING, get_ServicesVoiceServiceCallLog_Alias, set_ServicesVoiceServiceCallLog_Alias, BBFDM_BOTH},
|
||||
{0}
|
||||
};
|
||||
|
||||
/* *** Device.Services.VoiceService.{i}.CallLog.{i}.Session.{i}. *** */
|
||||
DMOBJ tServicesVoiceServiceCallLogSessionObj[] = {
|
||||
/* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys*/
|
||||
{"Destination", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tServicesVoiceServiceCallLogSessionDestinationObj, NULL, NULL, BBFDM_BOTH},
|
||||
{"Source", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tServicesVoiceServiceCallLogSessionSourceObj, NULL, NULL, BBFDM_BOTH},
|
||||
{0}
|
||||
};
|
||||
|
||||
DMLEAF tServicesVoiceServiceCallLogSessionParams[] = {
|
||||
/* PARAM, permission, type, getvalue, setvalue, bbfdm_type*/
|
||||
{"Duration", &DMREAD, DMT_UNINT, get_ServicesVoiceServiceCallLog_Duration, NULL, BBFDM_BOTH},
|
||||
{"Start", &DMREAD, DMT_TIME, get_ServicesVoiceServiceCallLog_Start, NULL, BBFDM_BOTH},
|
||||
{"SessionID", &DMREAD, DMT_STRING, get_ServicesVoiceServiceCallLog_SessionId, NULL, BBFDM_BOTH},
|
||||
{"SIPSessionID", &DMREAD, DMT_STRING, get_ServicesVoiceServiceCallLog_SIPSessionId, NULL, BBFDM_BOTH},
|
||||
{0}
|
||||
};
|
||||
|
||||
/* *** Device.Services.VoiceService.{i}.CallLog.{i}.Session.{i}.Destination. *** */
|
||||
DMOBJ tServicesVoiceServiceCallLogSessionDestinationObj[] = {
|
||||
/* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys*/
|
||||
{"DSP", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tServicesVoiceServiceCallLogSessionDestinationDSPObj, NULL, NULL, BBFDM_BOTH},
|
||||
{"RTP", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tServicesVoiceServiceCallLogSessionDestinationRTPParams, NULL, BBFDM_BOTH, NULL},
|
||||
{0}
|
||||
};
|
||||
|
||||
/* *** Device.Services.VoiceService.{i}.CallLog.{i}.Session.{i}.Source. *** */
|
||||
DMOBJ tServicesVoiceServiceCallLogSessionSourceObj[] = {
|
||||
/* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys*/
|
||||
{"DSP", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tServicesVoiceServiceCallLogSessionSourceDSPObj, NULL, NULL, BBFDM_BOTH},
|
||||
{"RTP", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tServicesVoiceServiceCallLogSessionSourceRTPParams, NULL, BBFDM_BOTH},
|
||||
{0}
|
||||
};
|
||||
|
||||
/* *** Device.Services.VoiceService.{i}.CallLog.{i}.Session.{i}.Destination.DSP. *** */
|
||||
DMOBJ tServicesVoiceServiceCallLogSessionDestinationDSPObj[] = {
|
||||
/* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys*/
|
||||
{"ReceiveCodec", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tServicesVoiceServiceCallLogSessionDestinationDSPCodecParams, NULL, BBFDM_BOTH},
|
||||
{"TransmitCodec", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tServicesVoiceServiceCallLogSessionDestinationDSPCodecParams, NULL, BBFDM_BOTH},
|
||||
{0}
|
||||
};
|
||||
|
||||
/* *** Device.Services.VoiceService.{i}.CallLog.{i}.Session.{i}.Destination.RTP. *** */
|
||||
DMLEAF tServicesVoiceServiceCallLogSessionDestinationRTPParams[] = {
|
||||
/* PARAM, permission, type, getvalue, setvalue, bbfdm_type */
|
||||
{"ReceivePacketLossRate", &DMREAD, DMT_UNINT, get_ServicesVoiceServiceCallLogSessionDestinationRTP_ReceivePacketLossRate, NULL, BBFDM_BOTH},
|
||||
{0}
|
||||
};
|
||||
|
||||
/* *** Device.Services.VoiceService.{i}.CallLog.{i}.Session.{i}.Source.DSP. *** */
|
||||
DMOBJ tServicesVoiceServiceCallLogSessionSourceDSPObj[] = {
|
||||
/* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys*/
|
||||
{"ReceiveCodec", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tServicesVoiceServiceCallLogSessionSourceDSPCodecParams, NULL, BBFDM_BOTH},
|
||||
{"TransmitCodec", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tServicesVoiceServiceCallLogSessionSourceDSPCodecParams, NULL, BBFDM_BOTH},
|
||||
{0}
|
||||
};
|
||||
|
||||
/* *** Device.Services.VoiceService.{i}.CallLog.{i}.Session.{i}.Destination.DSP.ReceiveCodec. *** */
|
||||
DMLEAF tServicesVoiceServiceCallLogSessionDestinationDSPCodecParams[] = {
|
||||
/* PARAM, permission, type, getvalue, setvalue, bbfdm_type*/
|
||||
{"Codec", &DMREAD, DMT_STRING, get_ServicesVoiceServiceCallLog_SessionDSPCodec, NULL, BBFDM_BOTH},
|
||||
{0}
|
||||
};
|
||||
|
||||
/* *** Device.Services.VoiceService.{i}.CallLog.{i}.Session.{i}.Source.DSP.ReceiveCodec. *** */
|
||||
DMLEAF tServicesVoiceServiceCallLogSessionSourceDSPCodecParams[] = {
|
||||
/* PARAM, permission, type, getvalue, setvalue, bbfdm_type*/
|
||||
{"Codec", &DMREAD, DMT_STRING, get_ServicesVoiceServiceCallLog_SessionDSPCodec, NULL, BBFDM_BOTH},
|
||||
{0}
|
||||
};
|
||||
|
||||
/* *** Device.Services.VoiceService.{i}.CallLog.{i}.Session.{i}.Source.RTP. *** */
|
||||
DMLEAF tServicesVoiceServiceCallLogSessionSourceRTPParams[] = {
|
||||
/* PARAM, permission, type, getvalue, setvalue, bbfdm_type*/
|
||||
{"FarEndIPAddress", &DMREAD, DMT_STRING, get_ServicesVoiceServiceCallLog_FarEndIpAddress, NULL, BBFDM_BOTH},
|
||||
{"PacketsDiscarded", &DMREAD, DMT_UNINT, get_ServicesVoiceServiceCallLog_Src_PacketsDiscarded, NULL, BBFDM_BOTH},
|
||||
{"PacketsLost", &DMREAD, DMT_UNINT, get_ServicesVoiceServiceCallLog_Src_PacketsLost, NULL, BBFDM_BOTH},
|
||||
{"PacketsReceived", &DMREAD, DMT_UNLONG, get_ServicesVoiceServiceCallLog_Src_PacketsReceived, NULL, BBFDM_BOTH},
|
||||
{"PacketsSent", &DMREAD, DMT_UNLONG, get_ServicesVoiceServiceCallLog_Src_PacketsSent, NULL, BBFDM_BOTH},
|
||||
{"AverageReceiveInterarrivalJitter", &DMREAD, DMT_INT, get_ServicesVoiceServiceCallLog_Src_AverageReceiveInterarrivalJitter, NULL, BBFDM_BOTH},
|
||||
{"FarEndInterarrivalJitter", &DMREAD, DMT_INT, get_ServicesVoiceServiceCallLog_Src_FarEndInterarrivalJitter, NULL, BBFDM_BOTH},
|
||||
{"FarEndPacketLossRate", &DMREAD, DMT_UNINT, get_ServicesVoiceServiceCallLog_Src_FarEndPacketLossRate, NULL, BBFDM_BOTH},
|
||||
{"MaxJitter", &DMREAD, DMT_INT, get_ServicesVoiceServiceCallLog_Src_MaxJitter, NULL, BBFDM_BOTH},
|
||||
{"AverageRoundTripDelay", &DMREAD, DMT_INT, get_ServicesVoiceServiceCallLog_Src_AverageRoundTripDelay, NULL, BBFDM_BOTH},
|
||||
{"AverageFarEndInterarrivalJitter", &DMREAD, DMT_INT, get_ServicesVoiceServiceCallLog_Src_AverageFarEndInterarrivalJitter, NULL, BBFDM_BOTH},
|
||||
{"ReceivePacketLossRate", &DMREAD, DMT_UNINT, get_ServicesVoiceServiceCallLog_Src__ReceivePacketLossRate, NULL, BBFDM_BOTH},
|
||||
{0}
|
||||
};
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License version 2.1
|
||||
* as published by the Free Software Foundation
|
||||
*
|
||||
* Author: Yalu Zhang, yalu.zhang@iopsys.eu
|
||||
*/
|
||||
|
||||
#ifndef __SERVICESVOICESERVICECALLLOG_H
|
||||
#define __SERVICESVOICESERVICECALLLOG_H
|
||||
|
||||
#include "libbbfdm-api/dmcommon.h"
|
||||
|
||||
extern DMOBJ tServicesVoiceServiceCallLogObj[];
|
||||
extern DMLEAF tServicesVoiceServiceCallLogParams[];
|
||||
extern DMOBJ tServicesVoiceServiceCallLogSessionObj[];
|
||||
extern DMLEAF tServicesVoiceServiceCallLogSessionParams[];
|
||||
extern DMOBJ tServicesVoiceServiceCallLogSessionDestinationObj[];
|
||||
extern DMOBJ tServicesVoiceServiceCallLogSessionSourceObj[];
|
||||
extern DMOBJ tServicesVoiceServiceCallLogSessionDestinationDSPObj[];
|
||||
extern DMLEAF tServicesVoiceServiceCallLogSessionDestinationRTPParams[];
|
||||
extern DMOBJ tServicesVoiceServiceCallLogSessionSourceDSPObj[];
|
||||
extern DMLEAF tServicesVoiceServiceCallLogSessionDestinationDSPCodecParams[];
|
||||
extern DMLEAF tServicesVoiceServiceCallLogSessionSourceDSPCodecParams[];
|
||||
extern DMLEAF tServicesVoiceServiceCallLogSessionSourceRTPParams[];
|
||||
|
||||
#endif //__SERVICESVOICESERVICECALLLOG_H
|
||||
|
||||
|
|
@ -1,244 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License version 2.1
|
||||
* as published by the Free Software Foundation
|
||||
*
|
||||
* Author: Yalu Zhang, yalu.zhang@iopsys.eu
|
||||
*/
|
||||
|
||||
#include "servicesvoiceservicecapabilities.h"
|
||||
#include "common.h"
|
||||
|
||||
/**************************************************************************
|
||||
* LINKER
|
||||
***************************************************************************/
|
||||
static int get_voice_service_capabilities_codec_linker(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker)
|
||||
{
|
||||
*linker = data ? dmstrdup(((struct codec_info *)data)->codec) : "";
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*************************************************************
|
||||
* ENTRY METHOD
|
||||
**************************************************************/
|
||||
static int browseServicesVoiceServiceCapabilitiesCodecInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
|
||||
{
|
||||
int i;
|
||||
char *inst = NULL;
|
||||
|
||||
if (codecs_num <= 0)
|
||||
init_supported_codecs();
|
||||
|
||||
for (i = 0; i < codecs_num; i++) {
|
||||
inst = handle_instance_without_section(dmctx, parent_node, i+1);
|
||||
if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&supported_codecs[i], inst) == DM_STOP)
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*************************************************************
|
||||
* GET & SET PARAM
|
||||
**************************************************************/
|
||||
static int get_ServicesVoiceServiceCapabilities_MaxLineCount(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
db_get_value_string("hw", "board", "VoicePorts", value);
|
||||
if ((*value)[0] == '\0')
|
||||
*value = "-1";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCapabilities_MaxSessionsPerLine(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = "2";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCapabilities_MaxSessionsPerExtension(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = "2";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCapabilities_MaxSessionCount(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = "4";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCapabilities_NetworkConnectionModes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = "SIP/2.0";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCapabilities_UserConnectionModes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = "FXS";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCapabilitiesSIPClient_Extensions(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = "OPTIONS,REFER,SUBSCRIBE,NOTIFY,INFO,PUBLISH,MESSAGE";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCapabilitiesSIPClient_URISchemes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = "sip";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCapabilitiesSIPClient_TLSAuthenticationProtocols(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
// Reference to https://en.wikipedia.org/wiki/OpenSSL#Algorithms
|
||||
*value = "MD5,SHA-1,SHA-2";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCapabilitiesSIPClient_TLSAuthenticationKeySizes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = "128,160,256";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCapabilitiesSIPClient_TLSEncryptionProtocols(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = "AES,Camellia,3DES";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCapabilitiesSIPClient_TLSEncryptionKeySizes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = "256,256,168";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCapabilitiesSIPClient_TLSKeyExchangeProtocols(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = "RSA";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCapabilitiesPOTS_DialType(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = "Tone";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCapabilitiesPOTS_ClipGeneration(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = "1";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCapabilitiesPOTS_ChargingPulse(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = "0";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCapabilitiesCodec_Codec(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
if (data) {
|
||||
struct codec_info *codec = (struct codec_info *)data;
|
||||
*value = dmstrdup(codec->codec);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCapabilitiesCodec_BitRate(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
if (data) {
|
||||
struct codec_info *codec = (struct codec_info *)data;
|
||||
dmasprintf(value, "%d", codec->bit_rate);
|
||||
} else
|
||||
*value = "0";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCapabilitiesCodec_PacketizationPeriod(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
if (data) {
|
||||
struct codec_info *codec = (struct codec_info *)data;
|
||||
*value = dmstrdup(codec->packetization_period);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCapabilities_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
return get_Alias_value_by_name(refparam, ctx, data, instance, value, "Capabilities", "Capabilities_inst");
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServiceCapabilities_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
return set_Alias_value_by_name(refparam, ctx, data, instance, value, action, "Capabilities", "Capabilities_inst");
|
||||
}
|
||||
|
||||
/**********************************************************************************************************************************
|
||||
* OBJ & PARAM DEFINITION
|
||||
***********************************************************************************************************************************/
|
||||
/* *** Device.Services.VoiceService.{i}.Capabilities. *** */
|
||||
DMOBJ tServicesVoiceServiceCapabilitiesObj[] = {
|
||||
/* OBJ, permission, addobj, delobj, checkdep, browseinstobj nextdynamicobj, nextobj, leaf, linker, bbfdm_type, uniqueKeys*/
|
||||
{"SIP", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tServicesVoiceServiceCapabilitiesSIPObj, NULL, NULL, BBFDM_BOTH},
|
||||
{"POTS", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tServicesVoiceServiceCapabilitiesPOTSParams, NULL, BBFDM_BOTH},
|
||||
{"Codec", &DMREAD, NULL, NULL, NULL, browseServicesVoiceServiceCapabilitiesCodecInst, NULL, NULL, NULL, tServicesVoiceServiceCapabilitiesCodecParams, get_voice_service_capabilities_codec_linker, BBFDM_BOTH, LIST_KEY{"Alias", "Codec", "BitRate", NULL}},
|
||||
{0}
|
||||
};
|
||||
|
||||
DMLEAF tServicesVoiceServiceCapabilitiesParams[] = {
|
||||
/* PARAM, permission, type, getvalue, setvalue, bbfdm_type*/
|
||||
{"MaxLineCount", &DMREAD, DMT_INT, get_ServicesVoiceServiceCapabilities_MaxLineCount, NULL, BBFDM_BOTH},
|
||||
{"MaxSessionsPerLine", &DMREAD, DMT_INT, get_ServicesVoiceServiceCapabilities_MaxSessionsPerLine, NULL, BBFDM_BOTH},
|
||||
{"MaxSessionsPerExtension", &DMREAD, DMT_INT, get_ServicesVoiceServiceCapabilities_MaxSessionsPerExtension, NULL, BBFDM_BOTH},
|
||||
{"MaxSessionCount", &DMREAD, DMT_INT, get_ServicesVoiceServiceCapabilities_MaxSessionCount, NULL, BBFDM_BOTH},
|
||||
{"NetworkConnectionModes", &DMREAD, DMT_STRING, get_ServicesVoiceServiceCapabilities_NetworkConnectionModes, NULL, BBFDM_BOTH},
|
||||
{"UserConnectionModes", &DMREAD, DMT_STRING, get_ServicesVoiceServiceCapabilities_UserConnectionModes, NULL, BBFDM_BOTH},
|
||||
{0}
|
||||
};
|
||||
|
||||
/* *** Device.Services.VoiceService.{i}.Capabilities.SIP. *** */
|
||||
DMOBJ tServicesVoiceServiceCapabilitiesSIPObj[] = {
|
||||
/* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys*/
|
||||
{"Client", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tServicesVoiceServiceCapabilitiesSIPClientParams, NULL, BBFDM_BOTH},
|
||||
{0}
|
||||
};
|
||||
|
||||
/* *** Device.Services.VoiceService.{i}.Capabilities.SIP.Client. *** */
|
||||
DMLEAF tServicesVoiceServiceCapabilitiesSIPClientParams[] = {
|
||||
/* PARAM, permission, type, getvalue, setvalue, bbfdm_type*/
|
||||
{"Extensions", &DMREAD, DMT_STRING, get_ServicesVoiceServiceCapabilitiesSIPClient_Extensions, NULL, BBFDM_BOTH},
|
||||
{"URISchemes", &DMREAD, DMT_STRING, get_ServicesVoiceServiceCapabilitiesSIPClient_URISchemes, NULL, BBFDM_BOTH},
|
||||
{"TLSAuthenticationProtocols", &DMREAD, DMT_STRING, get_ServicesVoiceServiceCapabilitiesSIPClient_TLSAuthenticationProtocols, NULL, BBFDM_BOTH},
|
||||
{"TLSAuthenticationKeySizes", &DMREAD, DMT_STRING, get_ServicesVoiceServiceCapabilitiesSIPClient_TLSAuthenticationKeySizes, NULL, BBFDM_BOTH},
|
||||
{"TLSEncryptionProtocols", &DMREAD, DMT_STRING, get_ServicesVoiceServiceCapabilitiesSIPClient_TLSEncryptionProtocols, NULL, BBFDM_BOTH},
|
||||
{"TLSEncryptionKeySizes", &DMREAD, DMT_STRING, get_ServicesVoiceServiceCapabilitiesSIPClient_TLSEncryptionKeySizes, NULL, BBFDM_BOTH},
|
||||
{"TLSKeyExchangeProtocols", &DMREAD, DMT_STRING, get_ServicesVoiceServiceCapabilitiesSIPClient_TLSKeyExchangeProtocols, NULL, BBFDM_BOTH},
|
||||
{0}
|
||||
};
|
||||
|
||||
/* *** Device.Services.VoiceService.{i}.Capabilities.POTS. *** */
|
||||
DMLEAF tServicesVoiceServiceCapabilitiesPOTSParams[] = {
|
||||
/* PARAM, permission, type, getvalue, setvalue, bbfdm_type*/
|
||||
{"DialType", &DMREAD, DMT_STRING, get_ServicesVoiceServiceCapabilitiesPOTS_DialType, NULL, BBFDM_BOTH},
|
||||
{"ClipGeneration", &DMREAD, DMT_BOOL, get_ServicesVoiceServiceCapabilitiesPOTS_ClipGeneration, NULL, BBFDM_BOTH},
|
||||
{"ChargingPulse", &DMREAD, DMT_BOOL, get_ServicesVoiceServiceCapabilitiesPOTS_ChargingPulse, NULL, BBFDM_BOTH},
|
||||
{0}
|
||||
};
|
||||
|
||||
/* *** Device.Services.VoiceService.{i}.Capabilities.Codec.{i}. *** */
|
||||
DMLEAF tServicesVoiceServiceCapabilitiesCodecParams[] = {
|
||||
/* PARAM, permission, type, getvalue, setvalue, bbfdm_type*/
|
||||
{"Codec", &DMREAD, DMT_STRING, get_ServicesVoiceServiceCapabilitiesCodec_Codec, NULL, BBFDM_BOTH},
|
||||
{"BitRate", &DMREAD, DMT_UNINT, get_ServicesVoiceServiceCapabilitiesCodec_BitRate, NULL, BBFDM_BOTH},
|
||||
{"PacketizationPeriod", &DMREAD, DMT_STRING, get_ServicesVoiceServiceCapabilitiesCodec_PacketizationPeriod, NULL, BBFDM_BOTH},
|
||||
{"Alias", &DMWRITE, DMT_STRING, get_ServicesVoiceServiceCapabilities_Alias, set_ServicesVoiceServiceCapabilities_Alias, BBFDM_BOTH},
|
||||
{0}
|
||||
};
|
||||
|
||||
|
|
@ -1,24 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License version 2.1
|
||||
* as published by the Free Software Foundation
|
||||
*
|
||||
* Author: Yalu Zhang, yalu.zhang@iopsys.eu
|
||||
*/
|
||||
|
||||
#ifndef __SERVICESVOICESERVICECAPABILITIES_H
|
||||
#define __SERVICESVOICESERVICECAPABILITIES_H
|
||||
|
||||
#include "libbbfdm-api/dmcommon.h"
|
||||
|
||||
extern DMOBJ tServicesVoiceServiceCapabilitiesObj[];
|
||||
extern DMLEAF tServicesVoiceServiceCapabilitiesParams[];
|
||||
extern DMOBJ tServicesVoiceServiceCapabilitiesSIPObj[];
|
||||
extern DMLEAF tServicesVoiceServiceCapabilitiesSIPClientParams[];
|
||||
extern DMLEAF tServicesVoiceServiceCapabilitiesPOTSParams[];
|
||||
extern DMLEAF tServicesVoiceServiceCapabilitiesCodecParams[];
|
||||
|
||||
#endif //__SERVICESVOICESERVICECAPABILITIES_H
|
||||
|
||||
|
|
@ -1,71 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License version 2.1
|
||||
* as published by the Free Software Foundation
|
||||
*
|
||||
* Author: Yalu Zhang, yalu.zhang@iopsys.eu
|
||||
*/
|
||||
|
||||
#include "servicesvoiceservicecodecprofile.h"
|
||||
#include "common.h"
|
||||
|
||||
/*************************************************************
|
||||
* GET & SET PARAM
|
||||
**************************************************************/
|
||||
/*#Device.Services.VoiceService.{i}.CodecProfile.{i}.Codec!UCI:asterisk/codec_profile,@i-1/name*/
|
||||
static int get_ServicesVoiceServiceCodecProfile_Codec(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
char *linker = NULL;
|
||||
|
||||
dmuci_get_value_by_section_string(((struct dmmap_dup *)data)->config_section, "name", &linker);
|
||||
adm_entry_get_linker_param(ctx, "Device.Services.VoiceService.", linker, value);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.CodecProfile.{i}.PacketizationPeriod!UCI:asterisk/codec_profile,@i-1/ptime*/
|
||||
static int get_ServicesVoiceServiceCodecProfile_PacketizationPeriod(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
dmuci_get_value_by_section_string(((struct dmmap_dup *)data)->config_section, "ptime", value);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServiceCodecProfile_PacketizationPeriod(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_string_list(value, -1, -1, -1, -1, 64, NULL, NULL))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "ptime", value);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*Get Device.Services.VoiceService.{i}.CodecProfile.{i}. Alias*/
|
||||
static int get_ServicesVoiceServiceCodecProfile_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
return get_Alias_value_by_inst(refparam, ctx, data, instance, value, "codecprofilealias");
|
||||
}
|
||||
|
||||
/*Set Device.Services.VoiceService.{i}.CodecProfile.{i}. Alias*/
|
||||
static int set_ServicesVoiceServiceCodecProfile_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
return set_Alias_value_by_inst(refparam, ctx, data, instance, value, action, "codecprofilealias");
|
||||
}
|
||||
|
||||
/**********************************************************************************************************************************
|
||||
* OBJ & PARAM DEFINITION
|
||||
***********************************************************************************************************************************/
|
||||
/* *** Device.Services.VoiceService.{i}.CodecProfile.{i}. *** */
|
||||
DMLEAF tServicesVoiceServiceCodecProfileParams[] = {
|
||||
/* PARAM, permission, type, getvalue, setvalue, bbfdm_type*/
|
||||
{"Codec", &DMREAD, DMT_STRING, get_ServicesVoiceServiceCodecProfile_Codec, NULL, BBFDM_BOTH},
|
||||
{"PacketizationPeriod", &DMWRITE, DMT_STRING, get_ServicesVoiceServiceCodecProfile_PacketizationPeriod, set_ServicesVoiceServiceCodecProfile_PacketizationPeriod, BBFDM_BOTH},
|
||||
{"Alias", &DMWRITE, DMT_STRING, get_ServicesVoiceServiceCodecProfile_Alias, set_ServicesVoiceServiceCodecProfile_Alias, BBFDM_BOTH},
|
||||
{0}
|
||||
};
|
||||
|
||||
|
|
@ -1,19 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License version 2.1
|
||||
* as published by the Free Software Foundation
|
||||
*
|
||||
* Author: Yalu Zhang, yalu.zhang@iopsys.eu
|
||||
*/
|
||||
|
||||
#ifndef __SERVICESVOICESERVICECODECPROFILE_H
|
||||
#define __SERVICESVOICESERVICECODECPROFILE_H
|
||||
|
||||
#include "libbbfdm-api/dmcommon.h"
|
||||
|
||||
extern DMLEAF tServicesVoiceServiceCodecProfileParams[];
|
||||
|
||||
#endif //__SERVICESVOICESERVICECODECPROFILE_H
|
||||
|
||||
|
|
@ -1,463 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2021 Iopsys Software Solutions AB
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License version 2.1
|
||||
* as published by the Free Software Foundation
|
||||
*
|
||||
* Author: Vivek Dutta <vivek.dutta@iopsys.eu>
|
||||
*/
|
||||
|
||||
#include "servicesvoiceservicedect.h"
|
||||
|
||||
/**************************************************************************
|
||||
* LINKER
|
||||
***************************************************************************/
|
||||
static int get_voice_service_dect_linker(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker)
|
||||
{
|
||||
*linker = data ? dmjson_get_value((json_object *)data, 1, "ipui") : "";
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*************************************************************
|
||||
* ENTRY METHOD
|
||||
**************************************************************/
|
||||
/*#Device.Services.VoiceService.{i}.DECT.Base.{i}.!UBUS:dect/status/None,None/base*/
|
||||
static int browseServicesVoiceServiceDECTBaseInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
|
||||
{
|
||||
json_object *res = NULL, *obj = NULL, *arrobj = NULL;
|
||||
char *inst = NULL;
|
||||
|
||||
dmubus_call("dect", "status", UBUS_ARGS{0}, 0, &res);
|
||||
if (res) {
|
||||
int id = 0, i = 0;
|
||||
|
||||
dmjson_foreach_obj_in_array(res, arrobj, obj, i, 1, "base") {
|
||||
|
||||
inst = handle_instance_without_section(dmctx, parent_node, ++id);
|
||||
|
||||
if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)obj, inst) == DM_STOP)
|
||||
break;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.DECT.Portable.{i}.!UBUS:dect/status/None,None/handsets*/
|
||||
static int browseServicesVoiceServiceDECTPortableInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
|
||||
{
|
||||
json_object *res = NULL, *obj = NULL, *arrobj = NULL;
|
||||
char *inst = NULL;
|
||||
|
||||
dmubus_call("dect", "status", UBUS_ARGS{0}, 0, &res);
|
||||
if (res) {
|
||||
int id = 0, i = 0;
|
||||
|
||||
dmjson_foreach_obj_in_array(res, arrobj, obj, i, 1, "handsets") {
|
||||
char *str_id = dmjson_get_value(obj, 1, "id");
|
||||
|
||||
/* Use the id from the UBUS call if it is found */
|
||||
if (str_id && *str_id) {
|
||||
id = DM_STRTOL(str_id);
|
||||
} else {
|
||||
id++;
|
||||
}
|
||||
|
||||
inst = handle_instance_without_section(dmctx, parent_node, id);
|
||||
|
||||
if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)obj, inst) == DM_STOP)
|
||||
break;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*************************************************************
|
||||
* GET & SET PARAM
|
||||
**************************************************************/
|
||||
/*#Device.Services.VoiceService.{i}.DECT.BaseNumberOfEntries!UBUS:dect/status//base*/
|
||||
static int get_ServicesVoiceServiceDECT_BaseNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
size_t num = 0;
|
||||
json_object *res = NULL, *base;
|
||||
|
||||
dmubus_call("dect", "status", UBUS_ARGS{0}, 0, &res);
|
||||
DM_ASSERT(res, *value = "0");
|
||||
json_object_object_get_ex(res, "base", &base);
|
||||
|
||||
num = (base) ? json_object_array_length(base) : 0;
|
||||
|
||||
dmasprintf(value, "%d", num);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.DECT.PortableNumberOfEntries!UBUS:dect/status//handsets*/
|
||||
static int get_ServicesVoiceServiceDECT_PortableNumberOfEntries(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
size_t num = 0;
|
||||
json_object *res = NULL, *handsets;
|
||||
|
||||
dmubus_call("dect", "status", UBUS_ARGS{0}, 0, &res);
|
||||
DM_ASSERT(res, *value = "0");
|
||||
|
||||
json_object_object_get_ex(res, "handsets", &handsets);
|
||||
|
||||
num = (handsets) ? json_object_array_length(handsets) : 0;
|
||||
|
||||
dmasprintf(value, "%d", num);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.DECT.Base.{i}.Status!UBUS:dect/status//base[@i-1].status*/
|
||||
static int get_ServicesVoiceServiceDECTBase_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
char *status = NULL;
|
||||
|
||||
status = dmjson_get_value((json_object *)data, 1, "status");
|
||||
|
||||
if (strcasecmp(status, "up") == 0) {
|
||||
*value = "Up";
|
||||
} else if (strcasecmp(status, "error") == 0) {
|
||||
*value = "Error";
|
||||
} else if (strcasecmp(status, "testing") == 0) {
|
||||
*value = "Testing";
|
||||
} else {
|
||||
*value = "Disabled";
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceDECTBase_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
struct uci_section *s = NULL;
|
||||
|
||||
uci_path_foreach_option_eq(bbfdm, "dmmap", "dect", "base_inst", instance, s) {
|
||||
dmuci_get_value_by_section_string(s, "alias", value);
|
||||
break;
|
||||
}
|
||||
if ((*value)[0] == '\0')
|
||||
dmasprintf(value, "cpe-%s", instance);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServiceDECTBase_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
struct uci_section *s = NULL, *dmmap = NULL;
|
||||
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_string(value, -1, 64, NULL, NULL))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
uci_path_foreach_option_eq(bbfdm, "dmmap", "dect", "base_inst", instance, s) {
|
||||
dmuci_set_value_by_section_bbfdm(s, "alias", value);
|
||||
return 0;
|
||||
}
|
||||
dmuci_add_section_bbfdm("dmmap", "dect", &dmmap);
|
||||
dmuci_set_value_by_section(dmmap, "base_inst", instance);
|
||||
dmuci_set_value_by_section(dmmap, "alias", value);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.DECT.Base.{i}.Name!UBUS:dect/status//base[@i-1].id*/
|
||||
static int get_ServicesVoiceServiceDECTBase_Name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
char *id = NULL;
|
||||
|
||||
id = dmjson_get_value((json_object *)data, 1, "id");
|
||||
dmasprintf(value, "Base-%s", id);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.DECT.Base.{i}.Standard!UBUS:dect/status//base[@i-1].standard*/
|
||||
static int get_ServicesVoiceServiceDECTBase_Standard(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = dmjson_get_value((json_object *)data, 1, "standard");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.DECT.Base.{i}.RFPI!UBUS:dect/status//base[@i-1].rfpi*/
|
||||
static int get_ServicesVoiceServiceDECTBase_RFPI(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = dmjson_get_value((json_object *)data, 1, "rfpi");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.DECT.Base.{i}.RepeaterSupportEnabled!UBUS:dect/status//base[@i-1].repeater_support_enabled*/
|
||||
static int get_ServicesVoiceServiceDECTBase_RepeaterSupportEnabled(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = dmjson_get_value((json_object *)data, 1, "repeater_support_enabled");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.DECT.Base.{i}.SubscriptionEnable!UBUS:dect/status//base[@i-1].subscription_enabled*/
|
||||
static int get_ServicesVoiceServiceDECTBase_SubscriptionEnable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = dmjson_get_value((json_object *)data, 1, "subscription_enabled");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServiceDECTBase_SubscriptionEnable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
bool enable;
|
||||
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_boolean(value))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
string_to_bool(value, &enable);
|
||||
if (enable)
|
||||
dmubus_call_set("dect", "registration_start", UBUS_ARGS{{"base", "1", Integer}}, 1);
|
||||
else
|
||||
dmubus_call_set("dect", "registration_stop", UBUS_ARGS{{"base", "1", Integer}}, 1);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.DECT.Base.{i}.FirmwareVersion!UBUS:dect/status//base[@i-1].firmware_version*/
|
||||
static int get_ServicesVoiceServiceDECTBase_FirmwareVersion(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = dmjson_get_value((json_object *)data, 1, "firmware_version");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.DECT.Base.{i}.EepromVersion!UBUS:dect/status//base[@i-1].eeprom_version*/
|
||||
static int get_ServicesVoiceServiceDECTBase_EepromVersion(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = dmjson_get_value((json_object *)data, 1, "eeprom_version");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.DECT.Base.{i}.HardwareVersion!UBUS:dect/status//base[@i-1].hardware_version*/
|
||||
static int get_ServicesVoiceServiceDECTBase_HardwareVersion(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = dmjson_get_value((json_object *)data, 1, "hardware_version");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.DECT.Portable.{i}.Status!UBUS:dect/status//handsets[@i-1].status*/
|
||||
static int get_ServicesVoiceServiceDECTPortable_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
char *status = NULL;
|
||||
|
||||
status = dmjson_get_value((json_object *)data, 1, "status");
|
||||
|
||||
if (strcasecmp(status, "Up") == 0) {
|
||||
*value = "Up";
|
||||
} else if (strcasecmp(status, "error") == 0) {
|
||||
*value = "Error";
|
||||
} else if (strcasecmp(status, "testing") == 0) {
|
||||
*value = "Testing";
|
||||
} else {
|
||||
*value = "Disabled";
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceDECTPortable_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
struct uci_section *s = NULL;
|
||||
|
||||
uci_path_foreach_option_eq(bbfdm, "dmmap", "dect", "portable_inst", instance, s) {
|
||||
dmuci_get_value_by_section_string(s, "alias", value);
|
||||
break;
|
||||
}
|
||||
if ((*value)[0] == '\0')
|
||||
dmasprintf(value, "cpe-%s", instance);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServiceDECTPortable_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
struct uci_section *s = NULL, *dmmap = NULL;
|
||||
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_string(value, -1, 64, NULL, NULL))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
uci_path_foreach_option_eq(bbfdm, "dmmap", "dect", "portable_inst", instance, s) {
|
||||
dmuci_set_value_by_section_bbfdm(s, "alias", value);
|
||||
return 0;
|
||||
}
|
||||
dmuci_add_section_bbfdm("dmmap", "dect", &dmmap);
|
||||
dmuci_set_value_by_section(dmmap, "portable_inst", instance);
|
||||
dmuci_set_value_by_section(dmmap, "alias", value);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.DECT.Portable.{i}.RegistrationStatus!UBUS:dect/status//handsets[@i-1].registration_status*/
|
||||
static int get_ServicesVoiceServiceDECTPortable_RegistrationStatus(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = dmjson_get_value((json_object *)data, 1, "registration_status");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.DECT.Portable.{i}.IPUI!UBUS:dect/status//handsets[@i-1].ipui*/
|
||||
static int get_ServicesVoiceServiceDECTPortable_IPUI(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = dmjson_get_value((json_object *)data, 1, "ipui");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.DECT.Portable.{i}.IPEI!UBUS:dect/status//handsets[@i-1].ipui*/
|
||||
static int get_ServicesVoiceServiceDECTPortable_IPEI(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
char *ipui = dmjson_get_value((json_object *)data, 1, "ipui");
|
||||
|
||||
*value = "";
|
||||
// Check for N type PUT
|
||||
if (ipui[0] == '0') {
|
||||
char buff[14] = {0};
|
||||
|
||||
DM_STRNCPY(buff, &ipui[1], sizeof(buff));
|
||||
dmasprintf(value, "%s0", buff);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.DECT.Portable.{i}.IPUILength!UBUS:dect/status//handsets[@i-1].ipui_length*/
|
||||
static int get_ServicesVoiceServiceDECTPortable_IPUILength(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = dmjson_get_value((json_object *)data, 1, "ipui_length");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.DECT.Portable.{i}.BaseAttachedTo!UBUS:dect/status//handsets[@i-1].base_id*/
|
||||
static int get_ServicesVoiceServiceDECTPortable_BaseAttachedTo(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
char *base = NULL;
|
||||
|
||||
base = dmjson_get_value((json_object *)data, 1, "base_id");
|
||||
|
||||
dmasprintf(value, "Device.VoiceService.1.DECT.Base.%s", base);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.DECT.Portable.{i}.PortableType!UBUS:dect/status//handsets[@i-1].portable_type*/
|
||||
static int get_ServicesVoiceServiceDECTPortable_PortableType(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = dmjson_get_value((json_object *)data, 1, "portable_type");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.DECT.Portable.{i}.SubscriptionTime!UBUS:dect/status//handsets[@i-1].subscription_time*/
|
||||
static int get_ServicesVoiceServiceDECTPortable_SubscriptionTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = dmjson_get_value((json_object *)data, 1, "subscription_time");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.DECT.Portable.{i}.HardwareVersion!UBUS:dect/status//handsets[@i-1].hardware_version*/
|
||||
static int get_ServicesVoiceServiceDECTPortable_HardwareVersion(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = dmjson_get_value((json_object *)data, 1, "hardware_version");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.DECT.Portable.{i}.SoftwareVersion!UBUS:dect/status//handsets[@i-1].software_version*/
|
||||
static int get_ServicesVoiceServiceDECTPortable_SoftwareVersion(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = dmjson_get_value((json_object *)data, 1, "software_version");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.DECT.Portable.{i}.SoftwareUpgrade!UBUS:dect/status//handsets[@i-1].software_upgrade*/
|
||||
static int get_ServicesVoiceServiceDECTPortable_SoftwareUpgrade(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = dmjson_get_value((json_object *)data, 1, "software_upgrade");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.DECT.Portable.{i}.LastUpdateDateTime!UBUS:dect/status//handsets[@i-1].last_update_datetime*/
|
||||
static int get_ServicesVoiceServiceDECTPortable_LastUpdateDateTime(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = dmjson_get_value((json_object *)data, 1, "last_update_datetime");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**********************************************************************************************************************************
|
||||
* OBJ & PARAM DEFINITION
|
||||
***********************************************************************************************************************************/
|
||||
/* *** Device.Services.VoiceService.{i}.DECT. *** */
|
||||
DMOBJ tServicesVoiceServiceDECTObj[] = {
|
||||
/* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys*/
|
||||
{"Base", &DMREAD, NULL, NULL, NULL, browseServicesVoiceServiceDECTBaseInst, NULL, NULL, NULL, tServicesVoiceServiceDECTBaseParams, NULL, BBFDM_BOTH, LIST_KEY{"RFPI", "Name", "Alias", NULL}},
|
||||
{"Portable", &DMREAD, NULL, NULL, NULL, browseServicesVoiceServiceDECTPortableInst, NULL, NULL, NULL, tServicesVoiceServiceDECTPortableParams, get_voice_service_dect_linker, BBFDM_BOTH, LIST_KEY{"IPEI", "Alias", NULL}},
|
||||
{0}
|
||||
};
|
||||
|
||||
DMLEAF tServicesVoiceServiceDECTParams[] = {
|
||||
/* PARAM, permission, type, getvalue, setvalue, bbfdm_type*/
|
||||
{"BaseNumberOfEntries", &DMREAD, DMT_UNINT, get_ServicesVoiceServiceDECT_BaseNumberOfEntries, NULL, BBFDM_BOTH},
|
||||
{"PortableNumberOfEntries", &DMREAD, DMT_UNINT, get_ServicesVoiceServiceDECT_PortableNumberOfEntries, NULL, BBFDM_BOTH},
|
||||
{0}
|
||||
};
|
||||
|
||||
DMLEAF tServicesVoiceServiceDECTBaseParams[] = {
|
||||
/* PARAM, permission, type, getvalue, setvalue, bbfdm_type*/
|
||||
{"Status", &DMREAD, DMT_STRING, get_ServicesVoiceServiceDECTBase_Status, NULL, BBFDM_BOTH},
|
||||
{"Alias", &DMWRITE, DMT_STRING, get_ServicesVoiceServiceDECTBase_Alias, set_ServicesVoiceServiceDECTBase_Alias, BBFDM_BOTH},
|
||||
{"Name", &DMREAD, DMT_STRING, get_ServicesVoiceServiceDECTBase_Name, NULL, BBFDM_BOTH},
|
||||
{"Standard", &DMREAD, DMT_STRING, get_ServicesVoiceServiceDECTBase_Standard, NULL, BBFDM_BOTH},
|
||||
{"RFPI", &DMREAD, DMT_HEXBIN, get_ServicesVoiceServiceDECTBase_RFPI, NULL, BBFDM_BOTH},
|
||||
{"RepeaterSupportEnabled", &DMREAD, DMT_BOOL, get_ServicesVoiceServiceDECTBase_RepeaterSupportEnabled, NULL, BBFDM_BOTH},
|
||||
{"SubscriptionEnable", &DMWRITE, DMT_BOOL, get_ServicesVoiceServiceDECTBase_SubscriptionEnable, set_ServicesVoiceServiceDECTBase_SubscriptionEnable, BBFDM_BOTH},
|
||||
{"FirmwareVersion", &DMREAD, DMT_STRING, get_ServicesVoiceServiceDECTBase_FirmwareVersion, NULL, BBFDM_BOTH},
|
||||
{"EepromVersion", &DMREAD, DMT_STRING, get_ServicesVoiceServiceDECTBase_EepromVersion, NULL, BBFDM_BOTH},
|
||||
{"HardwareVersion", &DMREAD, DMT_STRING, get_ServicesVoiceServiceDECTBase_HardwareVersion, NULL, BBFDM_BOTH},
|
||||
{0}
|
||||
};
|
||||
|
||||
/* *** Device.Services.VoiceService.{i}.DECT.Portable.{i}. *** */
|
||||
DMLEAF tServicesVoiceServiceDECTPortableParams[] = {
|
||||
/* PARAM, permission, type, getvalue, setvalue, bbfdm_type*/
|
||||
{"Status", &DMREAD, DMT_STRING, get_ServicesVoiceServiceDECTPortable_Status, NULL, BBFDM_BOTH},
|
||||
{"Alias", &DMWRITE, DMT_STRING, get_ServicesVoiceServiceDECTPortable_Alias, set_ServicesVoiceServiceDECTPortable_Alias, BBFDM_BOTH},
|
||||
{"RegistrationStatus", &DMREAD, DMT_STRING, get_ServicesVoiceServiceDECTPortable_RegistrationStatus, NULL, BBFDM_BOTH},
|
||||
{"IPUI", &DMREAD, DMT_HEXBIN, get_ServicesVoiceServiceDECTPortable_IPUI, NULL, BBFDM_BOTH},
|
||||
{"IPEI", &DMREAD, DMT_HEXBIN, get_ServicesVoiceServiceDECTPortable_IPEI, NULL, BBFDM_BOTH},
|
||||
{"IPUILength", &DMREAD, DMT_UNINT, get_ServicesVoiceServiceDECTPortable_IPUILength, NULL, BBFDM_BOTH},
|
||||
{"BaseAttachedTo", &DMREAD, DMT_STRING, get_ServicesVoiceServiceDECTPortable_BaseAttachedTo, NULL, BBFDM_BOTH},
|
||||
{"PortableType", &DMREAD, DMT_STRING, get_ServicesVoiceServiceDECTPortable_PortableType, NULL, BBFDM_BOTH},
|
||||
{"SubscriptionTime", &DMREAD, DMT_TIME, get_ServicesVoiceServiceDECTPortable_SubscriptionTime, NULL, BBFDM_BOTH},
|
||||
{"HardwareVersion", &DMREAD, DMT_STRING, get_ServicesVoiceServiceDECTPortable_HardwareVersion, NULL, BBFDM_BOTH},
|
||||
{"SoftwareVersion", &DMREAD, DMT_STRING, get_ServicesVoiceServiceDECTPortable_SoftwareVersion, NULL, BBFDM_BOTH},
|
||||
{"SoftwareUpgrade", &DMREAD, DMT_BOOL, get_ServicesVoiceServiceDECTPortable_SoftwareUpgrade, NULL, BBFDM_BOTH},
|
||||
{"LastUpdateDateTime", &DMREAD, DMT_TIME, get_ServicesVoiceServiceDECTPortable_LastUpdateDateTime, NULL, BBFDM_BOTH},
|
||||
{0}
|
||||
};
|
||||
|
||||
|
|
@ -1,23 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2021 Iopsys Software Solutions AB
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License version 2.1
|
||||
* as published by the Free Software Foundation
|
||||
*
|
||||
* Author: Vivek Dutta <vivek.dutta@iopsys.eu>
|
||||
*/
|
||||
|
||||
#ifndef __SERVICESVOICESERVICEDECT_H
|
||||
#define __SERVICESVOICESERVICEDECT_H
|
||||
|
||||
#include "libbbfdm-api/dmcommon.h"
|
||||
|
||||
extern DMOBJ tServicesVoiceServiceDECTObj[];
|
||||
extern DMLEAF tServicesVoiceServiceDECTParams[];
|
||||
extern DMLEAF tServicesVoiceServiceDECTBaseParams[];
|
||||
extern DMLEAF tServicesVoiceServiceDECTPortableParams[];
|
||||
|
||||
|
||||
#endif //__SERVICESVOICESERVICEDECT_H
|
||||
|
||||
|
|
@ -1,251 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License version 2.1
|
||||
* as published by the Free Software Foundation
|
||||
*
|
||||
* Author: Yalu Zhang, yalu.zhang@iopsys.eu
|
||||
*/
|
||||
|
||||
#include "servicesvoiceservicepots.h"
|
||||
#include "common.h"
|
||||
|
||||
/**************************************************************************
|
||||
* LINKER
|
||||
***************************************************************************/
|
||||
static int get_voice_service_pots_linker(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker)
|
||||
{
|
||||
*linker = data ? section_name(((struct dmmap_dup *)data)->config_section) : "";
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*************************************************************
|
||||
* ENTRY METHOD
|
||||
**************************************************************/
|
||||
/*#Device.Services.VoiceService.{i}.POTS.FXS.{i}.!UCI:asterisk/extension/dmmap_asterisk*/
|
||||
static int browseServicesVoiceServicePOTSFXSInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
|
||||
{
|
||||
char *inst = NULL;
|
||||
struct dmmap_dup *p = NULL;
|
||||
LIST_HEAD(dup_list);
|
||||
|
||||
synchronize_specific_config_sections_with_dmmap("asterisk", "extension", "dmmap_asterisk", &dup_list);
|
||||
list_for_each_entry(p, &dup_list, list) {
|
||||
char *line_type = NULL;
|
||||
|
||||
dmuci_get_value_by_section_string(p->config_section, "type", &line_type);
|
||||
if (line_type && (strcasecmp(line_type, "fxs") == 0)) {
|
||||
inst = handle_instance(dmctx, parent_node, p->dmmap_section, "fxsinstance", "fxsalias");
|
||||
|
||||
if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)p, inst) == DM_STOP)
|
||||
break;
|
||||
}
|
||||
if (line_type && *line_type)
|
||||
dmfree(line_type);
|
||||
}
|
||||
free_dmmap_config_dup_list(&dup_list);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*************************************************************
|
||||
* GET & SET PARAM
|
||||
**************************************************************/
|
||||
/*#Device.Services.VoiceService.{i}.POTS.Region!UCI:asterisk/tel_advanced,tel_options/country*/
|
||||
static int get_ServicesVoiceServicePOTS_Region(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
dmuci_get_option_value_string("asterisk", "tel_options", "country", value);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServicePOTS_Region(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_string(value, -1, 2, NULL, NULL))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
dmuci_set_value("asterisk", "tel_options", "country", value);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServicePOTSFXS_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = "Up";
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.POTS.FXS.{i}.Name!UCI:asterisk/tel_line,@i-1/name*/
|
||||
static int get_ServicesVoiceServicePOTSFXS_Name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
dmuci_get_value_by_section_string(((struct dmmap_dup *)data)->config_section, "name", value);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServicePOTSFXS_DialType(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = "Tone";
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.POTS.FXS.{i}.ClipGeneration!UCI:asterisk/tel_line,@i-1/clir*/
|
||||
static int get_ServicesVoiceServicePOTSFXS_ClipGeneration(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
char *clir;
|
||||
dmuci_get_value_by_section_string(((struct dmmap_dup *)data)->config_section, "clir", &clir);
|
||||
*value = *clir == '1' ? "0" : "1";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServicePOTSFXS_ClipGeneration(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
bool b;
|
||||
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_boolean(value))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
string_to_bool(value, &b);
|
||||
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "clir", !b ? "1" : "0");
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServicePOTSFXS_Active(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = "1";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServicePOTSFXS_TerminalType(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = "Any";
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.POTS.FXS.{i}.VoiceProcessing.TransmitGain!UCI:asterisk/extension,@i-1/txgain*/
|
||||
static int get_ServicesVoiceServicePOTSFXSVoiceProcessing_TransmitGain(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = dmuci_get_value_by_section_fallback_def(((struct dmmap_dup *)data)->config_section, "txgain", "0");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServicePOTSFXSVoiceProcessing_TransmitGain(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_int(value, RANGE_ARGS{{NULL,NULL}}, 1))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "txgain", value);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.POTS.FXS.{i}.VoiceProcessing.ReceiveGain!UCI:asterisk/extension,@i-1/rxgain*/
|
||||
static int get_ServicesVoiceServicePOTSFXSVoiceProcessing_ReceiveGain(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = dmuci_get_value_by_section_fallback_def(((struct dmmap_dup *)data)->config_section, "rxgain", "0");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServicePOTSFXSVoiceProcessing_ReceiveGain(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_int(value, RANGE_ARGS{{NULL,NULL}}, 1))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "rxgain", value);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.POTS.FXS.{i}.VoiceProcessing.EchoCancellationEnable!UCI:asterisk/extension,@i-1/echo_cancel*/
|
||||
static int get_ServicesVoiceServicePOTSFXSVoiceProcessing_EchoCancellationEnable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = dmuci_get_value_by_section_fallback_def(((struct dmmap_dup *)data)->config_section, "echo_cancel", "1");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServicePOTSFXSVoiceProcessing_EchoCancellationEnable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
bool b;
|
||||
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_boolean(value))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
string_to_bool(value, &b);
|
||||
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "echo_cancel", b ? "1" : "0");
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*Get Device.Services.VoiceService.{i}.POTS.FXS.{i}. Alias*/
|
||||
static int get_ServicesVoiceServicePOTSFXS_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
return get_Alias_value_by_inst(refparam, ctx, data, instance, value, "clientalias");
|
||||
}
|
||||
|
||||
/*Set Device.Services.VoiceService.{i}.POTS.FXS.{i}. Alias*/
|
||||
static int set_ServicesVoiceServicePOTSFXS_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
return set_Alias_value_by_inst(refparam, ctx, data, instance, value, action, "clientalias");
|
||||
}
|
||||
/**********************************************************************************************************************************
|
||||
* OBJ & PARAM DEFINITION
|
||||
***********************************************************************************************************************************/
|
||||
/* *** Device.Services.VoiceService.{i}.POTS. *** */
|
||||
DMOBJ tServicesVoiceServicePOTSObj[] = {
|
||||
/* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys*/
|
||||
{"FXS", &DMREAD, NULL, NULL, NULL, browseServicesVoiceServicePOTSFXSInst, NULL, NULL, tServicesVoiceServicePOTSFXSObj, tServicesVoiceServicePOTSFXSParams, get_voice_service_pots_linker, BBFDM_BOTH, LIST_KEY{"Name", "Alias", NULL}},
|
||||
{0}
|
||||
};
|
||||
|
||||
DMLEAF tServicesVoiceServicePOTSParams[] = {
|
||||
/* PARAM, permission, type, getvalue, setvalue, bbfdm_type*/
|
||||
{"Region", &DMWRITE, DMT_STRING, get_ServicesVoiceServicePOTS_Region, set_ServicesVoiceServicePOTS_Region, BBFDM_BOTH},
|
||||
{0}
|
||||
};
|
||||
|
||||
/* *** Device.Services.VoiceService.{i}.POTS.FXS.{i}. *** */
|
||||
DMOBJ tServicesVoiceServicePOTSFXSObj[] = {
|
||||
/* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys*/
|
||||
{"VoiceProcessing", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tServicesVoiceServicePOTSFXSVoiceProcessingParams, NULL, BBFDM_BOTH},
|
||||
{0}
|
||||
};
|
||||
|
||||
DMLEAF tServicesVoiceServicePOTSFXSParams[] = {
|
||||
/* PARAM, permission, type, getvalue, setvalue, bbfdm_type*/
|
||||
{"Status", &DMREAD, DMT_STRING, get_ServicesVoiceServicePOTSFXS_Status, NULL, BBFDM_BOTH},
|
||||
{"Name", &DMREAD, DMT_STRING, get_ServicesVoiceServicePOTSFXS_Name, NULL, BBFDM_BOTH},
|
||||
{"DialType", &DMREAD, DMT_STRING, get_ServicesVoiceServicePOTSFXS_DialType, NULL, BBFDM_BOTH},
|
||||
{"ClipGeneration", &DMWRITE, DMT_BOOL, get_ServicesVoiceServicePOTSFXS_ClipGeneration, set_ServicesVoiceServicePOTSFXS_ClipGeneration, BBFDM_BOTH},
|
||||
{"Active", &DMREAD, DMT_BOOL, get_ServicesVoiceServicePOTSFXS_Active, NULL, BBFDM_BOTH},
|
||||
{"TerminalType", &DMREAD, DMT_STRING, get_ServicesVoiceServicePOTSFXS_TerminalType, NULL, BBFDM_BOTH},
|
||||
{"Alias", &DMWRITE, DMT_STRING, get_ServicesVoiceServicePOTSFXS_Alias, set_ServicesVoiceServicePOTSFXS_Alias, BBFDM_BOTH},
|
||||
{0}
|
||||
};
|
||||
|
||||
/* *** Device.Services.VoiceService.{i}.POTS.FXS.{i}.VoiceProcessing. *** */
|
||||
DMLEAF tServicesVoiceServicePOTSFXSVoiceProcessingParams[] = {
|
||||
/* PARAM, permission, type, getvalue, setvalue, bbfdm_type*/
|
||||
{"TransmitGain", &DMWRITE, DMT_INT, get_ServicesVoiceServicePOTSFXSVoiceProcessing_TransmitGain, set_ServicesVoiceServicePOTSFXSVoiceProcessing_TransmitGain, BBFDM_BOTH},
|
||||
{"ReceiveGain", &DMWRITE, DMT_INT, get_ServicesVoiceServicePOTSFXSVoiceProcessing_ReceiveGain, set_ServicesVoiceServicePOTSFXSVoiceProcessing_ReceiveGain, BBFDM_BOTH},
|
||||
{"EchoCancellationEnable", &DMWRITE, DMT_BOOL, get_ServicesVoiceServicePOTSFXSVoiceProcessing_EchoCancellationEnable, set_ServicesVoiceServicePOTSFXSVoiceProcessing_EchoCancellationEnable, BBFDM_BOTH},
|
||||
{0}
|
||||
};
|
||||
|
|
@ -1,23 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License version 2.1
|
||||
* as published by the Free Software Foundation
|
||||
*
|
||||
* Author: Yalu Zhang, yalu.zhang@iopsys.eu
|
||||
*/
|
||||
|
||||
#ifndef __SERVICESVOICESERVICEPOTS_H
|
||||
#define __SERVICESVOICESERVICEPOTS_H
|
||||
|
||||
#include "libbbfdm-api/dmcommon.h"
|
||||
|
||||
extern DMOBJ tServicesVoiceServicePOTSObj[];
|
||||
extern DMLEAF tServicesVoiceServicePOTSParams[];
|
||||
extern DMOBJ tServicesVoiceServicePOTSFXSObj[];
|
||||
extern DMLEAF tServicesVoiceServicePOTSFXSParams[];
|
||||
extern DMLEAF tServicesVoiceServicePOTSFXSVoiceProcessingParams[];
|
||||
|
||||
#endif //__SERVICESVOICESERVICEPOTS_H
|
||||
|
||||
|
|
@ -1,54 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License version 2.1
|
||||
* as published by the Free Software Foundation
|
||||
*
|
||||
* Author: Yalu Zhang, yalu.zhang@iopsys.eu
|
||||
*/
|
||||
|
||||
#include "servicesvoiceservicereservedports.h"
|
||||
#include "common.h"
|
||||
|
||||
/*************************************************************
|
||||
* GET & SET PARAM
|
||||
**************************************************************/
|
||||
static int get_reserved_port_range(char **value)
|
||||
{
|
||||
char *start = NULL, *end = NULL;
|
||||
|
||||
dmuci_get_option_value_string("asterisk", "sip_options", "rtp_start", &start);
|
||||
dmuci_get_option_value_string("asterisk", "sip_options", "rtp_end", &end);
|
||||
if (start && *start && end && *end) {
|
||||
dmasprintf(value, "%s-%s", start, end);
|
||||
dmfree(start);
|
||||
dmfree(end);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.ReservedPorts.WANPortRange!UCI:asterisk/sip_advanced,sip_options/rtp_start*/
|
||||
static int get_ServicesVoiceServiceReservedPorts_WANPortRange(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
return get_reserved_port_range(value);
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.ReservedPorts.LANPortRange!UCI:asterisk/sip_advanced,sip_options/rtp_end*/
|
||||
static int get_ServicesVoiceServiceReservedPorts_LANPortRange(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
return get_reserved_port_range(value);
|
||||
}
|
||||
|
||||
/**********************************************************************************************************************************
|
||||
* OBJ & PARAM DEFINITION
|
||||
***********************************************************************************************************************************/
|
||||
/* *** Device.Services.VoiceService.{i}.ReservedPorts. *** */
|
||||
DMLEAF tServicesVoiceServiceReservedPortsParams[] = {
|
||||
/* PARAM, permission, type, getvalue, setvalue, bbfdm_type*/
|
||||
{"WANPortRange", &DMREAD, DMT_STRING, get_ServicesVoiceServiceReservedPorts_WANPortRange, NULL, BBFDM_BOTH},
|
||||
{"LANPortRange", &DMREAD, DMT_STRING, get_ServicesVoiceServiceReservedPorts_LANPortRange, NULL, BBFDM_BOTH},
|
||||
{0}
|
||||
};
|
||||
|
||||
|
|
@ -1,19 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License version 2.1
|
||||
* as published by the Free Software Foundation
|
||||
*
|
||||
* Author: Yalu Zhang, yalu.zhang@iopsys.eu
|
||||
*/
|
||||
|
||||
#ifndef __SERVICESVOICESERVICERESERVEDPORTS_H
|
||||
#define __SERVICESVOICESERVICERESERVEDPORTS_H
|
||||
|
||||
#include "libbbfdm-api/dmcommon.h"
|
||||
|
||||
extern DMLEAF tServicesVoiceServiceReservedPortsParams[];
|
||||
|
||||
#endif //__SERVICESVOICESERVICERESERVEDPORTS_H
|
||||
|
||||
|
|
@ -1,983 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License version 2.1
|
||||
* as published by the Free Software Foundation
|
||||
*
|
||||
* Author: Yalu Zhang, yalu.zhang@iopsys.eu
|
||||
*/
|
||||
|
||||
#include "servicesvoiceservice.h"
|
||||
#include "servicesvoiceservicesip.h"
|
||||
#include "common.h"
|
||||
|
||||
/**************************************************************************
|
||||
* LINKER
|
||||
***************************************************************************/
|
||||
static int get_voice_service_sip_client_linker(char *refparam, struct dmctx *dmctx, void *data, char *instance, char **linker)
|
||||
{
|
||||
*linker = data ? section_name(((struct dmmap_dup *)data)->config_section) : "";
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*************************************************************
|
||||
* ENTRY METHOD
|
||||
**************************************************************/
|
||||
/*#Device.Services.VoiceService.{i}.SIP.Client.{i}.!UCI:asterisk/sip_service_provider/dmmap_asterisk*/
|
||||
static int browseServicesVoiceServiceSIPClientInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
|
||||
{
|
||||
return browseVoiceServiceSIPProviderInst(dmctx, parent_node, prev_data, prev_instance);
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.SIP.Client.{i}.Contact.{i}.*/
|
||||
/*
|
||||
static int browseServicesVoiceServiceSIPClientContactInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
|
||||
{
|
||||
// prev_data is from its parent node SIP.Client.{i}. i.e. the UCI section of asterisk.sip_service_provider
|
||||
DM_LINK_INST_OBJ(dmctx, parent_node, prev_data, "1");
|
||||
return 0;
|
||||
}
|
||||
*/
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.SIP.Network.{i}.!UCI:asterisk/sip_service_provider/dmmap_asterisk*/
|
||||
static int browseServicesVoiceServiceSIPNetworkInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
|
||||
{
|
||||
char *inst = NULL;
|
||||
struct dmmap_dup *p = NULL;
|
||||
LIST_HEAD(dup_list);
|
||||
|
||||
synchronize_specific_config_sections_with_dmmap("asterisk", "sip_service_provider", "dmmap_asterisk", &dup_list);
|
||||
list_for_each_entry(p, &dup_list, list) {
|
||||
|
||||
inst = handle_instance(dmctx, parent_node, p->dmmap_section, "networkinstance", "networkalias");
|
||||
|
||||
if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)p, inst) == DM_STOP)
|
||||
break;
|
||||
}
|
||||
free_dmmap_config_dup_list(&dup_list);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.SIP.Network.{i}.FQDNServer.{i}.*/
|
||||
static int browseServicesVoiceServiceSIPNetworkFQDNServerInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
|
||||
{
|
||||
// prev_data is from its parent node SIP.Network.{i}. i.e. a UCI section of asterisk.sip_service_provider
|
||||
DM_LINK_INST_OBJ(dmctx, parent_node, prev_data, "1");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*************************************************************
|
||||
* ADD & DEL OBJ
|
||||
**************************************************************/
|
||||
static int addObjServicesVoiceServiceSIPClient(char *refparam, struct dmctx *ctx, void *data, char **instance)
|
||||
{
|
||||
char new_sec_name[16], value[32];
|
||||
struct uci_section *dmmap = NULL;
|
||||
|
||||
snprintf(new_sec_name, sizeof(new_sec_name), "sip%s", *instance);
|
||||
snprintf(value, sizeof(value), "account %s", *instance);
|
||||
|
||||
dmuci_set_value(TR104_UCI_PACKAGE, new_sec_name, "", "sip_service_provider");
|
||||
dmuci_set_value(TR104_UCI_PACKAGE, new_sec_name, "name", value);
|
||||
dmuci_set_value(TR104_UCI_PACKAGE, new_sec_name, "enable", "0");
|
||||
dmuci_set_value(TR104_UCI_PACKAGE, new_sec_name, "support_fax", "0");
|
||||
dmuci_set_value(TR104_UCI_PACKAGE, new_sec_name, "transport", "udp");
|
||||
|
||||
dmuci_add_section_bbfdm("dmmap_asterisk", "sip_service_provider", &dmmap);
|
||||
dmuci_set_value_by_section(dmmap, "section_name", new_sec_name);
|
||||
dmuci_set_value_by_section(dmmap, "clientinstance", *instance);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int delObjServicesVoiceServiceSIPClient(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
|
||||
{
|
||||
return delObjVoiceServiceSIPProvider(refparam, ctx, data, instance, del_action);
|
||||
}
|
||||
|
||||
static int addObjServicesVoiceServiceSIPNetwork(char *refparam, struct dmctx *ctx, void *data, char **instance)
|
||||
{
|
||||
BBF_DEBUG("Each Services.VoiceService.1.SIP.Network object is bound to one Services.VoiceService"
|
||||
".1.SIP.Client object\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int delObjServicesVoiceServiceSIPNetwork(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
|
||||
{
|
||||
BBF_DEBUG("Each Services.VoiceService.1.SIP.Network object is bound to one Services.VoiceService"
|
||||
".1.SIP.Client object\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
static int addObjServicesVoiceServiceSIPClientContact(char *refparam, struct dmctx *ctx, void *data, char **instance)
|
||||
{
|
||||
//TODO
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int delObjServicesVoiceServiceSIPClientContact(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
|
||||
{
|
||||
switch (del_action) {
|
||||
case DEL_INST:
|
||||
//TODO
|
||||
break;
|
||||
case DEL_ALL:
|
||||
//TODO
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int addObjServicesVoiceServiceSIPNetworkFQDNServer(char *refparam, struct dmctx *ctx, void *data, char **instance)
|
||||
{
|
||||
//TODO
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int delObjServicesVoiceServiceSIPNetworkFQDNServer(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
|
||||
{
|
||||
switch (del_action) {
|
||||
case DEL_INST:
|
||||
//TODO
|
||||
break;
|
||||
case DEL_ALL:
|
||||
//TODO
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
*/
|
||||
|
||||
/*************************************************************
|
||||
* GET & SET PARAM
|
||||
**************************************************************/
|
||||
/*#Device.Services.VoiceService.{i}.SIP.Client.{i}.Enable!UCI:asterisk/sip_service_provider,@i-1/enable*/
|
||||
static int get_ServicesVoiceServiceSIPClient_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = dmuci_get_value_by_section_fallback_def(((struct dmmap_dup *)data)->config_section, "enable", "1");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServiceSIPClient_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
bool b;
|
||||
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_boolean(value))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
string_to_bool(value, &b);
|
||||
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "enable", b ? "1" : "0");
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceSIPClient_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
struct uci_section *section = ((struct dmmap_dup *)data)->config_section;
|
||||
char *enabled = NULL;
|
||||
|
||||
dmuci_get_value_by_section_string(section, "enable", &enabled);
|
||||
if (enabled && *enabled == '0') {
|
||||
*value = "Disabled";
|
||||
|
||||
dmfree(enabled);
|
||||
} else {
|
||||
// Get registration status from ubus
|
||||
json_object *res = NULL, *sip = NULL, *client = NULL;
|
||||
|
||||
dmubus_call("voice.asterisk", "status", UBUS_ARGS{0}, 0, &res);
|
||||
if (res) {
|
||||
sip = dmjson_get_obj(res, 1, "sip");
|
||||
if (sip) {
|
||||
client = dmjson_get_obj(sip, 1, section->e.name);
|
||||
if (client) {
|
||||
char *state = dmjson_get_value(client, 1, "state");
|
||||
if (state && *state) {
|
||||
if (strcasecmp(state, "Registered") == 0) {
|
||||
*value = "Up";
|
||||
} else if (strcasecmp(state, "Rejected") == 0) {
|
||||
*value = "Error_Registration";
|
||||
} else if (strcasecmp(state, "Stopped") == 0) {
|
||||
*value = "Quiescent";
|
||||
} else if (strcasecmp(state, "Unregistered") == 0) {
|
||||
*value = "Registering";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
BBF_DEBUG("dmubus_call() failed\n");
|
||||
}
|
||||
}
|
||||
|
||||
// For internal failure
|
||||
if (!*value || !**value)
|
||||
*value = "Error_Registration";
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceSIPClient_Origin(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = "Static";
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.SIP.Client.{i}.AuthUserName!UCI:asterisk/sip_service_provider,@i-1/authuser*/
|
||||
static int get_ServicesVoiceServiceSIPClient_AuthUserName(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
dmuci_get_value_by_section_string(((struct dmmap_dup *)data)->config_section, "authuser", value);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServiceSIPClient_AuthUserName(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_string(value, -1, 128, NULL, NULL))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "authuser", value);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServiceSIPClient_AuthPassword(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_string(value, -1, 128, NULL, NULL))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "secret", value);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.SIP.Client.{i}.RegisterURI!UCI:asterisk/sip_service_provider,@i-1/user*/
|
||||
static int get_ServicesVoiceServiceSIPClient_RegisterURI(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
char *value_user = NULL;
|
||||
char *value_address = NULL;
|
||||
|
||||
dmuci_get_value_by_section_string(((struct dmmap_dup *)data)->config_section, "user", &value_user);
|
||||
dmuci_get_value_by_section_string(((struct dmmap_dup *)data)->config_section, "domain", &value_address);
|
||||
|
||||
if (!(value_address && *value_address)) {
|
||||
dmuci_get_value_by_section_string(((struct dmmap_dup *)data)->config_section, "outbound_proxy", &value_address);
|
||||
}
|
||||
|
||||
dmasprintf(value, "%s@%s", value_user, value_address);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServiceSIPClient_RegisterURI(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
char *value_user = NULL;
|
||||
char *value_domain = NULL;
|
||||
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_string(value, -1, 389, NULL, NULL))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
value_domain = DM_STRCHR(value, '@');
|
||||
if (value_domain) {
|
||||
value_domain++;
|
||||
value_user = dmstrdup(value);
|
||||
if (value_user) {
|
||||
value_user[value_domain - value - 1] = '\0';
|
||||
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "user", value_user);
|
||||
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "domain", value_domain);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.SIP.Network.{i}.Enable!UCI:asterisk/sip_service_provider,@i-1/enable*/
|
||||
static int get_ServicesVoiceServiceSIPNetwork_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = dmuci_get_value_by_section_fallback_def(((struct dmmap_dup *)data)->config_section, "enable", "1");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServiceSIPNetwork_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
bool b;
|
||||
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_boolean(value))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
string_to_bool(value, &b);
|
||||
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "enable", b ? "1" : "0");
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceSIPNetwork_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = "Up";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_server_address(struct uci_section *section, char *option, char **value)
|
||||
{
|
||||
dmuci_get_value_by_section_string(section, option, value);
|
||||
if (*value && **value) {
|
||||
char *port = DM_STRCHR(*value, ':');
|
||||
if (port) {
|
||||
char *server = dmstrdup(*value);
|
||||
if (server) {
|
||||
server[port - *value] = '\0';
|
||||
dmfree(*value);
|
||||
*value = server;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_server_address(struct uci_section *section, char *option, char *value)
|
||||
{
|
||||
char *old_value = NULL;
|
||||
|
||||
dmuci_get_value_by_section_string(section, option, &old_value);
|
||||
char *port = (old_value && *old_value) ? DM_STRCHR(old_value, ':') : NULL;
|
||||
if (port) {
|
||||
char new_value[32] = {0};
|
||||
|
||||
port++;
|
||||
snprintf(new_value, sizeof(new_value), "%s:%s", value, port);
|
||||
dmuci_set_value_by_section(section, option, new_value);
|
||||
} else {
|
||||
dmuci_set_value_by_section(section, option, value);
|
||||
}
|
||||
|
||||
if (old_value && *old_value)
|
||||
dmfree(old_value);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_server_port(struct uci_section *section, char *option, char **value)
|
||||
{
|
||||
char *domain = NULL, *port = NULL;
|
||||
|
||||
dmuci_get_value_by_section_string(section, option, &domain);
|
||||
if (domain && *domain) {
|
||||
port = DM_STRCHR(domain, ':');
|
||||
if (port)
|
||||
port++;
|
||||
}
|
||||
|
||||
*value = dmstrdup((port && *port) ? port : DEFAULT_SIP_PORT_STR);
|
||||
|
||||
if (domain && *domain)
|
||||
dmfree(domain);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_server_port(struct uci_section *section, char *option, char *value)
|
||||
{
|
||||
char *old_value = NULL, new_value[32] = {0};
|
||||
|
||||
dmuci_get_value_by_section_string(section, option, &old_value);
|
||||
char *tmp = old_value ? DM_STRCHR(old_value, ':') : NULL;
|
||||
if (tmp)
|
||||
*tmp = '\0';
|
||||
|
||||
snprintf(new_value, sizeof(new_value), "%s:%s", old_value ? old_value : "", value);
|
||||
dmuci_set_value_by_section(section, option, new_value);
|
||||
|
||||
if (old_value && *old_value)
|
||||
dmfree(old_value);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.SIP.Network.{i}.ProxyServer!UCI:asterisk/sip_service_provider,@i-1/host*/
|
||||
static int get_ServicesVoiceServiceSIPNetwork_ProxyServer(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
dmuci_get_value_by_section_string(((struct dmmap_dup *)data)->config_section, "host", value);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServiceSIPNetwork_ProxyServer(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_string(value, -1, 256, NULL, NULL))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "host", value);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.SIP.Network.{i}.ProxyServerPort!UCI:asterisk/sip_service_provider,@i-1/port*/
|
||||
static int get_ServicesVoiceServiceSIPNetwork_ProxyServerPort(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = dmuci_get_value_by_section_fallback_def(((struct dmmap_dup *)data)->config_section, "port", DEFAULT_SIP_PORT_STR);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServiceSIPNetwork_ProxyServerPort(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_unsignedInt(value, RANGE_ARGS{{"0","65535"}}, 1))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "port", value);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.SIP.Network.{i}.ProxyServerTransport!UCI:asterisk/sip_service_provider,@i-1/transport*/
|
||||
/*#Device.Services.VoiceService.{i}.SIP.Network.{i}.UserAgentTransport!UCI:asterisk/sip_service_provider,@i-1/transport*/
|
||||
static int get_ServicesVoiceServiceSIPNetwork_Transport(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
dmuci_get_value_by_section_string(((struct dmmap_dup *)data)->config_section, "transport", value);
|
||||
if (*value && **value) {
|
||||
// Convert to uppercase
|
||||
for (char *ch = *value; *ch != '\0'; ch++)
|
||||
*ch = toupper(*ch);
|
||||
} else {
|
||||
*value = "UDP";
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServiceSIPNetwork_Transport(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_string(value, -1, -1, ProxyServerTransport, NULL))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
for (char *ch = value; *ch != '\0'; ch++)
|
||||
*ch = tolower(*ch);
|
||||
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "transport", value);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.SIP.Network.{i}.RegistrarServer!UCI:asterisk/sip_service_provider,@i-1/host*/
|
||||
static int get_ServicesVoiceServiceSIPNetwork_RegistrarServer(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
dmuci_get_value_by_section_string(((struct dmmap_dup *)data)->config_section, "host", value);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServiceSIPNetwork_RegistrarServer(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_string(value, -1, 256, NULL, NULL))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "host", value);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.SIP.Network.{i}.RegistrarServerPort!UCI:asterisk/sip_service_provider,@i-1/port*/
|
||||
static int get_ServicesVoiceServiceSIPNetwork_RegistrarServerPort(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = dmuci_get_value_by_section_fallback_def(((struct dmmap_dup *)data)->config_section, "port", DEFAULT_SIP_PORT_STR);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServiceSIPNetwork_RegistrarServerPort(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_unsignedInt(value, RANGE_ARGS{{"0","65535"}}, 1))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "port", value);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.SIP.Network.{i}.RegistrarServerTransport!UCI:asterisk/sip_service_provider,@i-1/transport*/
|
||||
static int get_ServicesVoiceServiceSIPNetwork_RegistrarServerTransport(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
dmuci_get_value_by_section_string(((struct dmmap_dup *)data)->config_section, "transport", value);
|
||||
if (*value && **value) {
|
||||
for (char *ch = *value; *ch != '\0'; ch++)
|
||||
*ch = toupper(*ch);
|
||||
} else {
|
||||
*value = "UDP";
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServiceSIPNetwork_RegistrarServerTransport(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_string(value, -1, -1, RegistrarServerTransport, NULL))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
for (char *ch = value; *ch != '\0'; ch++)
|
||||
*ch = tolower(*ch);
|
||||
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "transport", value);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.SIP.Network.{i}.UserAgentDomain!UCI:asterisk/sip_service_provider,@i-1/domain*/
|
||||
static int get_ServicesVoiceServiceSIPNetwork_UserAgentDomain(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
dmuci_get_value_by_section_string(((struct dmmap_dup *)data)->config_section, "domain", value);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServiceSIPNetwork_UserAgentDomain(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_string(value, -1, 256, NULL, NULL))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "domain", value);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.SIP.Network.{i}.OutboundProxy!UCI:asterisk/sip_service_provider,@i-1/outbound_proxy*/
|
||||
static int get_ServicesVoiceServiceSIPNetwork_OutboundProxy(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
dmuci_get_value_by_section_string(((struct dmmap_dup *)data)->config_section, "outbound_proxy", value);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServiceSIPNetwork_OutboundProxy(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_string(value, -1, 256, NULL, NULL))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "outbound_proxy", value);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.SIP.Network.{i}.OutboundProxyPort!UCI:asterisk/sip_service_provider,@i-1/outbound_proxy_port*/
|
||||
static int get_ServicesVoiceServiceSIPNetwork_OutboundProxyPort(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = dmuci_get_value_by_section_fallback_def(((struct dmmap_dup *)data)->config_section, "outbound_proxy_port", DEFAULT_SIP_PORT_STR);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServiceSIPNetwork_OutboundProxyPort(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_unsignedInt(value, RANGE_ARGS{{"0","65535"}}, 1))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "outbound_proxy_port", value);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.SIP.Network.{i}.STUNServer!UCI:asterisk/sip_advanced,sip_options/stun_server*/
|
||||
static int get_ServicesVoiceServiceSIPNetwork_STUNServer(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
dmuci_get_option_value_string("asterisk", "sip_options", "stun_server", value);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServiceSIPNetwork_STUNServer(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_string(value, -1, 256, NULL, NULL))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
dmuci_set_value("asterisk", "sip_options", "stun_server", value);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.SIP.Network.{i}.RegistrationPeriod!UCI:asterisk/sip_advanced,sip_options/defaultexpiry*/
|
||||
static int get_ServicesVoiceServiceSIPNetwork_RegistrationPeriod(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = dmuci_get_option_value_fallback_def("asterisk", "sip_options", "defaultexpiry", DEFAULT_SIP_REGISTER_EXPIRY_STR);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServiceSIPNetwork_RegistrationPeriod(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_unsignedInt(value, RANGE_ARGS{{"1",NULL}}, 1))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
dmuci_set_value("asterisk", "sip_options", "defaultexpiry", value);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.SIP.Network.{i}.Realm!UCI:asterisk/sip_advanced,sip_options/realm*/
|
||||
static int get_ServicesVoiceServiceSIPNetwork_Realm(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
dmuci_get_option_value_string("asterisk", "sip_options", "realm", value);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServiceSIPNetwork_Realm(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_string(value, -1, -1, NULL, NULL))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
dmuci_set_value("asterisk", "sip_options", "realm", value);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.SIP.Network.{i}.RegisterExpires!UCI:asterisk/sip_advanced,sip_options/defaultexpiry*/
|
||||
static int get_ServicesVoiceServiceSIPNetwork_RegisterExpires(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = dmuci_get_option_value_fallback_def("asterisk", "sip_options", "defaultexpiry", DEFAULT_SIP_REGISTER_EXPIRY_STR);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServiceSIPNetwork_RegisterExpires(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_unsignedInt(value, RANGE_ARGS{{"1",NULL}}, 1))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
dmuci_set_value("asterisk", "sip_options", "defaultexpiry", value);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.SIP.Network.{i}.DSCPMark!UCI:asterisk/sip_advanced,sip_options/tos_sip*/
|
||||
static int get_ServicesVoiceServiceSIPNetwork_DSCPMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = dmuci_get_option_value_fallback_def("asterisk", "sip_options", "tos_sip", "0");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServiceSIPNetwork_DSCPMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_unsignedInt(value, RANGE_ARGS{{"0","63"}}, 1))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
dmuci_set_value("asterisk", "sip_options", "tos_sip", value);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.SIP.Network.{i}.CodecList!UCI:asterisk/sip_service_provider,@i-1/codecs*/
|
||||
static int get_ServicesVoiceServiceSIPNetwork_CodecList(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
char *tmp = NULL;
|
||||
|
||||
*value = "";
|
||||
dmuci_get_value_by_section_string(((struct dmmap_dup *)data)->config_section, "codecs", &tmp);
|
||||
if (tmp && *tmp) {
|
||||
char buf[256] = "";
|
||||
char *token, *saveptr;
|
||||
int len = 0;
|
||||
|
||||
for (token = strtok_r(tmp, ", ", &saveptr); token; token = strtok_r(NULL, ", ", &saveptr)) {
|
||||
const char *codec = get_codec_name(token);
|
||||
if (codec && len < sizeof(buf)) {
|
||||
int res = snprintf(buf + len, sizeof(buf) - len, "%s%s", len == 0 ? "" : ",", codec);
|
||||
if (res <= 0) {
|
||||
BBF_DEBUG("buf might be too small\n");
|
||||
dmfree(tmp);
|
||||
return FAULT_9002;
|
||||
}
|
||||
len += res;
|
||||
}
|
||||
}
|
||||
|
||||
if (buf[0] != '\0')
|
||||
*value = dmstrdup(buf);
|
||||
|
||||
dmfree(tmp);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServiceSIPNetwork_CodecList(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
char *codec_list = NULL, *token = NULL, *saveptr = NULL, *uci_name = NULL;
|
||||
int res = 0;
|
||||
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (!value)
|
||||
return FAULT_9007;
|
||||
else if (*value) {
|
||||
codec_list = dmstrdup(value);
|
||||
for (token = strtok_r(codec_list, ", ", &saveptr); token; token = strtok_r(NULL, ", ", &saveptr)) {
|
||||
if (!get_codec_uci_name(token)) {
|
||||
res = FAULT_9007;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case VALUESET:
|
||||
if (value) {
|
||||
// Empty the existing code list first
|
||||
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "codecs", "");
|
||||
|
||||
if (*value) {
|
||||
codec_list = dmstrdup(value);
|
||||
for (token = strtok_r(codec_list, ", ", &saveptr); token;
|
||||
token = strtok_r(NULL, ", ", &saveptr)) {
|
||||
uci_name = (char *)get_codec_uci_name(token);
|
||||
if (uci_name) {
|
||||
dmuci_add_list_value_by_section(((struct dmmap_dup *)data)->config_section, "codecs", uci_name);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (codec_list)
|
||||
dmfree(codec_list);
|
||||
return res;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.SIP.Network.{i}.FQDNServer.Enable!UCI:asterisk/sip_advanced,sip_options/srvlookup*/
|
||||
static int get_ServicesVoiceServiceSIPNetworkFQDNServer_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
dmuci_get_option_value_string("asterisk", "sip_options", "srvlookup", value);
|
||||
*value = (DM_LSTRCMP(*value, "yes") == 0) ? "1" : "0";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServiceSIPNetworkFQDNServer_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
bool b;
|
||||
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_boolean(value))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
string_to_bool(value, &b);
|
||||
dmuci_set_value("asterisk", "sip_options", "srvlookup", b ? "yes" : "no");
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceSIPNetworkFQDNServer_Origin(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = "Static";
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.SIP.Network.{i}.FQDNServer.Domain!UCI:asterisk/sip_service_provider,@i-1/domain*/
|
||||
static int get_ServicesVoiceServiceSIPNetworkFQDNServer_Domain(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
return get_server_address(((struct dmmap_dup *)data)->config_section, "domain", value);
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServiceSIPNetworkFQDNServer_Domain(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_string(value, -1, 256, NULL, NULL))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
set_server_address(((struct dmmap_dup *)data)->config_section, "domain", value);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.SIP.Network.{i}.FQDNServer.Port!UCI:asterisk/sip_service_provider,@i-1/domain*/
|
||||
static int get_ServicesVoiceServiceSIPNetworkFQDNServer_Port(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
return get_server_port(((struct dmmap_dup *)data)->config_section, "domain", value);
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServiceSIPNetworkFQDNServer_Port(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_unsignedInt(value, RANGE_ARGS{{"0","65535"}}, 1))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
set_server_port(((struct dmmap_dup *)data)->config_section, "domain", value);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*Get Device.Services.VoiceService.{i}.SIP.Network.{i}. Alias*/
|
||||
static int get_ServicesVoiceServiceSIPNetwork_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
return get_Alias_value_by_inst(refparam, ctx, data, instance, value, "networkalias");
|
||||
}
|
||||
|
||||
/*Set Device.Services.VoiceService.{i}.SIP.Network.{i}. Alias*/
|
||||
static int set_ServicesVoiceServiceSIPNetwork_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
return set_Alias_value_by_inst(refparam, ctx, data, instance, value, action, "networkalias");
|
||||
}
|
||||
|
||||
|
||||
/*Get Device.Services.VoiceService.{i}.SIP.Network.{i}.FQDNServer. Alias*/
|
||||
static int get_ServicesVoiceServiceSIPNetworkFQDNServer_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
return get_Alias_value_by_name(refparam, ctx, data, instance, value, "FQDNServer", "FQDNServer_inst");
|
||||
}
|
||||
|
||||
/*Set Device.Services.VoiceService.{i}.SIP.Network.{i}.FQDNServer. Alias*/
|
||||
static int set_ServicesVoiceServiceSIPNetworkFQDNServer_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
return set_Alias_value_by_name(refparam, ctx, data, instance, value, action, "FQDNServer", "FQDNServer_inst");
|
||||
}
|
||||
|
||||
/*Get Device.Services.VoiceService.{i}.SIP.Client.{i}. Alias*/
|
||||
static int get_ServicesVoiceServiceSIPClient_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
return get_Alias_value_by_name(refparam, ctx, data, instance, value, "SIPClient", "SIPClient_inst");
|
||||
}
|
||||
|
||||
/*Set Device.Services.VoiceService.{i}.SIP.Client.{i}. Alias*/
|
||||
static int set_ServicesVoiceServiceSIPClient_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
return set_Alias_value_by_name(refparam, ctx, data, instance, value, action, "SIPClient", "SIPClient_inst");
|
||||
}
|
||||
|
||||
/**********************************************************************************************************************************
|
||||
* OBJ & PARAM DEFINITION
|
||||
***********************************************************************************************************************************/
|
||||
/* *** Device.Services.VoiceService.{i}.SIP. *** */
|
||||
DMOBJ tServicesVoiceServiceSIPObj[] = {
|
||||
/* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys*/
|
||||
{"Client", &DMWRITE, addObjServicesVoiceServiceSIPClient, delObjServicesVoiceServiceSIPClient, NULL, browseServicesVoiceServiceSIPClientInst, NULL, NULL, tServicesVoiceServiceSIPClientObj, tServicesVoiceServiceSIPClientParams, get_voice_service_sip_client_linker, BBFDM_BOTH, LIST_KEY{"Alias", NULL}},
|
||||
{"Network", &DMWRITE, addObjServicesVoiceServiceSIPNetwork, delObjServicesVoiceServiceSIPNetwork, NULL, browseServicesVoiceServiceSIPNetworkInst, NULL, NULL, tServicesVoiceServiceSIPNetworkObj, tServicesVoiceServiceSIPNetworkParams, NULL, BBFDM_BOTH, LIST_KEY{"Alias", NULL}},
|
||||
{0}
|
||||
};
|
||||
|
||||
/* *** Device.Services.VoiceService.{i}.SIP.Client.{i}. *** */
|
||||
DMOBJ tServicesVoiceServiceSIPClientObj[] = {
|
||||
/* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys*/
|
||||
// {"Contact", &DMWRITE, addObjServicesVoiceServiceSIPClientContact, delObjServicesVoiceServiceSIPClientContact, NULL, browseServicesVoiceServiceSIPClientContactInst, NULL, NULL, NULL, tServicesVoiceServiceSIPClientContactParams, NULL, BBFDM_BOTH, LIST_KEY{"Alias", NULL}},
|
||||
{0}
|
||||
};
|
||||
|
||||
DMLEAF tServicesVoiceServiceSIPClientParams[] = {
|
||||
/* PARAM, permission, type, getvalue, setvalue, bbfdm_type*/
|
||||
{"Enable", &DMWRITE, DMT_BOOL, get_ServicesVoiceServiceSIPClient_Enable, set_ServicesVoiceServiceSIPClient_Enable, BBFDM_BOTH},
|
||||
{"Status", &DMREAD, DMT_STRING, get_ServicesVoiceServiceSIPClient_Status, NULL, BBFDM_BOTH},
|
||||
{"Origin", &DMREAD, DMT_STRING, get_ServicesVoiceServiceSIPClient_Origin, NULL, BBFDM_BOTH},
|
||||
{"AuthUserName", &DMWRITE, DMT_STRING, get_ServicesVoiceServiceSIPClient_AuthUserName, set_ServicesVoiceServiceSIPClient_AuthUserName, BBFDM_BOTH},
|
||||
{"AuthPassword", &DMWRITE, DMT_STRING, get_empty, set_ServicesVoiceServiceSIPClient_AuthPassword, BBFDM_BOTH},
|
||||
{"RegisterURI", &DMWRITE, DMT_STRING, get_ServicesVoiceServiceSIPClient_RegisterURI, set_ServicesVoiceServiceSIPClient_RegisterURI, BBFDM_BOTH},
|
||||
{"Alias", &DMWRITE, DMT_STRING, get_ServicesVoiceServiceSIPClient_Alias, set_ServicesVoiceServiceSIPClient_Alias, BBFDM_BOTH},
|
||||
{0}
|
||||
};
|
||||
|
||||
/* *** Device.Services.VoiceService.{i}.SIP.Network.{i}. *** */
|
||||
DMOBJ tServicesVoiceServiceSIPNetworkObj[] = {
|
||||
/* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys*/
|
||||
{"FQDNServer", &DMWRITE, NULL, NULL, NULL, browseServicesVoiceServiceSIPNetworkFQDNServerInst, NULL, NULL, NULL, tServicesVoiceServiceSIPNetworkFQDNServerParams, NULL, BBFDM_BOTH, LIST_KEY{"Alias", "Domain", NULL}},
|
||||
//{"FQDNServer", &DMWRITE, addObjServicesVoiceServiceSIPNetworkFQDNServer, delObjServicesVoiceServiceSIPNetworkFQDNServer, NULL, browseServicesVoiceServiceSIPNetworkFQDNServerInst, NULL, NULL, NULL, tServicesVoiceServiceSIPNetworkFQDNServerParams, NULL, BBFDM_BOTH, LIST_KEY{"Alias", "Domain", NULL}},
|
||||
{0}
|
||||
};
|
||||
|
||||
DMLEAF tServicesVoiceServiceSIPNetworkParams[] = {
|
||||
/* PARAM, permission, type, getvalue, setvalue, bbfdm_type*/
|
||||
{"Enable", &DMWRITE, DMT_BOOL, get_ServicesVoiceServiceSIPNetwork_Enable, set_ServicesVoiceServiceSIPNetwork_Enable, BBFDM_BOTH},
|
||||
{"Status", &DMREAD, DMT_STRING, get_ServicesVoiceServiceSIPNetwork_Status, NULL, BBFDM_BOTH},
|
||||
{"ProxyServer", &DMWRITE, DMT_STRING, get_ServicesVoiceServiceSIPNetwork_ProxyServer, set_ServicesVoiceServiceSIPNetwork_ProxyServer, BBFDM_BOTH},
|
||||
{"ProxyServerPort", &DMWRITE, DMT_UNINT, get_ServicesVoiceServiceSIPNetwork_ProxyServerPort, set_ServicesVoiceServiceSIPNetwork_ProxyServerPort, BBFDM_BOTH},
|
||||
{"ProxyServerTransport", &DMWRITE, DMT_STRING, get_ServicesVoiceServiceSIPNetwork_Transport, set_ServicesVoiceServiceSIPNetwork_Transport, BBFDM_BOTH},
|
||||
{"RegistrarServer", &DMWRITE, DMT_STRING, get_ServicesVoiceServiceSIPNetwork_RegistrarServer, set_ServicesVoiceServiceSIPNetwork_RegistrarServer, BBFDM_BOTH},
|
||||
{"RegistrarServerPort", &DMWRITE, DMT_UNINT, get_ServicesVoiceServiceSIPNetwork_RegistrarServerPort, set_ServicesVoiceServiceSIPNetwork_RegistrarServerPort, BBFDM_BOTH},
|
||||
{"RegistrarServerTransport", &DMWRITE, DMT_STRING, get_ServicesVoiceServiceSIPNetwork_RegistrarServerTransport, set_ServicesVoiceServiceSIPNetwork_RegistrarServerTransport, BBFDM_BOTH},
|
||||
{"UserAgentDomain", &DMWRITE, DMT_STRING, get_ServicesVoiceServiceSIPNetwork_UserAgentDomain, set_ServicesVoiceServiceSIPNetwork_UserAgentDomain, BBFDM_BOTH},
|
||||
{"OutboundProxy", &DMWRITE, DMT_STRING, get_ServicesVoiceServiceSIPNetwork_OutboundProxy, set_ServicesVoiceServiceSIPNetwork_OutboundProxy, BBFDM_BOTH},
|
||||
{"OutboundProxyPort", &DMWRITE, DMT_UNINT, get_ServicesVoiceServiceSIPNetwork_OutboundProxyPort, set_ServicesVoiceServiceSIPNetwork_OutboundProxyPort, BBFDM_BOTH},
|
||||
{"UserAgentTransport", &DMWRITE, DMT_STRING, get_ServicesVoiceServiceSIPNetwork_Transport, set_ServicesVoiceServiceSIPNetwork_Transport, BBFDM_BOTH},
|
||||
{"STUNServer", &DMWRITE, DMT_STRING, get_ServicesVoiceServiceSIPNetwork_STUNServer, set_ServicesVoiceServiceSIPNetwork_STUNServer, BBFDM_BOTH},
|
||||
{"RegistrationPeriod", &DMWRITE, DMT_UNINT, get_ServicesVoiceServiceSIPNetwork_RegistrationPeriod, set_ServicesVoiceServiceSIPNetwork_RegistrationPeriod, BBFDM_BOTH},
|
||||
{"Realm", &DMWRITE, DMT_STRING, get_ServicesVoiceServiceSIPNetwork_Realm, set_ServicesVoiceServiceSIPNetwork_Realm, BBFDM_BOTH},
|
||||
{"RegisterExpires", &DMWRITE, DMT_UNINT, get_ServicesVoiceServiceSIPNetwork_RegisterExpires, set_ServicesVoiceServiceSIPNetwork_RegisterExpires, BBFDM_BOTH},
|
||||
{"DSCPMark", &DMWRITE, DMT_UNINT, get_ServicesVoiceServiceSIPNetwork_DSCPMark, set_ServicesVoiceServiceSIPNetwork_DSCPMark, BBFDM_BOTH},
|
||||
{"CodecList", &DMWRITE, DMT_STRING, get_ServicesVoiceServiceSIPNetwork_CodecList, set_ServicesVoiceServiceSIPNetwork_CodecList, BBFDM_BOTH},
|
||||
{"Alias", &DMWRITE, DMT_STRING, get_ServicesVoiceServiceSIPNetwork_Alias, set_ServicesVoiceServiceSIPNetwork_Alias, BBFDM_BOTH},
|
||||
{0}
|
||||
};
|
||||
|
||||
/* *** Device.Services.VoiceService.{i}.SIP.Network.{i}.FQDNServer. *** */
|
||||
DMLEAF tServicesVoiceServiceSIPNetworkFQDNServerParams[] = {
|
||||
/* PARAM, permission, type, getvalue, setvalue, bbfdm_type*/
|
||||
{"Enable", &DMWRITE, DMT_BOOL, get_ServicesVoiceServiceSIPNetworkFQDNServer_Enable, set_ServicesVoiceServiceSIPNetworkFQDNServer_Enable, BBFDM_BOTH},
|
||||
{"Origin", &DMREAD, DMT_STRING, get_ServicesVoiceServiceSIPNetworkFQDNServer_Origin, NULL, BBFDM_BOTH},
|
||||
{"Domain", &DMWRITE, DMT_STRING, get_ServicesVoiceServiceSIPNetworkFQDNServer_Domain, set_ServicesVoiceServiceSIPNetworkFQDNServer_Domain, BBFDM_BOTH},
|
||||
{"Port", &DMWRITE, DMT_UNINT, get_ServicesVoiceServiceSIPNetworkFQDNServer_Port, set_ServicesVoiceServiceSIPNetworkFQDNServer_Port, BBFDM_BOTH},
|
||||
{"Alias", &DMWRITE, DMT_STRING, get_ServicesVoiceServiceSIPNetworkFQDNServer_Alias, set_ServicesVoiceServiceSIPNetworkFQDNServer_Alias, BBFDM_BOTH},
|
||||
{0}
|
||||
};
|
||||
|
|
@ -1,25 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License version 2.1
|
||||
* as published by the Free Software Foundation
|
||||
*
|
||||
* Author: Yalu Zhang, yalu.zhang@iopsys.eu
|
||||
*/
|
||||
|
||||
#ifndef __SERVICESVOICESERVICESIP_H
|
||||
#define __SERVICESVOICESERVICESIP_H
|
||||
|
||||
#include "libbbfdm-api/dmcommon.h"
|
||||
|
||||
extern DMOBJ tServicesVoiceServiceSIPObj[];
|
||||
extern DMOBJ tServicesVoiceServiceSIPClientObj[];
|
||||
extern DMLEAF tServicesVoiceServiceSIPClientParams[];
|
||||
extern DMLEAF tServicesVoiceServiceSIPClientContactParams[];
|
||||
extern DMOBJ tServicesVoiceServiceSIPNetworkObj[];
|
||||
extern DMLEAF tServicesVoiceServiceSIPNetworkParams[];
|
||||
extern DMLEAF tServicesVoiceServiceSIPNetworkFQDNServerParams[];
|
||||
|
||||
#endif //__SERVICESVOICESERVICESIP_H
|
||||
|
||||
|
|
@ -1,366 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License version 2.1
|
||||
* as published by the Free Software Foundation
|
||||
*
|
||||
* Author: Yalu Zhang, yalu.zhang@iopsys.eu
|
||||
*/
|
||||
|
||||
#include "servicesvoiceservicevoipprofile.h"
|
||||
#include "common.h"
|
||||
|
||||
/*************************************************************
|
||||
* GET & SET PARAM
|
||||
**************************************************************/
|
||||
static int get_ServicesVoiceServiceVoIPProfile_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = dmuci_get_option_value_fallback_def("asterisk", "general", "profile_enable", "1");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServiceVoIPProfile_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
bool b;
|
||||
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_boolean(value))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
string_to_bool(value, &b);
|
||||
dmuci_set_value("asterisk", "general", "profile_enable", b ? "1" : "0");
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.VoIPProfile.{i}.DTMFMethod!UCI:asterisk/sip_advanced,sip_options/dtmf_mode*/
|
||||
static int get_ServicesVoiceServiceVoIPProfile_DTMFMethod(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
char *method = NULL;
|
||||
|
||||
dmuci_get_option_value_string(TR104_UCI_PACKAGE, "sip_options", "dtmf_mode", &method);
|
||||
if (method && *method) {
|
||||
if (strcasecmp(method, "inband") == 0)
|
||||
*value = "InBand";
|
||||
else if (strcasecmp(method, "rfc4733") == 0)
|
||||
*value = "RFC4733";
|
||||
else if (strcasestr(method, "info") != NULL)
|
||||
*value = "SIPInfo";
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServiceVoIPProfile_DTMFMethod(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
char *new_value = "";
|
||||
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_string_list(value, -1, -1, -1, -1, -1, DTMFMethod, NULL))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
if (strcasecmp(value, "InBand") == 0)
|
||||
new_value = "inband";
|
||||
else if (strcasecmp(value, "RFC4733") == 0)
|
||||
new_value = "rfc4733";
|
||||
else if (strcasecmp(value, "SIPInfo") == 0)
|
||||
new_value = "info";
|
||||
dmuci_set_value(TR104_UCI_PACKAGE, "sip_options", "dtmf_mode", new_value);
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.VoIPProfile.{i}.RTP.LocalPortMin!UCI:asterisk/sip_advanced,sip_options/rtp_start*/
|
||||
static int get_ServicesVoiceServiceVoIPProfileRTP_LocalPortMin(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = dmuci_get_option_value_fallback_def("asterisk", "sip_options", "rtp_start", "1024");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServiceVoIPProfileRTP_LocalPortMin(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_unsignedInt(value, RANGE_ARGS{{"1","65535"}}, 1))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
dmuci_set_value("asterisk", "sip_options", "rtp_start", value);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.VoIPProfile.{i}.RTP.LocalPortMax!UCI:asterisk/sip_advanced,sip_options/rtp_end*/
|
||||
static int get_ServicesVoiceServiceVoIPProfileRTP_LocalPortMax(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = dmuci_get_option_value_fallback_def("asterisk", "sip_options", "rtp_end", "1024");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServiceVoIPProfileRTP_LocalPortMax(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_unsignedInt(value, RANGE_ARGS{{"1","65535"}}, 1))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
dmuci_set_value("asterisk", "sip_options", "rtp_end", value);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.VoIPProfile.{i}.RTP.DSCPMark!UCI:asterisk/sip_advanced,sip_options/tos_audio*/
|
||||
static int get_ServicesVoiceServiceVoIPProfileRTP_DSCPMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = dmuci_get_option_value_fallback_def("asterisk", "sip_options", "tos_audio", "0");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServiceVoIPProfileRTP_DSCPMark(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_unsignedInt(value, RANGE_ARGS{{"0","63"}}, 1))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
dmuci_set_value("asterisk", "sip_options", "tos_audio", value);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.VoIPProfile.{i}.RTP.TelephoneEventPayloadType!UCI:asterisk/tel_advanced,tel_options/tel_event_pt*/
|
||||
static int get_ServicesVoiceServiceVoIPProfileRTP_TelephoneEventPayloadType(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = dmuci_get_option_value_fallback_def("asterisk", "tel_options", "tel_event_pt", "0");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServiceVoIPProfileRTP_TelephoneEventPayloadType(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_unsignedInt(value, RANGE_ARGS{{"96","127"}}, 1))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
dmuci_set_value("asterisk", "tel_options", "tel_event_pt", value);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.VoIPProfile.{i}.RTP.JitterBufferType!UCI:asterisk/tel_advanced,tel_options/jb_impl*/
|
||||
static int get_ServicesVoiceServiceVoIPProfileRTP_JitterBufferType(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
char *tmp = NULL;
|
||||
|
||||
dmuci_get_option_value_string("asterisk", "tel_options", "jb_impl", &tmp);
|
||||
if (tmp && *tmp) {
|
||||
if (strcasecmp(tmp, "adaptive") == 0)
|
||||
*value = "Dynamic";
|
||||
else
|
||||
*value = "Static";
|
||||
dmfree(tmp);
|
||||
} else {
|
||||
*value = "";
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServiceVoIPProfileRTP_JitterBufferType(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_string(value, -1, -1, JitterBufferType, NULL))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
dmuci_set_value("asterisk", "tel_options", "jb_impl", (strcasecmp(value, "Dynamic") == 0) ? "adaptive" : "fixed");
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.VoIPProfile.{i}.RTP.JitterBufferMaxSize!UCI:asterisk/tel_advanced,tel_options/jb_maxsize*/
|
||||
static int get_ServicesVoiceServiceVoIPProfileRTP_JitterBufferMaxSize(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = dmuci_get_option_value_fallback_def("asterisk", "tel_options", "jb_maxsize", "0");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServiceVoIPProfileRTP_JitterBufferMaxSize(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_unsignedInt(value, RANGE_ARGS{{NULL,NULL}}, 1))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
dmuci_set_value("asterisk", "tel_options", "jb_maxsize", value);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.VoIPProfile.{i}.RTP.RTCP.TxRepeatInterval!UCI:asterisk/sip_advanced,sip_options/rtcpinterval*/
|
||||
static int get_ServicesVoiceServiceVoIPProfileRTPRTCP_TxRepeatInterval(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = dmuci_get_option_value_fallback_def("asterisk", "sip_options", "rtcpinterval", "1");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServiceVoIPProfileRTPRTCP_TxRepeatInterval(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_unsignedInt(value, RANGE_ARGS{{"1",NULL}}, 1))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
dmuci_set_value("asterisk", "sip_options", "rtcpinterval", value);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.VoIPProfile.{i}.RTP.SRTP.Enable!UCI:asterisk/sip_service_provider,@i-1/encryption*/
|
||||
static int get_ServicesVoiceServiceVoIPProfileRTPSRTP_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = dmuci_get_value_by_section_fallback_def(((struct dmmap_dup *)data)->config_section, "encryption", "1");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServiceVoIPProfileRTPSRTP_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
bool b;
|
||||
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_boolean(value))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
string_to_bool(value, &b);
|
||||
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "encryption", b ? "1" : "0");
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceVoIPProfileRTPSRTP_KeyingMethods(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = "SDP";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServiceVoIPProfileRTPSRTP_KeyingMethods(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_string_list(value, -1, -1, -1, -1, -1, KeyingMethods, NULL))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
// To be supported in the future perhaps
|
||||
return FAULT_9000;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceVoIPProfileRTPSRTP_EncryptionKeySizes(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
*value = "128";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServiceVoIPProfileRTPSRTP_EncryptionKeySizes(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_unsignedInt_list(value, -1, -1, -1, RANGE_ARGS{{NULL,NULL}}, 1))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
// To be supported in the future perhaps
|
||||
return FAULT_9000;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*Get Device.Services.VoiceService.{i}.VoIPProfile.{i}. Alias*/
|
||||
static int get_ServicesVoiceServiceVoIPProfile_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
return get_Alias_value_by_inst(refparam, ctx, data, instance, value, "clientalias");
|
||||
}
|
||||
|
||||
/*Set Device.Services.VoiceService.{i}.VoIPProfile.{i}. Alias*/
|
||||
static int set_ServicesVoiceServiceVoIPProfile_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
return set_Alias_value_by_inst(refparam, ctx, data, instance, value, action, "clientalias");
|
||||
}
|
||||
|
||||
/**********************************************************************************************************************************
|
||||
* OBJ & PARAM DEFINITION
|
||||
***********************************************************************************************************************************/
|
||||
/* *** Device.Services.VoiceService.{i}.VoIPProfile.{i}. *** */
|
||||
DMOBJ tServicesVoiceServiceVoIPProfileObj[] = {
|
||||
/* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys*/
|
||||
{"RTP", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tServicesVoiceServiceVoIPProfileRTPObj, tServicesVoiceServiceVoIPProfileRTPParams, NULL, BBFDM_BOTH},
|
||||
{0}
|
||||
};
|
||||
|
||||
DMLEAF tServicesVoiceServiceVoIPProfileParams[] = {
|
||||
/* PARAM, permission, type, getvalue, setvalue, bbfdm_type*/
|
||||
{"DTMFMethod", &DMWRITE, DMT_STRING, get_ServicesVoiceServiceVoIPProfile_DTMFMethod, set_ServicesVoiceServiceVoIPProfile_DTMFMethod, BBFDM_BOTH},
|
||||
{"Alias", &DMWRITE, DMT_STRING, get_ServicesVoiceServiceVoIPProfile_Alias, set_ServicesVoiceServiceVoIPProfile_Alias, BBFDM_BOTH},
|
||||
{"Enable", &DMWRITE, DMT_BOOL, get_ServicesVoiceServiceVoIPProfile_Enable, set_ServicesVoiceServiceVoIPProfile_Enable, BBFDM_BOTH},
|
||||
{0}
|
||||
};
|
||||
|
||||
/* *** Device.Services.VoiceService.{i}.VoIPProfile.{i}.RTP. *** */
|
||||
DMOBJ tServicesVoiceServiceVoIPProfileRTPObj[] = {
|
||||
/* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys*/
|
||||
{"RTCP", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tServicesVoiceServiceVoIPProfileRTPRTCPParams, NULL, BBFDM_BOTH},
|
||||
{"SRTP", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tServicesVoiceServiceVoIPProfileRTPSRTPParams, NULL, BBFDM_BOTH},
|
||||
{0}
|
||||
};
|
||||
|
||||
DMLEAF tServicesVoiceServiceVoIPProfileRTPParams[] = {
|
||||
/* PARAM, permission, type, getvalue, setvalue, bbfdm_type*/
|
||||
{"LocalPortMin", &DMWRITE, DMT_UNINT, get_ServicesVoiceServiceVoIPProfileRTP_LocalPortMin, set_ServicesVoiceServiceVoIPProfileRTP_LocalPortMin, BBFDM_BOTH},
|
||||
{"LocalPortMax", &DMWRITE, DMT_UNINT, get_ServicesVoiceServiceVoIPProfileRTP_LocalPortMax, set_ServicesVoiceServiceVoIPProfileRTP_LocalPortMax, BBFDM_BOTH},
|
||||
{"DSCPMark", &DMWRITE, DMT_UNINT, get_ServicesVoiceServiceVoIPProfileRTP_DSCPMark, set_ServicesVoiceServiceVoIPProfileRTP_DSCPMark, BBFDM_BOTH},
|
||||
{"TelephoneEventPayloadType", &DMWRITE, DMT_UNINT, get_ServicesVoiceServiceVoIPProfileRTP_TelephoneEventPayloadType, set_ServicesVoiceServiceVoIPProfileRTP_TelephoneEventPayloadType, BBFDM_BOTH},
|
||||
{"JitterBufferType", &DMWRITE, DMT_STRING, get_ServicesVoiceServiceVoIPProfileRTP_JitterBufferType, set_ServicesVoiceServiceVoIPProfileRTP_JitterBufferType, BBFDM_BOTH},
|
||||
{"JitterBufferMaxSize", &DMWRITE, DMT_UNINT, get_ServicesVoiceServiceVoIPProfileRTP_JitterBufferMaxSize, set_ServicesVoiceServiceVoIPProfileRTP_JitterBufferMaxSize, BBFDM_BOTH},
|
||||
{0}
|
||||
};
|
||||
|
||||
/* *** Device.Services.VoiceService.{i}.VoIPProfile.{i}.RTP.RTCP. *** */
|
||||
DMLEAF tServicesVoiceServiceVoIPProfileRTPRTCPParams[] = {
|
||||
/* PARAM, permission, type, getvalue, setvalue, bbfdm_type*/
|
||||
{"TxRepeatInterval", &DMWRITE, DMT_UNINT, get_ServicesVoiceServiceVoIPProfileRTPRTCP_TxRepeatInterval, set_ServicesVoiceServiceVoIPProfileRTPRTCP_TxRepeatInterval, BBFDM_BOTH},
|
||||
{0}
|
||||
};
|
||||
|
||||
/* *** Device.Services.VoiceService.{i}.VoIPProfile.{i}.RTP.SRTP. *** */
|
||||
DMLEAF tServicesVoiceServiceVoIPProfileRTPSRTPParams[] = {
|
||||
/* PARAM, permission, type, getvalue, setvalue, bbfdm_type*/
|
||||
{"Enable", &DMWRITE, DMT_BOOL, get_ServicesVoiceServiceVoIPProfileRTPSRTP_Enable, set_ServicesVoiceServiceVoIPProfileRTPSRTP_Enable, BBFDM_BOTH},
|
||||
{"KeyingMethods", &DMWRITE, DMT_STRING, get_ServicesVoiceServiceVoIPProfileRTPSRTP_KeyingMethods, set_ServicesVoiceServiceVoIPProfileRTPSRTP_KeyingMethods, BBFDM_BOTH},
|
||||
{"EncryptionKeySizes", &DMWRITE, DMT_STRING, get_ServicesVoiceServiceVoIPProfileRTPSRTP_EncryptionKeySizes, set_ServicesVoiceServiceVoIPProfileRTPSRTP_EncryptionKeySizes, BBFDM_BOTH},
|
||||
{0}
|
||||
};
|
||||
|
|
@ -1,24 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License version 2.1
|
||||
* as published by the Free Software Foundation
|
||||
*
|
||||
* Author: Yalu Zhang, yalu.zhang@iopsys.eu
|
||||
*/
|
||||
|
||||
#ifndef __SERVICESVOICESERVICEVOIPPROFILE_H
|
||||
#define __SERVICESVOICESERVICEVOIPPROFILE_H
|
||||
|
||||
#include "libbbfdm-api/dmcommon.h"
|
||||
|
||||
extern DMOBJ tServicesVoiceServiceVoIPProfileObj[];
|
||||
extern DMLEAF tServicesVoiceServiceVoIPProfileParams[];
|
||||
extern DMOBJ tServicesVoiceServiceVoIPProfileRTPObj[];
|
||||
extern DMLEAF tServicesVoiceServiceVoIPProfileRTPParams[];
|
||||
extern DMLEAF tServicesVoiceServiceVoIPProfileRTPRTCPParams[];
|
||||
extern DMLEAF tServicesVoiceServiceVoIPProfileRTPSRTPParams[];
|
||||
|
||||
#endif //__SERVICESVOICESERVICEVOIPPROFILE_H
|
||||
|
||||
|
|
@ -125,9 +125,7 @@ DMOBJ tDeviceObj[] = {
|
|||
{"Security", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tSecurityObj, tSecurityParams, NULL, BBFDM_BOTH, NULL, "2.4"},
|
||||
#endif
|
||||
{"RouterAdvertisement", &DMREAD, NULL, NULL, "file:/etc/config/dhcp", NULL, NULL, NULL, tRouterAdvertisementObj, tRouterAdvertisementParams, NULL, BBFDM_BOTH, NULL, "2.2"},
|
||||
#ifdef BBF_TR104
|
||||
{"Services", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tServicesObj, NULL, NULL, BBFDM_BOTH, NULL, "2.0"},
|
||||
#endif
|
||||
{"Services", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, BBFDM_BOTH, NULL, "2.0"},
|
||||
{"GatewayInfo", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tGatewayInfoParams, NULL, BBFDM_CWMP, NULL, "2.0"},
|
||||
{"MQTT", &DMREAD, NULL, NULL, "file:/etc/config/mosquitto", NULL, NULL, NULL, tMQTTObj, tMQTTParams, NULL, BBFDM_BOTH, NULL, "2.10"},
|
||||
{"SSH", &DMREAD, NULL, NULL, "file:/etc/config/dropbear", NULL, NULL, NULL, tSSHObj, tSSHParams, NULL, BBFDM_BOTH, NULL, "2.16"},
|
||||
|
|
|
|||
|
|
@ -1,137 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2021 iopsys Software Solutions AB
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License version 2.1
|
||||
* as published by the Free Software Foundation
|
||||
*
|
||||
* Author Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||
*/
|
||||
|
||||
#include "servicesvoiceservicecallcontrol.h"
|
||||
#include "common.h"
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.CallControl.Extension.{i}.ComfortNoise!UCI:asterisk/extension,@i-1/comfort_noise*/
|
||||
static int get_ServicesVoiceServiceCallControlExtension_ComfortNoise(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
dmuci_get_value_by_section_string(((struct dmmap_dup *)data)->config_section, "comfort_noise", value);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServiceCallControlExtension_ComfortNoise(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
bool b;
|
||||
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_boolean(value))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
string_to_bool(value, &b);
|
||||
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "comfort_noise", b ? "1" : "0");
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.CallControl.Extension.{i}.TXGain!UCI:asterisk/extension,@i-1/txgain*/
|
||||
static int get_ServicesVoiceServiceCallControlExtension_TXGain(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
dmuci_get_value_by_section_string(((struct dmmap_dup *)data)->config_section, "txgain", value);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServiceCallControlExtension_TXGain(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_string(value, -1, 32, NULL, NULL))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "txgain", value);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.CallControl.Extension.{i}.RXGain!UCI:asterisk/extension,@i-1/rxgain*/
|
||||
static int get_ServicesVoiceServiceCallControlExtension_RXGain(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
dmuci_get_value_by_section_string(((struct dmmap_dup *)data)->config_section, "rxgain", value);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServiceCallControlExtension_RXGain(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_string(value, -1, 32, NULL, NULL))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "rxgain", value);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.CallControl.Extension.{i}.EchoCancel!UCI:asterisk/extension,@i-1/echo_cancel*/
|
||||
static int get_ServicesVoiceServiceCallControlExtension_EchoCancel(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
dmuci_get_value_by_section_string(((struct dmmap_dup *)data)->config_section, "echo_cancel", value);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServiceCallControlExtension_EchoCancel(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
bool b;
|
||||
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_boolean(value))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
string_to_bool(value, &b);
|
||||
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "echo_cancel", b ? "1" : "0");
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*#Device.Services.VoiceService.{i}.CallControl.Extension.{i}.Type!UCI:asterisk/extension,@i-1/type*/
|
||||
static int get_ServicesVoiceServiceCallControlExtension_Type(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
dmuci_get_value_by_section_string(((struct dmmap_dup *)data)->config_section, "type", value);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServiceCallControlExtension_Type(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_string(value, -1, 32, NULL, NULL))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
dmuci_set_value_by_section(((struct dmmap_dup *)data)->config_section, "type", value);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**********************************************************************************************************************************
|
||||
* OBJ & PARAM DEFINITION
|
||||
***********************************************************************************************************************************/
|
||||
/* *** Device.Services.VoiceService.{i}.CallControl.Extension.{i}. *** */
|
||||
DMLEAF tIOPSYS_VoiceServiceCallControlExtensionParams[] = {
|
||||
/* PARAM, permission, type, getvalue, setvalue, bbfdm_type*/
|
||||
{BBF_VENDOR_PREFIX"ComfortNoise", &DMWRITE, DMT_STRING, get_ServicesVoiceServiceCallControlExtension_ComfortNoise, set_ServicesVoiceServiceCallControlExtension_ComfortNoise, BBFDM_BOTH},
|
||||
{BBF_VENDOR_PREFIX"TXGain", &DMWRITE, DMT_STRING, get_ServicesVoiceServiceCallControlExtension_TXGain, set_ServicesVoiceServiceCallControlExtension_TXGain, BBFDM_BOTH},
|
||||
{BBF_VENDOR_PREFIX"RXGain", &DMWRITE, DMT_STRING, get_ServicesVoiceServiceCallControlExtension_RXGain, set_ServicesVoiceServiceCallControlExtension_RXGain, BBFDM_BOTH},
|
||||
{BBF_VENDOR_PREFIX"EchoCancel", &DMWRITE, DMT_STRING, get_ServicesVoiceServiceCallControlExtension_EchoCancel, set_ServicesVoiceServiceCallControlExtension_EchoCancel, BBFDM_BOTH},
|
||||
{BBF_VENDOR_PREFIX"Type", &DMWRITE, DMT_STRING, get_ServicesVoiceServiceCallControlExtension_Type, set_ServicesVoiceServiceCallControlExtension_Type, BBFDM_BOTH},
|
||||
{0}
|
||||
};
|
||||
|
|
@ -1,19 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2021 iopsys Software Solutions AB
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License version 2.1
|
||||
* as published by the Free Software Foundation
|
||||
*
|
||||
* Author Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||
*/
|
||||
|
||||
#ifndef __IOPSYS_VOICESERVICECALLCONTROL_H
|
||||
#define __IOPSYS_VOICESERVICECALLCONTROL_H
|
||||
|
||||
#include "libbbfdm-api/dmcommon.h"
|
||||
|
||||
extern DMLEAF tIOPSYS_VoiceServiceCallControlExtensionParams[];
|
||||
|
||||
#endif //__IOPSYS_VOICESERVICECALLCONTROL_H
|
||||
|
||||
|
|
@ -1,178 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2021 iopsys Software Solutions AB
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License version 2.1
|
||||
* as published by the Free Software Foundation
|
||||
*
|
||||
* Author Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||
* Author Grzegorz Sluja <grzegorz.sluja@iopsys.eu>
|
||||
*/
|
||||
|
||||
#include "servicesvoiceservicecalllog.h"
|
||||
#include "common.h"
|
||||
|
||||
static int get_ServicesVoiceServiceCallLog_SipIpAddress(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
struct call_log_entry *entry = (struct call_log_entry *)data;
|
||||
*value = (entry) ? dmstrdup(entry->sipIpAddress) : "";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCallLog_SipResponseCode(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
struct call_log_entry *entry = (struct call_log_entry *)data;
|
||||
*value = (entry) ? dmstrdup(entry->sipResponseCode) : "0";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCallLog_Src_BurstDensity(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
struct call_log_entry *entry = (struct call_log_entry *)data;
|
||||
*value = (entry) ? dmstrdup(entry->localBurstDensity) : "0";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCallLog_Dst_BurstDensity(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
struct call_log_entry *entry = (struct call_log_entry *)data;
|
||||
*value = (entry) ? dmstrdup(entry->remoteBurstDensity) : "0";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCallLog_Src_BurstDuration(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
struct call_log_entry *entry = (struct call_log_entry *)data;
|
||||
*value = (entry) ? dmstrdup(entry->localBurstDuration) : "0";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCallLog_Dst_BurstDuration(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
struct call_log_entry *entry = (struct call_log_entry *)data;
|
||||
*value = (entry) ? dmstrdup(entry->remoteBurstDuration) : "0";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCallLog_Src_GapDensity(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
struct call_log_entry *entry = (struct call_log_entry *)data;
|
||||
*value = (entry) ? dmstrdup(entry->localGapDensity) : "0";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCallLog_Dst_GapDensity(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
struct call_log_entry *entry = (struct call_log_entry *)data;
|
||||
*value = (entry) ? dmstrdup(entry->remoteGapDensity) : "0";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCallLog_Src_GapDuration(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
struct call_log_entry *entry = (struct call_log_entry *)data;
|
||||
*value = (entry) ? dmstrdup(entry->localGapDuration) : "0";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCallLog_Dst_GapDuration(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
struct call_log_entry *entry = (struct call_log_entry *)data;
|
||||
*value = (entry) ? dmstrdup(entry->remoteGapDuration) : "0";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCallLog_Src_JBAvgDelay(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
struct call_log_entry *entry = (struct call_log_entry *)data;
|
||||
*value = (entry) ? dmstrdup(entry->localJbRate) : "0";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCallLog_Dst_JBAvgDelay(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
struct call_log_entry *entry = (struct call_log_entry *)data;
|
||||
*value = (entry) ? dmstrdup(entry->remoteJbRate) : "0";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCallLog_Src_JBMaxDelay(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
struct call_log_entry *entry = (struct call_log_entry *)data;
|
||||
*value = (entry) ? dmstrdup(entry->localJbMax) : "0";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCallLog_Dst_JBMaxDelay(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
struct call_log_entry *entry = (struct call_log_entry *)data;
|
||||
*value = (entry) ? dmstrdup(entry->remoteJbMax) : "0";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCallLog_Src_JBNomDelay(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
struct call_log_entry *entry = (struct call_log_entry *)data;
|
||||
*value = (entry) ? dmstrdup(entry->localJbNominal) : "0";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCallLog_Dst_JBNomDelay(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
struct call_log_entry *entry = (struct call_log_entry *)data;
|
||||
*value = (entry) ? dmstrdup(entry->remoteJbNominal) : "0";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCallLog_Src_PeakJitter(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
struct call_log_entry *entry = (struct call_log_entry *)data;
|
||||
*value = (entry) ? dmstrdup(entry->localJbAbsMax) : "0";
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ServicesVoiceServiceCallLog_Dst_PeakJitter(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
struct call_log_entry *entry = (struct call_log_entry *)data;
|
||||
*value = (entry) ? dmstrdup(entry->remoteJbAbsMax) : "0";
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**********************************************************************************************************************************
|
||||
* OBJ & PARAM DEFINITION
|
||||
***********************************************************************************************************************************/
|
||||
/* *** Device.Services.VoiceService.{i}.CallLog.{i}. *** */
|
||||
DMLEAF tIOPSYS_VoiceServiceCallLogParams[] = {
|
||||
/* PARAM, permission, type, getvalue, setvalue, bbfdm_type*/
|
||||
{BBF_VENDOR_PREFIX"SIPIPAddress", &DMREAD, DMT_STRING, get_ServicesVoiceServiceCallLog_SipIpAddress, NULL, BBFDM_BOTH},
|
||||
{BBF_VENDOR_PREFIX"SIPResponseCode", &DMREAD, DMT_UNINT, get_ServicesVoiceServiceCallLog_SipResponseCode, NULL, BBFDM_BOTH},
|
||||
{0}
|
||||
};
|
||||
|
||||
/* *** Device.Services.VoiceService.{i}.CallLog.{i}.Session.{i}.Source.RTP. *** */
|
||||
DMLEAF tIOPSYS_VoiceServiceCallLogSessionSourceRTPParams[] = {
|
||||
/* PARAM, permission, type, getvalue, setvalue, bbfdm_type*/
|
||||
{BBF_VENDOR_PREFIX"BurstDensity", &DMREAD, DMT_UNINT, get_ServicesVoiceServiceCallLog_Src_BurstDensity, NULL, BBFDM_BOTH},
|
||||
{BBF_VENDOR_PREFIX"BurstDuration", &DMREAD, DMT_UNINT, get_ServicesVoiceServiceCallLog_Src_BurstDuration, NULL, BBFDM_BOTH},
|
||||
{BBF_VENDOR_PREFIX"GapDensity", &DMREAD, DMT_UNINT, get_ServicesVoiceServiceCallLog_Src_GapDensity, NULL, BBFDM_BOTH},
|
||||
{BBF_VENDOR_PREFIX"GapDuration", &DMREAD, DMT_UNINT, get_ServicesVoiceServiceCallLog_Src_GapDuration, NULL, BBFDM_BOTH},
|
||||
{BBF_VENDOR_PREFIX"JBAvgDelay", &DMREAD, DMT_UNINT, get_ServicesVoiceServiceCallLog_Src_JBAvgDelay, NULL, BBFDM_BOTH},
|
||||
{BBF_VENDOR_PREFIX"JBMaxDelay", &DMREAD, DMT_UNINT, get_ServicesVoiceServiceCallLog_Src_JBMaxDelay, NULL, BBFDM_BOTH},
|
||||
{BBF_VENDOR_PREFIX"JBNomDelay", &DMREAD, DMT_UNINT, get_ServicesVoiceServiceCallLog_Src_JBNomDelay, NULL, BBFDM_BOTH},
|
||||
{BBF_VENDOR_PREFIX"PeakJitter", &DMREAD, DMT_UNINT, get_ServicesVoiceServiceCallLog_Src_PeakJitter, NULL, BBFDM_BOTH},
|
||||
{0}
|
||||
};
|
||||
|
||||
/* *** Device.Services.VoiceService.{i}.CallLog.{i}.Session.{i}.Destination.RTP. *** */
|
||||
DMLEAF tIOPSYS_VoiceServiceCallLogSessionDestinationRTPParams[] = {
|
||||
/* PARAM, permission, type, getvalue, setvalue, bbfdm_type*/
|
||||
{BBF_VENDOR_PREFIX"BurstDensity", &DMREAD, DMT_UNINT, get_ServicesVoiceServiceCallLog_Dst_BurstDensity, NULL, BBFDM_BOTH},
|
||||
{BBF_VENDOR_PREFIX"BurstDuration", &DMREAD, DMT_UNINT, get_ServicesVoiceServiceCallLog_Dst_BurstDuration, NULL, BBFDM_BOTH},
|
||||
{BBF_VENDOR_PREFIX"GapDensity", &DMREAD, DMT_UNINT, get_ServicesVoiceServiceCallLog_Dst_GapDensity, NULL, BBFDM_BOTH},
|
||||
{BBF_VENDOR_PREFIX"GapDuration", &DMREAD, DMT_UNINT, get_ServicesVoiceServiceCallLog_Dst_GapDuration, NULL, BBFDM_BOTH},
|
||||
{BBF_VENDOR_PREFIX"JBAvgDelay", &DMREAD, DMT_UNINT, get_ServicesVoiceServiceCallLog_Dst_JBAvgDelay, NULL, BBFDM_BOTH},
|
||||
{BBF_VENDOR_PREFIX"JBMaxDelay", &DMREAD, DMT_UNINT, get_ServicesVoiceServiceCallLog_Dst_JBMaxDelay, NULL, BBFDM_BOTH},
|
||||
{BBF_VENDOR_PREFIX"JBNomDelay", &DMREAD, DMT_UNINT, get_ServicesVoiceServiceCallLog_Dst_JBNomDelay, NULL, BBFDM_BOTH},
|
||||
{BBF_VENDOR_PREFIX"PeakJitter", &DMREAD, DMT_UNINT, get_ServicesVoiceServiceCallLog_Dst_PeakJitter, NULL, BBFDM_BOTH},
|
||||
{0}
|
||||
};
|
||||
|
|
@ -1,22 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2021 iopsys Software Solutions AB
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License version 2.1
|
||||
* as published by the Free Software Foundation
|
||||
*
|
||||
* Author Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||
* Author Grzegorz Sluja <grzegorz.sluja@iopsys.eu>
|
||||
*/
|
||||
|
||||
#ifndef __IOPSYS_VOICESERVICECALLLOG_H
|
||||
#define __IOPSYS_VOICESERVICECALLLOG_H
|
||||
|
||||
#include "libbbfdm-api/dmcommon.h"
|
||||
|
||||
extern DMLEAF tIOPSYS_VoiceServiceCallLogParams[];
|
||||
extern DMLEAF tIOPSYS_VoiceServiceCallLogSessionSourceRTPParams[];
|
||||
extern DMLEAF tIOPSYS_VoiceServiceCallLogSessionDestinationRTPParams[];
|
||||
|
||||
#endif //__IOPSYS_VOICESERVICECALLLOG_H
|
||||
|
||||
|
|
@ -1,64 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2021 Iopsys Software Solutions AB
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License version 2.1
|
||||
* as published by the Free Software Foundation
|
||||
*
|
||||
* Author: Vivek Dutta <vivek.dutta@iopsys.eu>
|
||||
*/
|
||||
|
||||
#include "servicesvoiceservicedect.h"
|
||||
|
||||
/*************************************************************
|
||||
* ENTRY METHOD
|
||||
**************************************************************/
|
||||
static int get_ServicesVoiceServiceDECTPortable_Name(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
char *ipui = dmjson_get_value((json_object *)data, 1, "ipui");
|
||||
char *id = dmjson_get_value((json_object *)data, 1, "id");
|
||||
|
||||
dmuci_get_option_value_string("dect", ipui, "name", value);
|
||||
if ((*value)[0] == '\0') {
|
||||
if (DM_STRLEN(id))
|
||||
dmasprintf(value, "DECT%s", id);
|
||||
else
|
||||
dmasprintf(value, "DECT%s", instance);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_ServicesVoiceServiceDECTPortable_Name(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
struct uci_section *s = NULL;
|
||||
char *ipui = NULL;
|
||||
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
if (dm_validate_string(value, -1, 64, NULL, NULL))
|
||||
return FAULT_9007;
|
||||
break;
|
||||
case VALUESET:
|
||||
ipui = dmjson_get_value((json_object *)data, 1, "ipui");
|
||||
if ((s = get_origin_section_from_config("dect", "handset", ipui)) == NULL) {
|
||||
dmuci_add_section("dect", "handset", &s);
|
||||
dmuci_rename_section_by_section(s, ipui);
|
||||
}
|
||||
|
||||
dmuci_set_value_by_section(s, "name", value);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**********************************************************************************************************************************
|
||||
* OBJ & PARAM DEFINITION
|
||||
***********************************************************************************************************************************/
|
||||
/* *** Device.Services.VoiceService.{i}.DECT.Portable.{i}. *** */
|
||||
DMLEAF tIOPSYS_VoiceServiceDECTPortableParams[] = {
|
||||
/* PARAM, permission, type, getvalue, setvalue, bbfdm_type*/
|
||||
{BBF_VENDOR_PREFIX"Name", &DMWRITE, DMT_STRING, get_ServicesVoiceServiceDECTPortable_Name, set_ServicesVoiceServiceDECTPortable_Name, BBFDM_BOTH},
|
||||
{0}
|
||||
};
|
||||
|
||||
|
|
@ -1,20 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2021 Iopsys Software Solutions AB
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License version 2.1
|
||||
* as published by the Free Software Foundation
|
||||
*
|
||||
* Author: Vivek Dutta <vivek.dutta@iopsys.eu>
|
||||
*/
|
||||
|
||||
#ifndef __SERVICESVOICESERVICEDECT_H
|
||||
#define __SERVICESVOICESERVICEDECT_H
|
||||
|
||||
#include "libbbfdm-api/dmcommon.h"
|
||||
|
||||
extern DMLEAF tIOPSYS_VoiceServiceDECTPortableParams[];
|
||||
|
||||
|
||||
#endif //__SERVICESVOICESERVICEDECT_H
|
||||
|
||||
13
libbbfdm/dmtree/vendor/iopsys/tr181/vendor.c
vendored
13
libbbfdm/dmtree/vendor/iopsys/tr181/vendor.c
vendored
|
|
@ -16,9 +16,6 @@
|
|||
#include "ip.h"
|
||||
#include "times.h"
|
||||
#include "wifi.h"
|
||||
#include "../tr104/servicesvoiceservicecallcontrol.h"
|
||||
#include "../tr104/servicesvoiceservicecalllog.h"
|
||||
#include "../tr104/servicesvoiceservicedect.h"
|
||||
#include "vendor.h"
|
||||
|
||||
DM_MAP_OBJ tVendorExtensionIOPSYS[] = {
|
||||
|
|
@ -28,11 +25,11 @@ DM_MAP_OBJ tVendorExtensionIOPSYS[] = {
|
|||
{"Device.Ethernet.", tIOPSYS_EthernetObj, NULL},
|
||||
{"Device.Time.", NULL, tIOPSYS_TimeParams},
|
||||
{"Device.Bridging.Bridge.{i}.Port.{i}.", NULL, tIOPSYS_BridgingBridgePortParams},
|
||||
{"Device.Services.VoiceService.{i}.CallLog.{i}.", NULL, tIOPSYS_VoiceServiceCallLogParams},
|
||||
{"Device.Services.VoiceService.{i}.CallLog.{i}.Session.{i}.Source.RTP.", NULL, tIOPSYS_VoiceServiceCallLogSessionSourceRTPParams},
|
||||
{"Device.Services.VoiceService.{i}.CallLog.{i}.Session.{i}.Destination.RTP.", NULL, tIOPSYS_VoiceServiceCallLogSessionDestinationRTPParams},
|
||||
{"Device.Services.VoiceService.{i}.DECT.Portable.{i}.", NULL, tIOPSYS_VoiceServiceDECTPortableParams},
|
||||
{"Device.Services.VoiceService.{i}.CallControl.Extension.{i}.", NULL, tIOPSYS_VoiceServiceCallControlExtensionParams},
|
||||
//{"Device.Services.VoiceService.{i}.CallLog.{i}.", NULL, tIOPSYS_VoiceServiceCallLogParams},
|
||||
//{"Device.Services.VoiceService.{i}.CallLog.{i}.Session.{i}.Source.RTP.", NULL, tIOPSYS_VoiceServiceCallLogSessionSourceRTPParams},
|
||||
//{"Device.Services.VoiceService.{i}.CallLog.{i}.Session.{i}.Destination.RTP.", NULL, tIOPSYS_VoiceServiceCallLogSessionDestinationRTPParams},
|
||||
//{"Device.Services.VoiceService.{i}.DECT.Portable.{i}.", NULL, tIOPSYS_VoiceServiceDECTPortableParams},
|
||||
//{"Device.Services.VoiceService.{i}.CallControl.Extension.{i}.", NULL, tIOPSYS_VoiceServiceCallControlExtensionParams},
|
||||
{"Device.WiFi.AccessPoint.{i}.", NULL, tIOPSYS_WiFiAccessPointParams},
|
||||
{0}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -13,12 +13,10 @@ CURRENT_PATH = os.getcwd()
|
|||
ROOT = None
|
||||
BBF_ERROR_CODE = 0
|
||||
BBF_TR181_ROOT_FILE = "device.c"
|
||||
BBF_TR104_ROOT_FILE = "servicesvoiceservice.c"
|
||||
BBF_VENDOR_ROOT_FILE = "vendor.c"
|
||||
BBF_VENDOR_PREFIX = "X_IOPSYS_EU_"
|
||||
BBF_DMTREE_PATH = CURRENT_PATH + "/../libbbfdm/dmtree"
|
||||
BBF_DMTREE_PATH_TR181 = BBF_DMTREE_PATH + "/tr181"
|
||||
BBF_DMTREE_PATH_TR104 = BBF_DMTREE_PATH + "/tr104"
|
||||
BBF_DMTREE_PATH_TR143 = BBF_DMTREE_PATH + "/tr143"
|
||||
BBF_DMTREE_PATH_TR471 = BBF_DMTREE_PATH + "/tr471"
|
||||
BBF_DMTREE_PATH_TR181_JSON = BBF_DMTREE_PATH + "/json/tr181.json"
|
||||
|
|
@ -26,8 +24,7 @@ BBF_DMTREE_PATH_TR104_JSON = BBF_DMTREE_PATH + "/json/tr104.json"
|
|||
DATA_MODEL_FILE = ".data_model.txt"
|
||||
ARRAY_JSON_FILES = {"tr181": BBF_DMTREE_PATH_TR181_JSON,
|
||||
"tr104": BBF_DMTREE_PATH_TR104_JSON}
|
||||
LIST_DM_DIR = [BBF_DMTREE_PATH_TR181,
|
||||
BBF_DMTREE_PATH_TR104, BBF_DMTREE_PATH_TR143, BBF_DMTREE_PATH_TR471]
|
||||
LIST_DM_DIR = [BBF_DMTREE_PATH_TR181, BBF_DMTREE_PATH_TR143, BBF_DMTREE_PATH_TR471]
|
||||
LIST_IGNORED_LINE = ['/*', '//', '#']
|
||||
LIST_OBJ = []
|
||||
LIST_PARAM = []
|
||||
|
|
@ -413,15 +410,12 @@ def generate_supported_dm(vendor_prefix=None, vendor_list=None, plugins=None):
|
|||
cd_dir(BBF_DMTREE_PATH_TR181)
|
||||
generate_datamodel_tree(BBF_TR181_ROOT_FILE)
|
||||
|
||||
cd_dir(BBF_DMTREE_PATH_TR104)
|
||||
generate_datamodel_tree(BBF_TR104_ROOT_FILE)
|
||||
|
||||
for DIR in LIST_DM_DIR:
|
||||
cd_dir(DIR)
|
||||
for _root, _dirs, files in os.walk("."):
|
||||
files.sort()
|
||||
for filename in files:
|
||||
if filename.endswith('.c') is False or filename == BBF_TR181_ROOT_FILE or filename == BBF_TR104_ROOT_FILE:
|
||||
if filename.endswith('.c') is False or filename == BBF_TR181_ROOT_FILE:
|
||||
continue
|
||||
|
||||
generate_datamodel_tree(filename)
|
||||
|
|
@ -448,20 +442,6 @@ def generate_supported_dm(vendor_prefix=None, vendor_list=None, plugins=None):
|
|||
|
||||
cd_dir(BBF_DMTREE_PATH)
|
||||
|
||||
vendor_dir = f'vendor/{vendor}/tr104'
|
||||
if os.path.isdir(vendor_dir):
|
||||
cd_dir(vendor_dir)
|
||||
|
||||
for _root, _dirs, files in os.walk("."):
|
||||
files.sort()
|
||||
for filename in files:
|
||||
if filename.endswith('.c') is False:
|
||||
continue
|
||||
|
||||
generate_datamodel_tree(filename)
|
||||
|
||||
cd_dir(BBF_DMTREE_PATH)
|
||||
|
||||
############## Download && Generate Plugins Data Models ##############
|
||||
global BBF_ERROR_CODE
|
||||
if plugins is not None and isinstance(plugins, list) and plugins:
|
||||
|
|
@ -514,7 +494,7 @@ def generate_supported_dm(vendor_prefix=None, vendor_list=None, plugins=None):
|
|||
|
||||
remove_folder(".repo")
|
||||
try:
|
||||
subprocess.run(["git", "clone", "--depth", "1", repo, ".repo"],
|
||||
subprocess.run(["git", "clone", repo, ".repo"],
|
||||
stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, check = True)
|
||||
except (OSError, subprocess.SubprocessError) as _e:
|
||||
print(f' Failed to clone {repo} !!!!!')
|
||||
|
|
|
|||
|
|
@ -11,7 +11,6 @@
|
|||
],
|
||||
"dm_json_files": [
|
||||
"../libbbfdm/dmtree/json/tr181.json",
|
||||
"../libbbfdm/dmtree/json/tr104.json",
|
||||
"../libbbfdm/dmtree/vendor/iopsys/vendor.json"
|
||||
],
|
||||
"vendor_prefix": "X_IOPSYS_EU_",
|
||||
|
|
@ -94,6 +93,26 @@
|
|||
"dm_files": [
|
||||
"src/cwmp_dm/datamodel.c"
|
||||
]
|
||||
},
|
||||
{
|
||||
"repo": "https://dev.iopsys.eu/voice/tr104.git",
|
||||
"proto": "git",
|
||||
"version": "devel",
|
||||
"dm_files": [
|
||||
"libdm/dmtree/servicesvoiceservice.c",
|
||||
"libdm/dmtree/servicesvoiceservicecallcontrol.c",
|
||||
"libdm/dmtree/servicesvoiceservicecalllog.c",
|
||||
"libdm/dmtree/servicesvoiceservicecapabilities.c",
|
||||
"libdm/dmtree/servicesvoiceservicecodecprofile.c",
|
||||
"libdm/dmtree/servicesvoiceservicedect.c",
|
||||
"libdm/dmtree/servicesvoiceservicepots.c",
|
||||
"libdm/dmtree/servicesvoiceservicereservedports.c",
|
||||
"libdm/dmtree/servicesvoiceservicesip.c",
|
||||
"libdm/dmtree/servicesvoiceservicevoipprofile.c",
|
||||
"libdm/dmtree/vendor_ext/servicesvoiceservicecallcontrol.c",
|
||||
"libdm/dmtree/vendor_ext/servicesvoiceservicecalllog.c",
|
||||
"libdm/dmtree/vendor_ext/servicesvoiceservicedect.c"
|
||||
]
|
||||
}
|
||||
],
|
||||
"output": {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue