Skip to content

Commit

Permalink
lte/alt1250: Fix bug that caused stack when executing the socket API
Browse files Browse the repository at this point in the history
Fix a bug that caused the application to get stuck when executing
the socket API after waking up from hibernation and before executing
lte_hibernation_resume().
  • Loading branch information
SPRESENSE authored and pkarashchenko committed Feb 9, 2024
1 parent 2ac0adf commit 3650251
Show file tree
Hide file tree
Showing 22 changed files with 51 additions and 36 deletions.
2 changes: 1 addition & 1 deletion lte/alt1250/alt1250_atcmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -245,7 +245,7 @@ static int send_internal_at_command(FAR struct alt1250_s *dev,

err_alt1250("Internal ATCMD : %s\n", dev->tx_buff);

ret = altdevice_send_command(dev->altfd, container, usock_result);
ret = altdevice_send_command(dev, dev->altfd, container, usock_result);
if (ret == REP_NO_ACK)
{
/* In case of no error */
Expand Down
12 changes: 11 additions & 1 deletion lte/alt1250/alt1250_devif.c
Original file line number Diff line number Diff line change
Expand Up @@ -92,10 +92,20 @@ FAR struct alt_container_s *altdevice_exchange_selcontainer(int fd,
* name: altdevice_send_command
****************************************************************************/

int altdevice_send_command(int fd, FAR struct alt_container_s *container,
int altdevice_send_command(FAR struct alt1250_s *dev, int fd,
FAR struct alt_container_s *container,
FAR int32_t *usock_res)
{
int ret;

#ifdef CONFIG_LTE_ALT1250_ENABLE_HIBERNATION_MODE
if (dev->is_resuming)
{
*usock_res = -EOPNOTSUPP;
return REP_SEND_ACK;
}
#endif

ret = ioctl_wrapper(fd, ALT1250_IOC_SEND, (unsigned long)container);
if (ret < 0)
{
Expand Down
4 changes: 3 additions & 1 deletion lte/alt1250/alt1250_devif.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
#include <stdint.h>

#include <nuttx/modem/alt1250.h>
#include "alt1250_daemon.h"

#define DEV_ALT1250 "/dev/alt1250"

Expand All @@ -39,7 +40,8 @@ int init_alt1250_device(void);
void finalize_alt1250_device(int fd);
FAR struct alt_container_s *altdevice_exchange_selcontainer(int fd,
FAR struct alt_container_s *container);
int altdevice_send_command(int fd, FAR struct alt_container_s *container,
int altdevice_send_command(FAR struct alt1250_s *dev, int fd,
FAR struct alt_container_s *container,
FAR int32_t *usock_res);
int altdevice_powercontrol(int fd, uint32_t cmd);
int altdevice_seteventbuff(int fd, FAR struct alt_evtbuffer_s *buffers);
Expand Down
2 changes: 1 addition & 1 deletion lte/alt1250/alt1250_reset_seq.c
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ static int send_getversion_onreset(FAR struct alt1250_s *dev,
set_container_postproc(container, postproc_ponresetseq,
(unsigned long)&reset_arg);

return altdevice_send_command(dev->altfd, container, usock_result);
return altdevice_send_command(dev, dev->altfd, container, usock_result);
}

/****************************************************************************
Expand Down
2 changes: 1 addition & 1 deletion lte/alt1250/alt1250_select.c
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ static int send_select_command(FAR struct alt1250_s *dev,
set_container_ids(&container, 0, LTE_CMDID_SELECT);
set_container_argument(&container, in, nitems(in));

return altdevice_send_command(dev->altfd, &container, &usock_result);
return altdevice_send_command(dev, dev->altfd, &container, &usock_result);
}

/****************************************************************************
Expand Down
4 changes: 2 additions & 2 deletions lte/alt1250/usock_handlers/alt1250_accepthdlr.c
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ static int send_close_command(FAR struct alt1250_s *dev,
set_container_response(container, USOCKET_REP_RESPONSE(usock), idx);
set_container_postproc(container, postproc_accepterr, 0);

return altdevice_send_command(dev->altfd, container, usock_result);
return altdevice_send_command(dev, dev->altfd, container, usock_result);
}

/****************************************************************************
Expand Down Expand Up @@ -188,7 +188,7 @@ static int send_accept_command(FAR struct alt1250_s *dev,
set_container_response(container, USOCKET_REP_RESPONSE(usock), idx);
set_container_postproc(container, postproc_accept, 0);

return altdevice_send_command(dev->altfd, container, usock_result);
return altdevice_send_command(dev, dev->altfd, container, usock_result);
}

/****************************************************************************
Expand Down
2 changes: 1 addition & 1 deletion lte/alt1250/usock_handlers/alt1250_bindhdlr.c
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ static int send_bind_command(FAR struct alt1250_s *dev,
set_container_response(container, USOCKET_REP_RESPONSE(usock), idx);
set_container_postproc(container, postproc_sockcommon, 0);

return altdevice_send_command(dev->altfd, container, usock_result);
return altdevice_send_command(dev, dev->altfd, container, usock_result);
}

/****************************************************************************
Expand Down
2 changes: 1 addition & 1 deletion lte/alt1250/usock_handlers/alt1250_closehdlr.c
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ static int send_close_command(FAR struct alt1250_s *dev,
set_container_response(container, USOCKET_REP_RESPONSE(usock), idx);
set_container_postproc(container, postproc_sockcommon, 0);

return altdevice_send_command(dev->altfd, container, usock_result);
return altdevice_send_command(dev, dev->altfd, container, usock_result);
}

/****************************************************************************
Expand Down
2 changes: 1 addition & 1 deletion lte/alt1250/usock_handlers/alt1250_connecthdlr.c
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ static int send_connect_command(FAR struct alt1250_s *dev,
set_container_response(container, USOCKET_REP_RESPONSE(usock), idx);
set_container_postproc(container, postproc_connect, 0);

return altdevice_send_command(dev->altfd, container, usock_result);
return altdevice_send_command(dev, dev->altfd, container, usock_result);
}

/****************************************************************************
Expand Down
2 changes: 1 addition & 1 deletion lte/alt1250/usock_handlers/alt1250_getsocknamehdlr.c
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ static int send_getsockname_command(FAR struct alt1250_s *dev,
set_container_response(container, USOCKET_REP_RESPONSE(usock), idx);
set_container_postproc(container, postproc_getsockname, 0);

return altdevice_send_command(dev->altfd, container, usock_result);
return altdevice_send_command(dev, dev->altfd, container, usock_result);
}

/****************************************************************************
Expand Down
2 changes: 1 addition & 1 deletion lte/alt1250/usock_handlers/alt1250_getsockopthdlr.c
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ int send_getsockopt_command(FAR struct alt1250_s *dev,
set_container_response(container, USOCKET_REP_RESPONSE(usock), idx);
set_container_postproc(container, func, priv);

return altdevice_send_command(dev->altfd, container, usock_result);
return altdevice_send_command(dev, dev->altfd, container, usock_result);
}

/****************************************************************************
Expand Down
2 changes: 1 addition & 1 deletion lte/alt1250/usock_handlers/alt1250_ioctl_event.c
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ static int send_eventnotice_command(FAR struct alt1250_s *dev,
set_container_response(container, ltecmd->outparam, ltecmd->outparamlen);
set_container_postproc(container, NULL, 0);

return altdevice_send_command(dev->altfd, container, usock_result);
return altdevice_send_command(dev, dev->altfd, container, usock_result);
}

/****************************************************************************
Expand Down
2 changes: 1 addition & 1 deletion lte/alt1250/usock_handlers/alt1250_ioctl_fwupdate.c
Original file line number Diff line number Diff line change
Expand Up @@ -445,7 +445,7 @@ int usockreq_ioctl_fwupdate(FAR struct alt1250_s *dev,
ltecmd->outparamlen);
set_container_postproc(container, postproc_hdlr, postproc_priv);

ret = altdevice_send_command(dev->altfd, container, usock_result);
ret = altdevice_send_command(dev, dev->altfd, container, usock_result);

if (IS_NEED_CONTAINER_FREE(ret))
{
Expand Down
6 changes: 3 additions & 3 deletions lte/alt1250/usock_handlers/alt1250_ioctl_ifreq.c
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ static int send_actpdn_command(FAR struct alt1250_s *dev,
set_container_response(container, USOCKET_REP_RESPONSE(usock), idx);
set_container_postproc(container, postproc_actpdn, 0);

return altdevice_send_command(dev->altfd, container, usock_result);
return altdevice_send_command(dev, dev->altfd, container, usock_result);
}

/****************************************************************************
Expand All @@ -124,7 +124,7 @@ static int send_radio_command(FAR struct alt1250_s *dev,
set_container_postproc(container,
on ? postproc_radioon : postproc_radiooff, 0);

return altdevice_send_command(dev->altfd, container, usock_result);
return altdevice_send_command(dev, dev->altfd, container, usock_result);
}

/****************************************************************************
Expand Down Expand Up @@ -369,7 +369,7 @@ int send_reportnet_command(FAR struct alt1250_s *dev,
set_container_response(container, USOCKET_REP_RESPONSE(usock), idx);
set_container_postproc(container, func, priv);

return altdevice_send_command(dev->altfd, container, usock_result);
return altdevice_send_command(dev, dev->altfd, container, usock_result);
}

/****************************************************************************
Expand Down
17 changes: 10 additions & 7 deletions lte/alt1250/usock_handlers/alt1250_ioctl_normal.c
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,7 @@ int send_lapi_command(FAR struct alt1250_s *dev,
set_container_response(container, ltecmd->outparam, ltecmd->outparamlen);
set_container_postproc(container, hdlr, priv);

return altdevice_send_command(dev->altfd, container, usock_result);
return altdevice_send_command(dev, dev->altfd, container, usock_result);
}

#ifdef CONFIG_LTE_ALT1250_ENABLE_HIBERNATION_MODE
Expand Down Expand Up @@ -238,7 +238,7 @@ static int send_getversion_command(FAR struct alt1250_s *dev,
set_container_response(container, alt1250_getevtarg(LTE_CMDID_GETVER), 2);
set_container_postproc(container, postproc_fwgetversion, 0);

return altdevice_send_command(dev->altfd, container, usock_result);
return altdevice_send_command(dev, dev->altfd, container, usock_result);
}

/****************************************************************************
Expand All @@ -257,7 +257,7 @@ static int send_register_command(FAR struct alt1250_s *dev,
set_container_response(container, ltecmd->outparam, ltecmd->outparamlen);
set_container_postproc(container, postproc_setreport, index);

return altdevice_send_command(dev->altfd, container, usock_result);
return altdevice_send_command(dev, dev->altfd, container, usock_result);
}

/****************************************************************************
Expand Down Expand Up @@ -355,6 +355,13 @@ static int lte_context_resume(FAR struct alt1250_s *dev,
goto error;
}

/* After the retry mode is disabled, the ALT1250 daemon can receive
* commands from the ALT1250 and the ALT1250 daemon is ready for normal
* operation, so the "is_resuming" flag is disabled.
*/

dev->is_resuming = false;

/* If the ALT1250 is not powered on, return Resume as failure. */

power = altdevice_powercontrol(dev->altfd, LTE_CMDID_GET_POWER_STAT);
Expand All @@ -376,10 +383,6 @@ static int lte_context_resume(FAR struct alt1250_s *dev,
dbg_alt1250("Failed to send resume commands.\n");
}

/* Resume phase is over */

dev->is_resuming = false;

return ret;

error:
Expand Down
2 changes: 1 addition & 1 deletion lte/alt1250/usock_handlers/alt1250_listenhdlr.c
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ static int send_listen_command(FAR struct alt1250_s *dev,
set_container_response(container, USOCKET_REP_RESPONSE(usock), idx);
set_container_postproc(container, postproc_sockcommon, 0);

return altdevice_send_command(dev->altfd, container, usock_result);
return altdevice_send_command(dev, dev->altfd, container, usock_result);
}

/****************************************************************************
Expand Down
2 changes: 1 addition & 1 deletion lte/alt1250/usock_handlers/alt1250_recvfromhdlr.c
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ static int send_recvfrom_command(FAR struct alt1250_s *dev,
set_container_response(container, USOCKET_REP_RESPONSE(usock), idx++);
set_container_postproc(container, postproc_recvfrom, 0);

return altdevice_send_command(dev->altfd, container, usock_result);
return altdevice_send_command(dev, dev->altfd, container, usock_result);
}

/****************************************************************************
Expand Down
2 changes: 1 addition & 1 deletion lte/alt1250/usock_handlers/alt1250_sendtohdlr.c
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ static int send_sendto_command(FAR struct alt1250_s *dev,
set_container_response(container, USOCKET_REP_RESPONSE(usock), idx);
set_container_postproc(container, postproc_sockcommon, 0);

return altdevice_send_command(dev->altfd, container, usock_result);
return altdevice_send_command(dev, dev->altfd, container, usock_result);
}

/****************************************************************************
Expand Down
2 changes: 1 addition & 1 deletion lte/alt1250/usock_handlers/alt1250_setsockopthdlr.c
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ static int send_setsockopt_command(FAR struct alt1250_s *dev,
set_container_response(container, USOCKET_REP_RESPONSE(usock), idx);
set_container_postproc(container, postproc_sockcommon, 0);

return altdevice_send_command(dev->altfd, container, usock_result);
return altdevice_send_command(dev, dev->altfd, container, usock_result);
}

/****************************************************************************
Expand Down
2 changes: 1 addition & 1 deletion lte/alt1250/usock_handlers/alt1250_shutdownhdlr.c
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ static int send_shutdown_command(FAR struct alt1250_s *dev,
set_container_response(container, USOCKET_REP_RESPONSE(usock), idx);
set_container_postproc(container, postproc_sockcommon, 0);

return altdevice_send_command(dev->altfd, container, usock_result);
return altdevice_send_command(dev, dev->altfd, container, usock_result);
}

/****************************************************************************
Expand Down
10 changes: 5 additions & 5 deletions lte/alt1250/usock_handlers/alt1250_sms.c
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ static int send_smsinit_command(FAR struct alt1250_s *dev,
set_container_response(container, &dummy_output, 1);
set_container_postproc(container, func, 0);

return altdevice_send_command(dev->altfd, container, usock_result);
return altdevice_send_command(dev, dev->altfd, container, usock_result);
}

/****************************************************************************
Expand All @@ -197,7 +197,7 @@ static int send_smsfin_command(FAR struct alt1250_s *dev,
set_container_response(container, &dummy_output, 1);
set_container_postproc(container, func, 0);

return altdevice_send_command(dev->altfd, container, usock_result);
return altdevice_send_command(dev, dev->altfd, container, usock_result);
}

/****************************************************************************
Expand Down Expand Up @@ -239,7 +239,7 @@ static int send_smssend_command(FAR struct alt1250_s *dev,
set_container_response(container, USOCKET_REP_RESPONSE(usock), idx);
set_container_postproc(container, postproc_smssend, 0);

return altdevice_send_command(dev->altfd, container, usock_result);
return altdevice_send_command(dev, dev->altfd, container, usock_result);
}

/****************************************************************************
Expand Down Expand Up @@ -270,7 +270,7 @@ static int send_smsdelete_command(FAR struct alt1250_s *dev,
set_container_response(container, &dummy_output, 1);
set_container_postproc(container, postproc_smsdelete, 0);

return altdevice_send_command(dev->altfd, container, usock_result);
return altdevice_send_command(dev, dev->altfd, container, usock_result);
}

/****************************************************************************
Expand All @@ -286,7 +286,7 @@ static int send_smsreportrecv_command(FAR struct alt1250_s *dev,

set_container_ids(&container, 0, LTE_CMDID_SMS_REPORT_RECV);

return altdevice_send_command(dev->altfd, &container, usock_result);
return altdevice_send_command(dev, dev->altfd, &container, usock_result);
}

/****************************************************************************
Expand Down
4 changes: 2 additions & 2 deletions lte/alt1250/usock_handlers/alt1250_sockethdlr.c
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ static int send_fctl_command(FAR struct alt1250_s *dev,
set_container_postproc(container, cmd == ALTCOM_SETFL ? postproc_setfl :
cmd == ALTCOM_GETFL ? postproc_getfl : NULL, 0);

return altdevice_send_command(dev->altfd, container, usock_result);
return altdevice_send_command(dev, dev->altfd, container, usock_result);
}

/****************************************************************************
Expand Down Expand Up @@ -331,7 +331,7 @@ static int send_socket_command(FAR struct alt1250_s *dev,
set_container_response(container, USOCKET_REP_RESPONSE(usock), idx);
set_container_postproc(container, postproc_socket, 0);

return altdevice_send_command(dev->altfd, container, usock_result);
return altdevice_send_command(dev, dev->altfd, container, usock_result);
}

/****************************************************************************
Expand Down

0 comments on commit 3650251

Please sign in to comment.