int cwmp_worker_thread_init(cwmp_t * cwmp, int num, size_t size) { int err; cwmp_max_threads = num; err = pthread_attr_init(&cwmp_worker_thread_attr); if (err != 0) { cwmp_log_error("pthread_attr_init() failed"); return CWMP_ERROR; } err = pthread_attr_setstacksize(&cwmp_worker_thread_attr, size); if (err != 0) { cwmp_log_error("pthread_attr_setstacksize() failed"); return CWMP_ERROR; } cwmp_worker_threaded = 1; return CWMP_OK; }
void queue_push(queue_t *q, void * data, int type) { qnode_t *node; node = (qnode_t *)MALLOC(sizeof(qnode_t)); if(node == NULL) { cwmp_log_error("malloc null"); return ; } node->data = data; node->arg1 = NULL; node->arg2 = NULL; node->datatype = type; node->priority = QUEUE_PRIORITY_COMMON; node->next = NULL; pthread_mutex_lock(&q->mutex); q->size += 1; if(q->first==NULL) { q->first = node; q->last = node; } else { q->last->next = node; q->last = node; } pthread_mutex_unlock(& q->mutex); }
void initialize(void) { cwmp_log_init(NULL, CWMP_LOG_DEBUG); gpool = (pool_t*)pool_create(POOL_DEFAULT_SIZE); gcwmp = (cwmp_t*)pool_palloc(gpool, sizeof(cwmp_t)); if(!gcwmp) { cwmp_log_error("create cwmp_t error!"); exit(-1); } cwmp_log_debug("cwmp at %p", gcwmp); if(!gcwmp->pool) { cwmp_log_debug("cwmp pool at %p", gpool); gcwmp->pool = gpool; } cwmp_model_load_xml(gcwmp, "device.xml", NULL, 0); char * envstr; char * encstr; envstr = "SOAP-ENV"; //cwmp_conf_get("cwmp:soap_env"); encstr = "SOAP-ENC"; // cwmp_conf_get("cwmp:soap_enc"); cwmp_set_envelope_ns(envstr, encstr); }
int cwmp_conf_open(const char * filename) { FUNCTION_TRACE(); cwmp_conf_handle = malloc(sizeof(cwmp_conf_handle)); if (!cwmp_conf_handle) { cwmp_log_error("conf malloc faild.\n"); return CWMP_ERROR; } cwmp_conf_handle->filename = TRstrdup(filename); return CWMP_OK; }
void cwmp_agent_session(cwmp_t * cwmp) { char name[1024] = {0}; char value[1024]= {0}; char local_ip[32]; char * envstr; char * encstr; envstr = "SOAP-ENV"; //cwmp_conf_get("cwmp:soap_env"); encstr = "SOAP-ENC"; // cwmp_conf_get("cwmp:soap_enc"); cwmp_set_envelope_ns(envstr, encstr); if (cwmp_session_get_localip(local_ip) == -1) { cwmp_log_error("get local ip error. exited.\n"); exit(-1); } print_param(cwmp->root, 0); CWMP_SPRINTF_PARAMETER_NAME(name, 3, InternetGatewayDeviceModule, ManagementServerModule, URLModule); cwmp_data_set_parameter_value(cwmp, cwmp->root, name, cwmp->acs_url, TRstrlen(cwmp->acs_url), cwmp->pool); CWMP_SPRINTF_PARAMETER_NAME(name, 3, InternetGatewayDeviceModule, ManagementServerModule, ConnectionRequestURLModule); TRsnprintf(value, 1024, "http://%s:%d", local_ip, cwmp->httpd_port); cwmp_data_set_parameter_value(cwmp, cwmp->root, name, value, TRstrlen(value), cwmp->pool); CWMP_SPRINTF_PARAMETER_NAME(name, 3, InternetGatewayDeviceModule, DeviceInfoModule, ManufacturerModule); cwmp_data_set_parameter_value(cwmp, cwmp->root, name, cwmp->cpe_mf, TRstrlen(cwmp->cpe_mf), cwmp->pool); CWMP_SPRINTF_PARAMETER_NAME(name, 3, InternetGatewayDeviceModule, DeviceInfoModule, ManufacturerOUIModule); cwmp_data_set_parameter_value(cwmp, cwmp->root, name, cwmp->cpe_oui, TRstrlen(cwmp->cpe_oui), cwmp->pool); CWMP_SPRINTF_PARAMETER_NAME(name, 3, InternetGatewayDeviceModule, DeviceInfoModule, ProductClassModule); cwmp_data_set_parameter_value(cwmp, cwmp->root, name, cwmp->cpe_pc, TRstrlen(cwmp->cpe_pc), cwmp->pool); CWMP_SPRINTF_PARAMETER_NAME(name, 3, InternetGatewayDeviceModule, DeviceInfoModule, SerialNumberModule); cwmp_data_set_parameter_value(cwmp, cwmp->root, name, cwmp->cpe_sn, TRstrlen(cwmp->cpe_sn), cwmp->pool); cwmp_agent_start_session(cwmp); }
void queue_add(queue_t *q, void * data, int type, int priority, void * arg1, void *arg2) { qnode_t *node; node = (qnode_t *)MALLOC(sizeof(qnode_t)); if(node == NULL) { cwmp_log_error("malloc null"); return ; } node->data = data; node->arg1 = arg1; node->arg2 = arg2; node->datatype = type; node->priority = priority; node->next = NULL; pthread_mutex_lock(&q->mutex); q->size += 1; if(q->first==NULL) { q->first = node; q->last = node; } else { qnode_t * first = q->first; if(priority >= first->priority) { node->next = first->next; q->first = node; } else { q->last->next = node; q->last = node; } } pthread_mutex_unlock(& q->mutex); }
void cwmp_agent_start_session(cwmp_t * cwmp) { int rv; cwmp_session_t * session; int session_close = CWMP_NO; xmldoc_t * newdoc; FUNCTION_TRACE(); event_list_t *evtlist; while (TRUE) { if (cwmp->new_request == CWMP_NO) { cwmp_log_debug("No new request from ACS\n"); sleep(2); //cwmp->new_request = CWMP_YES; continue; } cwmp_log_debug("New request from ACS\n"); cwmp->new_request = CWMP_NO; session = cwmp_session_create(cwmp); session_close = CWMP_NO; session->timeout = cwmp_conf_get_int("cwmpd:http_timeout"); //cwmp_session_set_timeout(cwmp_conf_get_int("cwmpd:http_timeout")); cwmp_log_debug("session timeout is %d", session->timeout); cwmp_session_open(session); while (!session_close) { //cwmp_log_debug("session status: %d", session->status); switch (session->status) { case CWMP_ST_START: //create a new connection to acs cwmp_log_debug("session stutus: New START\n"); if (cwmp_session_connect(session, cwmp->acs_url) != CWMP_OK) { cwmp_log_error("connect to acs: %s failed.\n", cwmp->acs_url); session->status = CWMP_ST_RETRY; } else { session->status = CWMP_ST_INFORM; } break; case CWMP_ST_INFORM: evtlist = NULL; cwmp_log_debug("session stutus: INFORM\n"); cwmp_agent_get_active_event(cwmp, session, & evtlist); if(evtlist != NULL) { cwmp_event_clear_active(cwmp); } cwmp_log_debug("session stutus: INFORM2\n"); if (cwmp->acs_auth) { cwmp_session_set_auth(session, cwmp->acs_user , cwmp->acs_pwd ); } cwmp_log_debug("session stutus: INFORM3\n"); newdoc = cwmp_session_create_inform_message(session, evtlist, session->envpool); cwmp_write_doc_to_chunk(newdoc, session->writers, session->envpool); session->last_method = CWMP_INFORM_METHOD; session->status = CWMP_ST_SEND; break; case CWMP_ST_SEND: cwmp_log_debug("session stutus: SEND"); cwmp_log_debug("session data request length: %d", cwmp_chunk_length(session->writers)); session->newdata = CWMP_NO; rv = cwmp_agent_send_request(session); if (rv == CWMP_OK) { cwmp_log_debug("session data sended OK, rv=%d", rv); session->status = CWMP_ST_RECV; } else { cwmp_log_debug("session data sended faild! rv=%d", rv); session->status = CWMP_ST_EXIT; /* if (rv == CWMP_COULDNOT_CONNECT) { session->status = CWMP_ST_RETRY; } else { session->status = CWMP_ST_EXIT; } */ } break; case CWMP_ST_RECV: cwmp_log_debug("session stutus: RECV"); cwmp_chunk_clear(session->readers); rv = cwmp_agent_recv_response(session); if (rv == CWMP_OK) { session->status = CWMP_ST_ANSLYSE; } else { session->status = CWMP_ST_END; } break; case CWMP_ST_ANSLYSE: cwmp_log_debug("session stutus: ANSLYSE"); rv = cwmp_agent_analyse_session(session); if (rv == CWMP_OK) { session->status = CWMP_ST_SEND; } else { session->status = CWMP_ST_END; } break; case CWMP_ST_RETRY: cwmp_log_debug("session stutus: RETRY"); if (cwmp_agent_retry_session(session) == CWMP_TIMEOUT) { cwmp_log_debug("session retry timeover, go out"); session->status = CWMP_ST_EXIT; } else { session->status = CWMP_ST_START; } break; case CWMP_ST_END: //close connection of ACS cwmp_log_debug("session stutus: END"); //run task from queue if (session->newdata == CWMP_YES) { session->status = CWMP_ST_SEND; } else { session->status = CWMP_ST_EXIT; } break; case CWMP_ST_EXIT: cwmp_log_debug("session stutus: EXIT"); cwmp_session_close(session); if (session->reconnect == CWMP_YES) { session->reconnect = CWMP_NO; session->status = CWMP_ST_START; break; } session_close = CWMP_YES; break; default: cwmp_log_debug("Unknown session stutus"); break; }//end switch }//end while(!session_close) cwmp_log_debug("session stutus: EXIT"); cwmp_session_free(session); session = NULL; int newtaskres = cwmp_agent_run_tasks(cwmp); if(newtaskres == CWMP_YES) { cwmp->new_request = CWMP_YES; } }//end while(TRUE) }