@@ -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
747716static 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
863801static 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