mirror of
https://dev.iopsys.eu/bbf/icwmp.git
synced 2025-12-10 07:44:41 +01:00
T#7705: Code re-organise and improvements
This reverts commit cbfff1b644.
This commit is contained in:
parent
4c6065812b
commit
291e11d67a
68 changed files with 4179 additions and 4155 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -6,6 +6,7 @@
|
|||
*.xml
|
||||
*.so
|
||||
*.txt
|
||||
*.orig
|
||||
bin/*
|
||||
!bin/Makefile.am
|
||||
.prepared*
|
||||
|
|
|
|||
53
Makefile.am
53
Makefile.am
|
|
@ -5,32 +5,31 @@ CWMP_VERSION = 3.0.1
|
|||
bin_PROGRAMS = icwmpd
|
||||
|
||||
icwmpd_SOURCES = \
|
||||
./common.c \
|
||||
./log.c \
|
||||
./cwmp_uci.c \
|
||||
./config.c \
|
||||
./session.c \
|
||||
./backupSession.c \
|
||||
./digauth.c \
|
||||
./event.c \
|
||||
./http.c \
|
||||
./netlink.c \
|
||||
./ubus_utils.c \
|
||||
./datamodel_interface.c \
|
||||
./cwmp_cli.c \
|
||||
./notifications.c \
|
||||
./cwmp_zlib.c \
|
||||
./cwmp_du_state.c \
|
||||
./download.c \
|
||||
./upload.c \
|
||||
./sched_inform.c \
|
||||
./xml.c \
|
||||
./rpc_soap.c \
|
||||
./diagnostic.c \
|
||||
./reboot.c \
|
||||
./heartbeat.c \
|
||||
./cwmp.c \
|
||||
./ssl_utils.c
|
||||
./src/common.c \
|
||||
./src/log.c \
|
||||
./src/cwmp_uci.c \
|
||||
./src/config.c \
|
||||
./src/session.c \
|
||||
./src/backupSession.c \
|
||||
./src/digauth.c \
|
||||
./src/event.c \
|
||||
./src/http.c \
|
||||
./src/ubus_utils.c \
|
||||
./src/datamodel_interface.c \
|
||||
./src/cwmp_cli.c \
|
||||
./src/notifications.c \
|
||||
./src/cwmp_zlib.c \
|
||||
./src/cwmp_du_state.c \
|
||||
./src/download.c \
|
||||
./src/upload.c \
|
||||
./src/sched_inform.c \
|
||||
./src/xml.c \
|
||||
./src/rpc.c \
|
||||
./src/diagnostic.c \
|
||||
./src/reboot.c \
|
||||
./src/heartbeat.c \
|
||||
./src/cwmp.c \
|
||||
./src/ssl_utils.c
|
||||
|
||||
icwmpd_CFLAGS = \
|
||||
$(AM_CFLAGS) \
|
||||
|
|
@ -66,4 +65,4 @@ icwmpd_LDADD = \
|
|||
icwmpd_CFLAGS+=-DCWMP_VERSION=\"$(CWMP_VERSION)\"
|
||||
icwmpd_LDFLAGS+=-DCWMP_VERSION=\"$(CWMP_VERSION)\"
|
||||
|
||||
icwmpd_CFLAGS+=-I./inc
|
||||
icwmpd_CFLAGS+=-I..
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
AC_INIT([icwmp], [1.0], [dev@iopsys.eu])
|
||||
AM_INIT_AUTOMAKE
|
||||
AC_CONFIG_SRCDIR([cwmp.c])
|
||||
AC_CONFIG_SRCDIR([src/cwmp.c])
|
||||
|
||||
AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects])
|
||||
|
||||
|
|
|
|||
|
|
@ -8,6 +8,21 @@ pwd
|
|||
trap cleanup EXIT
|
||||
trap cleanup SIGINT
|
||||
|
||||
function check_valgrind_xml() {
|
||||
echo "Checking memory leaks..."
|
||||
grep -q "<kind>UninitCondition</kind>" memory-report.xml
|
||||
error_on_zero $?
|
||||
|
||||
grep -q "<kind>Leak_PossiblyLost</kind>" memory-report.xml
|
||||
error_on_zero $?
|
||||
|
||||
grep -q "<kind>Leak_DefinitelyLost</kind>" memory-report.xml
|
||||
error_on_zero $?
|
||||
|
||||
grep -q "<kind>Leak_StillReachable</kind>" memory-report.xml
|
||||
error_on_zero $?
|
||||
}
|
||||
|
||||
date +%s > timestamp.log
|
||||
echo "Compiling icmwp"
|
||||
build_icwmp
|
||||
|
|
@ -59,6 +74,11 @@ done
|
|||
echo "Stop all services"
|
||||
supervisorctl stop icwmpd
|
||||
|
||||
check_valgrind_xml
|
||||
|
||||
cp test/files/etc/config/users /etc/config/
|
||||
cp test/files/etc/config/wireless /etc/config/
|
||||
|
||||
echo "Verify Custom notifications"
|
||||
echo "#### Start custom_notifications ####" >> "$icwmp_master_log"
|
||||
if ./test/script/verify_custom_notifications.sh; then
|
||||
|
|
|
|||
|
|
@ -38,6 +38,7 @@ function exec_cmd()
|
|||
|
||||
function configure_genieacs()
|
||||
{
|
||||
start_acs
|
||||
sleep 10
|
||||
echo "create a new user"
|
||||
curl -X POST 'http://localhost:3000/init' -H "Content-Type: application/json" --data '{"users": true, "presets": true, "filters": true, "device": true, "index": true, "overview": true}' >/dev/null 2>&1
|
||||
|
|
|
|||
|
|
@ -1,17 +0,0 @@
|
|||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Copyright (C) 2013-2020 iopsys Software Solutions AB
|
||||
* Author Omar Kallel <omar.kallel@pivasoftware.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __ZLIB_H
|
||||
#define __ZLIB_H
|
||||
|
||||
int zlib_compress(char *message, unsigned char **zmsg, int *zlen, int type);
|
||||
|
||||
#endif
|
||||
|
|
@ -1,25 +0,0 @@
|
|||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Copyright (C) 2019 iopsys Software Solutions AB
|
||||
* Author: Imen Bhiri <imen.bhiri@pivasoftware.com>
|
||||
* Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||
*/
|
||||
|
||||
#ifndef __DIAGNOSTIC__H
|
||||
#define __DIAGNOSTIC__H
|
||||
|
||||
bool set_diagnostic_parameter_structure_value(char *parameter_name, char *value);
|
||||
|
||||
int cwmp_download_diagnostics();
|
||||
int cwmp_upload_diagnostics();
|
||||
int cwmp_ip_ping_diagnostics();
|
||||
int cwmp_nslookup_diagnostics();
|
||||
int cwmp_traceroute_diagnostics();
|
||||
int cwmp_udp_echo_diagnostics();
|
||||
int cwmp_serverselection_diagnostics();
|
||||
|
||||
#endif
|
||||
34
inc/http.h
34
inc/http.h
|
|
@ -1,34 +0,0 @@
|
|||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Copyright (C) 2011 Luka Perkov <freecwmp@lukaperkov.net>
|
||||
*/
|
||||
|
||||
#ifndef _FREECWMP_HTTP_H__
|
||||
#define _FREECWMP_HTTP_H__
|
||||
|
||||
#include "common.h"
|
||||
|
||||
extern char *fc_cookies;
|
||||
|
||||
#define HTTP_TIMEOUT 60
|
||||
|
||||
struct http_client {
|
||||
struct curl_slist *header_list;
|
||||
char *url;
|
||||
};
|
||||
|
||||
void http_set_timeout(void);
|
||||
|
||||
int http_client_init(struct cwmp *cwmp);
|
||||
void http_client_exit(void);
|
||||
int http_send_message(struct cwmp *cwmp, char *msg_out, int msg_out_len, char **msg_in);
|
||||
|
||||
void http_server_init(void);
|
||||
void http_server_listen(void);
|
||||
void http_success_cr(void);
|
||||
|
||||
#endif
|
||||
|
|
@ -1,19 +0,0 @@
|
|||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Copyright (C) 2013-2019 iopsys Software Solutions AB
|
||||
* Author Mohamed Kallel <mohamed.kallel@pivasoftware.com>
|
||||
* Author Anis Ellouze <anis.ellouze@pivasoftware.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _NETLINK_H__
|
||||
#define _NETLINK_H__
|
||||
|
||||
int netlink_init(void);
|
||||
int netlink_init_v6(void);
|
||||
|
||||
#endif
|
||||
19
inc/reboot.h
19
inc/reboot.h
|
|
@ -1,19 +0,0 @@
|
|||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Copyright (C) 2021 iopsys Software Solutions AB
|
||||
* Author Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||
*/
|
||||
|
||||
#ifndef _REBOOT_H__
|
||||
#define _REBOOT_H__
|
||||
|
||||
#include "common.h"
|
||||
|
||||
void launch_reboot_methods(struct cwmp *cwmp);
|
||||
|
||||
#endif //_REBOOT_H__
|
||||
|
||||
34
inc/xml.h
34
inc/xml.h
|
|
@ -1,34 +0,0 @@
|
|||
#ifndef __XML__H_
|
||||
#define __XML__H_
|
||||
|
||||
#include <xml_utils.h>
|
||||
#include "session.h"
|
||||
#include "common.h"
|
||||
|
||||
#define CWMP_MXML_TAB_SPACE " "
|
||||
#define MAX_SCHEDULE_INFORM_QUEUE 10
|
||||
|
||||
#define MXML_DELETE(X) \
|
||||
do { \
|
||||
if (X) { \
|
||||
mxmlDelete(X); \
|
||||
X = NULL; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
extern const char *cwmp_urls[];
|
||||
int xml_prepare_msg_out(struct session *session);
|
||||
int xml_prepare_lwnotification_message(char **msg_out);
|
||||
int xml_set_cwmp_id_rpc_cpe(struct session *session);
|
||||
int xml_recreate_namespace(mxml_node_t *tree);
|
||||
const char *whitespace_cb(mxml_node_t *node, int where);
|
||||
int xml_set_cwmp_id(struct session *session);
|
||||
int xml_send_message(struct cwmp *cwmp, struct session *session, struct rpc *rpc);
|
||||
mxml_node_t *mxmlFindElementOpaque(mxml_node_t *node, mxml_node_t *top, const char *text, int descend);
|
||||
char *xml__get_attribute_name_by_value(mxml_node_t *node, const char *value);
|
||||
char *xml_get_cwmp_version(int version);
|
||||
void xml_exit(void);
|
||||
void load_response_xml_schema(mxml_node_t **schema);
|
||||
void load_notification_xml_schema(mxml_node_t **tree);
|
||||
|
||||
#endif
|
||||
282
netlink.c
282
netlink.c
|
|
@ -1,282 +0,0 @@
|
|||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Copyright (C) 2013-2021 iopsys Software Solutions AB
|
||||
* Author Mohamed Kallel <mohamed.kallel@pivasoftware.com>
|
||||
* Author Ahmed Zribi <ahmed.zribi@pivasoftware.com>
|
||||
* Copyright (C) 2011-2012 Luka Perkov <freecwmp@lukaperkov.net>
|
||||
*
|
||||
*/
|
||||
|
||||
#include <netinet/in.h>
|
||||
#include <net/if.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <linux/rtnetlink.h>
|
||||
#include <linux/netlink.h>
|
||||
#include <stddef.h>
|
||||
#include <libubox/uloop.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "netlink.h"
|
||||
#include "cwmp_uci.h"
|
||||
#include "log.h"
|
||||
#include "event.h"
|
||||
|
||||
static int itfcmp(char *itf1, char *itf2);
|
||||
static void netlink_new_msg(struct uloop_fd *ufd, unsigned events);
|
||||
static struct uloop_fd netlink_event = {.cb = netlink_new_msg };
|
||||
static struct uloop_fd netlink_event_v6 = {.cb = netlink_new_msg };
|
||||
|
||||
static int itfcmp(char *itf1, char *itf2)
|
||||
{
|
||||
int index = 0;
|
||||
int status = 1;
|
||||
char *str = NULL;
|
||||
char *buf1 = NULL;
|
||||
char *buf2 = NULL;
|
||||
|
||||
if (itf1 == NULL || itf2 == NULL)
|
||||
return status;
|
||||
|
||||
if (itf1[0] == '\0')
|
||||
goto end;
|
||||
str = strchr(itf1, '.');
|
||||
if (str == NULL)
|
||||
goto end;
|
||||
index = (int)(str - itf1);
|
||||
if (!index)
|
||||
goto end;
|
||||
|
||||
buf1 = malloc(index);
|
||||
if (!buf1)
|
||||
goto end;
|
||||
|
||||
strncpy(buf1, itf1, index);
|
||||
buf1[index] = '\0';
|
||||
if (itf2[0] == '\0')
|
||||
goto end;
|
||||
|
||||
str = strchr(itf2, '.');
|
||||
if (str == NULL)
|
||||
goto end;
|
||||
|
||||
index = (int)(str - itf2);
|
||||
if (!index)
|
||||
goto end;
|
||||
|
||||
buf2 = malloc(index);
|
||||
if (!buf2)
|
||||
goto end;
|
||||
|
||||
strncpy(buf2, itf1, index);
|
||||
buf2[index] = '\0';
|
||||
|
||||
if (strcmp(buf1, buf2) == 0)
|
||||
status = 0;
|
||||
end:
|
||||
if (buf1)
|
||||
free(buf1);
|
||||
if (buf2)
|
||||
free(buf2);
|
||||
return status;
|
||||
}
|
||||
|
||||
static void freecwmp_netlink_interface(struct nlmsghdr *nlh)
|
||||
{
|
||||
struct ifaddrmsg *ifa = (struct ifaddrmsg *)NLMSG_DATA(nlh);
|
||||
struct rtattr *rth = IFA_RTA(ifa);
|
||||
int rtl = IFA_PAYLOAD(nlh);
|
||||
char if_name[IFNAMSIZ], if_addr[INET_ADDRSTRLEN];
|
||||
|
||||
memset(&if_name, 0, sizeof(if_name));
|
||||
memset(&if_addr, 0, sizeof(if_addr));
|
||||
|
||||
if (ifa->ifa_family == AF_INET) { //CASE IPv4
|
||||
while (rtl && RTA_OK(rth, rtl)) {
|
||||
if (rth->rta_type != IFA_LOCAL) {
|
||||
rth = RTA_NEXT(rth, rtl);
|
||||
continue;
|
||||
}
|
||||
|
||||
uint32_t addr = htonl(*(uint32_t *)RTA_DATA(rth));
|
||||
if (htonl(13) == 13) {
|
||||
// running on big endian system
|
||||
} else {
|
||||
// running on little endian system
|
||||
addr = __builtin_bswap32(addr);
|
||||
}
|
||||
|
||||
if_indextoname(ifa->ifa_index, if_name);
|
||||
if (itfcmp(cwmp_main.conf.interface, if_name)) {
|
||||
rth = RTA_NEXT(rth, rtl);
|
||||
continue;
|
||||
}
|
||||
|
||||
inet_ntop(AF_INET, &(addr), if_addr, INET_ADDRSTRLEN);
|
||||
|
||||
FREE(cwmp_main.conf.ip);
|
||||
cwmp_main.conf.ip = strdup(if_addr);
|
||||
cwmp_uci_set_varstate_value("cwmp", "cpe", "ip", cwmp_main.conf.ip);
|
||||
cwmp_commit_package("cwmp", UCI_VARSTATE_CONFIG);
|
||||
connection_request_ip_value_change(&cwmp_main, IPv4);
|
||||
break;
|
||||
}
|
||||
} else { //CASE IPv6
|
||||
while (rtl && RTA_OK(rth, rtl)) {
|
||||
char pradd_v6[128];
|
||||
if (rth->rta_type != IFA_ADDRESS || ifa->ifa_scope == RT_SCOPE_LINK) {
|
||||
rth = RTA_NEXT(rth, rtl);
|
||||
continue;
|
||||
}
|
||||
inet_ntop(AF_INET6, RTA_DATA(rth), pradd_v6, sizeof(pradd_v6));
|
||||
if_indextoname(ifa->ifa_index, if_name);
|
||||
if (strncmp(cwmp_main.conf.interface, if_name, IFNAMSIZ)) {
|
||||
rth = RTA_NEXT(rth, rtl);
|
||||
continue;
|
||||
}
|
||||
|
||||
FREE(cwmp_main.conf.ipv6);
|
||||
cwmp_main.conf.ipv6 = strdup(pradd_v6);
|
||||
cwmp_uci_set_varstate_value("cwmp", "cpe", "ipv6", cwmp_main.conf.ip);
|
||||
cwmp_commit_package("cwmp", UCI_VARSTATE_CONFIG);
|
||||
connection_request_ip_value_change(&cwmp_main, IPv6);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void netlink_new_msg(struct uloop_fd *ufd, unsigned events __attribute__((unused)))
|
||||
{
|
||||
struct nlmsghdr *nlh;
|
||||
char buffer[BUFSIZ];
|
||||
size_t msg_size;
|
||||
|
||||
memset(&buffer, 0, sizeof(buffer));
|
||||
|
||||
nlh = (struct nlmsghdr *)buffer;
|
||||
if ((int)(msg_size = recv(ufd->fd, nlh, BUFSIZ, 0)) == -1) {
|
||||
CWMP_LOG(ERROR, "error receiving netlink message");
|
||||
return;
|
||||
}
|
||||
|
||||
while ((size_t)msg_size > sizeof(*nlh)) {
|
||||
int len = nlh->nlmsg_len;
|
||||
int req_len = len - sizeof(*nlh);
|
||||
|
||||
if (req_len < 0 || (size_t)len > msg_size) {
|
||||
CWMP_LOG(ERROR, "error reading netlink message");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!NLMSG_OK(nlh, msg_size)) {
|
||||
CWMP_LOG(ERROR, "netlink message is not NLMSG_OK");
|
||||
return;
|
||||
}
|
||||
|
||||
if (nlh->nlmsg_type == RTM_NEWADDR)
|
||||
freecwmp_netlink_interface(nlh);
|
||||
|
||||
msg_size -= NLMSG_ALIGN(len);
|
||||
nlh = (struct nlmsghdr *)((char *)nlh + NLMSG_ALIGN(len));
|
||||
}
|
||||
}
|
||||
|
||||
int netlink_init_v6(void)
|
||||
{
|
||||
struct {
|
||||
struct nlmsghdr hdr;
|
||||
struct ifaddrmsg msg;
|
||||
} req;
|
||||
struct sockaddr_nl addr;
|
||||
int sock[2];
|
||||
|
||||
memset(&addr, 0, sizeof(addr));
|
||||
memset(&req, 0, sizeof(req));
|
||||
|
||||
if ((sock[0] = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE)) == -1) {
|
||||
CWMP_LOG(ERROR, "couldn't open NETLINK_ROUTE socket");
|
||||
return -1;
|
||||
}
|
||||
|
||||
addr.nl_family = AF_NETLINK;
|
||||
addr.nl_groups = RTMGRP_IPV6_IFADDR;
|
||||
if ((bind(sock[0], (struct sockaddr *)&addr, sizeof(addr))) == -1) {
|
||||
CWMP_LOG(ERROR, "couldn't bind netlink socket");
|
||||
return -1;
|
||||
}
|
||||
|
||||
netlink_event_v6.fd = sock[0];
|
||||
uloop_fd_add(&netlink_event_v6, ULOOP_READ | ULOOP_EDGE_TRIGGER);
|
||||
|
||||
if ((sock[1] = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE)) == -1) {
|
||||
CWMP_LOG(ERROR, "couldn't open NETLINK_ROUTE socket");
|
||||
return -1;
|
||||
}
|
||||
|
||||
req.hdr.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifaddrmsg));
|
||||
req.hdr.nlmsg_flags = NLM_F_REQUEST | NLM_F_ROOT;
|
||||
req.hdr.nlmsg_type = RTM_GETADDR;
|
||||
req.msg.ifa_family = AF_INET6;
|
||||
|
||||
if ((send(sock[1], &req, req.hdr.nlmsg_len, 0)) == -1) {
|
||||
CWMP_LOG(ERROR, "couldn't send netlink socket");
|
||||
return -1;
|
||||
}
|
||||
|
||||
struct uloop_fd dummy_event = {.fd = sock[1] };
|
||||
netlink_new_msg(&dummy_event, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int netlink_init(void)
|
||||
{
|
||||
struct {
|
||||
struct nlmsghdr hdr;
|
||||
struct ifaddrmsg msg;
|
||||
} req;
|
||||
struct sockaddr_nl addr;
|
||||
int sock[2];
|
||||
|
||||
memset(&addr, 0, sizeof(addr));
|
||||
memset(&req, 0, sizeof(req));
|
||||
|
||||
if ((sock[0] = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE)) == -1) {
|
||||
CWMP_LOG(ERROR, "couldn't open NETLINK_ROUTE socket");
|
||||
return -1;
|
||||
}
|
||||
|
||||
addr.nl_family = AF_NETLINK;
|
||||
addr.nl_groups = RTMGRP_IPV4_IFADDR;
|
||||
if ((bind(sock[0], (struct sockaddr *)&addr, sizeof(addr))) == -1) {
|
||||
CWMP_LOG(ERROR, "couldn't bind netlink socket");
|
||||
return -1;
|
||||
}
|
||||
|
||||
netlink_event.fd = sock[0];
|
||||
uloop_fd_add(&netlink_event, ULOOP_READ | ULOOP_EDGE_TRIGGER);
|
||||
|
||||
if ((sock[1] = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE)) == -1) {
|
||||
CWMP_LOG(ERROR, "couldn't open NETLINK_ROUTE socket");
|
||||
return -1;
|
||||
}
|
||||
|
||||
req.hdr.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifaddrmsg));
|
||||
req.hdr.nlmsg_flags = NLM_F_REQUEST | NLM_F_ROOT;
|
||||
req.hdr.nlmsg_type = RTM_GETADDR;
|
||||
req.msg.ifa_family = AF_INET;
|
||||
|
||||
if ((send(sock[1], &req, req.hdr.nlmsg_len, 0)) == -1) {
|
||||
CWMP_LOG(ERROR, "couldn't send netlink socket");
|
||||
return -1;
|
||||
}
|
||||
|
||||
struct uloop_fd dummy_event = {.fd = sock[1] };
|
||||
netlink_new_msg(&dummy_event, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
2852
rpc_soap.c
2852
rpc_soap.c
File diff suppressed because it is too large
Load diff
|
|
@ -1,13 +1,14 @@
|
|||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* backupSession.c - API to store/load CWMP session in/from backup XML files
|
||||
*
|
||||
* Copyright (C) 2021-2022, IOPSYS Software Solutions AB.
|
||||
*
|
||||
* Copyright (C) 2013-2021 iopsys Software Solutions AB
|
||||
* Author Mohamed Kallel <mohamed.kallel@pivasoftware.com>
|
||||
* Author Ahmed Zribi <ahmed.zribi@pivasoftware.com>
|
||||
* Author Omar Kallel <omar.kallel@pivasoftware.com>
|
||||
*
|
||||
* See LICENSE file for license related information.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <unistd.h>
|
||||
|
|
@ -521,7 +522,7 @@ void bkp_session_delete_apply_schedule_download(struct apply_schedule_download *
|
|||
|
||||
void bkp_session_insert_change_du_state(struct change_du_state *pchange_du_state)
|
||||
{
|
||||
struct operations *p;
|
||||
struct operations *p = NULL;
|
||||
char schedule_time[128];
|
||||
mxml_node_t *b, *n;
|
||||
|
||||
|
|
@ -662,7 +663,7 @@ void bkp_session_delete_upload(struct upload *pupload)
|
|||
void bkp_session_insert_du_state_change_complete(struct du_state_change_complete *pdu_state_change_complete)
|
||||
{
|
||||
char schedule_time[128], resolved[8], fault_code[8];
|
||||
struct opresult *p;
|
||||
struct opresult *p = NULL;
|
||||
mxml_node_t *b;
|
||||
|
||||
pthread_mutex_lock(&mutex_backup_session);
|
||||
|
|
@ -802,6 +803,10 @@ void load_queue_event(mxml_node_t *tree, struct cwmp *cwmp)
|
|||
const char *element = mxmlGetElement(b);
|
||||
|
||||
if (strcmp(element, "command_key") == 0) {
|
||||
// cppcheck-suppress knownConditionTrueFalse
|
||||
/*
|
||||
* idx value can be modified when loading the backup with the function load_specific_backup_attributes
|
||||
*/
|
||||
if (idx != -1) {
|
||||
if (EVENT_CONST[idx].RETRY & EVENT_RETRY_AFTER_REBOOT) {
|
||||
event_container_save = cwmp_add_event_container(cwmp, idx, ((command_key != NULL) ? command_key : ""));
|
||||
|
|
@ -1,19 +1,20 @@
|
|||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* backupSession.h - API to store/load CWMP session in/from backup XML files
|
||||
*
|
||||
* Copyright (C) 2021-2022, IOPSYS Software Solutions AB.
|
||||
*
|
||||
* Copyright (C) 2013-2020 iopsys Software Solutions AB
|
||||
* Author Mohamed Kallel <mohamed.kallel@pivasoftware.com>
|
||||
* Author Ahmed Zribi <ahmed.zribi@pivasoftware.com>
|
||||
* Author Omar Kallel <omar.kallel@pivasoftware.com>
|
||||
*
|
||||
* See LICENSE file for license related information.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _BACKUPSESSION_H__
|
||||
#define _BACKUPSESSION_H__
|
||||
|
||||
#include <xml_utils.h>
|
||||
#include "xml_utils.h"
|
||||
#include "common.h"
|
||||
|
||||
#define RPC_NO_STATUS -1
|
||||
|
|
@ -1,12 +1,12 @@
|
|||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* common.c - Some commun functions used by the application
|
||||
*
|
||||
* Copyright (C) 2021-2022, IOPSYS Software Solutions AB.
|
||||
*
|
||||
* Copyright (C) 2013-2021 iopsys Software Solutions AB
|
||||
* Author Omar Kallel <omar.kallel@pivasoftware.com>
|
||||
*
|
||||
* See LICENSE file for license related information.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <fcntl.h>
|
||||
|
|
@ -165,6 +165,7 @@ void add_dm_parameter_to_list(struct list_head *head, char *param_name, char *pa
|
|||
dm_parameter->value = strdup(param_val);
|
||||
|
||||
dm_parameter->type = strdup(param_type ? param_type : "xsd:string");
|
||||
dm_parameter->access_list = strdup("");
|
||||
dm_parameter->notification = notification;
|
||||
dm_parameter->writable = writable;
|
||||
}
|
||||
|
|
@ -175,6 +176,7 @@ void delete_dm_parameter_from_list(struct cwmp_dm_parameter *dm_parameter)
|
|||
free(dm_parameter->name);
|
||||
free(dm_parameter->value);
|
||||
free(dm_parameter->type);
|
||||
free(dm_parameter->access_list);
|
||||
free(dm_parameter);
|
||||
}
|
||||
|
||||
|
|
@ -1,13 +1,14 @@
|
|||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* common.h - Some commun functions used by the application
|
||||
*
|
||||
* Copyright (C) 2021-2022, IOPSYS Software Solutions AB.
|
||||
*
|
||||
* Copyright (C) 2013-2020 iopsys Software Solutions AB
|
||||
* Author Omar Kallel <omar.kallel@pivasoftware.com>
|
||||
*
|
||||
* See LICENSE file for license related information.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __CCOMMON_H
|
||||
#define __CCOMMON_H
|
||||
|
||||
|
|
@ -216,6 +217,7 @@ struct cwmp_dm_parameter {
|
|||
char *name;
|
||||
char *value;
|
||||
char *type;
|
||||
char *access_list;
|
||||
int notification;
|
||||
bool writable;
|
||||
bool forced_notification_param;
|
||||
|
|
@ -1,14 +1,16 @@
|
|||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* config.c - load/store icwmp application configuration
|
||||
*
|
||||
* Copyright (C) 2021-2022, IOPSYS Software Solutions AB.
|
||||
*
|
||||
* Copyright (C) 2013-2021 iopsys Software Solutions AB
|
||||
* Author Mohamed Kallel <mohamed.kallel@pivasoftware.com>
|
||||
* Author Ahmed Zribi <ahmed.zribi@pivasoftware.com>
|
||||
* Author Omar Kallel <omar.kallel@pivasoftware.com>
|
||||
*
|
||||
* See LICENSE file for license related information.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
|
|
@ -1,13 +1,13 @@
|
|||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* config.h - load/store icwmp application configuration
|
||||
*
|
||||
* Copyright (C) 2013-2019 iopsys Software Solutions AB
|
||||
* Author Mohamed Kallel <mohamed.kallel@pivasoftware.com>
|
||||
* Copyright (C) 2021-2022, IOPSYS Software Solutions AB.
|
||||
*
|
||||
* Author Omar Kallel <omar.kallel@pivasoftware.com>
|
||||
* Author Anis Ellouze <anis.ellouze@pivasoftware.com>
|
||||
*
|
||||
* See LICENSE file for license related information.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _CONFIG_H__
|
||||
|
|
@ -1,13 +1,14 @@
|
|||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* cwmp.c - icwmp Main file
|
||||
*
|
||||
* Copyright (C) 2021-2022, IOPSYS Software Solutions AB.
|
||||
*
|
||||
* Copyright (C) 2013-2021 iopsys Software Solutions AB
|
||||
* Author Mohamed Kallel <mohamed.kallel@pivasoftware.com>
|
||||
* Author Ahmed Zribi <ahmed.zribi@pivasoftware.com>
|
||||
* Author Omar Kallel <omar.kallel@pivasoftware.com>
|
||||
*
|
||||
* See LICENSE file for license related information.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <math.h>
|
||||
|
|
@ -28,7 +29,7 @@
|
|||
#include "session.h"
|
||||
#include "diagnostic.h"
|
||||
#include "http.h"
|
||||
#include "rpc_soap.h"
|
||||
#include "rpc.h"
|
||||
#include "config.h"
|
||||
#include "backupSession.h"
|
||||
#include "ubus_utils.h"
|
||||
|
|
@ -39,7 +40,6 @@
|
|||
#include "datamodel_interface.h"
|
||||
#include "cwmp_du_state.h"
|
||||
#include "heartbeat.h"
|
||||
#include "netlink.h"
|
||||
|
||||
static pthread_t periodic_event_thread;
|
||||
static pthread_t scheduleInform_thread;
|
||||
|
|
@ -230,7 +230,7 @@ int cwmp_schedule_rpc(struct cwmp *cwmp, struct session *session)
|
|||
struct list_head *ilist;
|
||||
struct rpc *rpc_acs, *rpc_cpe;
|
||||
|
||||
if (http_client_init(cwmp) || thread_end) {
|
||||
if (icwmp_http_client_init(cwmp) || thread_end) {
|
||||
CWMP_LOG(INFO, "Initializing http client failed");
|
||||
goto retry;
|
||||
}
|
||||
|
|
@ -327,7 +327,7 @@ retry:
|
|||
end:
|
||||
MXML_DELETE(session->tree_in);
|
||||
MXML_DELETE(session->tree_out);
|
||||
http_client_exit();
|
||||
icwmp_http_client_exit();
|
||||
xml_exit();
|
||||
return session->error;
|
||||
}
|
||||
|
|
@ -571,16 +571,6 @@ static void *thread_uloop_run(void *v __attribute__((unused)))
|
|||
{
|
||||
uloop_init();
|
||||
|
||||
if (netlink_init()) {
|
||||
CWMP_LOG(ERROR, "netlink initialization failed");
|
||||
}
|
||||
|
||||
if (cwmp_main.conf.ipv6_enable) {
|
||||
if (netlink_init_v6()) {
|
||||
CWMP_LOG(ERROR, "netlink initialization failed");
|
||||
}
|
||||
}
|
||||
|
||||
ctx = ubus_connect(cwmp_main.conf.ubus_socket);
|
||||
if (!ctx)
|
||||
return NULL;
|
||||
|
|
@ -603,7 +593,7 @@ static void *thread_uloop_run(void *v __attribute__((unused)))
|
|||
|
||||
static void *thread_http_cr_server_listen(void *v __attribute__((unused)))
|
||||
{
|
||||
http_server_listen();
|
||||
icwmp_http_server_listen();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
@ -830,6 +820,7 @@ end:
|
|||
static int cwmp_init(struct cwmp *cwmp)
|
||||
{
|
||||
int error;
|
||||
|
||||
icwmp_init_list_services();
|
||||
cwmp->event_id = 0;
|
||||
cwmp->cwmp_period = 0;
|
||||
|
|
@ -1011,7 +1002,7 @@ int main(int argc, char **argv)
|
|||
return error;
|
||||
|
||||
configure_var_state(&cwmp_main);
|
||||
http_server_init();
|
||||
icwmp_http_server_init();
|
||||
|
||||
memset(&act, 0, sizeof(act));
|
||||
act.sa_handler = icwmp_signal_handler;
|
||||
|
|
@ -1,11 +1,12 @@
|
|||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* cwmp_cli.c - icwmp CLI
|
||||
*
|
||||
* Copyright (C) 2021-2022, IOPSYS Software Solutions AB.
|
||||
*
|
||||
* Copyright (C) 2013-2021 iopsys Software Solutions AB
|
||||
* Author Omar Kallel <omar.kallel@pivasoftware.com>
|
||||
*
|
||||
* See LICENSE file for license related information.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
|
|
@ -64,7 +65,7 @@ void display_get_cmd_result(struct cmd_input in __attribute__((unused)), union c
|
|||
fprintf(stderr, "Fault %s: %s\n", fault, get_fault_message_by_fault_code(fault));
|
||||
return;
|
||||
}
|
||||
struct cwmp_dm_parameter *param_value;
|
||||
struct cwmp_dm_parameter *param_value = NULL;
|
||||
list_for_each_entry (param_value, res.param_list, list) {
|
||||
fprintf(stdout, "%s => %s\n", param_value->name, param_value->value);
|
||||
}
|
||||
|
|
@ -89,7 +90,7 @@ char *cmd_set_exec_func(struct cmd_input in, union cmd_result *res __attribute__
|
|||
int fault_idx = cwmp_set_multiple_parameters_values(&list_set_param_value, "set_key", &flag, &faults_list);
|
||||
cwmp_free_all_dm_parameter_list(&list_set_param_value);
|
||||
if (fault_idx != FAULT_CPE_NO_FAULT) {
|
||||
struct cwmp_param_fault *param_fault;
|
||||
struct cwmp_param_fault *param_fault = NULL;
|
||||
char fault[5] = {0};
|
||||
list_for_each_entry (param_fault, &faults_list, list) {
|
||||
snprintf(fault, sizeof(fault), "%d", param_fault->fault);
|
||||
|
|
@ -204,7 +205,7 @@ void display_get_notif_cmd_result(struct cmd_input in __attribute__((unused)), u
|
|||
fprintf(stderr, "Fault %s: %s\n", fault, get_fault_message_by_fault_code(fault));
|
||||
return;
|
||||
}
|
||||
struct cwmp_dm_parameter *param_value;
|
||||
struct cwmp_dm_parameter *param_value = NULL;
|
||||
list_for_each_entry (param_value, res.param_list, list) {
|
||||
fprintf(stdout, "%s => %s\n", param_value->name, param_value->notification == 2 ? "active" : param_value->notification == 1 ? "passive" : "off");
|
||||
}
|
||||
|
|
@ -266,7 +267,7 @@ void display_get_names_cmd_result(struct cmd_input in __attribute__((unused)), u
|
|||
fprintf(stderr, "Fault %s: %s\n", fault, get_fault_message_by_fault_code(fault));
|
||||
return;
|
||||
}
|
||||
struct cwmp_dm_parameter *param_value;
|
||||
struct cwmp_dm_parameter *param_value = NULL;
|
||||
list_for_each_entry (param_value, res.param_list, list) {
|
||||
fprintf(stdout, "%s => %s\n", param_value->name, param_value->writable ? "writable" : "not-writable");
|
||||
}
|
||||
|
|
@ -1,3 +1,14 @@
|
|||
/*
|
||||
* cwmp_cli.h - icwmp CLI
|
||||
*
|
||||
* Copyright (C) 2021-2022, IOPSYS Software Solutions AB.
|
||||
*
|
||||
* Author Omar Kallel <omar.kallel@pivasoftware.com>
|
||||
*
|
||||
* See LICENSE file for license related information.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef CWMP_CLI
|
||||
#define CWMP_CLI
|
||||
|
||||
|
|
@ -1,11 +1,12 @@
|
|||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* cwmp-du_state.c - ChangeDUState method corresponding functions
|
||||
*
|
||||
* Copyright (C) 2021-2022, IOPSYS Software Solutions AB.
|
||||
*
|
||||
* Copyright (C) 2013-2021 iopsys Software Solutions AB
|
||||
* Author Omar Kallel <omar.kallel@pivasoftware.com>
|
||||
*
|
||||
* See LICENSE file for license related information.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <libubox/blobmsg_json.h>
|
||||
|
|
@ -156,7 +157,7 @@ static int get_deployment_unit_name_version(char *uuid, char **name, char **vers
|
|||
snprintf(name_param, sizeof(name_param), "Device.SoftwareModules.DeploymentUnit.%s.Name", sw_by_uuid_instance);
|
||||
snprintf(version_param, sizeof(version_param), "Device.SoftwareModules.DeploymentUnit.%s.Version", sw_by_uuid_instance);
|
||||
snprintf(environment_param, sizeof(environment_param), "Device.SoftwareModules.DeploymentUnit.%s.ExecutionEnvRef", sw_by_uuid_instance);
|
||||
struct cwmp_dm_parameter *param_value;
|
||||
struct cwmp_dm_parameter *param_value = NULL;
|
||||
list_for_each_entry (param_value, &sw_parameters, list) {
|
||||
if (strcmp(param_value->name, name_param) == 0) {
|
||||
*name = strdup(param_value->value);
|
||||
|
|
@ -218,7 +219,7 @@ static char *get_exec_env_name(char *environment_path)
|
|||
if (err)
|
||||
return strdup("");
|
||||
|
||||
struct cwmp_dm_parameter *param_value;
|
||||
struct cwmp_dm_parameter *param_value = NULL;
|
||||
snprintf(env_param, sizeof(env_param), "%sName", environment_path);
|
||||
list_for_each_entry (param_value, &environment_list, list) {
|
||||
if (strcmp(param_value->name, env_param) == 0) {
|
||||
|
|
@ -1,11 +1,12 @@
|
|||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* cwmp-du_state.h - ChangeDUState method corresponding functions
|
||||
*
|
||||
* Copyright (C) 2021-2022, IOPSYS Software Solutions AB.
|
||||
*
|
||||
* Copyright (C) 2013-2021 iopsys Software Solutions AB
|
||||
* Author Omar Kallel <omar.kallel@pivasoftware.com>
|
||||
*
|
||||
* See LICENSE file for license related information.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef CWMP_DU_STATE_H
|
||||
|
|
@ -1,12 +1,14 @@
|
|||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* cwmp_uci.c - API to manage UCI packages/sections/options
|
||||
*
|
||||
* Copyright (C) 2021-2022, IOPSYS Software Solutions AB.
|
||||
*
|
||||
* Copyright (C) 2013-2021 iopsys Software Solutions AB
|
||||
* Author Omar Kallel <omar.kallel@pivasoftware.com>
|
||||
*
|
||||
* See LICENSE file for license related information.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <ctype.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
|
@ -1,14 +1,15 @@
|
|||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* cwmp_uci.h - API to manage UCI packages/sections/options
|
||||
*
|
||||
* Copyright (C) 2021-2022, IOPSYS Software Solutions AB.
|
||||
*
|
||||
* Copyright (C) 2013-2020 iopsys Software Solutions AB
|
||||
* Author Omar Kallel <omar.kallel@pivasoftware.com>
|
||||
*
|
||||
* See LICENSE file for license related information.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __CWMPUCI_H
|
||||
#define __CWMPUCI_H
|
||||
|
||||
|
|
@ -1,11 +1,12 @@
|
|||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* cwmp_zlib.c - ZLIB compresssion of CWMP messages
|
||||
*
|
||||
* Copyright (C) 2021-2022, IOPSYS Software Solutions AB.
|
||||
*
|
||||
* Copyright (C) 2014-2021 iopsys Software Solutions AB
|
||||
* Author Mohamed Kallel <mohamed.kallel@pivasoftware.com>
|
||||
*
|
||||
* See LICENSE file for license related information.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <zlib.h>
|
||||
17
src/cwmp_zlib.h
Normal file
17
src/cwmp_zlib.h
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
/*
|
||||
* cwmp_zlib.h - ZLIB compresssion of CWMP messages
|
||||
*
|
||||
* Copyright (C) 2021-2022, IOPSYS Software Solutions AB.
|
||||
*
|
||||
* Author Mohamed Kallel <mohamed.kallel@pivasoftware.com>
|
||||
*
|
||||
* See LICENSE file for license related information.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __ZLIB_H
|
||||
#define __ZLIB_H
|
||||
|
||||
int zlib_compress(char *message, unsigned char **zmsg, int *zlen, int type);
|
||||
|
||||
#endif
|
||||
|
|
@ -1,11 +1,12 @@
|
|||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* datamodel_interface.c - API to call BBF datamodel functions (set, get, add, delete, setattributes, getattributes, getnames, ...)
|
||||
*
|
||||
* Copyright (C) 2021-2022, IOPSYS Software Solutions AB.
|
||||
*
|
||||
* Copyright (C) 2013-2021 iopsys Software Solutions AB
|
||||
* Author Omar Kallel <omar.kallel@pivasoftware.com>
|
||||
*
|
||||
* See LICENSE file for license related information.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <libubox/blobmsg_json.h>
|
||||
|
|
@ -440,7 +441,7 @@ char *cwmp_get_multiple_parameters_values(struct list_head *arg_params_list, str
|
|||
{
|
||||
int e;
|
||||
struct cwmp *cwmp = &cwmp_main;
|
||||
struct cwmp_dm_parameter *param_value;
|
||||
struct cwmp_dm_parameter *param_value = NULL;
|
||||
struct list_params_result get_result = { .parameters_list = parameters_list };
|
||||
struct blob_buf b = { 0 };
|
||||
|
||||
|
|
@ -536,7 +537,7 @@ void ubus_setm_values_callback(struct ubus_request *req, int type __attribute__(
|
|||
int cwmp_set_multiple_parameters_values(struct list_head *parameters_values_list, char *parameter_key, int *flag, struct list_head *faults_list)
|
||||
{
|
||||
int e;
|
||||
struct cwmp_dm_parameter *param_value;
|
||||
struct cwmp_dm_parameter *param_value = NULL;
|
||||
struct setm_values_res set_result = { .flag = flag, .faults_list = faults_list };
|
||||
struct cwmp *cwmp = &cwmp_main;
|
||||
struct blob_buf b = { 0 };
|
||||
|
|
@ -1,3 +1,14 @@
|
|||
/*
|
||||
* datamodel_interface.h - API to call BBF datamodel functions (set, get, add, delete, setattributes, getattributes, getnames, ...)
|
||||
*
|
||||
* Copyright (C) 2021-2022, IOPSYS Software Solutions AB.
|
||||
*
|
||||
* Author Omar Kallel <omar.kallel@pivasoftware.com>
|
||||
*
|
||||
* See LICENSE file for license related information.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef SRC_DATAMODELIFACE_H_
|
||||
#define SRC_DATAMODELIFACE_H_
|
||||
|
||||
|
|
@ -1,14 +1,16 @@
|
|||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* diagnostic.c - Manage Diagnostics parameters from icwmp
|
||||
*
|
||||
* Copyright (C) 2021-2022, IOPSYS Software Solutions AB.
|
||||
*
|
||||
* Copyright (C) 2021 iopsys Software Solutions AB
|
||||
* Author Imen Bhiri <imen.bhiri@pivasoftware.com>
|
||||
* Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||
* Author: Omar Kallel <omar.kallel@pivasoftware.com>
|
||||
*
|
||||
* See LICENSE file for license related information.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "common.h"
|
||||
27
src/diagnostic.h
Normal file
27
src/diagnostic.h
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
/*
|
||||
* diagnostic.h - Manage Diagnostics parameters from icwmp
|
||||
*
|
||||
* Copyright (C) 2021-2022, IOPSYS Software Solutions AB.
|
||||
*
|
||||
* Author Imen Bhiri <imen.bhiri@pivasoftware.com>
|
||||
* Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||
* Author: Omar Kallel <omar.kallel@pivasoftware.com>
|
||||
*
|
||||
* See LICENSE file for license related information.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __DIAGNOSTIC__H
|
||||
#define __DIAGNOSTIC__H
|
||||
|
||||
bool set_diagnostic_parameter_structure_value(char *parameter_name, char *value);
|
||||
|
||||
int cwmp_download_diagnostics();
|
||||
int cwmp_upload_diagnostics();
|
||||
int cwmp_ip_ping_diagnostics();
|
||||
int cwmp_nslookup_diagnostics();
|
||||
int cwmp_traceroute_diagnostics();
|
||||
int cwmp_udp_echo_diagnostics();
|
||||
int cwmp_serverselection_diagnostics();
|
||||
|
||||
#endif
|
||||
|
|
@ -144,10 +144,10 @@ static void get_hexstring(unsigned const char *hash, int len, char *hexstr, int
|
|||
|
||||
static void get_value_from_header(const char *data)
|
||||
{
|
||||
if (data == NULL)
|
||||
if (CWMP_STRLEN(data) == 0)
|
||||
return;
|
||||
|
||||
int header_len = strlen(data) + 1;
|
||||
int header_len = CWMP_STRLEN(data) + 1;
|
||||
char header[header_len];
|
||||
memset(header, 0, header_len);
|
||||
strncpy(header, data, header_len);
|
||||
|
|
@ -167,7 +167,7 @@ static void get_value_from_header(const char *data)
|
|||
strip_lead_trail_char(key, '\"');
|
||||
|
||||
eq = eq + 1;
|
||||
char *end = eq + strlen(eq) - 1;
|
||||
char *end = eq + CWMP_STRLEN(eq) - 1;
|
||||
len = end - eq + 2;
|
||||
char val[len];
|
||||
snprintf(val, len, "%s", eq);
|
||||
|
|
@ -1,3 +1,13 @@
|
|||
/*
|
||||
* digauth.h - HTTP digest authentication utility
|
||||
*
|
||||
* Copyright (C) 2022, IOPSYS Software Solutions AB.
|
||||
*
|
||||
* Author: suvendhu.hansa@iopsys.eu
|
||||
*
|
||||
* See LICENSE file for license related information.
|
||||
*
|
||||
*/
|
||||
#ifndef DIGAUTH_H_
|
||||
#define DIGAUTH_H_
|
||||
|
||||
|
|
@ -1,13 +1,13 @@
|
|||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* download.c - Download method functions
|
||||
*
|
||||
* Copyright (C) 2022, IOPSYS Software Solutions AB.
|
||||
*
|
||||
* Author: Omar Kallel <omar.kallel@pivasoftware.com>
|
||||
*
|
||||
* See LICENSE file for license related information.
|
||||
*
|
||||
* Copyright (C) 2013-2021 iopsys Software Solutions AB
|
||||
* Author Omar Kallel <omar.kallel@pivasoftware.com>
|
||||
*/
|
||||
|
||||
#include <curl/curl.h>
|
||||
#include <string.h>
|
||||
#include <libubox/blobmsg_json.h>
|
||||
|
|
@ -1,3 +1,13 @@
|
|||
/*
|
||||
* download.h - Download method functions
|
||||
*
|
||||
* Copyright (C) 2022, IOPSYS Software Solutions AB.
|
||||
*
|
||||
* Author: Omar Kallel <omar.kallel@pivasoftware.com>
|
||||
*
|
||||
* See LICENSE file for license related information.
|
||||
*
|
||||
*/
|
||||
#ifndef CWMP_DOWNLOAD_H
|
||||
#define CWMP_DOWNLOAD_H
|
||||
|
||||
|
|
@ -1,14 +1,14 @@
|
|||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* event.c - Manage CWMP Events
|
||||
*
|
||||
* Copyright (C) 2022, IOPSYS Software Solutions AB.
|
||||
*
|
||||
* Copyright (C) 2013-2021 iopsys Software Solutions AB
|
||||
* Author Mohamed Kallel <mohamed.kallel@pivasoftware.com>
|
||||
* Author Ahmed Zribi <ahmed.zribi@pivasoftware.com>
|
||||
* Author Omar Kallel <omar.kallel@pivasoftware.com>
|
||||
*
|
||||
* See LICENSE file for license related information.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "backupSession.h"
|
||||
|
|
@ -389,7 +389,7 @@ void *thread_event_periodic(void *v)
|
|||
|
||||
bool event_exist_in_list(struct cwmp *cwmp, int event)
|
||||
{
|
||||
struct event_container *event_container;
|
||||
struct event_container *event_container = NULL;
|
||||
list_for_each_entry (event_container, cwmp->head_event_container, list) {
|
||||
if (event_container->code == event)
|
||||
return true;
|
||||
|
|
@ -1,12 +1,12 @@
|
|||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* event.h - Manage CWMP Events
|
||||
*
|
||||
* Copyright (C) 2022, IOPSYS Software Solutions AB.
|
||||
*
|
||||
* Copyright (C) 2013-2020 iopsys Software Solutions AB
|
||||
* Author Omar Kallel <omar.kallel@pivasoftware.com>
|
||||
*
|
||||
* See LICENSE file for license related information.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef EVENT_H_
|
||||
|
|
@ -1,3 +1,13 @@
|
|||
/*
|
||||
* heartbeat.c - CWMP HeartBeat mechanism
|
||||
*
|
||||
* Copyright (C) 2022, IOPSYS Software Solutions AB.
|
||||
*
|
||||
* Author Omar Kallel <omar.kallel@pivasoftware.com>
|
||||
*
|
||||
* See LICENSE file for license related information.
|
||||
*
|
||||
*/
|
||||
#include <pthread.h>
|
||||
#include <unistd.h>
|
||||
|
||||
|
|
@ -1,3 +1,13 @@
|
|||
/*
|
||||
* heartbeat.h - CWMP HeartBeat mechanism
|
||||
*
|
||||
* Copyright (C) 2022, IOPSYS Software Solutions AB.
|
||||
*
|
||||
* Author Omar Kallel <omar.kallel@pivasoftware.com>
|
||||
*
|
||||
* See LICENSE file for license related information.
|
||||
*
|
||||
*/
|
||||
#ifndef HEARTBEAT_H
|
||||
#define HEARTBEAT_H
|
||||
|
||||
|
|
@ -1,14 +1,14 @@
|
|||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* http.c - API for HTTP exchanges
|
||||
*
|
||||
* Copyright (C) 2013-2021 iopsys Software Solutions AB
|
||||
* Copyright (C) 2022, IOPSYS Software Solutions AB.
|
||||
*
|
||||
* Author Omar Kallel <omar.kallel@pivasoftware.com>
|
||||
* Author Mohamed Kallel <mohamed.kallel@pivasoftware.com>
|
||||
* Author Ahmed Zribi <ahmed.zribi@pivasoftware.com>
|
||||
* Author Omar Kallel <omar.kallel@pivasoftware.com>
|
||||
* Copyright (C) 2011-2012 Luka Perkov <freecwmp@lukaperkov.net>
|
||||
*
|
||||
* See LICENSE file for license related information.
|
||||
*
|
||||
*/
|
||||
#include <curl/curl.h>
|
||||
#include <arpa/inet.h>
|
||||
|
|
@ -39,7 +39,7 @@ void http_set_timeout(void)
|
|||
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 1);
|
||||
}
|
||||
|
||||
int http_client_init(struct cwmp *cwmp)
|
||||
int icwmp_http_client_init(struct cwmp *cwmp)
|
||||
{
|
||||
char *dhcp_dis = NULL;
|
||||
char *acs_var_stat = NULL;
|
||||
|
|
@ -96,7 +96,7 @@ int http_client_init(struct cwmp *cwmp)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void http_client_exit(void)
|
||||
void icwmp_http_client_exit(void)
|
||||
{
|
||||
icwmp_free(http_c.url);
|
||||
|
||||
|
|
@ -131,7 +131,69 @@ static size_t http_get_response(void *buffer, size_t size, size_t rxed, char **m
|
|||
return size * rxed;
|
||||
}
|
||||
|
||||
int http_send_message(struct cwmp *cwmp, char *msg_out, int msg_out_len, char **msg_in)
|
||||
static void http_set_security_options(struct cwmp *cwmp)
|
||||
{
|
||||
curl_easy_setopt(curl, CURLOPT_USERNAME, cwmp->conf.acs_userid);
|
||||
curl_easy_setopt(curl, CURLOPT_PASSWORD, cwmp->conf.acs_passwd);
|
||||
curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC | CURLAUTH_DIGEST);
|
||||
|
||||
if (cwmp->conf.acs_ssl_capath)
|
||||
curl_easy_setopt(curl, CURLOPT_CAPATH, cwmp->conf.acs_ssl_capath);
|
||||
if (cwmp->conf.insecure_enable) {
|
||||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);
|
||||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0);
|
||||
}
|
||||
}
|
||||
|
||||
static void http_set_connection_options(struct cwmp *cwmp)
|
||||
{
|
||||
curl_easy_setopt(curl, CURLOPT_URL, http_c.url);
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_TIMEOUT, HTTP_TIMEOUT);
|
||||
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, HTTP_TIMEOUT);
|
||||
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
|
||||
curl_easy_setopt(curl, CURLOPT_POSTREDIR, CURL_REDIR_POST_ALL);
|
||||
curl_easy_setopt(curl, CURLOPT_NOBODY, 0);
|
||||
#ifdef DEVEL
|
||||
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
|
||||
#endif
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, fc_cookies);
|
||||
curl_easy_setopt(curl, CURLOPT_COOKIEJAR, fc_cookies);
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_INTERFACE, cwmp->conf.interface);
|
||||
}
|
||||
|
||||
static void http_set_header_list_options(struct cwmp *cwmp)
|
||||
{
|
||||
switch (cwmp->conf.compression) {
|
||||
case COMP_NONE:
|
||||
break;
|
||||
case COMP_GZIP:
|
||||
curl_easy_setopt(curl, CURLOPT_ACCEPT_ENCODING, "gzip");
|
||||
http_c.header_list = curl_slist_append(http_c.header_list, "Content-Encoding: gzip");
|
||||
break;
|
||||
case COMP_DEFLATE:
|
||||
curl_easy_setopt(curl, CURLOPT_ACCEPT_ENCODING, "deflate");
|
||||
http_c.header_list = curl_slist_append(http_c.header_list, "Content-Encoding: deflate");
|
||||
break;
|
||||
}
|
||||
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, http_c.header_list);
|
||||
}
|
||||
|
||||
static void http_set_inout_options(char *msg_out, int msg_out_len, char **msg_in)
|
||||
{
|
||||
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, msg_out);
|
||||
if (msg_out)
|
||||
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long)msg_out_len);
|
||||
else
|
||||
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, 0);
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, http_get_response);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, msg_in);
|
||||
}
|
||||
|
||||
int icwmp_http_send_message(struct cwmp *cwmp, char *msg_out, int msg_out_len, char **msg_in)
|
||||
{
|
||||
unsigned char buf[sizeof(struct in6_addr)];
|
||||
int tmp = 0;
|
||||
|
|
@ -158,53 +220,13 @@ int http_send_message(struct cwmp *cwmp, char *msg_out, int msg_out_len, char **
|
|||
if (!http_c.header_list)
|
||||
return -1;
|
||||
}
|
||||
curl_easy_setopt(curl, CURLOPT_URL, http_c.url);
|
||||
curl_easy_setopt(curl, CURLOPT_USERNAME, cwmp->conf.acs_userid);
|
||||
curl_easy_setopt(curl, CURLOPT_PASSWORD, cwmp->conf.acs_passwd);
|
||||
curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC | CURLAUTH_DIGEST);
|
||||
curl_easy_setopt(curl, CURLOPT_TIMEOUT, HTTP_TIMEOUT);
|
||||
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, HTTP_TIMEOUT);
|
||||
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
|
||||
curl_easy_setopt(curl, CURLOPT_POSTREDIR, CURL_REDIR_POST_ALL);
|
||||
curl_easy_setopt(curl, CURLOPT_NOBODY, 0);
|
||||
switch (cwmp->conf.compression) {
|
||||
case COMP_NONE:
|
||||
break;
|
||||
case COMP_GZIP:
|
||||
curl_easy_setopt(curl, CURLOPT_ACCEPT_ENCODING, "gzip");
|
||||
http_c.header_list = curl_slist_append(http_c.header_list, "Content-Encoding: gzip");
|
||||
break;
|
||||
case COMP_DEFLATE:
|
||||
curl_easy_setopt(curl, CURLOPT_ACCEPT_ENCODING, "deflate");
|
||||
http_c.header_list = curl_slist_append(http_c.header_list, "Content-Encoding: deflate");
|
||||
break;
|
||||
}
|
||||
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, http_c.header_list);
|
||||
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, msg_out);
|
||||
if (msg_out)
|
||||
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long)msg_out_len);
|
||||
else
|
||||
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, 0);
|
||||
http_set_connection_options(cwmp);
|
||||
http_set_security_options(cwmp);
|
||||
http_set_header_list_options(cwmp);
|
||||
http_set_inout_options(msg_out, msg_out_len, msg_in);
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, http_get_response);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, msg_in);
|
||||
|
||||
#ifdef DEVEL
|
||||
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
|
||||
#endif
|
||||
curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errbuf);
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, fc_cookies);
|
||||
curl_easy_setopt(curl, CURLOPT_COOKIEJAR, fc_cookies);
|
||||
|
||||
if (cwmp->conf.acs_ssl_capath)
|
||||
curl_easy_setopt(curl, CURLOPT_CAPATH, cwmp->conf.acs_ssl_capath);
|
||||
if (cwmp->conf.insecure_enable) {
|
||||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);
|
||||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0);
|
||||
}
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_INTERFACE, cwmp->conf.interface);
|
||||
*msg_in = (char *)calloc(1, sizeof(char));
|
||||
|
||||
res = curl_easy_perform(curl);
|
||||
|
|
@ -279,7 +301,7 @@ error:
|
|||
return -1;
|
||||
}
|
||||
|
||||
void http_success_cr(void)
|
||||
static void http_success_cr(void)
|
||||
{
|
||||
CWMP_LOG(INFO, "Connection Request thread: add connection request event in the queue");
|
||||
pthread_mutex_lock(&(cwmp_main.mutex_session_queue));
|
||||
|
|
@ -291,14 +313,14 @@ void http_success_cr(void)
|
|||
static void http_cr_new_client(int client, bool service_available)
|
||||
{
|
||||
FILE *fp;
|
||||
char buffer[BUFSIZ];
|
||||
char auth_digest_buffer[BUFSIZ];
|
||||
char buffer[BUFSIZ] = {0};
|
||||
char auth_digest_buffer[BUFSIZ] = {0};
|
||||
int8_t auth_status = 0;
|
||||
bool auth_digest_checked = false;
|
||||
bool method_is_get = false;
|
||||
bool internal_error = false;
|
||||
|
||||
char cr_http_get_head[HTTP_GET_HDR_LEN];
|
||||
char cr_http_get_head[HTTP_GET_HDR_LEN] = {0};
|
||||
|
||||
pthread_mutex_lock(&mutex_config_load);
|
||||
fp = fdopen(client, "r+");
|
||||
|
|
@ -388,7 +410,7 @@ http_end:
|
|||
pthread_mutex_unlock(&mutex_config_load);
|
||||
}
|
||||
|
||||
void http_server_init(void)
|
||||
void icwmp_http_server_init(void)
|
||||
{
|
||||
struct sockaddr_in6 server = { 0 };
|
||||
unsigned short cr_port;
|
||||
|
|
@ -438,7 +460,7 @@ void http_server_init(void)
|
|||
CWMP_LOG(INFO, "Connection Request server initiated with the port: %d", cr_port);
|
||||
}
|
||||
|
||||
void http_server_listen(void)
|
||||
void icwmp_http_server_listen(void)
|
||||
{
|
||||
int client_sock, c;
|
||||
int cr_request = 0;
|
||||
36
src/http.h
Normal file
36
src/http.h
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
/*
|
||||
* http.h - API for HTTP exchanges
|
||||
*
|
||||
* Copyright (C) 2022, IOPSYS Software Solutions AB.
|
||||
*
|
||||
* Author Omar Kallel <omar.kallel@pivasoftware.com>
|
||||
* Author Mohamed Kallel <mohamed.kallel@pivasoftware.com>
|
||||
* Author Ahmed Zribi <ahmed.zribi@pivasoftware.com>
|
||||
*
|
||||
* See LICENSE file for license related information.
|
||||
*
|
||||
*/
|
||||
#ifndef _FREECWMP_HTTP_H__
|
||||
#define _FREECWMP_HTTP_H__
|
||||
|
||||
#include "common.h"
|
||||
|
||||
extern char *fc_cookies;
|
||||
|
||||
#define HTTP_TIMEOUT 60
|
||||
|
||||
struct http_client {
|
||||
struct curl_slist *header_list;
|
||||
char *url;
|
||||
};
|
||||
|
||||
void http_set_timeout(void);
|
||||
|
||||
int icwmp_http_client_init(struct cwmp *cwmp);
|
||||
void icwmp_http_client_exit(void);
|
||||
int icwmp_http_send_message(struct cwmp *cwmp, char *msg_out, int msg_out_len, char **msg_in);
|
||||
|
||||
void icwmp_http_server_init(void);
|
||||
void icwmp_http_server_listen(void);
|
||||
|
||||
#endif
|
||||
|
|
@ -1,12 +1,13 @@
|
|||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* log.c - CWMP Logs functions
|
||||
*
|
||||
* Copyright (C) 2022, IOPSYS Software Solutions AB.
|
||||
*
|
||||
* Copyright (C) 2013-2021 iopsys Software Solutions AB
|
||||
* Author Mohamed Kallel <mohamed.kallel@pivasoftware.com>
|
||||
* Author Ahmed Zribi <ahmed.zribi@pivasoftware.com>
|
||||
* Author Omar Kallel <omar.kallel@pivasoftware.com>
|
||||
*
|
||||
* See LICENSE file for license related information.
|
||||
*
|
||||
*/
|
||||
|
||||
|
|
@ -1,12 +1,13 @@
|
|||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* log.h - CWMP Logs functions
|
||||
*
|
||||
* Copyright (C) 2022, IOPSYS Software Solutions AB.
|
||||
*
|
||||
* Copyright (C) 2013-2019 iopsys Software Solutions AB
|
||||
* Author Mohamed Kallel <mohamed.kallel@pivasoftware.com>
|
||||
* Author Ahmed Zribi <ahmed.zribi@pivasoftware.com>
|
||||
* Author Omar Kallel <omar.kallel@pivasoftware.com>
|
||||
*
|
||||
* See LICENSE file for license related information.
|
||||
*
|
||||
*/
|
||||
|
||||
|
|
@ -1,12 +1,12 @@
|
|||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* notifications.c - Manage CWMP Notifications
|
||||
*
|
||||
* Copyright (C) 2022, IOPSYS Software Solutions AB.
|
||||
*
|
||||
* Copyright (C) 2013-2021 iopsys Software Solutions AB
|
||||
* Author Omar Kallel <omar.kallel@pivasoftware.com>
|
||||
*
|
||||
* See LICENSE file for license related information.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <netdb.h>
|
||||
|
|
@ -207,7 +207,7 @@ int get_parameter_leaf_notification_from_childs_list(char *parameter_name, struc
|
|||
{
|
||||
char *parent = NULL;
|
||||
int ret_notif = -1;
|
||||
struct cwmp_dm_parameter *param_value;
|
||||
struct cwmp_dm_parameter *param_value = NULL;
|
||||
if (childs_list == NULL)
|
||||
return -1;
|
||||
list_for_each_entry (param_value, childs_list, list) {
|
||||
|
|
@ -239,7 +239,7 @@ char *cwmp_get_parameter_attributes(char *parameter_name, struct list_head *para
|
|||
cwmp_free_all_dm_parameter_list(&childs_notifs);
|
||||
return error;
|
||||
}
|
||||
struct cwmp_dm_parameter *param_value;
|
||||
struct cwmp_dm_parameter *param_value = NULL;
|
||||
list_for_each_entry (param_value, ¶ms_list, list) {
|
||||
int notif_leaf;
|
||||
notif_leaf = check_parameter_forced_notification(param_value->name);
|
||||
|
|
@ -307,7 +307,7 @@ void create_list_param_obj_notify()
|
|||
|
||||
char* updated_list_param_leaf_notify_with_sub_parameter_list(struct list_head *list_param_leaf_notify, struct cwmp_dm_parameter parent_parameter, void (*update_notify_file_line_arg)(FILE *notify_file, char *param_name, char *param_type, char *param_value, int notification), FILE* notify_file_arg)
|
||||
{
|
||||
struct cwmp_dm_parameter *param_iter;
|
||||
struct cwmp_dm_parameter *param_iter = NULL;
|
||||
LIST_HEAD(params_list);
|
||||
char *err = cwmp_get_parameter_values(parent_parameter.name, ¶ms_list);
|
||||
if (err)
|
||||
|
|
@ -326,7 +326,7 @@ char* updated_list_param_leaf_notify_with_sub_parameter_list(struct list_head *l
|
|||
|
||||
void create_list_param_leaf_notify(struct list_head *list_param_leaf_notify, void (*update_notify_file_line_arg)(FILE *notify_file, char *param_name, char *param_type, char *param_value, int notification), FILE* notify_file_arg)
|
||||
{
|
||||
struct cwmp_dm_parameter *param_iter;
|
||||
struct cwmp_dm_parameter *param_iter = NULL;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < (int)ARRAY_SIZE(forced_notifications_parameters); i++)
|
||||
|
|
@ -462,7 +462,7 @@ void load_custom_notify_json(struct cwmp *cwmp)
|
|||
*/
|
||||
void get_parameter_value_from_parameters_list(struct list_head *params_list, char *parameter_name, char **value, char **type)
|
||||
{
|
||||
struct cwmp_dm_parameter *param_value;
|
||||
struct cwmp_dm_parameter *param_value = NULL;
|
||||
list_for_each_entry (param_value, params_list, list) {
|
||||
if (param_value->name == NULL)
|
||||
continue;
|
||||
|
|
@ -1,12 +1,12 @@
|
|||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* notifications.h - Manage CWMP Notifications
|
||||
*
|
||||
* Copyright (C) 2022, IOPSYS Software Solutions AB.
|
||||
*
|
||||
* Copyright (C) 2013-2020 iopsys Software Solutions AB
|
||||
* Author Omar Kallel <omar.kallel@pivasoftware.com>
|
||||
*
|
||||
* See LICENSE file for license related information.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef NOTIFICATIONS_H_
|
||||
|
|
@ -1,11 +1,12 @@
|
|||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* reboot.c - Reboot method fuctions
|
||||
*
|
||||
* Copyright (C) 2022, IOPSYS Software Solutions AB.
|
||||
*
|
||||
* Copyright (C) 2021 iopsys Software Solutions AB
|
||||
* Author Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||
*
|
||||
* See LICENSE file for license related information.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <unistd.h>
|
||||
20
src/reboot.h
Normal file
20
src/reboot.h
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
/*
|
||||
* reboot.h - Reboot method fuctions
|
||||
*
|
||||
* Copyright (C) 2022, IOPSYS Software Solutions AB.
|
||||
*
|
||||
* Author Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||
*
|
||||
* See LICENSE file for license related information.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _REBOOT_H__
|
||||
#define _REBOOT_H__
|
||||
|
||||
#include "common.h"
|
||||
|
||||
void launch_reboot_methods(struct cwmp *cwmp);
|
||||
|
||||
#endif //_REBOOT_H__
|
||||
|
||||
|
|
@ -1,13 +1,13 @@
|
|||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* rpc.h - CWMP RPC methods
|
||||
*
|
||||
* Copyright (C) 2021-2022, IOPSYS Software Solutions AB.
|
||||
*
|
||||
* Copyright (C) 2013-2019 iopsys Software Solutions AB
|
||||
* Author Mohamed Kallel <mohamed.kallel@pivasoftware.com>
|
||||
* Author Ahmed Zribi <ahmed.zribi@pivasoftware.com>
|
||||
* Copyright (C) 2011 Luka Perkov <freecwmp@lukaperkov.net>
|
||||
* Author Omar Kallel <omar.kallel@pivasoftware.com>
|
||||
*
|
||||
* See LICENSE file for license related information.
|
||||
*
|
||||
*/
|
||||
|
||||
|
|
@ -51,7 +51,6 @@ int cwmp_rpc_acs_parse_response_get_rpc_methods(struct cwmp *cwmp, struct sessio
|
|||
int cwmp_rpc_acs_prepare_get_rpc_methods(struct cwmp *cwmp, struct session *session, struct rpc *rpc);
|
||||
int cwmp_rpc_acs_prepare_transfer_complete(struct cwmp *cwmp, struct session *session, struct rpc *rpc);
|
||||
int cwmp_rpc_acs_prepare_du_state_change_complete(struct cwmp *cwmp, struct session *session, struct rpc *rpc);
|
||||
int cwmp_rpc_acs_destroy_data_inform(struct session *session, struct rpc *rpc);
|
||||
|
||||
int xml_handle_message(struct session *session);
|
||||
int cwmp_create_fault_message(struct session *session, struct rpc *rpc_cpe, int fault_code);
|
||||
|
|
@ -1,11 +1,12 @@
|
|||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* sched_inform.c - ScheduleInform method corresponding functions
|
||||
*
|
||||
* Copyright (C) 2021-2022, IOPSYS Software Solutions AB.
|
||||
*
|
||||
* Copyright (C) 2013-2021 iopsys Software Solutions AB
|
||||
* Author Omar Kallel <omar.kallel@pivasoftware.com>
|
||||
*
|
||||
* See LICENSE file for license related information.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "sched_inform.h"
|
||||
|
|
@ -1,11 +1,12 @@
|
|||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* sched_inform.h - ScheduleInform method corresponding functions
|
||||
*
|
||||
* Copyright (C) 2021-2022, IOPSYS Software Solutions AB.
|
||||
*
|
||||
* Copyright (C) 2013-2021 iopsys Software Solutions AB
|
||||
* Author Omar Kallel <omar.kallel@pivasoftware.com>
|
||||
*
|
||||
* See LICENSE file for license related information.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef CWMP_SCHED_INFORM_H
|
||||
|
|
@ -1,12 +1,12 @@
|
|||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* session.c - API for CWMP Session
|
||||
*
|
||||
* Copyright (C) 2021-2022, IOPSYS Software Solutions AB.
|
||||
*
|
||||
* Copyright (C) 2013-2021 iopsys Software Solutions AB
|
||||
* Author Omar Kallel <omar.kallel@pivasoftware.com>
|
||||
*
|
||||
* See LICENSE file for license related information.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
|
|
@ -14,7 +14,7 @@
|
|||
#include "session.h"
|
||||
#include "config.h"
|
||||
#include "event.h"
|
||||
#include "rpc_soap.h"
|
||||
#include "rpc.h"
|
||||
#include "backupSession.h"
|
||||
#include "heartbeat.h"
|
||||
|
||||
|
|
@ -1,18 +1,18 @@
|
|||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* session.h - API for CWMP Session
|
||||
*
|
||||
* Copyright (C) 2021-2022, IOPSYS Software Solutions AB.
|
||||
*
|
||||
* Copyright (C) 2013-2020 iopsys Software Solutions AB
|
||||
* Author Omar Kallel <omar.kallel@pivasoftware.com>
|
||||
*
|
||||
* See LICENSE file for license related information.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef SESSION_H_
|
||||
#define SESSION_H_
|
||||
|
||||
#include <xml_utils.h>
|
||||
#include "xml_utils.h"
|
||||
#include "common.h"
|
||||
|
||||
typedef struct session {
|
||||
|
|
@ -1,3 +1,13 @@
|
|||
/*
|
||||
* ubus_utils.h - ubus methods and utility functions
|
||||
*
|
||||
* Copyright (C) 2022, IOPSYS Software Solutions AB.
|
||||
*
|
||||
* Author: suvendhu.hansa@iopsys.eu
|
||||
*
|
||||
* See LICENSE file for license related information
|
||||
*
|
||||
*/
|
||||
#ifndef __ICWMP_UBUS_UTILS_H__
|
||||
#define __ICWMP_UBUS_UTILS_H__
|
||||
|
||||
|
|
@ -1,11 +1,12 @@
|
|||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* upload.c - Upload method corresponding functions
|
||||
*
|
||||
* Copyright (C) 2021-2022, IOPSYS Software Solutions AB.
|
||||
*
|
||||
* Copyright (C) 2013-2021 iopsys Software Solutions AB
|
||||
* Author Omar Kallel <omar.kallel@pivasoftware.com>
|
||||
*
|
||||
* See LICENSE file for license related information.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <curl/curl.h>
|
||||
|
|
@ -36,7 +37,7 @@ int lookup_vcf_name(int instance, char **value)
|
|||
CWMP_LOG(ERROR, "Not able to get the value of the parameter %s", vcf_name_parameter);
|
||||
return -1;
|
||||
}
|
||||
struct cwmp_dm_parameter *param_value;
|
||||
struct cwmp_dm_parameter *param_value = NULL;
|
||||
list_for_each_entry (param_value, &vcf_parameters, list) {
|
||||
*value = param_value->value ? strdup(param_value->value) : NULL;
|
||||
break;
|
||||
|
|
@ -54,7 +55,7 @@ int lookup_vlf_name(int instance, char **value)
|
|||
CWMP_LOG(ERROR, "Not able to get the value of the parameter %s", vlf_name_parameter);
|
||||
return -1;
|
||||
}
|
||||
struct cwmp_dm_parameter *param_value;
|
||||
struct cwmp_dm_parameter *param_value = NULL;
|
||||
list_for_each_entry (param_value, &vlf_parameters, list) {
|
||||
*value = param_value->value ? strdup(param_value->value) : NULL;
|
||||
break;
|
||||
|
|
@ -1,11 +1,12 @@
|
|||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
* upload.h - Upload method corresponding functions
|
||||
*
|
||||
* Copyright (C) 2021-2022, IOPSYS Software Solutions AB.
|
||||
*
|
||||
* Copyright (C) 2013-2021 iopsys Software Solutions AB
|
||||
* Author Omar Kallel <omar.kallel@pivasoftware.com>
|
||||
*
|
||||
* See LICENSE file for license related information.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef CWMP_UPLOAD_H
|
||||
255
src/xml.h
Normal file
255
src/xml.h
Normal file
|
|
@ -0,0 +1,255 @@
|
|||
#ifndef __XML__H_
|
||||
#define __XML__H_
|
||||
|
||||
#include "xml_utils.h"
|
||||
#include "session.h"
|
||||
#include "common.h"
|
||||
|
||||
#define CWMP_MXML_TAB_SPACE " "
|
||||
#define MAX_SCHEDULE_INFORM_QUEUE 10
|
||||
|
||||
#define XML2(A,B) {A, B, 0, NULL}
|
||||
#define XML3(A,B,C) {A, B, C, NULL}
|
||||
#define XML4(A,B,D) {A, B, 0, D}
|
||||
enum soap_methods {
|
||||
SOAP_REQ_SPV = 1,
|
||||
SOAP_REQ_GPV,
|
||||
SOAP_REQ_GPN,
|
||||
SOAP_REQ_SPA,
|
||||
SOAP_REQ_GPA,
|
||||
SOAP_REQ_ADDOBJ,
|
||||
SOAP_REQ_DELOBJ,
|
||||
SOAP_REQ_REBOOT,
|
||||
SOAP_REQ_DOWNLOAD,
|
||||
SOAP_REQ_UPLOAD,
|
||||
SOAP_REQ_CANCELTRANSFER,
|
||||
SOAP_REQ_SCHEDINF,
|
||||
SOAP_REQ_SCHEDDOWN,
|
||||
SOAP_REQ_CDU,
|
||||
SOAP_REQ_SPV_LIST,
|
||||
SOAP_REQ_SPV_LIST_REF,
|
||||
SOAP_REQ_GPV_REF,
|
||||
SOAP_REQ_SPA_REF,
|
||||
SOAP_REQ_GPA_REF,
|
||||
SOAP_TIMEWINDOW_REF,
|
||||
SOAP_TIME_REF,
|
||||
SOAP_REQ_CDU_OPERATIONS,
|
||||
SOAP_REQ_CDU_OPS_REF,
|
||||
SOAP_REQ_DU_INSTALL,
|
||||
SOAP_REQ_DU_UPDATE,
|
||||
SOAP_REQ_DU_UNINSTALL,
|
||||
|
||||
SOAP_RESP_GPV,
|
||||
SOAP_PARAM_STRUCT,
|
||||
SOAP_PARAM_STRUCT_REF,
|
||||
SOAP_VALUE_STRUCT,
|
||||
SOAP_RESP_SPV,
|
||||
SOAP_RESP_GPN,
|
||||
SOAP_RESP_GPN_REF,
|
||||
SOAP_RESP_GPA,
|
||||
SOAP_RESP_GPA_REF,
|
||||
SOAP_RESP_ADDOBJ,
|
||||
SOAP_RESP_DELOBJ,
|
||||
SOAP_RESP_DOWNLOAD,
|
||||
SOAP_RESP_UPLOAD,
|
||||
SOAP_RESP_GETRPC,
|
||||
SOAP_RESP_GETRPC_REF,
|
||||
SOAP_ACS_TRANSCOMPLETE,
|
||||
SOAP_ROOT_FAULT,
|
||||
SOAP_RPC_FAULT,
|
||||
SOAP_FAULT_DETAIL,
|
||||
SOAP_CWMP_FAULT,
|
||||
SOAP_SPV_FAULT,
|
||||
SOAP_SPV_FAULT_REF,
|
||||
SOAP_FAULT_STRCT_REF,
|
||||
SOAP_ENV,
|
||||
SOAP_HEAD,
|
||||
SOAP_BODY,
|
||||
SOAP_INFORM_CWMP,
|
||||
SOAP_DEVID,
|
||||
SOAP_DU_CHANGE_COMPLETE,
|
||||
SOAP_CDU_RESULTS_REF,
|
||||
SOAP_CDU_OPTS_REF,
|
||||
ATTR_PARAM_STRUCT,
|
||||
ATTR_SOAP_ENV,
|
||||
SOAP_MAX
|
||||
};
|
||||
|
||||
enum xml_tag_types {
|
||||
XML_STRING,
|
||||
XML_BOOL,
|
||||
XML_INTEGER,
|
||||
XML_LINTEGER,
|
||||
XML_TIME,
|
||||
XML_FUNC,
|
||||
XML_REC,
|
||||
XML_NODE,
|
||||
XML_ATTR
|
||||
};
|
||||
|
||||
enum tag_multiple_single {
|
||||
XML_SINGLE,
|
||||
XML_LIST
|
||||
};
|
||||
|
||||
enum validation_types {
|
||||
VALIDATE_STR_SIZE,
|
||||
VALIDATE_UNINT,
|
||||
VALIDATE_BOOLEAN,
|
||||
VALIDATE_INT_RANGE
|
||||
};
|
||||
|
||||
struct xml_tag_validation {
|
||||
char *tag_name;
|
||||
int validation_type;
|
||||
int min;
|
||||
int max;
|
||||
};
|
||||
|
||||
struct xml_data_struct {
|
||||
mxml_node_t **parameter_list;
|
||||
char **name;
|
||||
char **value;
|
||||
char **string;
|
||||
char **parameter_path;
|
||||
char **parameter_name;
|
||||
char **object_name;
|
||||
char **parameter_key;
|
||||
char **command_key;
|
||||
char **file_type;
|
||||
char **url;
|
||||
char **username;
|
||||
char **password;
|
||||
char **uuid;
|
||||
char **exec_env_ref;
|
||||
char **du_ref;
|
||||
char **current_state;
|
||||
char **version;
|
||||
char **window_mode;
|
||||
char **user_message;
|
||||
char **start_time;
|
||||
char **complete_time;
|
||||
char **access_list;
|
||||
char **fault_string;
|
||||
char **faultcode;
|
||||
char **faultstring;
|
||||
char **manufacturer;
|
||||
char **oui;
|
||||
char **serial_number;
|
||||
char **current_time;
|
||||
char **product_class;
|
||||
char **xsi_type;
|
||||
int *file_size;
|
||||
int *notification;
|
||||
int *scheddown_max_retries;
|
||||
int *status;
|
||||
int *instance;
|
||||
int *fault_code;
|
||||
int *max_envelopes;
|
||||
int *retry_count;
|
||||
long int *delay_seconds;
|
||||
long int *window_start;
|
||||
long int *window_end;
|
||||
bool *next_level;
|
||||
bool *notification_change;
|
||||
bool *writable;
|
||||
|
||||
mxml_node_t **xml_env;
|
||||
struct list_head *data_list;
|
||||
char **xcwmp;
|
||||
int *amd_version;
|
||||
unsigned int *session_timeout;
|
||||
int *cdu_type;
|
||||
int *counter;
|
||||
struct xml_tag_validation *validations;
|
||||
int nbre_validations;
|
||||
};
|
||||
|
||||
struct xml_list_data {
|
||||
struct list_head list;
|
||||
char *param_name;
|
||||
char *param_value;
|
||||
char *param_type;
|
||||
char *windowmode;
|
||||
char *usermessage;
|
||||
char *access_list;
|
||||
char *rpc_name;
|
||||
char *fault_string;
|
||||
char *url;
|
||||
char *uuid;
|
||||
char *username;
|
||||
char *password;
|
||||
char *execution_env_ref;
|
||||
char *version;
|
||||
char *du_ref;
|
||||
char *current_state;
|
||||
char *start_time;
|
||||
char *complete_time;
|
||||
char *command_key;
|
||||
|
||||
long int windowstart;
|
||||
long int windowend;
|
||||
int max_retries;
|
||||
int notification;
|
||||
int fault_code;
|
||||
int cdu_type;
|
||||
int event_code;
|
||||
bool notification_change;
|
||||
bool writable;
|
||||
};
|
||||
|
||||
struct xml_tag {
|
||||
char *tag_name;
|
||||
int tag_type;
|
||||
int rec_ref;
|
||||
int (*xml_func)(mxml_node_t *node, struct xml_data_struct *xml_attrs);
|
||||
};
|
||||
|
||||
struct xml_node_data {
|
||||
int node_ms;
|
||||
int tag_node_ref;
|
||||
char *tag_list_name;
|
||||
struct xml_tag xml_tags[10];
|
||||
};
|
||||
|
||||
#define MXML_DELETE(X) \
|
||||
do { \
|
||||
if (X) { \
|
||||
mxmlDelete(X); \
|
||||
X = NULL; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
extern const char *cwmp_urls[];
|
||||
int xml_prepare_msg_out(struct session *session);
|
||||
int xml_prepare_lwnotification_message(char **msg_out);
|
||||
int xml_set_cwmp_id_rpc_cpe(struct session *session);
|
||||
int xml_recreate_namespace(mxml_node_t *tree);
|
||||
const char *whitespace_cb(mxml_node_t *node, int where);
|
||||
int xml_set_cwmp_id(struct session *session);
|
||||
int xml_send_message(struct cwmp *cwmp, struct session *session, struct rpc *rpc);
|
||||
mxml_node_t *mxmlFindElementOpaque(mxml_node_t *node, mxml_node_t *top, const char *text, int descend);
|
||||
char *xml__get_attribute_name_by_value(mxml_node_t *node, const char *value);
|
||||
char *xml_get_cwmp_version(int version);
|
||||
void xml_exit(void);
|
||||
void load_response_xml_schema(mxml_node_t **schema);
|
||||
void load_notification_xml_schema(mxml_node_t **tree);
|
||||
int load_xml_node_data(int node_ref, mxml_node_t *node, struct xml_data_struct *xml_attrs);
|
||||
int build_xml_node_data(int node_ref, mxml_node_t *node, struct xml_data_struct *xml_attrs);
|
||||
void add_xml_data_list(struct list_head *data_list, struct xml_list_data *xml_data);
|
||||
mxml_node_t * build_top_body_soap_response(mxml_node_t *node, char *method);
|
||||
mxml_node_t * build_top_body_soap_request(mxml_node_t *node, char *method);
|
||||
void dm_parameter_list_to_xml_data_list(struct list_head *dm_parameter_list, struct list_head *xml_data_list);
|
||||
void xml_data_list_to_dm_parameter_list(struct list_head *xml_data_list, struct list_head *dm_parameter_list);
|
||||
void xml_data_list_to_cdu_operations_list(struct list_head *xml_data_list, struct list_head *du_op_list);
|
||||
void cdu_operations_list_to_xml_data_list(struct list_head *du_op_list, struct list_head *xml_data_list);
|
||||
void event_container_list_to_xml_data_list(struct list_head *event_container, struct list_head *xml_data_list);
|
||||
void cwmp_param_fault_list_to_xml_data_list(struct list_head *param_fault_list, struct list_head *xml_data_list);
|
||||
void cwmp_free_all_xml_data_list(struct list_head *list);
|
||||
int load_upload_filetype(mxml_node_t *b, struct xml_data_struct *xml_attrs);
|
||||
int load_download_filetype(mxml_node_t *b, struct xml_data_struct *xml_attrs);
|
||||
int load_sched_download_window_mode(mxml_node_t *b, struct xml_data_struct *xml_attrs);
|
||||
int load_change_du_state_operation(mxml_node_t *b, struct xml_data_struct *xml_attrs);
|
||||
int build_inform_events(mxml_node_t *b, struct xml_data_struct *xml_attrs);
|
||||
int build_inform_env_header(mxml_node_t *b, struct xml_data_struct *xml_attrs);
|
||||
#endif
|
||||
|
|
@ -4,20 +4,20 @@ LIB_LDFLAGS:= -luci -lblobmsg_json -lubox\
|
|||
-ljson-c -lubus -lpthread -lcurl\
|
||||
-lcrypto -lmxml
|
||||
|
||||
LIB_CFLAGS:= -fPIC -I../../inc -DLOPENSSL -g -O0
|
||||
LIB_CFLAGS:= -fPIC -I../../src/ -DLOPENSSL -g -O0
|
||||
UNIT_TESTS:= icwmp_unit_testd
|
||||
|
||||
VALGRIND = /usr/bin/valgrind --xml=yes --xml-file=memory-report.xml --leak-check=full --show-reachable=yes --show-leak-kinds=all --errors-for-leak-kinds=all
|
||||
|
||||
ICWMP_SOURCES=$(patsubst ./%.c, ../../%.c, $(icwmpd_SOURCES))
|
||||
ICWMP_OBJS=$(patsubst ../../%.c, %.o, $(ICWMP_SOURCES))
|
||||
ICWMP_SOURCES=$(patsubst ./src/%.c, ../../src/%.c, $(icwmpd_SOURCES))
|
||||
ICWMP_OBJS=$(patsubst ../../src/%.c, %.o, $(ICWMP_SOURCES))
|
||||
TEST_SRCS = $(wildcard *.c)
|
||||
TEST_OBJS = $(TEST_SRCS:=.o)
|
||||
|
||||
%.c.o: %.c
|
||||
$(CC) -g -O0 -I../../inc -c -o $@ $<
|
||||
$(CC) -g -O0 -I../../src/ -c -o $@ $<
|
||||
|
||||
%.o: ../../%.c
|
||||
%.o: ../../src/%.c
|
||||
$(CC) ${LIB_CFLAGS} -c -o $@ $<
|
||||
|
||||
libunit: ${ICWMP_OBJS}
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@
|
|||
|
||||
#include "common.h"
|
||||
#include "config.h"
|
||||
#include "rpc_soap.h"
|
||||
#include "rpc.h"
|
||||
|
||||
static struct cwmp cwmp_main_test = { 0 };
|
||||
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@
|
|||
#include "datamodel_interface.h"
|
||||
#include "event.h"
|
||||
#include "xml.h"
|
||||
#include "rpc_soap.h"
|
||||
#include "rpc.h"
|
||||
#include "session.h"
|
||||
#include "log.h"
|
||||
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@
|
|||
#include <string.h>
|
||||
#include <mxml.h>
|
||||
|
||||
#include "rpc_soap.h"
|
||||
#include "rpc.h"
|
||||
#include "event.h"
|
||||
#include "session.h"
|
||||
#include "config.h"
|
||||
|
|
|
|||
577
xml.c
577
xml.c
|
|
@ -1,577 +0,0 @@
|
|||
/*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Copyright (C) 2013-2021 iopsys Software Solutions AB
|
||||
* Author Mohamed Kallel <mohamed.kallel@pivasoftware.com>
|
||||
* Author Ahmed Zribi <ahmed.zribi@pivasoftware.com>
|
||||
* Author Omar Kallel <omar.kallel@pivasoftware.com>
|
||||
*/
|
||||
|
||||
#include "xml.h"
|
||||
#include "log.h"
|
||||
#include "notifications.h"
|
||||
#include "http.h"
|
||||
#include "cwmp_zlib.h"
|
||||
|
||||
static const char *soap_env_url = "http://schemas.xmlsoap.org/soap/envelope/";
|
||||
static const char *soap_enc_url = "http://schemas.xmlsoap.org/soap/encoding/";
|
||||
static const char *xsd_url = "http://www.w3.org/2001/XMLSchema";
|
||||
static const char *xsi_url = "http://www.w3.org/2001/XMLSchema-instance";
|
||||
|
||||
const char *cwmp_urls[] = { "urn:dslforum-org:cwmp-1-0", "urn:dslforum-org:cwmp-1-1", "urn:dslforum-org:cwmp-1-2", "urn:dslforum-org:cwmp-1-2", "urn:dslforum-org:cwmp-1-2", "urn:dslforum-org:cwmp-1-2", NULL };
|
||||
|
||||
mxml_node_t * /* O - Element node or NULL */
|
||||
mxmlFindElementOpaque(mxml_node_t *node, /* I - Current node */
|
||||
mxml_node_t *top, /* I - Top node */
|
||||
const char *text, /* I - Element text, if NULL return NULL */
|
||||
int descend) /* I - Descend into tree - MXML_DESCEND, MXML_NO_DESCEND, or MXML_DESCEND_FIRST */
|
||||
{
|
||||
if (!node || !top || !text)
|
||||
return (NULL);
|
||||
|
||||
node = mxmlWalkNext(node, top, descend);
|
||||
|
||||
while (node != NULL) {
|
||||
const char *op = mxmlGetOpaque(node);
|
||||
if (mxmlGetType(node) == MXML_OPAQUE && op && (!strcmp(op, text))) {
|
||||
return (node);
|
||||
}
|
||||
|
||||
if (descend == MXML_DESCEND)
|
||||
node = mxmlWalkNext(node, top, MXML_DESCEND);
|
||||
else
|
||||
node = mxmlGetNextSibling(node);
|
||||
}
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
char *xml__get_attribute_name_by_value(mxml_node_t *node, const char *value)
|
||||
{
|
||||
int attributes_nbre = mxmlElementGetAttrCount(node);
|
||||
int i;
|
||||
for (i = 0; i < attributes_nbre; i++) {
|
||||
char *attr_name = NULL;
|
||||
const char *attr_value = mxmlElementGetAttrByIndex(node, i, (const char **)&attr_name);
|
||||
if (strcmp(attr_value, value) == 0)
|
||||
return attr_name;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int xml_recreate_namespace(mxml_node_t *tree)
|
||||
{
|
||||
const char *cwmp_urn;
|
||||
int i;
|
||||
mxml_node_t *b = tree;
|
||||
|
||||
do {
|
||||
char *c;
|
||||
FREE(ns.soap_env);
|
||||
FREE(ns.soap_enc);
|
||||
FREE(ns.xsd);
|
||||
FREE(ns.xsi);
|
||||
FREE(ns.cwmp);
|
||||
|
||||
c = (char *)xml__get_attribute_name_by_value(b, soap_env_url);
|
||||
if (c && *(c + 5) == ':') {
|
||||
ns.soap_env = strdup((c + 6));
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
|
||||
c = (char *)xml__get_attribute_name_by_value(b, soap_enc_url);
|
||||
if (c && *(c + 5) == ':') {
|
||||
ns.soap_enc = strdup((c + 6));
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
|
||||
c = (char *)xml__get_attribute_name_by_value(b, xsd_url);
|
||||
if (c && *(c + 5) == ':') {
|
||||
ns.xsd = strdup((c + 6));
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
|
||||
c = (char *)xml__get_attribute_name_by_value(b, xsi_url);
|
||||
if (c && *(c + 5) == ':') {
|
||||
ns.xsi = strdup((c + 6));
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
|
||||
for (i = 0; cwmp_urls[i] != NULL; i++) {
|
||||
cwmp_urn = cwmp_urls[i];
|
||||
c = (char *)xml__get_attribute_name_by_value(b, cwmp_urn);
|
||||
if (c && *(c + 5) == ':') {
|
||||
ns.cwmp = strdup((c + 6));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!ns.cwmp)
|
||||
continue;
|
||||
|
||||
return 0;
|
||||
} while ((b = mxmlWalkNext(b, tree, MXML_DESCEND)));
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
void xml_exit(void)
|
||||
{
|
||||
FREE(ns.soap_env);
|
||||
FREE(ns.soap_enc);
|
||||
FREE(ns.xsd);
|
||||
FREE(ns.xsi);
|
||||
FREE(ns.cwmp);
|
||||
}
|
||||
|
||||
int xml_send_message(struct cwmp *cwmp, struct session *session, struct rpc *rpc)
|
||||
{
|
||||
char *s, *msg_out = NULL, *msg_in = NULL;
|
||||
char c[512];
|
||||
int msg_out_len = 0, f, r = 0;
|
||||
mxml_node_t *b;
|
||||
|
||||
if (session->tree_out) {
|
||||
unsigned char *zmsg_out;
|
||||
msg_out = mxmlSaveAllocString(session->tree_out, whitespace_cb);
|
||||
CWMP_LOG_XML_MSG(DEBUG, msg_out, XML_MSG_OUT);
|
||||
if (cwmp->conf.compression != COMP_NONE) {
|
||||
if (zlib_compress(msg_out, &zmsg_out, &msg_out_len, cwmp->conf.compression)) {
|
||||
return -1;
|
||||
}
|
||||
FREE(msg_out);
|
||||
msg_out = (char *)zmsg_out;
|
||||
} else {
|
||||
msg_out_len = strlen(msg_out);
|
||||
}
|
||||
}
|
||||
while (1) {
|
||||
f = 0;
|
||||
if (http_send_message(cwmp, msg_out, msg_out_len, &msg_in)) {
|
||||
goto error;
|
||||
}
|
||||
if (msg_in) {
|
||||
CWMP_LOG_XML_MSG(DEBUG, msg_in, XML_MSG_IN);
|
||||
if ((s = strstr(msg_in, "<FaultCode>")))
|
||||
sscanf(s, "<FaultCode>%d</FaultCode>", &f);
|
||||
if (f) {
|
||||
if (f == 8005) {
|
||||
r++;
|
||||
if (r < 5) {
|
||||
FREE(msg_in);
|
||||
continue;
|
||||
}
|
||||
goto error;
|
||||
} else if (rpc && rpc->type != RPC_ACS_INFORM) {
|
||||
break;
|
||||
} else {
|
||||
goto error;
|
||||
}
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
goto end;
|
||||
}
|
||||
}
|
||||
|
||||
session->tree_in = mxmlLoadString(NULL, msg_in, MXML_OPAQUE_CALLBACK);
|
||||
if (!session->tree_in)
|
||||
goto error;
|
||||
xml_recreate_namespace(session->tree_in);
|
||||
/* get NoMoreRequests or HolRequest*/
|
||||
session->hold_request = false;
|
||||
|
||||
if (snprintf(c, sizeof(c), "%s:%s", ns.cwmp, "NoMoreRequests") == -1)
|
||||
goto error;
|
||||
b = mxmlFindElement(session->tree_in, session->tree_in, c, NULL, NULL, MXML_DESCEND);
|
||||
if (b) {
|
||||
b = mxmlWalkNext(b, session->tree_in, MXML_DESCEND_FIRST);
|
||||
if (b && mxmlGetType(b) == MXML_OPAQUE && mxmlGetOpaque(b))
|
||||
session->hold_request = atoi(mxmlGetOpaque(b));
|
||||
} else {
|
||||
if (snprintf(c, sizeof(c), "%s:%s", ns.cwmp, "HoldRequests") == -1)
|
||||
goto error;
|
||||
|
||||
b = mxmlFindElement(session->tree_in, session->tree_in, c, NULL, NULL, MXML_DESCEND);
|
||||
if (b) {
|
||||
b = mxmlWalkNext(b, session->tree_in, MXML_DESCEND_FIRST);
|
||||
if (b && mxmlGetType(b) == MXML_OPAQUE && mxmlGetOpaque(b))
|
||||
session->hold_request = atoi(mxmlGetOpaque(b));
|
||||
}
|
||||
}
|
||||
|
||||
end:
|
||||
FREE(msg_out);
|
||||
FREE(msg_in);
|
||||
return 0;
|
||||
|
||||
error:
|
||||
FREE(msg_out);
|
||||
FREE(msg_in);
|
||||
return -1;
|
||||
}
|
||||
|
||||
int xml_prepare_msg_out(struct session *session)
|
||||
{
|
||||
struct cwmp *cwmp = &cwmp_main;
|
||||
struct config *conf;
|
||||
conf = &(cwmp->conf);
|
||||
mxml_node_t *n;
|
||||
|
||||
load_response_xml_schema(&session->tree_out);
|
||||
if (!session->tree_out)
|
||||
return -1;
|
||||
|
||||
n = mxmlFindElement(session->tree_out, session->tree_out, "soap_env:Envelope", NULL, NULL, MXML_DESCEND);
|
||||
if (!n) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
mxmlElementSetAttr(n, "xmlns:cwmp", cwmp_urls[(conf->amd_version) - 1]);
|
||||
if (!session->tree_out)
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int xml_set_cwmp_id(struct session *session)
|
||||
{
|
||||
char c[32];
|
||||
mxml_node_t *b;
|
||||
|
||||
/* define cwmp id */
|
||||
if (snprintf(c, sizeof(c), "%u", ++(cwmp_main.cwmp_id)) == -1)
|
||||
return -1;
|
||||
|
||||
b = mxmlFindElement(session->tree_out, session->tree_out, "cwmp:ID", NULL, NULL, MXML_DESCEND);
|
||||
if (!b)
|
||||
return -1;
|
||||
|
||||
b = mxmlNewOpaque(b, c);
|
||||
if (!b)
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int xml_set_cwmp_id_rpc_cpe(struct session *session)
|
||||
{
|
||||
char c[512];
|
||||
mxml_node_t *b;
|
||||
|
||||
/* handle cwmp:ID */
|
||||
if (snprintf(c, sizeof(c), "%s:%s", ns.cwmp, "ID") == -1)
|
||||
return -1;
|
||||
|
||||
b = mxmlFindElement(session->tree_in, session->tree_in, c, NULL, NULL, MXML_DESCEND);
|
||||
|
||||
if (b) {
|
||||
/* ACS send ID parameter */
|
||||
b = mxmlWalkNext(b, session->tree_in, MXML_DESCEND_FIRST);
|
||||
if (!b || mxmlGetType(b) != MXML_OPAQUE || !mxmlGetOpaque(b))
|
||||
return 0;
|
||||
snprintf(c, sizeof(c), "%s", mxmlGetOpaque(b));
|
||||
|
||||
b = mxmlFindElement(session->tree_out, session->tree_out, "cwmp:ID", NULL, NULL, MXML_DESCEND);
|
||||
if (!b)
|
||||
return -1;
|
||||
|
||||
b = mxmlNewOpaque(b, c);
|
||||
if (!b)
|
||||
return -1;
|
||||
} else {
|
||||
/* ACS does not send ID parameter */
|
||||
int r = xml_set_cwmp_id(session);
|
||||
return r;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
const char *get_node_tab_space(mxml_node_t *node)
|
||||
{
|
||||
static char tab_space[10 * sizeof(CWMP_MXML_TAB_SPACE) + 1];
|
||||
int count = 0;
|
||||
|
||||
memset(tab_space, 0, sizeof(tab_space));
|
||||
while ((node = mxmlGetParent(node))) {
|
||||
count = count + 1;
|
||||
}
|
||||
|
||||
if (count) {
|
||||
snprintf(tab_space, sizeof(tab_space), "%*s", (int)(count * sizeof(CWMP_MXML_TAB_SPACE)), "");
|
||||
}
|
||||
|
||||
return tab_space;
|
||||
}
|
||||
|
||||
const char *whitespace_cb(mxml_node_t *node, int where __attribute__((unused)))
|
||||
{
|
||||
if (mxmlGetType(node) != MXML_ELEMENT)
|
||||
return NULL;
|
||||
|
||||
switch (where) {
|
||||
case MXML_WS_BEFORE_CLOSE:
|
||||
if (mxmlGetFirstChild(node) && mxmlGetType(mxmlGetFirstChild(node)) != MXML_ELEMENT)
|
||||
return NULL;
|
||||
|
||||
return get_node_tab_space(node);
|
||||
case MXML_WS_BEFORE_OPEN:
|
||||
if (where == MXML_WS_BEFORE_CLOSE && mxmlGetFirstChild(node) && mxmlGetType(mxmlGetFirstChild(node)) != MXML_ELEMENT)
|
||||
return NULL;
|
||||
|
||||
return get_node_tab_space(node);
|
||||
case MXML_WS_AFTER_OPEN:
|
||||
return ((mxmlGetFirstChild(node) == NULL || mxmlGetType(mxmlGetFirstChild(node)) == MXML_ELEMENT) ? "\n" : NULL);
|
||||
case MXML_WS_AFTER_CLOSE:
|
||||
return "\n";
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
char *xml_get_cwmp_version(int version)
|
||||
{
|
||||
static char versions[60];
|
||||
unsigned pos = 0;
|
||||
int k;
|
||||
|
||||
versions[0] = '\0';
|
||||
for (k = 0; k < version; k++) {
|
||||
pos += snprintf(&versions[pos], sizeof(versions) - pos, "1.%d, ", k);
|
||||
}
|
||||
|
||||
if (pos)
|
||||
versions[pos - 2] = 0;
|
||||
|
||||
return versions;
|
||||
}
|
||||
|
||||
static int xml_prepare_lwnotifications(mxml_node_t *parameter_list)
|
||||
{
|
||||
mxml_node_t *b, *n;
|
||||
|
||||
struct list_head *p;
|
||||
struct cwmp_dm_parameter *lw_notification;
|
||||
list_for_each (p, &list_lw_value_change) {
|
||||
lw_notification = list_entry(p, struct cwmp_dm_parameter, list);
|
||||
|
||||
n = mxmlNewElement(parameter_list, "Param");
|
||||
if (!n)
|
||||
goto error;
|
||||
|
||||
b = mxmlNewElement(n, "Name");
|
||||
if (!b)
|
||||
goto error;
|
||||
|
||||
b = mxmlNewOpaque(b, lw_notification->name);
|
||||
if (!b)
|
||||
goto error;
|
||||
|
||||
b = mxmlNewElement(n, "Value");
|
||||
if (!b)
|
||||
goto error;
|
||||
#ifdef ACS_MULTI
|
||||
mxmlElementSetAttr(b, "xsi:type", lw_notification->type);
|
||||
#endif
|
||||
b = mxmlNewOpaque(b, lw_notification->value);
|
||||
if (!b)
|
||||
goto error;
|
||||
}
|
||||
return 0;
|
||||
|
||||
error:
|
||||
return -1;
|
||||
}
|
||||
|
||||
int xml_prepare_lwnotification_message(char **msg_out)
|
||||
{
|
||||
mxml_node_t *lw_tree;
|
||||
|
||||
load_notification_xml_schema(&lw_tree);
|
||||
if (!lw_tree)
|
||||
goto error;
|
||||
|
||||
*msg_out = mxmlSaveAllocString(lw_tree, whitespace_cb);
|
||||
|
||||
mxmlDelete(lw_tree);
|
||||
return 0;
|
||||
|
||||
error:
|
||||
return -1;
|
||||
}
|
||||
|
||||
void load_notification_xml_schema(mxml_node_t **tree)
|
||||
{
|
||||
char declaration[1024] = {0};
|
||||
struct cwmp *cwmp = &cwmp_main;
|
||||
struct config *conf;
|
||||
conf = &(cwmp->conf);
|
||||
char *c = NULL;
|
||||
|
||||
if (tree == NULL)
|
||||
return;
|
||||
|
||||
*tree = NULL;
|
||||
|
||||
snprintf(declaration, sizeof(declaration), "?xml version=\"1.0\" encoding=\"UTF-8\"?");
|
||||
mxml_node_t *xml = mxmlNewElement(NULL, declaration);
|
||||
if (xml == NULL)
|
||||
return;
|
||||
|
||||
mxml_node_t *notification = mxmlNewElement(xml, "Notification");
|
||||
if (notification == NULL) {
|
||||
MXML_DELETE(xml);
|
||||
return;
|
||||
}
|
||||
|
||||
mxmlElementSetAttr(notification, "xmlns", "urn:broadband-forum-org:cwmp:lwnotif-1-0");
|
||||
mxmlElementSetAttr(notification, "xmlns:xs", xsd_url);
|
||||
mxmlElementSetAttr(notification, "xmlns:xsi", xsi_url);
|
||||
mxmlElementSetAttr(notification, "xsi:schemaLocation", "urn:broadband-forum-org:cwmp:lxnotif-1-0 http://www.broadband-forum.org/cwmp/cwmp-UDPLightweightNotification-1-0.xsd");
|
||||
|
||||
mxml_node_t *ts = mxmlNewElement(notification, "TS");
|
||||
if (ts == NULL) {
|
||||
MXML_DELETE(xml);
|
||||
return;
|
||||
}
|
||||
|
||||
if (cwmp_asprintf(&c, "%ld", time(NULL)) == -1) {
|
||||
MXML_DELETE(xml);
|
||||
return;
|
||||
}
|
||||
|
||||
if (NULL == mxmlNewOpaque(ts, c)) {
|
||||
FREE(c);
|
||||
MXML_DELETE(xml);
|
||||
return;
|
||||
}
|
||||
|
||||
FREE(c);
|
||||
|
||||
mxml_node_t *un = mxmlNewElement(notification, "UN");
|
||||
if (un == NULL) {
|
||||
MXML_DELETE(xml);
|
||||
return;
|
||||
}
|
||||
|
||||
if (NULL == mxmlNewOpaque(un, conf->acs_userid)) {
|
||||
MXML_DELETE(xml);
|
||||
return;
|
||||
}
|
||||
|
||||
mxml_node_t *cn = mxmlNewElement(notification, "CN");
|
||||
if (cn == NULL) {
|
||||
MXML_DELETE(xml);
|
||||
return;
|
||||
}
|
||||
|
||||
c = (char *)calculate_lwnotification_cnonce();
|
||||
if (!c) {
|
||||
MXML_DELETE(xml);
|
||||
return;
|
||||
}
|
||||
|
||||
if (NULL == mxmlNewOpaque(cn, c)) {
|
||||
FREE(c);
|
||||
MXML_DELETE(xml);
|
||||
return;
|
||||
}
|
||||
|
||||
FREE(c);
|
||||
|
||||
mxml_node_t *oui = mxmlNewElement(notification, "OUI");
|
||||
if (oui == NULL) {
|
||||
MXML_DELETE(xml);
|
||||
return;
|
||||
}
|
||||
|
||||
if (NULL == mxmlNewOpaque(oui, cwmp->deviceid.oui)) {
|
||||
MXML_DELETE(xml);
|
||||
return;
|
||||
}
|
||||
|
||||
mxml_node_t *pclass = mxmlNewElement(notification, "ProductClass");
|
||||
if (pclass == NULL) {
|
||||
MXML_DELETE(xml);
|
||||
return;
|
||||
}
|
||||
|
||||
if (NULL == mxmlNewOpaque(pclass, cwmp->deviceid.productclass ? cwmp->deviceid.productclass : "")) {
|
||||
MXML_DELETE(xml);
|
||||
return;
|
||||
}
|
||||
|
||||
mxml_node_t *slno = mxmlNewElement(notification, "SerialNumber");
|
||||
if (slno == NULL) {
|
||||
MXML_DELETE(xml);
|
||||
return;
|
||||
}
|
||||
|
||||
if (NULL == mxmlNewOpaque(slno, cwmp->deviceid.serialnumber ? cwmp->deviceid.serialnumber : "")) {
|
||||
MXML_DELETE(xml);
|
||||
return;
|
||||
}
|
||||
|
||||
if (xml_prepare_lwnotifications(notification)) {
|
||||
MXML_DELETE(xml);
|
||||
return;
|
||||
}
|
||||
|
||||
*tree = xml;
|
||||
}
|
||||
|
||||
void load_response_xml_schema(mxml_node_t **schema)
|
||||
{
|
||||
char declaration[1024] = {0};
|
||||
|
||||
if (schema == NULL)
|
||||
return;
|
||||
|
||||
*schema = NULL;
|
||||
|
||||
snprintf(declaration, sizeof(declaration), "?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?");
|
||||
mxml_node_t *xml = mxmlNewElement(NULL, declaration);
|
||||
if (xml == NULL)
|
||||
return;
|
||||
|
||||
mxml_node_t *envlp = mxmlNewElement(xml, "soap_env:Envelope");
|
||||
if (envlp == NULL) {
|
||||
MXML_DELETE(xml);
|
||||
return;
|
||||
}
|
||||
|
||||
mxmlElementSetAttr(envlp, "xmlns:soap_env", soap_env_url);
|
||||
mxmlElementSetAttr(envlp, "xmlns:soap_enc", soap_enc_url);
|
||||
mxmlElementSetAttr(envlp, "xmlns:xsd", xsd_url);
|
||||
mxmlElementSetAttr(envlp, "xmlns:xsi", xsi_url);
|
||||
|
||||
mxml_node_t *header = mxmlNewElement(envlp, "soap_env:Header");
|
||||
if (header == NULL) {
|
||||
MXML_DELETE(xml);
|
||||
return;
|
||||
}
|
||||
|
||||
mxml_node_t *id = mxmlNewElement(header, "cwmp:ID");
|
||||
if (id == NULL) {
|
||||
MXML_DELETE(xml);
|
||||
return;
|
||||
}
|
||||
|
||||
mxmlElementSetAttr(id, "soap_env:mustUnderstand", "1");
|
||||
|
||||
if (NULL == mxmlNewElement(envlp, "soap_env:Body")) {
|
||||
MXML_DELETE(xml);
|
||||
return;
|
||||
}
|
||||
|
||||
*schema = xml;
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue