nuttx-apps/lte/alt1250/usock_handlers/alt1250_ioctl_lwm2m.c
SPRESENSE 4a9b3a5881 lte: Add usrsock daemon for ALT1250 LTE modem
Add usrsock daemon for ALT1250 LTE modem.
2023-06-07 01:51:33 +08:00

965 lines
31 KiB
C

/****************************************************************************
* apps/lte/alt1250/usock_handlers/alt1250_ioctl_lwm2m.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 <nuttx/net/usrsock.h>
#include <stdlib.h>
#include <string.h>
#include "alt1250_dbg.h"
#include "alt1250_container.h"
#include "alt1250_atcmd.h"
#include "alt1250_ioctl_subhdlr.h"
#include "alt1250_usrsock_hdlr.h"
#include <lte/lte_lwm2m.h>
/****************************************************************************
* Private Functions
****************************************************************************/
/****************************************************************************
* name: atcmdreply_getepname
****************************************************************************/
static int atcmdreply_getepname(FAR struct alt1250_s *dev,
FAR struct alt_container_s *reply,
FAR char *rdata, int len, unsigned long arg,
FAR int32_t *usock_result)
{
char *name;
void **param = (void **)arg;
char *outbuf = (char *)param[0];
int outbuflen = (int)param[1];
*usock_result = check_atreply_ok(rdata, len, NULL);
if (*usock_result == OK)
{
name = strtok_r(rdata, " \r\n", &rdata);
if (name)
{
memset(outbuf, 0, outbuflen);
strncpy(outbuf, name, outbuflen);
*usock_result = outbuf[outbuflen - 1] == 0
? strlen(outbuf) : outbuflen;
}
}
return REP_SEND_ACK;
}
/****************************************************************************
* name: strcpy_until
****************************************************************************/
static char strcpy_until(char *dst, int n, char **src, char *delim)
{
char *tmp = *src;
if (dst)
{
dst[n - 1] = '\0';
n--;
}
while (*tmp && !strchr(delim, *tmp))
{
if (dst && (n > 0))
{
*dst++ = *tmp;
n--;
}
tmp++;
}
if (dst && (n > 0))
{
*dst = '\0';
}
*src = tmp + 1;
return *tmp;
}
/****************************************************************************
* name: atcmdreply_getsrvinfo_step4
****************************************************************************/
static int atcmdreply_getsrvinfo_step4(FAR struct alt1250_s *dev,
FAR struct alt_container_s *reply,
FAR char *rdata, int len, unsigned long arg,
FAR int32_t *usock_result)
{
char *tmp;
int ret = REP_SEND_ACK;
FAR struct lwm2mstub_serverinfo_s *info
= (FAR struct lwm2mstub_serverinfo_s *)(((void **)arg)[0]);
*usock_result = -EIO;
if (check_atreply_ok(rdata, len, NULL) == OK)
{
info->object_inst = 0;
if ((tmp = strstr(rdata, "%LWM2MCMD: ")) != NULL)
{
tmp += strlen("%LWM2MCMD: ");
info->nonip = strstr(tmp, "\"N\"") ? true : false;
*usock_result = 0;
}
}
return ret;
}
/****************************************************************************
* name: atcmdreply_getsrvinfo_step3
****************************************************************************/
static int atcmdreply_getsrvinfo_step3(FAR struct alt1250_s *dev,
FAR struct alt_container_s *reply,
FAR char *rdata, int len, unsigned long arg,
FAR int32_t *usock_result)
{
char *tmp;
int ret = REP_SEND_ACK;
FAR struct lwm2mstub_serverinfo_s *info
= (FAR struct lwm2mstub_serverinfo_s *)(((void **)arg)[0]);
*usock_result = -EIO;
if (check_atreply_ok(rdata, len, NULL) == OK)
{
info->object_inst = 0;
if ((tmp = strstr(rdata, "%LWM2MCMD: ")) != NULL)
{
tmp += strlen("%LWM2MCMD: ");
strcpy_until(NULL, 0, &tmp, ",");
strcpy_until(NULL, 0, &tmp, ",");
strcpy_until(NULL, 0, &tmp, ",");
strcpy_until(NULL, 0, &tmp, ",");
info->security_mode = atoi(tmp);
ret = lwm2mstub_send_getresource(dev, reply,
CONTAINER_SOCKETID(reply),
atcmdreply_getsrvinfo_step4,
arg, usock_result, "1,0,22");
}
}
return ret;
}
/****************************************************************************
* name: atcmdreply_getsrvinfo_step2
****************************************************************************/
static int atcmdreply_getsrvinfo_step2(FAR struct alt1250_s *dev,
FAR struct alt_container_s *reply,
FAR char *rdata, int len, unsigned long arg,
FAR int32_t *usock_result)
{
char *tmp;
int ret = REP_SEND_ACK;
FAR struct lwm2mstub_serverinfo_s *info
= (FAR struct lwm2mstub_serverinfo_s *)(((void **)arg)[0]);
*usock_result = -EIO;
if (check_atreply_ok(rdata, len, NULL) == OK)
{
info->object_inst = 0;
if ((tmp = strstr(rdata, "%LWM2MCMD: ")) != NULL)
{
tmp += strlen("%LWM2MCMD: ");
info->bootstrap = strstr(tmp, "\"false\"") ? false : true;
ret = lwm2mstub_send_getresource(dev, reply,
CONTAINER_SOCKETID(reply),
atcmdreply_getsrvinfo_step3,
arg, usock_result, "0,0,2");
}
}
return ret;
}
/****************************************************************************
* name: atcmdreply_getsrvinfo_step1
****************************************************************************/
static int atcmdreply_getsrvinfo_step1(FAR struct alt1250_s *dev,
FAR struct alt_container_s *reply,
FAR char *rdata, int len, unsigned long arg,
FAR int32_t *usock_result)
{
char *tmp;
int ret = REP_SEND_ACK;
FAR struct lwm2mstub_serverinfo_s *info
= (FAR struct lwm2mstub_serverinfo_s *)(((void **)arg)[0]);
*usock_result = -EIO;
/* Expected reply format
* %LWM2MCMD: <ServerURL>,<void>,<lifetime>,<binding>,<status>
*/
if (check_atreply_ok(rdata, len, NULL) == OK)
{
info->object_inst = 0;
info->device_id[0] = '\0';
info->security_key[0] = '\0';
if ((tmp = strstr(rdata, "%LWM2MCMD: ")) != NULL)
{
tmp += strlen("%LWM2MCMD: ");
strcpy_until(info->server_uri, LWM2MSTUB_MAX_SERVER_NAME,
&tmp, ",\r\n");
strcpy_until(NULL, 0, &tmp, ",\r\n"); /* Skip Server ID */
strcpy_until(NULL, 0, &tmp, ",\r\n"); /* Skip Life time */
strcpy_until(NULL, 0, &tmp, ",\r\n"); /* Skip Binding */
info->state = atoi(tmp);
ret = lwm2mstub_send_getresource(dev, reply,
CONTAINER_SOCKETID(reply),
atcmdreply_getsrvinfo_step2,
arg, usock_result, "0,0,1");
}
}
return ret;
}
/****************************************************************************
* name: atcmdreply_getenobjnum
****************************************************************************/
static int atcmdreply_getenobjnum(FAR struct alt1250_s *dev,
FAR struct alt_container_s *reply,
FAR char *rdata, int len, unsigned long arg,
FAR int32_t *usock_result)
{
*usock_result = -EIO;
if (check_atreply_ok(rdata, len, NULL) == OK)
{
*usock_result = 1;
rdata += 2; /* avoid "\r\n" */
while (*rdata != '\r')
{
if (*rdata == ';')
{
(*usock_result)++;
}
rdata++;
}
}
return REP_SEND_ACK;
}
/****************************************************************************
* name: atcmdreply_getenobjects
****************************************************************************/
static int atcmdreply_getenobjects(FAR struct alt1250_s *dev,
FAR struct alt_container_s *reply,
FAR char *rdata, int len, unsigned long arg,
FAR int32_t *usock_result)
{
int i;
FAR uint16_t *objids = (FAR uint16_t *)(((void **)arg)[0]);
int objnum = (int)(((void **)arg)[1]);
*usock_result = -EIO;
if (check_atreply_ok(rdata, len, NULL) == OK)
{
i = 0;
rdata += 2; /* avoid "\r\n" */
objids[i++] = atoi(rdata);
while (strcpy_until(NULL, 0, &rdata, ";\r\n") == ';' && i < objnum)
{
objids[i++] = atoi(rdata);
}
*usock_result = i;
}
return REP_SEND_ACK;
}
/****************************************************************************
* name: atcmdreply_getobjresnum
****************************************************************************/
static int atcmdreply_getobjresnum(FAR struct alt1250_s *dev,
FAR struct alt_container_s *reply,
FAR char *rdata, int len, unsigned long arg,
FAR int32_t *usock_result)
{
char term;
*usock_result = -ENODEV;
if (check_atreply_ok(rdata, len, NULL) == OK)
{
*usock_result = -EIO;
if ((rdata = strstr(rdata, "%OBJECTDEF: ")) != NULL)
{
*usock_result = 0;
rdata += strlen("%OBJECTDEF: ");
term = ',';
while (term == ',')
{
if ((term = strcpy_until(NULL, 0, &rdata, ",\r\n")) == ','
&& (term = strcpy_until(NULL, 0, &rdata, ",\r\n")) == ','
&& (term = strcpy_until(NULL, 0, &rdata, ",\r\n")) == ','
&& (term = strcpy_until(NULL, 0, &rdata, ",\r\n")) == ',')
{
/* the commas must be 4 for one resource definitions */
(*usock_result)++;
}
}
}
}
return REP_SEND_ACK;
}
/****************************************************************************
* name: resoperation_code
****************************************************************************/
static int resoperation_code(const char *s)
{
return s[0] == 'W' ? LWM2MSTUB_RESOP_WRITE :
s[0] == 'X' ? LWM2MSTUB_RESOP_EXEC :
s[0] != 'R' ? -1 :
s[1] == 'W' ? LWM2MSTUB_RESOP_RW : LWM2MSTUB_RESOP_READ;
}
/****************************************************************************
* name: resdatatype_code
****************************************************************************/
static int resdatatype_code(const char *s)
{
int ret = -1;
if (!strcmp(s, "\"none\""))
{
ret = LWM2MSTUB_RESDATA_NONE;
}
else if (!strcmp(s, "str"))
{
ret = LWM2MSTUB_RESDATA_STRING;
}
else if (!strcmp(s, "int"))
{
ret = LWM2MSTUB_RESDATA_INT;
}
else if (!strcmp(s, "uint"))
{
ret = LWM2MSTUB_RESDATA_UNSIGNED;
}
else if (!strcmp(s, "flt"))
{
ret = LWM2MSTUB_RESDATA_FLOAT;
}
else if (!strcmp(s, "bool"))
{
ret = LWM2MSTUB_RESDATA_BOOL;
}
else if (!strcmp(s, "opq"))
{
ret = LWM2MSTUB_RESDATA_OPAQUE;
}
else if (!strcmp(s, "time"))
{
ret = LWM2MSTUB_RESDATA_TIME;
}
else if (!strcmp(s, "ol"))
{
ret = LWM2MSTUB_RESDATA_OBJLINK;
}
return ret;
}
/****************************************************************************
* name: atcmdreply_getobjdef
****************************************************************************/
static int atcmdreply_getobjdef(FAR struct alt1250_s *dev,
FAR struct alt_container_s *reply,
FAR char *rdata, int len, unsigned long arg,
FAR int32_t *usock_result)
{
char tmp[8];
char term;
FAR struct lwm2mstub_resource_s *reses
= (FAR struct lwm2mstub_resource_s *)(((void **)arg)[0]);
int resnum = (int)(((void **)arg)[1]);
*usock_result = -ENODEV;
if (check_atreply_ok(rdata, len, NULL) == OK)
{
*usock_result = -EIO;
if ((rdata = strstr(rdata, "%OBJECTDEF: ")) != NULL)
{
*usock_result = 0;
rdata += strlen("%OBJECTDEF: ");
term = strcpy_until(NULL, 0, &rdata, ",\r\n");
/* <objID>,<resID>,<Type>,<Operation>,<Type> */
while (term == ',' && *usock_result < resnum)
{
reses[*usock_result].res_id = atoi(rdata);
term = strcpy_until(NULL, 0, &rdata, ",\r\n");
term = strcpy_until(tmp, 8, &rdata, ",\r\n");
reses[*usock_result].operation = resoperation_code(tmp);
reses[*usock_result].inst_type = atoi(rdata);
term = strcpy_until(NULL, 0, &rdata, ",\r\n");
term = strcpy_until(tmp, 8, &rdata, ",\r\n");
reses[*usock_result].data_type = resdatatype_code(tmp);
(*usock_result)++;
}
}
}
return REP_SEND_ACK;
}
/****************************************************************************
* name: atcmdreply_getrat
****************************************************************************/
static int atcmdreply_getrat(FAR struct alt1250_s *dev,
FAR struct alt_container_s *reply,
FAR char *rdata, int len, unsigned long arg,
FAR int32_t *usock_result)
{
*usock_result = -ENODEV;
if (check_atreply_ok(rdata, len, NULL) == OK)
{
*usock_result = -EIO;
if (strstr(rdata, "CATM") != NULL)
{
*usock_result = LTE_RAT_CATM;
}
else if (strstr(rdata, "NBIOT") != NULL)
{
*usock_result = LTE_RAT_NBIOT;
}
}
return REP_SEND_ACK;
}
/****************************************************************************
* name: atcmdreply_setsrvinfo_step4
****************************************************************************/
static int atcmdreply_setsrvinfo_step4(FAR struct alt1250_s *dev,
FAR struct alt_container_s *reply,
FAR char *rdata, int len, unsigned long arg,
FAR int32_t *usock_result)
{
int ret = REP_SEND_ACK;
*usock_result = -EIO;
if (check_atreply_ok(rdata, len, NULL) == OK)
{
ret = lwm2mstub_send_bsdone(dev, reply, CONTAINER_SOCKETID(reply),
usock_result);
}
return ret;
}
/****************************************************************************
* name: atcmdreply_setsrvinfo_step3
****************************************************************************/
static int atcmdreply_setsrvinfo_step3(FAR struct alt1250_s *dev,
FAR struct alt_container_s *reply,
FAR char *rdata, int len, unsigned long arg,
FAR int32_t *usock_result)
{
int ret = REP_SEND_ACK;
*usock_result = -EIO;
if (check_atreply_ok(rdata, len, NULL) == OK)
{
ret = lwm2mstub_send_bscreateobj1(dev, reply,
CONTAINER_SOCKETID(reply),
atcmdreply_setsrvinfo_step4, arg,
usock_result,
(FAR struct lwm2mstub_serverinfo_s *)arg);
}
return ret;
}
/****************************************************************************
* name: atcmdreply_setsrvinfo_step2
****************************************************************************/
static int atcmdreply_setsrvinfo_step2(FAR struct alt1250_s *dev,
FAR struct alt_container_s *reply,
FAR char *rdata, int len, unsigned long arg,
FAR int32_t *usock_result)
{
int ret = REP_SEND_ACK;
*usock_result = -EIO;
if (check_atreply_ok(rdata, len, NULL) == OK)
{
ret = lwm2mstub_send_bscreateobj0(dev, reply,
CONTAINER_SOCKETID(reply),
atcmdreply_setsrvinfo_step3, arg,
usock_result,
(FAR struct lwm2mstub_serverinfo_s *)arg);
}
return ret;
}
/****************************************************************************
* name: atcmdreply_setsrvinfo_step1
****************************************************************************/
static int atcmdreply_setsrvinfo_step1(FAR struct alt1250_s *dev,
FAR struct alt_container_s *reply,
FAR char *rdata, int len, unsigned long arg,
FAR int32_t *usock_result)
{
int ret = REP_SEND_ACK;
*usock_result = -EIO;
if (check_atreply_ok(rdata, len, NULL) == OK)
{
ret = lwm2mstub_send_bsdelete(dev, reply, CONTAINER_SOCKETID(reply),
atcmdreply_setsrvinfo_step2, arg, usock_result);
}
return ret;
}
/****************************************************************************
* name: perform_m2m_applysetting
****************************************************************************/
static int perform_m2m_applysetting(FAR struct alt1250_s *dev,
FAR int32_t *usock_result,
uint32_t xid)
{
dbg_alt1250("%s called\n", __func__);
if (dev->lwm2m_apply_xid >= 0)
{
*usock_result = -EINPROGRESS;
dbg_alt1250("Apply is in progress\n");
return REP_SEND_ACK;
}
*usock_result = OK;
dev->lwm2m_apply_xid = (int64_t)xid;
MODEM_STATE_INTENTRST(dev);
altdevice_reset(dev->altfd);
return REP_NO_ACK; /* Ack is replied after received reset event */
}
/****************************************************************************
* name: commands_on_any_state
****************************************************************************/
static int commands_on_any_state(FAR struct alt1250_s *dev,
FAR struct alt_container_s *container,
FAR struct usock_s *usock,
FAR struct lte_ioctl_data_s *ltecmd,
FAR int32_t *usock_result)
{
int ret = REP_SEND_ACK;
switch (ltecmd->cmdid)
{
case LTE_CMDID_LWM2M_GETEP:
ret = lwm2mstub_send_getepname(dev, container,
USOCKET_USOCKID(usock),
atcmdreply_getepname,
(unsigned long)ltecmd->outparam,
usock_result);
break;
case LTE_CMDID_LWM2M_GETSRVNUM:
*usock_result = -EOPNOTSUPP;
break;
case LTE_CMDID_LWM2M_GETSRVINFO:
ret = lwm2mstub_send_getsrvinfo(dev, container,
USOCKET_USOCKID(usock),
atcmdreply_getsrvinfo_step1,
(unsigned long)ltecmd->outparam,
usock_result);
break;
case LTE_CMDID_LWM2M_GETACTIVEOBJNUM:
ret = lwm2mstub_send_getsupobjs(dev, container,
USOCKET_USOCKID(usock),
atcmdreply_getenobjnum, 0,
usock_result);
break;
case LTE_CMDID_LWM2M_GETACTIVEOBJ:
ret = lwm2mstub_send_getsupobjs(dev, container,
USOCKET_USOCKID(usock),
atcmdreply_getenobjects,
(unsigned long)ltecmd->outparam,
usock_result);
break;
case LTE_CMDID_LWM2M_GETOBJRESNUM:
ret = lwm2mstub_send_getobjdef(dev, container,
USOCKET_USOCKID(usock),
atcmdreply_getobjresnum,
0, usock_result,
*((uint16_t *)ltecmd->inparam));
break;
case LTE_CMDID_LWM2M_GETOBJRESOURCE:
ret = lwm2mstub_send_getobjdef(dev, container,
USOCKET_USOCKID(usock),
atcmdreply_getobjdef,
(unsigned long)ltecmd->outparam,
usock_result,
*((uint16_t *)ltecmd->inparam));
break;
case LTE_CMDID_LWM2M_GETRAT:
ret = lwm2mstub_send_getrat(dev, container,
USOCKET_USOCKID(usock),
atcmdreply_getrat,
(unsigned long)ltecmd->outparam,
usock_result);
break;
case LTE_CMDID_LWM2M_GETQMODE:
ret = lwm2mstub_send_getqueuemode(dev, container,
USOCKET_USOCKID(usock),
usock_result);
break;
}
return ret;
}
/****************************************************************************
* name: commands_on_poweron_state
****************************************************************************/
static int commands_on_poweron_state(FAR struct alt1250_s *dev,
FAR struct alt_container_s *container,
FAR struct usock_s *usock,
FAR struct lte_ioctl_data_s *ltecmd,
FAR int32_t *usock_result)
{
int ret;
switch (ltecmd->cmdid)
{
case LTE_CMDID_LWM2M_SETEP:
ret = lwm2mstub_send_setepname(
dev, container, USOCKET_USOCKID(usock),
usock_result, (const char *)ltecmd->inparam);
break;
case LTE_CMDID_LWM2M_SETSRVINFO:
ret = lwm2mstub_send_bsstart(
dev, container, USOCKET_USOCKID(usock),
atcmdreply_setsrvinfo_step1,
(unsigned long)ltecmd->inparam[0],
usock_result);
break;
case LTE_CMDID_LWM2M_SETACTIVEOBJ:
ret = lwm2mstub_send_setsupobjs(
dev, container, USOCKET_USOCKID(usock),
usock_result,
(uint16_t *)ltecmd->inparam[0], (int)ltecmd->inparam[1]);
break;
case LTE_CMDID_LWM2M_SETOBJRESOURCE:
ret = lwm2mstub_send_setobjdef(
dev, container, USOCKET_USOCKID(usock),
usock_result, (uint16_t)(uint32_t)ltecmd->inparam[0],
(int)ltecmd->inparam[1],
(struct lwm2mstub_resource_s *)ltecmd->inparam[2]);
break;
case LTE_CMDID_LWM2M_CHANGERAT:
ret = lwm2mstub_send_changerat(dev, container,
USOCKET_USOCKID(usock),
usock_result,
*((int *)ltecmd->inparam));
break;
case LTE_CMDID_LWM2M_SETQMODE:
ret = lwm2mstub_send_setqueuemode(dev, container,
USOCKET_USOCKID(usock),
usock_result,
(int)ltecmd->inparam);
break;
case LTE_CMDID_LWM2M_APPLY_SETTING:
ret = perform_m2m_applysetting(dev, usock_result,
USOCKET_XID(usock));
break;
default:
ret = commands_on_any_state(dev, container, usock, ltecmd,
usock_result);
break;
}
return ret;
}
/****************************************************************************
* name: commands_on_radioon_state
****************************************************************************/
static int commands_on_radioon_state(FAR struct alt1250_s *dev,
FAR struct alt_container_s *container,
FAR struct usock_s *usock,
FAR struct lte_ioctl_data_s *ltecmd,
FAR int32_t *usock_result)
{
int ret;
switch (ltecmd->cmdid)
{
case LTE_CMDID_LWM2M_CONNECT:
ret = lwm2mstub_send_registration(
dev, container, USOCKET_USOCKID(usock), usock_result,
(int)ltecmd->inparam
);
break;
case LTE_CMDID_LWM2M_READRESP:
ret = lwm2mstub_send_evrespwvalue(
dev, container, USOCKET_USOCKID(usock), usock_result,
(int)ltecmd->inparam[0],
(int)ltecmd->inparam[1],
(struct lwm2mstub_instance_s *)ltecmd->inparam[2],
(char *)ltecmd->inparam[3]
);
break;
case LTE_CMDID_LWM2M_WRITERESP:
ret = lwm2mstub_send_evresponse(
dev, container, USOCKET_USOCKID(usock), usock_result,
(int)ltecmd->inparam[0],
(int)ltecmd->inparam[1],
(struct lwm2mstub_instance_s *)ltecmd->inparam[2]
);
break;
case LTE_CMDID_LWM2M_OBSERVERESP:
ret = lwm2mstub_send_evrespwoinst(
dev, container, USOCKET_USOCKID(usock), usock_result,
(int)ltecmd->inparam[0],
(int)ltecmd->inparam[1]
);
break;
case LTE_CMDID_LWM2M_EXECRESP:
ret = lwm2mstub_send_evresponse(
dev, container, USOCKET_USOCKID(usock), usock_result,
(int)ltecmd->inparam[0],
(int)ltecmd->inparam[1],
(struct lwm2mstub_instance_s *)ltecmd->inparam[2]
);
break;
case LTE_CMDID_LWM2M_OBSERVEUPDATE:
ret = lwm2mstub_send_objevent(
dev, container, USOCKET_USOCKID(usock), usock_result,
(char *)ltecmd->inparam[0],
(struct lwm2mstub_instance_s *)ltecmd->inparam[1],
(char *)ltecmd->inparam[2]
);
break;
default:
ret = commands_on_any_state(dev, container, usock, ltecmd,
usock_result);
break;
}
return ret;
}
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* name: send_m2mnotice_command
****************************************************************************/
int send_m2mnotice_command(uint32_t cmdid,
FAR struct alt1250_s *dev,
FAR struct alt_container_s *container,
FAR struct usock_s *usock,
FAR struct lte_ioctl_data_s *ltecmd,
FAR int32_t *ures)
{
int ret = REP_SEND_ACK;
*ures = OK;
switch (cmdid)
{
case LTE_CMDID_LWM2M_READ_EVT:
case LTE_CMDID_LWM2M_WRITE_EVT:
case LTE_CMDID_LWM2M_EXEC_EVT:
case LTE_CMDID_LWM2M_OVSTART_EVT:
case LTE_CMDID_LWM2M_OVSTOP_EVT:
/* TODO: Now unregister any events makes all event notify stop.
* This will be fixed in near future.
*/
ret = lwm2mstub_send_m2mobjcmd(
dev, container, USOCKET_USOCKID(usock), ures,
(ltecmd->cb != NULL));
break;
case LTE_CMDID_LWM2M_SERVEROP_EVT:
ret = lwm2mstub_send_m2mopev(
dev, container, USOCKET_USOCKID(usock), ures,
(ltecmd->cb != NULL));
break;
case LTE_CMDID_LWM2M_FWUP_EVT:
ret = lwm2mstub_send_m2mev(
dev, container, USOCKET_USOCKID(usock), ures,
(ltecmd->cb != NULL));
break;
default:
*ures = -EINVAL;
break;
}
return ret;
}
/****************************************************************************
* name: usockreq_ioctl_lwm2m
****************************************************************************/
int usockreq_ioctl_lwm2m(FAR struct alt1250_s *dev,
FAR struct usrsock_request_buff_s *req,
FAR int32_t *ures,
FAR uint32_t *usock_xid,
FAR struct usock_ackinfo_s *ackinfo)
{
FAR struct usrsock_request_ioctl_s *request = &req->request.ioctl_req;
FAR struct lte_ioctl_data_s *ltecmd = &req->req_ioctl.ltecmd;
FAR struct usock_s *usock = NULL;
FAR struct alt_container_s *container;
int ret = REP_SEND_ACK_WOFREE;
dbg_alt1250("%s called with : %08lx\n", __func__, ltecmd->cmdid);
*ures = -EOPNOTSUPP;
*usock_xid = request->head.xid;
if (dev->is_support_lwm2m)
{
usock = usocket_search(dev, request->usockid);
if (usock == NULL)
{
*ures = -EBADFD;
return ret;
}
container = container_alloc();
if (container == NULL)
{
return REP_NO_CONTAINER;
}
*ures = -EINVAL;
ret = REP_SEND_ACK;
USOCKET_SET_REQUEST(usock, request->head.reqid, request->head.xid);
if (MODEM_STATE_IS_PON(dev))
{
/* These commands is available just in power on state */
ret = commands_on_poweron_state(dev, container, usock, ltecmd,
ures);
}
else if (MODEM_STATE_IS_RON(dev))
{
ret = commands_on_radioon_state(dev, container, usock, ltecmd,
ures);
}
if (IS_NEED_CONTAINER_FREE(ret))
{
container_free(container);
}
}
return ret;
}