Skip to content

Commit 0549018

Browse files
MarkusLassilarlubos
authored andcommitted
applications: serial_lte_modem: Combine sends
Combine duplicated code related to send and sendto. Signed-off-by: Markus Lassila <[email protected]>
1 parent df4c985 commit 0549018

File tree

1 file changed

+39
-91
lines changed

1 file changed

+39
-91
lines changed

applications/serial_lte_modem/src/slm_at_socket.c

Lines changed: 39 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -679,7 +679,7 @@ static int do_accept(int timeout)
679679
return 0;
680680
}
681681

682-
static int do_send(const uint8_t *data, int datalen)
682+
static int do_send(const uint8_t *data, int len)
683683
{
684684
int ret = 0;
685685
int sockfd = sock->fd;
@@ -694,54 +694,23 @@ static int do_send(const uint8_t *data, int datalen)
694694
}
695695
}
696696

697-
uint32_t offset = 0;
697+
uint32_t sent = 0;
698698

699-
while (offset < datalen) {
700-
ret = zsock_send(sockfd, data + offset, datalen - offset, 0);
699+
while (sent < len) {
700+
ret = zsock_send(sockfd, data + sent, len - sent, 0);
701701
if (ret < 0) {
702-
LOG_ERR("zsock_send() failed: %d, sent: %d", -errno, offset);
702+
LOG_ERR("Sent %u out of %u bytes. (%d)", sent, len, -errno);
703703
ret = -errno;
704704
break;
705705
}
706-
offset += ret;
706+
sent += ret;
707707
}
708708

709-
rsp_send("\r\n#XSEND: %d\r\n", offset);
710-
711-
if (ret >= 0) {
712-
return 0;
709+
if (!in_datamode()) {
710+
rsp_send("\r\n#XSEND: %d\r\n", sent);
713711
}
714712

715-
return ret;
716-
}
717-
718-
static int do_send_datamode(const uint8_t *data, int datalen)
719-
{
720-
int ret = 0;
721-
int sockfd = sock->fd;
722-
723-
/* For TCP/TLS Server, send to incoming socket */
724-
if (sock->type == SOCK_STREAM && sock->role == AT_SOCKET_ROLE_SERVER) {
725-
if (sock->fd_peer != INVALID_SOCKET) {
726-
sockfd = sock->fd_peer;
727-
} else {
728-
LOG_ERR("No connection");
729-
return -EINVAL;
730-
}
731-
}
732-
733-
uint32_t offset = 0;
734-
735-
while (offset < datalen) {
736-
ret = zsock_send(sockfd, data + offset, datalen - offset, 0);
737-
if (ret < 0) {
738-
LOG_ERR("zsock_send() failed: %d, sent: %d", -errno, offset);
739-
break;
740-
}
741-
offset += ret;
742-
}
743-
744-
return (offset > 0) ? offset : -1;
713+
return sent > 0 ? sent : ret;
745714
}
746715

747716
static int do_recv(int timeout, int flags)
@@ -788,76 +757,45 @@ static int do_recv(int timeout, int flags)
788757
return ret;
789758
}
790759

