static int checkCommand(mpl_list_t *cmdMsg) { char *buf = NULL; int len; mpl_param_element_t *elem_p; mpl_list_t *check_result_list_p = NULL; mpl_pack_options_t options = MPL_PACK_OPTIONS_DEFAULT; const char *prompt = "Protocol error: "; options.force_field_pack_mode = true; elem_p = mpl_param_list_find(PERS_PARAM_ID(Req), cmdMsg); if (elem_p == NULL) { printf("%sno command\n", prompt); return -1; } if (personnel_checkBag_Req(elem_p, &check_result_list_p)) { len = mpl_param_list_pack_extended(check_result_list_p, NULL, 0, &options); buf = calloc(1, len + 1); strcat(buf, prompt); if (buf != NULL) { (void)mpl_param_list_pack_extended(check_result_list_p, buf, len+1, &options); printf("%s%s\n", prompt, buf); free(buf); } else { printf("%smemory error\n", prompt); } mpl_param_list_destroy(&check_result_list_p); return -1; } return 0; }
int main() { int client_tag = 1; int handle; char lan_device_p[] = "usb0"; char wan_device_p[] = "rmnet0"; char dns_server_p[] = "10.10.10.10"; printf("\n"); printf("#############\n"); printf("Starting test\n"); printf("#############\n"); if (initStecom() < 0) { printf("Failed to start stecom\n"); goto error; } TESTNOTNEG(sterc_init(NULL, &my_log_func)); printf("Test 1 - create\n"); { mpl_msg_t *request_p = NULL; mpl_msg_t resp; request_p = mpl_req_msg_alloc(STERC_PARAM_SET_ID); if (NULL == request_p) { printf("mpl_req_msg_alloc failed!\n"); goto error; } request_p->req.id = sterc_create; TESTNOTNEG(mpl_add_param_to_list(&request_p->req.param_list_p, sterc_paramid_lan_device, lan_device_p)); TESTNOTNEG(mpl_add_param_to_list(&request_p->req.param_list_p, sterc_paramid_wan_device, wan_device_p)); TESTNOTNEG(mpl_add_param_to_list(&request_p->req.param_list_p, sterc_paramid_wan_dns, dns_server_p)); TESTNOTNEG(mpl_add_param_to_list(&request_p->req.param_list_p, sterc_paramid_ct, &client_tag)); TESTNOTNEG(sendToStecomCtrl(request_p)); mpl_msg_free((mpl_msg_t *)request_p); TESTNOTNEG(waitAndReadStecomResp(&resp)); TESTBOOL(resp.common.type, sterc_msgtype_resp); TESTBOOL(resp.common.id, sterc_create); TESTBOOL(MPL_GET_PARAM_VALUE_FROM_LIST(int,sterc_paramid_ct,(resp.common.param_list_p)), client_tag); handle = MPL_GET_PARAM_VALUE_FROM_LIST(int,sterc_paramid_handle,(resp.common.param_list_p)); TESTBOOL(resp.resp.result, sterc_result_ok); mpl_param_list_destroy(&resp.common.param_list_p); } printf("Test 2 - set parameter req\n"); { mpl_msg_t *request_p = NULL; mpl_msg_t resp; memcpy(lan_device_p, "usb1\0", 5); request_p = mpl_req_msg_alloc(STERC_PARAM_SET_ID); if (NULL == request_p) { printf("mpl_req_msg_alloc failed!\n"); goto error; } request_p->req.id = sterc_set; TESTNOTNEG(mpl_add_param_to_list(&request_p->req.param_list_p, sterc_paramid_handle, &handle)); TESTNOTNEG(mpl_add_param_to_list(&request_p->req.param_list_p, sterc_paramid_lan_device, lan_device_p)); TESTNOTNEG(mpl_add_param_to_list(&request_p->req.param_list_p, sterc_paramid_ct, &client_tag)); TESTNOTNEG(sendToStecomCtrl(request_p)); mpl_msg_free((mpl_msg_t *)request_p); TESTNOTNEG(waitAndReadStecomResp(&resp)); TESTBOOL(resp.common.type, sterc_msgtype_resp); TESTBOOL(resp.common.id, sterc_set); TESTBOOL(MPL_GET_PARAM_VALUE_FROM_LIST(int,sterc_paramid_ct,(resp.common.param_list_p)), client_tag); TESTBOOL(resp.resp.result, sterc_result_ok); mpl_param_list_destroy(&resp.common.param_list_p); } printf("Test 3 - get parameter req\n"); { mpl_msg_t *request_p = NULL; mpl_msg_t resp; char* lan_device; mpl_param_element_t *param_element_p = NULL; request_p = mpl_req_msg_alloc(STERC_PARAM_SET_ID); if (NULL == request_p) { printf("mpl_req_msg_alloc failed!\n"); goto error; } request_p->req.id = sterc_get; TESTNOTNEG(mpl_add_param_to_list(&request_p->req.param_list_p, sterc_paramid_handle, &handle)); TESTNOTNEG(mpl_add_param_to_list(&request_p->req.param_list_p, sterc_paramid_lan_device, lan_device_p)); TESTNOTNEG(mpl_add_param_to_list(&request_p->req.param_list_p, sterc_paramid_ct, &client_tag)); TESTNOTNEG(sendToStecomCtrl(request_p)); mpl_msg_free((mpl_msg_t *)request_p); TESTNOTNEG(waitAndReadStecomResp(&resp)); TESTBOOL(resp.common.type, sterc_msgtype_resp); TESTBOOL(resp.common.id, sterc_get); TESTBOOL(MPL_GET_PARAM_VALUE_FROM_LIST(int,sterc_paramid_ct,(resp.common.param_list_p)), client_tag); param_element_p = mpl_param_list_find(sterc_paramid_lan_device, resp.common.param_list_p); if (param_element_p == NULL) { printf("Could not find lan device parameter in response\n"); goto error; } lan_device = (char*) param_element_p->value_p; TESTBOOL(strncmp(lan_device, lan_device_p, 5),0); TESTBOOL(resp.resp.result, sterc_result_ok); mpl_param_list_destroy(&resp.common.param_list_p); } printf("Test 4 - destroy req\n"); { mpl_msg_t *request_p = NULL; mpl_msg_t resp; request_p = mpl_req_msg_alloc(STERC_PARAM_SET_ID); if (NULL == request_p) { printf("mpl_req_msg_alloc failed!\n"); goto error; } request_p->req.id = sterc_destroy; TESTNOTNEG(mpl_add_param_to_list(&request_p->req.param_list_p, sterc_paramid_handle, &handle)); TESTNOTNEG(mpl_add_param_to_list(&request_p->req.param_list_p, sterc_paramid_ct, &client_tag)); TESTNOTNEG(sendToStecomCtrl(request_p)); mpl_msg_free((mpl_msg_t *)request_p); TESTNOTNEG(waitAndReadStecomResp(&resp)); TESTBOOL(resp.common.type, sterc_msgtype_resp); TESTBOOL(resp.common.id, sterc_destroy); TESTBOOL(MPL_GET_PARAM_VALUE_FROM_LIST(int,sterc_paramid_ct,(resp.common.param_list_p)), client_tag); TESTBOOL(resp.resp.result, sterc_result_ok); mpl_param_list_destroy(&resp.common.param_list_p); } printf("Test 5 - create without wan_device\n"); { mpl_msg_t *request_p = NULL; mpl_msg_t resp; request_p = mpl_req_msg_alloc(STERC_PARAM_SET_ID); if (NULL == request_p) { printf("mpl_req_msg_alloc failed!\n"); goto error; } request_p->req.id = sterc_create; TESTNOTNEG(mpl_add_param_to_list(&request_p->req.param_list_p, sterc_paramid_lan_device, lan_device_p)); TESTNOTNEG(mpl_add_param_to_list(&request_p->req.param_list_p, sterc_paramid_wan_dns, dns_server_p)); TESTNOTNEG(mpl_add_param_to_list(&request_p->req.param_list_p, sterc_paramid_ct, &client_tag)); TESTNOTNEG(sendToStecomCtrl(request_p)); mpl_msg_free((mpl_msg_t *)request_p); TESTNOTNEG(waitAndReadStecomResp(&resp)); TESTBOOL(resp.common.type, sterc_msgtype_resp); TESTBOOL(resp.common.id, sterc_create); TESTBOOL(resp.resp.result, sterc_result_failed_parameter_not_found); mpl_param_list_destroy(&resp.common.param_list_p); } closeStecom(); printf("#######################\n"); printf("Testing done, all pass!\n"); printf("#######################\n\n"); return 0; error: printf("##############\n"); printf("Testing failed\n"); printf("##############\n\n"); return -1; }
static bool psccclient_selector_callback_event(int fd, void *data_p) { psccclient_t *psccclient_p = (psccclient_t *)data_p; mpl_msg_event_t *event_p = NULL; exe_request_record_t *record_p = NULL; int conn_id = 0; bool in_iadb = false; exe_request_t request; bool event_processed = false; bool network_initiated = false; mpl_param_element_t *param_elem_p = NULL; int res; bool sterc_event = false; ATC_LOG_D("fd = %d, data_p = %p", fd, data_p); if (NULL == psccclient_p) { ATC_LOG_E("psccclient_p is NULL!"); goto exit; } if (psccclient_p->pscc_fd_event == fd) { event_p = mpl_req_msg_alloc(PSCC_PARAM_SET_ID); } else if (psccclient_p->sterc_fd_event == fd) { event_p = mpl_req_msg_alloc(STERC_PARAM_SET_ID); sterc_event = true; } else { ATC_LOG_E("invalid fd_request"); goto exit; } if (NULL == event_p) { ATC_LOG_E("mpl_event_msg_alloc failed!"); goto exit; } res = psccclient_receive_event(psccclient_p, event_p, sterc_event); if (res < 0) { ATC_LOG_E("receive_event failed!"); goto exit; } else if (res == 0) { /* Zero is returned if peer has closed the socket */ goto disconnect; } ATC_LOG_I("received event %d", event_p->id); if (PSCC_CT_PRESENT((pscc_msg_t *) event_p)) { /* The event included a client tag. * Concerns attach and detach. */ int client_tag = (int)PSCC_GET_CT((pscc_msg_t *) event_p); record_p = request_record_get_record_from_client_tag((int)PSCC_GET_CT((pscc_msg_t *) event_p)); ATC_LOG_I("Client Tag Present"); if (NULL == record_p) { ATC_LOG_E("could not find request record"); goto exit; } } else if (PSCC_CONNID_PRESENT((pscc_msg_t *) event_p)) { /* The event included a conn id. * Get the corresponding request from iadb. */ ATC_LOG_I("CONNID Present"); conn_id = get_connection_id(event_p); in_iadb = psccclient_iadb_get_at_ct_on_conn_id(conn_id, (int *)(&record_p)); if(in_iadb && (event_p->id == pscc_event_modified) && (NULL != record_p) && (EXE_CGCMOD != record_p->request_id)) { ATC_LOG_I("pscc_event_modified recvd and record_p->request_id = %d",record_p->request_id); network_initiated = true; } /* Even if there is a pscc call waiting for a return for a particular connid, there is a chance * that the event might be unsolicited. Currently only occurs for (network initiated) * disconnected events. In that case, handle it as unsolicited. */ if (in_iadb && event_p->id == pscc_event_disconnected) { param_elem_p = mpl_param_list_find(pscc_paramid_reason, event_p->param_list_p); if (param_elem_p != NULL && (pscc_reason_pdp_context_nw_deactivated == *(int *)(param_elem_p->value_p))) { ATC_LOG_I("nw initiated pscc_event_disconnected. Treat as unsolicited."); network_initiated = true; } else if (param_elem_p != NULL && (pscc_reason_pdp_context_nw_deactivated_reset == *(int *)(param_elem_p->value_p))) { ATC_LOG_I("nw initiated pscc_event_disconnected with reset indication. Treat as unsolicited."); network_initiated = true; } } if (NULL == record_p || !in_iadb || network_initiated) { #ifdef EXE_USE_ATC_CUSTOMER_EXTENSIONS /* Note: The extended event handler needs to return false if processing * is not complete and further processing is required by the generic * handler. Return true to prevent the generic handler from ever seeing * the event. */ event_processed = exe_extended_pscc_event_handler(psccclient_p, event_p, conn_id); #else event_processed = false; #endif ATC_LOG_I("Received unsolicited event not related to an outstanding request"); /* Unsolicited event not related to an outstanding request. */ if (!event_processed) { event_processed = exe_pscc_event_handler(psccclient_p, event_p, conn_id); if (!event_processed) { ATC_LOG_E("Unknown/Unhandled event! (%d)", event_p->id); } } goto exit; } } else if (STERC_HANDLE_PRESENT((pscc_msg_t *) event_p)) { int sterc_handle = (int)STERC_GET_HANDLE((pscc_msg_t *) event_p); in_iadb = psccclient_iadb_get_at_ct_on_sterc_handle(sterc_handle, (int *)(&record_p)); ATC_LOG_I("Sterc Handle Present"); if (in_iadb && event_p->id == sterc_event_disconnected) { param_elem_p = mpl_param_list_find(sterc_paramid_reason, event_p->param_list_p); if (param_elem_p != NULL) { ATC_LOG_I("Received sterc disconnect reason: (%d)", *(int *)(param_elem_p->value_p)); } } if (NULL == record_p || !in_iadb) { ATC_LOG_I("Received unsolicited event not related to an outstanding request with Sterc Handle Present"); /* Unsolicited event not related to an outstanding request. */ event_processed = exe_pscc_event_handler(psccclient_p, event_p, sterc_handle); if (!event_processed) { ATC_LOG_E("Received unknown sterc event! (%d)", event_p->id); } goto exit; } } else { /* No client tag and no connection id. */ ATC_LOG_E("No CT and no CONNID"); goto exit; } ATC_LOG_I("Setting event to record"); if (!psccclient_set_pscc_event_p(record_p, event_p)) { ATC_LOG_E("failed to set event_p to record!"); goto exit; } request = request_record_get_request(record_p); if (EXE_SUCCESS != request(record_p)) { ATC_LOG_E("request returned unsuccessfully, failed!"); } exit: mpl_msg_free((mpl_msg_t *)event_p); return true; /* Returning false will remove the fd from the selector. */ disconnect: ATC_LOG_E("********************************************************"); ATC_LOG_E("***** at_core lost contact with pscc daemon *****"); ATC_LOG_E("********************************************************"); mpl_msg_free((mpl_msg_t *)event_p); /* Do nothing. Let the receive socket callback clean-up. */ return false; /* Returning false will remove the fd from the selector. */ }