fix issue 8593

add http compression
fix log issue when log type is DEBUG
This commit is contained in:
Anis Ellouze 2016-02-11 19:34:43 +01:00
parent e2b34c2b6a
commit 1b32babf55
10 changed files with 127 additions and 28 deletions

View file

@ -17,6 +17,7 @@ icwmpd_SOURCES = \
../time.c \ ../time.c \
../ubus.c \ ../ubus.c \
../xml.c \ ../xml.c \
../zlib.c \
../dm/dmcwmp.c \ ../dm/dmcwmp.c \
../dm/dmentry.c \ ../dm/dmentry.c \
../dm/dmmem.c \ ../dm/dmmem.c \
@ -72,7 +73,8 @@ icwmpd_LDADD = \
$(LIBZSTREAM_LIBS) \ $(LIBZSTREAM_LIBS) \
$(LIBPTHREAD_LIBS) \ $(LIBPTHREAD_LIBS) \
$(LIBJSON_LIBS) \ $(LIBJSON_LIBS) \
$(LBLOBMSG_LIBS) $(LBLOBMSG_LIBS) \
$(LIBZ_LIBS)
icwmpd_CFLAGS+=-DCWMP_VERSION=\"$(CWMP_VERSION)\" icwmpd_CFLAGS+=-DCWMP_VERSION=\"$(CWMP_VERSION)\"
icwmpd_LDFLAGS+=-DCWMP_VERSION=\"$(CWMP_VERSION)\" icwmpd_LDFLAGS+=-DCWMP_VERSION=\"$(CWMP_VERSION)\"

View file

@ -495,6 +495,25 @@ int get_global_config(struct config *conf)
{ {
return error; return error;
} }
if((error = uci_get_value(UCI_ACS_COMPRESSION ,&value)) == CWMP_OK)
{
if(value != NULL)
{
if (0 == strcasecmp(value, "gzip")) {
conf->compression = COMP_GZIP;
} else if (0 == strcasecmp(value, "deflate")) {
conf->compression = COMP_DEFLATE;
} else {
conf->compression = COMP_NONE;
}
free(value);
value = NULL;
}
}
else
{
return error;
}
if((error = uci_get_value(UCI_ACS_SSL_CAPATH,&value)) == CWMP_OK) if((error = uci_get_value(UCI_ACS_SSL_CAPATH,&value)) == CWMP_OK)
{ {
if(value != NULL) if(value != NULL)

View file

@ -32,6 +32,8 @@ AM_PROG_CC_C_O
LIBPTHREAD_LIBS='-lpthread' LIBPTHREAD_LIBS='-lpthread'
AC_SUBST([LIBPTHREAD_LIBS]) AC_SUBST([LIBPTHREAD_LIBS])
LIBZ_LIBS='-lz'
AC_SUBST([LIBZ_LIBS])
case "$CFLAGS" in case "$CFLAGS" in
*_AADJ*) LIBJSON_LIBS='-ljson -ljson-c' ;; *_AADJ*) LIBJSON_LIBS='-ljson -ljson-c' ;;
*) LIBJSON_LIBS='-ljson' ;; *) LIBJSON_LIBS='-ljson' ;;

View file

@ -221,6 +221,34 @@ int set_management_server_connection_request_passwd(char *refparam, struct dmctx
return 0; return 0;
} }
int get_management_server_http_compression_supportted(char *refparam, struct dmctx *ctx, char **value)
{
*value = "GZIP,Deflate";
return 0;
}
int get_management_server_http_compression(char *refparam, struct dmctx *ctx, char **value)
{
dmuci_get_option_value_string("cwmp", "acs", "compression", value);
return 0;
}
int set_management_server_http_compression(char *refparam, struct dmctx *ctx, int action, char *value)
{
switch (action) {
case VALUECHECK:
if (0 == strcasecmp(value, "gzip") || 0 == strcasecmp(value, "deflate")) {
return 0;
}
return FAULT_9007;
case VALUESET:
dmuci_set_value("cwmp", "acs", "compression", value);
cwmp_set_end_session(END_SESSION_RELOAD);
return 0;
}
return 0;
}
int entry_method_root_ManagementServer(struct dmctx *ctx) int entry_method_root_ManagementServer(struct dmctx *ctx)
{ {
IF_MATCH(ctx, DMROOT"ManagementServer.") { IF_MATCH(ctx, DMROOT"ManagementServer.") {
@ -235,6 +263,8 @@ int entry_method_root_ManagementServer(struct dmctx *ctx)
DMPARAM("ConnectionRequestURL", ctx, "0", get_management_server_connection_request_url, NULL, NULL, 1, 0, 2, NULL); DMPARAM("ConnectionRequestURL", ctx, "0", get_management_server_connection_request_url, NULL, NULL, 1, 0, 2, NULL);
DMPARAM("ConnectionRequestUsername", ctx, "1", get_management_server_connection_request_username, set_management_server_connection_request_username, NULL, 0, 1, UNDEF, NULL); DMPARAM("ConnectionRequestUsername", ctx, "1", get_management_server_connection_request_username, set_management_server_connection_request_username, NULL, 0, 1, UNDEF, NULL);
DMPARAM("ConnectionRequestPassword", ctx, "1", get_empty, set_management_server_connection_request_passwd, NULL, 0, 1, UNDEF, NULL); DMPARAM("ConnectionRequestPassword", ctx, "1", get_empty, set_management_server_connection_request_passwd, NULL, 0, 1, UNDEF, NULL);
DMPARAM("HTTPCompressionSupported", ctx, "0", get_management_server_http_compression_supportted, NULL, NULL, 0, 1, UNDEF, NULL);
DMPARAM("HTTPCompression", ctx, "1", get_management_server_http_compression, set_management_server_http_compression, NULL, 0, 1, UNDEF, NULL);
return 0; return 0;
} }
return FAULT_9005; return FAULT_9005;

View file

@ -2219,7 +2219,7 @@ inline int entry_wandevice_wanprotocolconnection_instance(struct dmctx *ctx, cha
DMPARAM("X_BROADCOM_COM_FirewallEnabled", ctx, "1", get_interface_firewall_enabled_wanproto, set_interface_firewall_enabled_wanproto, "xsd:boolean", 0, 1, UNDEF, NULL); DMPARAM("X_BROADCOM_COM_FirewallEnabled", ctx, "1", get_interface_firewall_enabled_wanproto, set_interface_firewall_enabled_wanproto, "xsd:boolean", 0, 1, UNDEF, NULL);
DMPARAM("X_BROADCOM_COM_IGMPEnabled", ctx, "1", get_wan_ip_link_connection_igmp_enabled, set_wan_ip_link_connection_igmp_enabled, "xsd:boolean", 0, 1, UNDEF, NULL); DMPARAM("X_BROADCOM_COM_IGMPEnabled", ctx, "1", get_wan_ip_link_connection_igmp_enabled, set_wan_ip_link_connection_igmp_enabled, "xsd:boolean", 0, 1, UNDEF, NULL);
DMPARAM("DNSEnabled", ctx, "1", get_wan_ip_link_connection_dns_enabled, set_wan_ip_link_connection_dns_enabled, "xsd:boolean", 0, 1, UNDEF, NULL); DMPARAM("DNSEnabled", ctx, "1", get_wan_ip_link_connection_dns_enabled, set_wan_ip_link_connection_dns_enabled, "xsd:boolean", 0, 1, UNDEF, NULL);
DMPARAM("DNSOverrideAllowed", ctx, 0, get_empty, NULL, NULL, 0, 1, UNDEF, NULL); DMPARAM("DNSOverrideAllowed", ctx, "0", get_empty, NULL, NULL, 0, 1, UNDEF, NULL);
DMPARAM("Name", ctx, "1", get_wan_ip_link_connection_name, set_wan_ip_link_connection_connection_name, NULL, 0, 1, UNDEF, NULL); DMPARAM("Name", ctx, "1", get_wan_ip_link_connection_name, set_wan_ip_link_connection_connection_name, NULL, 0, 1, UNDEF, NULL);
DMOBJECT(DMROOT"WANDevice.%s.WANConnectionDevice.%s.WANIPConnection.%s.X_INTENO_COM_VLAN.", ctx, "1", 1, NULL, NULL, NULL, idev, iwan, iconp); DMOBJECT(DMROOT"WANDevice.%s.WANConnectionDevice.%s.WANIPConnection.%s.X_INTENO_COM_VLAN.", ctx, "1", 1, NULL, NULL, NULL, idev, iwan, iconp);
DMPARAM("VLANID", ctx, "1", get_wan_ip_link_connection_vid, set_wan_ip_link_connection_vid, "xsd:unsignedInt", 0, 1, UNDEF, NULL); DMPARAM("VLANID", ctx, "1", get_wan_ip_link_connection_vid, set_wan_ip_link_connection_vid, "xsd:unsignedInt", 0, 1, UNDEF, NULL);

51
http.c
View file

@ -22,7 +22,6 @@
#include <fcntl.h> #include <fcntl.h>
#include "cwmp.h" #include "cwmp.h"
#include "log.h" #include "log.h"
#include <libubox/uloop.h> #include <libubox/uloop.h>
#include <libubox/usock.h> #include <libubox/usock.h>
@ -74,16 +73,6 @@ http_client_init(struct cwmp *cwmp)
/* TODO debug ssl config from freecwmp*/ /* TODO debug ssl config from freecwmp*/
#ifdef HTTP_CURL #ifdef HTTP_CURL
http_c.header_list = NULL;
http_c.header_list = curl_slist_append(http_c.header_list, "User-Agent: cwmp");
if (!http_c.header_list) return -1;
http_c.header_list = curl_slist_append(http_c.header_list, "Content-Type: text/xml");
if (!http_c.header_list) return -1;
# ifdef ACS_FUSION
char *expect_header = "Expect:";
http_c.header_list = curl_slist_append(http_c.header_list, expect_header);
if (!http_c.header_list) return -1;
# endif /* ACS_FUSION */
curl = curl_easy_init(); curl = curl_easy_init();
if (!curl) return -1; if (!curl) return -1;
@ -155,7 +144,7 @@ http_get_response(void *buffer, size_t size, size_t rxed, char **msg_in)
#endif /* HTTP_CURL */ #endif /* HTTP_CURL */
int int
http_send_message(struct cwmp *cwmp, char *msg_out, char **msg_in) http_send_message(struct cwmp *cwmp, char *msg_out, int msg_out_len,char **msg_in)
{ {
#ifdef HTTP_CURL #ifdef HTTP_CURL
CURLcode res; CURLcode res;
@ -163,18 +152,38 @@ http_send_message(struct cwmp *cwmp, char *msg_out, char **msg_in)
static char *ip_acs = NULL; static char *ip_acs = NULL;
char *ip = NULL; char *ip = NULL;
char errbuf[CURL_ERROR_SIZE]; char errbuf[CURL_ERROR_SIZE];
http_c.header_list = NULL;
http_c.header_list = curl_slist_append(http_c.header_list, "User-Agent: inteno-cwmp");
if (!http_c.header_list) return -1;
http_c.header_list = curl_slist_append(http_c.header_list, "Content-Type: text/xml");
if (!http_c.header_list) return -1;
# ifdef ACS_FUSION
char *expect_header = "Expect:";
http_c.header_list = curl_slist_append(http_c.header_list, expect_header);
if (!http_c.header_list) return -1;
# endif /* ACS_FUSION */
curl_easy_setopt(curl, CURLOPT_URL, http_c.url); curl_easy_setopt(curl, CURLOPT_URL, http_c.url);
curl_easy_setopt(curl, CURLOPT_USERNAME, cwmp->conf.acs_userid); 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_PASSWORD, cwmp->conf.acs_passwd);
curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC|CURLAUTH_DIGEST); curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC|CURLAUTH_DIGEST);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, http_c.header_list);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, HTTP_TIMEOUT); curl_easy_setopt(curl, CURLOPT_TIMEOUT, HTTP_TIMEOUT);
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, HTTP_TIMEOUT); curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, HTTP_TIMEOUT);
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
switch (cwmp->conf.compression) {
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); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, msg_out);
if (msg_out) if (msg_out)
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long) strlen(msg_out)); curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long) msg_out_len);
else else
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, 0); curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, 0);
@ -225,18 +234,26 @@ http_send_message(struct cwmp *cwmp, char *msg_out, char **msg_in)
} }
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code); curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code);
if(http_code == 204) if(http_code == 204)
{ {
CWMP_LOG (INFO,"Receive HTTP 204 No Content"); CWMP_LOG (INFO,"Receive HTTP 204 No Content");
} }
if(http_code == 415)
{
cwmp->conf.compression = COMP_NONE;
goto error;
}
if (http_code != 200 && http_code != 204) if (http_code != 200 && http_code != 204)
goto error; goto error;
/* TODO add check for 301, 302 and 307 HTTP Redirect*/ /* TODO add check for 301, 302 and 307 HTTP Redirect*/
curl_easy_reset(curl); curl_easy_reset(curl);
if (http_c.header_list) {
curl_slist_free_all(http_c.header_list);
http_c.header_list = NULL;
}
if (res) goto error; if (res) goto error;
@ -281,6 +298,10 @@ http_send_message(struct cwmp *cwmp, char *msg_out, char **msg_in)
error: error:
FREE(*msg_in); FREE(*msg_in);
if (http_c.header_list) {
curl_slist_free_all(http_c.header_list);
http_c.header_list = NULL;
}
return -1; return -1;
} }

