lte/lapi/src/lapi_pdn.c (187 lines of code) (raw):

/**************************************************************************** * apps/lte/lapi/src/lapi_pdn.c * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. The * ASF licenses this file to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. * ****************************************************************************/ /**************************************************************************** * Included Files ****************************************************************************/ #include <nuttx/config.h> #include <stdio.h> #include <stdint.h> #include <errno.h> #include <sys/param.h> #include <nuttx/wireless/lte/lte_ioctl.h> #include "lte/lte_api.h" #include "lte/lapi.h" #include "lapi_dbg.h" /**************************************************************************** * Pre-processor Definitions ****************************************************************************/ /**************************************************************************** * Private Functions ****************************************************************************/ static int lte_activate_pdn_inparam_check(FAR lte_apn_setting_t *apn) { int32_t mask = 0; if (!apn) { lapi_printf("apn is null.\n"); return -EINVAL; } if ((!apn->apn) || (strnlen((char *)apn->apn, LTE_APN_LEN) >= LTE_APN_LEN)) { lapi_printf("apn is length overflow.\n"); return -EINVAL; } if ((apn->ip_type < LTE_IPTYPE_V4) || (apn->ip_type > LTE_IPTYPE_NON)) { lapi_printf("ip type is invalid. iptype=%d\n", apn->ip_type); return -EINVAL; } if ((apn->auth_type < LTE_APN_AUTHTYPE_NONE) || (apn->auth_type > LTE_APN_AUTHTYPE_CHAP)) { lapi_printf("auth type is invalid. authtype=%d\n", apn->auth_type); return -EINVAL; } if (apn->user_name && apn->password) { if (strnlen((FAR char *)apn->user_name, LTE_APN_USER_NAME_LEN) >= LTE_APN_USER_NAME_LEN) { lapi_printf("username is length overflow.\n"); return -EINVAL; } if (strnlen((FAR char *)apn->password, LTE_APN_PASSWD_LEN) >= LTE_APN_PASSWD_LEN) { lapi_printf("password is length overflow.\n"); return -EINVAL; } } else { if (apn->auth_type != LTE_APN_AUTHTYPE_NONE) { lapi_printf("authentication information is invalid.\n"); return -EINVAL; } } mask = (LTE_APN_TYPE_DEFAULT | LTE_APN_TYPE_MMS | LTE_APN_TYPE_SUPL | LTE_APN_TYPE_DUN | LTE_APN_TYPE_HIPRI | LTE_APN_TYPE_FOTA | LTE_APN_TYPE_IMS | LTE_APN_TYPE_CBS | LTE_APN_TYPE_IA | LTE_APN_TYPE_EMERGENCY); if (0 == (apn->apn_type & mask)) { lapi_printf("apn type is invalid. apntype=%08ld / mask=%08ld \n", apn->apn_type, mask); return -EINVAL; } return OK; } static int lte_deactivate_pdn_inparam_check(uint8_t session_id) { if (LTE_SESSION_ID_MIN > session_id || LTE_SESSION_ID_MAX < session_id) { lapi_printf("Invalid session id %d.\n", session_id); return -EINVAL; } return OK; } /**************************************************************************** * Public Functions ****************************************************************************/ /* Synchronous APIs */ int lte_activate_pdn_sync(FAR lte_apn_setting_t *apn, FAR lte_pdn_t *pdn) { int ret; int result; FAR void *inarg[] = { apn }; FAR void *outarg[] = { &result, pdn }; if (lte_activate_pdn_inparam_check(apn) || pdn == NULL) { return -EINVAL; } ret = lapi_req(LTE_CMDID_ACTPDN, (FAR void *)inarg, nitems(inarg), (FAR void *)outarg, nitems(outarg), NULL); if (ret == 0) { ret = result; } return ret; } int lte_deactivate_pdn_sync(uint8_t session_id) { int ret; int result; FAR void *inarg[] = { &session_id }; FAR void *outarg[] = { &result }; if (lte_deactivate_pdn_inparam_check(session_id)) { return -EINVAL; } ret = lapi_req(LTE_CMDID_DEACTPDN, (FAR void *)inarg, nitems(inarg), (FAR void *)outarg, nitems(outarg), NULL); if (ret == 0) { ret = result; } return ret; } /* Asynchronous APIs */ int lte_activate_pdn(FAR lte_apn_setting_t *apn, activate_pdn_cb_t callback) { FAR void *inarg[] = { apn }; if (callback == NULL) { return -EINVAL; } if (lte_activate_pdn_inparam_check(apn)) { return -EINVAL; } return lapi_req(LTE_CMDID_ACTPDN | LTE_CMDOPT_ASYNC_BIT, (FAR void *)inarg, nitems(inarg), NULL, 0, callback); } #ifdef CONFIG_LTE_LAPI_ENABLE_DEPRECATED_API int lte_deactivate_pdn(uint8_t session_id, deactivate_pdn_cb_t callback) { FAR void *inarg[] = { &session_id }; if (callback == NULL) { return -EINVAL; } if (lte_deactivate_pdn_inparam_check(session_id)) { return -EINVAL; } return lapi_req(LTE_CMDID_DEACTPDN | LTE_CMDOPT_ASYNC_BIT, (FAR void *)inarg, nitems(inarg), NULL, 0, callback); } #endif /* CONFIG_LTE_LAPI_ENABLE_DEPRECATED_API */ int lte_activate_pdn_cancel(void) { int ret; int result; FAR void *outarg[] = { &result }; ret = lapi_req(LTE_CMDID_ACTPDNCAN, NULL, 0, (FAR void *)outarg, nitems(outarg), NULL); if (ret == 0) { ret = result; } return ret; }