@@ -401,65 +401,77 @@ static int esp_send(struct net_pkt *pkt,
401401
402402#define CIPRECVDATA_CMD_MIN_LEN (sizeof("+CIPRECVDATA,L:") - 1)
403403#define CIPRECVDATA_CMD_MAX_LEN (sizeof("+CIPRECVDATA,LLLL:") - 1)
404- MODEM_CMD_DIRECT_DEFINE (on_cmd_ciprecvdata )
405- {
406- char * endptr , cmd_buf [CIPRECVDATA_CMD_MAX_LEN + 1 ];
407- int data_offset , data_len , ret ;
408- size_t match_len , frags_len ;
409- struct esp_socket * sock ;
410- struct esp_data * dev ;
411- struct net_pkt * pkt ;
412404
413- dev = CONTAINER_OF (data , struct esp_data , cmd_handler_data );
414-
415- sock = dev -> rx_sock ;
405+ static int cmd_ciprecvdata_parse (struct esp_socket * sock ,
406+ struct net_buf * buf , uint16_t len ,
407+ int * data_offset , int * data_len )
408+ {
409+ char cmd_buf [CIPRECVDATA_CMD_MAX_LEN + 1 ];
410+ char * endptr ;
411+ size_t frags_len ;
412+ size_t match_len ;
416413
417- frags_len = net_buf_frags_len (data -> rx_buf );
414+ frags_len = net_buf_frags_len (buf );
418415 if (frags_len < CIPRECVDATA_CMD_MIN_LEN ) {
419- ret = - EAGAIN ;
420- goto out ;
416+ return - EAGAIN ;
421417 }
422418
423419 match_len = net_buf_linearize (cmd_buf , CIPRECVDATA_CMD_MAX_LEN ,
424- data -> rx_buf , 0 , CIPRECVDATA_CMD_MAX_LEN );
425-
420+ buf , 0 , CIPRECVDATA_CMD_MAX_LEN );
426421 cmd_buf [match_len ] = 0 ;
427422
428- data_len = strtol (& cmd_buf [len ], & endptr , 10 );
423+ * data_len = strtol (& cmd_buf [len ], & endptr , 10 );
429424 if (endptr == & cmd_buf [len ] ||
430425 (* endptr == 0 && match_len >= CIPRECVDATA_CMD_MAX_LEN ) ||
431- data_len > sock -> bytes_avail ) {
426+ * data_len > sock -> bytes_avail ) {
432427 LOG_ERR ("Invalid cmd: %s" , log_strdup (cmd_buf ));
433- ret = len ;
434- goto out ;
428+ return - EBADMSG ;
435429 } else if (* endptr == 0 ) {
436- ret = - EAGAIN ;
437- goto out ;
430+ return - EAGAIN ;
438431 } else if (* endptr != _CIPRECVDATA_END ) {
439432 LOG_ERR ("Invalid end of cmd: 0x%02x != 0x%02x" , * endptr ,
440433 _CIPRECVDATA_END );
441- ret = len ;
442- goto out ;
434+ return - EBADMSG ;
443435 }
444436
445- * endptr = 0 ;
446-
447437 /* data_offset is the offset to where the actual data starts */
448- data_offset = strlen ( cmd_buf ) + 1 ;
438+ * data_offset = ( endptr - cmd_buf ) + 1 ;
449439
450440 /* FIXME: Inefficient way of waiting for data */
451- if (data_offset + data_len > frags_len ) {
452- ret = - EAGAIN ;
453- goto out ;
441+ if (* data_offset + * data_len > frags_len ) {
442+ return - EAGAIN ;
443+ }
444+
445+ * endptr = 0 ;
446+
447+ return 0 ;
448+ }
449+
450+ MODEM_CMD_DIRECT_DEFINE (on_cmd_ciprecvdata )
451+ {
452+ struct esp_data * dev = CONTAINER_OF (data , struct esp_data ,
453+ cmd_handler_data );
454+ struct esp_socket * sock = dev -> rx_sock ;
455+ int data_offset , data_len ;
456+ struct net_pkt * pkt ;
457+ int err ;
458+
459+ err = cmd_ciprecvdata_parse (sock , data -> rx_buf , len , & data_offset ,
460+ & data_len );
461+ if (err ) {
462+ if (err == - EAGAIN ) {
463+ return - EAGAIN ;
464+ }
465+
466+ return err ;
454467 }
455468
456469 sock -> bytes_avail -= data_len ;
457- ret = data_offset + data_len ;
458470
459471 if ((sock -> flags & (ESP_SOCK_CONNECTED | ESP_SOCK_CLOSE_PENDING )) !=
460472 ESP_SOCK_CONNECTED ) {
461473 LOG_DBG ("Received data on closed link %d" , sock -> link_id );
462- goto out ;
474+ return data_offset + data_len ;
463475 }
464476
465477 pkt = esp_prepare_pkt (dev , data -> rx_buf , data_offset , data_len );
@@ -476,8 +488,7 @@ MODEM_CMD_DIRECT_DEFINE(on_cmd_ciprecvdata)
476488submit_work :
477489 k_work_submit_to_queue (& dev -> workq , & sock -> recv_work );
478490
479- out :
480- return ret ;
491+ return data_offset + data_len ;
481492}
482493
483494static void esp_recvdata_work (struct k_work * work )
0 commit comments