791-
static int do_sendto(const char *url, uint16_t port, const uint8_t *data, int datalen)
760+
static int do_sendto(const char *url, uint16_t port, const uint8_t *data, int len)
792761
{
793762
int ret = 0;
794-
uint32_t offset = 0;
795-
struct sockaddr sa = {
796-
.sa_family = AF_UNSPEC
797-
};
763+
uint32_t sent = 0;
764+
struct sockaddr sa = {.sa_family = AF_UNSPEC};
798765

799766
LOG_DBG("sendto %s:%d", url, port);
800767
ret = util_resolve_host(sock->cid, url, port, sock->family, &sa);
801768
if (ret) {
802769
return -EAGAIN;
803770
}
804771

805-
while (offset < datalen) {
806-
if (sa.sa_family == AF_INET) {
807-
ret = zsock_sendto(sock->fd, data + offset, datalen - offset, 0,
808-
&sa, sizeof(struct sockaddr_in));
809-
} else {
810-
ret = zsock_sendto(sock->fd, data + offset, datalen - offset, 0,
811-
&sa, sizeof(struct sockaddr_in6));
812-
}
772+
do {
773+
ret = zsock_sendto(sock->fd, data + sent, len - sent, 0, &sa,
774+
sa.sa_family == AF_INET ? sizeof(struct sockaddr_in)
775+
: sizeof(struct sockaddr_in6));
813776
if (ret <= 0) {
814-
LOG_ERR("zsock_sendto() failed: %d, sent: %d", -errno, offset);
815777
ret = -errno;
816778
break;
817779
}
818-
offset += ret;
819-
}
780+
sent += ret;
820781

821-
rsp_send("\r\n#XSENDTO: %d\r\n", offset);
782+
} while (sock->type != SOCK_DGRAM && sent < len);
822783

823-
if (ret >= 0) {
824-
return 0;
784+
if (ret >= 0 && sock->type == SOCK_DGRAM && sent != len) {
785+
/* Partial send of datagram. */
786+
ret = -EAGAIN;
787+
sent = 0;
825788
}
826789

827-
return ret;
828-
}
829-
830-
static int do_sendto_datamode(const uint8_t *data, int datalen)
831-
{
832-
int ret = 0;
833-
struct sockaddr sa = {
834-
.sa_family = AF_UNSPEC
835-
};
836-
837-
LOG_DBG("sendto %s:%d", udp_url, udp_port);
838-
ret = util_resolve_host(sock->cid, udp_url, udp_port, sock->family, &sa);
839-
if (ret) {
840-
return -EAGAIN;
790+
if (ret < 0) {
791+
LOG_ERR("Sent %u out of %u bytes. (%d)", sent, len, ret);
841792
}
842793

843-
uint32_t offset = 0;
844-
845-
while (offset < datalen) {
846-
if (sa.sa_family == AF_INET) {
847-
ret = zsock_sendto(sock->fd, data + offset, datalen - offset, 0,
848-
&sa, sizeof(struct sockaddr_in));
849-
} else {
850-
ret = zsock_sendto(sock->fd, data + offset, datalen - offset, 0,
851-
&sa, sizeof(struct sockaddr_in6));
852-
}
853-
if (ret <= 0) {
854-
LOG_ERR("zsock_sendto() failed: %d, sent: %d", -errno, offset);
855-
break;
856-
}
857-
offset += ret;
794+
if (!in_datamode()) {
795+
rsp_send("\r\n#XSENDTO: %d\r\n", sent);
858796
}
859797

860-
return (offset > 0) ? offset : -1;
798+
return sent > 0 ? sent : ret;
861799
}
862800

863801
static int do_recvfrom(int timeout, int flags)
@@ -959,9 +897,9 @@ static int socket_datamode_callback(uint8_t op, const uint8_t *data, int len, ui
959897
return -EOVERFLOW;
960898
} else {
961899
if (strlen(udp_url) > 0) {
962-
ret = do_sendto_datamode(data, len);
900+
ret = do_sendto(udp_url, udp_port, data, len);
963901
} else {
964-
ret = do_send_datamode(data, len);
902+
ret = do_send(data, len);
965903
}
966904
LOG_INF("datamode send: %d", ret);
967905
}
@@ -1445,6 +1383,11 @@ static int handle_at_send(enum at_parser_cmd_type cmd_type, struct at_parser *pa
14451383
return err;
14461384
}
14471385
err = do_send(data, size);
1386+
if (err == size) {
1387+
err = 0;
1388+
} else {
1389+
err = err < 0 ? err : -EAGAIN;
1390+
}
14481391
} else {
14491392
err = enter_datamode(socket_datamode_callback);
14501393
}
@@ -1515,6 +1458,11 @@ static int handle_at_sendto(enum at_parser_cmd_type cmd_type, struct at_parser *
15151458
return err;
15161459
}
15171460
err = do_sendto(udp_url, udp_port, data, size);
1461+
if (err == size) {
1462+
err = 0;
1463+
} else {
1464+
err = err < 0 ? err : -EAGAIN;
1465+
}
15181466
memset(udp_url, 0, sizeof(udp_url));
15191467
} else {
15201468
err = enter_datamode(socket_datamode_callback);

0 commit comments

Comments
 (0)