View file

@ -43,6 +43,7 @@
#define UCI_ACS_SSL_CAPATH "cwmp.acs.ssl_capath" #define UCI_ACS_SSL_CAPATH "cwmp.acs.ssl_capath"
#define UCI_ACS_INSECURE_ENABLE "cwmp.acs.insecure_enable" #define UCI_ACS_INSECURE_ENABLE "cwmp.acs.insecure_enable"
#define UCI_ACS_SSL_VERSION "cwmp.acs.ssl_version" #define UCI_ACS_SSL_VERSION "cwmp.acs.ssl_version"
#define UCI_ACS_COMPRESSION "cwmp.acs.compression"
#define UCI_LOG_SEVERITY_PATH "cwmp.cpe.log_severity" #define UCI_LOG_SEVERITY_PATH "cwmp.cpe.log_severity"
#define UCI_CPE_USERID_PATH "cwmp.cpe.userid" #define UCI_CPE_USERID_PATH "cwmp.cpe.userid"
#define UCI_CPE_PASSWD_PATH "cwmp.cpe.passwd" #define UCI_CPE_PASSWD_PATH "cwmp.cpe.passwd"
@ -106,6 +107,11 @@ enum event_idx_enum {
EVENT_IDX_M_Upload, EVENT_IDX_M_Upload,
__EVENT_IDX_MAX __EVENT_IDX_MAX
}; };
enum http_compression {
COMP_NONE,
COMP_GZIP,
COMP_DEFLATE
};
typedef struct event_container { typedef struct event_container {
struct list_head list; struct list_head list;
@ -137,6 +143,7 @@ typedef struct config {
char *ubus_socket; char *ubus_socket;
int connection_request_port; int connection_request_port;
int period; int period;
int compression;
time_t time; time_t time;
bool periodic_enable; bool periodic_enable;
bool insecure_enable; bool insecure_enable;
@ -248,5 +255,6 @@ void connection_request_port_value_change(struct cwmp *cwmp, int port);
void add_dm_parameter_tolist(struct list_head *head, char *param_name, char *param_data, char *param_type); void add_dm_parameter_tolist(struct list_head *head, char *param_name, char *param_data, char *param_type);
void cwmp_set_end_session (unsigned int end_session_flag); void cwmp_set_end_session (unsigned int end_session_flag);
void *thread_handle_notify(void *v); void *thread_handle_notify(void *v);
int zlib_compress (char *message, unsigned char **zmsg, int *zlen, int type);
#endif /* _CWMP_H__ */ #endif /* _CWMP_H__ */

View file

@ -47,7 +47,7 @@ static size_t http_get_response(void *buffer, size_t size, size_t rxed, char **m
int http_client_init(struct cwmp *cwmp); int http_client_init(struct cwmp *cwmp);
void http_client_exit(void); void http_client_exit(void);
int http_send_message(struct cwmp *cwmp, char *msg_out, char **msg_in); 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_init(void);
void http_server_listen(void); void http_server_listen(void);

16
log.c
View file

@ -89,9 +89,8 @@ int log_set_on_file(char *value)
void puts_log(int severity, const char *fmt, ...) void puts_log(int severity, const char *fmt, ...)
{ {
va_list args; va_list args;
int buflen = 1024;
int i; int i;
char buf[1024];
char buf_file[1024];
time_t t; time_t t;
struct tm *Tm; struct tm *Tm;
struct timeval tv; struct timeval tv;
@ -104,6 +103,12 @@ void puts_log(int severity, const char *fmt, ...)
{ {
return; return;
} }
if (severity == DEBUG)
{
buflen = 512000;
}
char buf[buflen];
char buf_file[buflen];
gettimeofday(&tv, 0); gettimeofday(&tv, 0);
t = time((time_t*)NULL); t = time((time_t*)NULL);
@ -116,15 +121,13 @@ void puts_log(int severity, const char *fmt, ...)
Tm->tm_min, Tm->tm_min,
Tm->tm_sec, Tm->tm_sec,
SEVERITY_NAMES[severity]); SEVERITY_NAMES[severity]);
if(strlen(log_file_name) == 0) if(strlen(log_file_name) == 0)
{ {
strcpy(log_file_name,DEFAULT_LOG_FILE_NAME); strcpy(log_file_name,DEFAULT_LOG_FILE_NAME);
} }
if(enable_log_file) if(enable_log_file)
{ {
pthread_mutex_lock (&mutex_log); pthread_mutex_lock (&mutex_log);
if (stat(log_file_name, &st) == 0) if (stat(log_file_name, &st) == 0)
{ {
size = st.st_size; size = st.st_size;
@ -140,12 +143,11 @@ void puts_log(int severity, const char *fmt, ...)
pLog = fopen(log_file_name,"a+"); pLog = fopen(log_file_name,"a+");
} }
} }
va_start(args, fmt); va_start(args, fmt);
i += vsprintf(buf+i, fmt, args); i += vsprintf(buf+i, fmt, args);
if(enable_log_file) if(enable_log_file)
{ {
sprintf(buf_file,"%s\n",buf); sprintf(buf_file,"%s\n",buf);
fputs (buf_file, pLog); fputs (buf_file, pLog);
} }
va_end(args); va_end(args);

21
xml.c
View file

@ -168,16 +168,31 @@ void xml_exit(void)
int xml_send_message(struct cwmp *cwmp, struct session *session, struct rpc *rpc) int xml_send_message(struct cwmp *cwmp, struct session *session, struct rpc *rpc)
{ {
char *s, *c, *msg_out = NULL, *msg_in = NULL; char *s, *c, *msg_out = NULL, *msg_in = NULL;
int f, r = 0; int msg_out_len = 0, f, r = 0;
mxml_node_t *b; mxml_node_t *b;
if (session->tree_out) if (session->tree_out) {
unsigned char *zmsg_out;
msg_out = mxmlSaveAllocString(session->tree_out, whitespace_cb); msg_out = mxmlSaveAllocString(session->tree_out, whitespace_cb);
CWMP_LOG(DEBUG,"Message OUT \n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n%s\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",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) { while (1) {
f = 0; f = 0;
if (http_send_message(cwmp, msg_out, &msg_in)) if (http_send_message(cwmp, msg_out, msg_out_len,&msg_in)) {
goto error; goto error;
}
if (msg_in) { if (msg_in) {
CWMP_LOG(DEBUG,"Message IN \n<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n%s\n<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<",msg_in);
if (s = strstr(msg_in, "<FaultCode>")) if (s = strstr(msg_in, "<FaultCode>"))
sscanf(s, "<FaultCode>%d</FaultCode>",&f); sscanf(s, "<FaultCode>%d</FaultCode>",&f);
if (f) { if (f) {