4 #include "luat_crypto.h"
6 #ifdef LUAT_USE_NETWORK
8 #include "platform_def.h"
10 #include "luat_network_adapter.h"
12 #ifndef LWIP_NUM_SOCKETS
13 #define LWIP_NUM_SOCKETS 8
19 network_ctrl_t lwip_ctrl_table
[LWIP_NUM_SOCKETS
];
20 // HANDLE network_mutex;
22 int last_adapter_index
;
23 int default_adapter_index
;
24 llist_head dns_cache_head
;
26 uint8_t lwip_ctrl_busy
[LWIP_NUM_SOCKETS
];
34 network_adapter_info
*opt
;
37 network_ctrl_t
*ctrl_table
;
41 static network_adapter_t prv_adapter_table
[NW_ADAPTER_QTY
];
42 static network_info_t prv_network
= {
43 .last_adapter_index
= -1,
44 .default_adapter_index
= -1,
47 static const char *prv_network_event_id_string
[] =
66 static const char *prv_network_ctrl_state_string
[] =
79 static const char *prv_network_ctrl_wait_state_string
[] =
90 static const char *prv_network_ctrl_callback_event_string
[] =
99 const char *network_ctrl_event_id_string(uint32_t event
)
101 if (event
> EV_NW_END
|| event
< EV_NW_RESET
)
103 return prv_network_event_id_string
[EV_NW_END
- EV_NW_RESET
];
105 return prv_network_event_id_string
[event
- EV_NW_RESET
];
108 const char *network_ctrl_state_string(uint8_t state
)
110 if (state
> NW_STATE_DISCONNECTING
)
112 return prv_network_ctrl_state_string
[NW_STATE_DISCONNECTING
+ 1];
114 return prv_network_ctrl_state_string
[state
];
117 const char *network_ctrl_wait_state_string(uint8_t state
)
119 if (state
> NW_WAIT_EVENT
)
121 return prv_network_ctrl_wait_state_string
[NW_WAIT_EVENT
+ 1];
123 return prv_network_ctrl_wait_state_string
[state
];
126 const char *network_ctrl_callback_event_string(uint32_t event
)
128 if (event
> EV_NW_RESULT_EVENT
|| event
< EV_NW_RESULT_LINK
)
130 return prv_network_ctrl_callback_event_string
[event
- EV_NW_RESULT_EVENT
+ 1];
132 return prv_network_ctrl_callback_event_string
[event
- EV_NW_RESULT_EVENT
];
135 network_adapter_info
* network_adapter_fetch(int id
, void** userdata
) {
136 if (id
>= 0 && id
< NW_ADAPTER_QTY
) {
137 if (prv_adapter_table
[id
].opt
) {
138 *userdata
= prv_adapter_table
[id
].user_data
;
139 return prv_adapter_table
[id
].opt
;
146 #include "../lwip/port/net_lwip.h"
148 #include "dhcp_def.h"
150 extern void DBG_Printf(const char* format
, ...);
151 extern void DBG_HexPrintf(void *Data
, unsigned int len
);
152 //#define DBG(x,y...) DBG_Printf("%s %d:"x"\r\n", __FUNCTION__,__LINE__,##y)
153 //#define DBG_ERR(x,y...) DBG_Printf("%s %d:"x"\r\n", __FUNCTION__,__LINE__,##y)
154 static int tls_random( void *p_rng
,
155 unsigned char *output
, size_t output_len
);
157 #define __NW_DEBUG_ENABLE__
158 #ifdef __NW_DEBUG_ENABLE__
159 #ifdef LUAT_LOG_NO_NEWLINE
160 #define DBG(x,...) do {if (ctrl->is_debug) {DBG_Printf("%s %d:"x, __FUNCTION__,__LINE__,##__VA_ARGS__);}} while(0)
161 #define DBG_ERR(x,...) DBG_Printf("%s %d:"x, __FUNCTION__,__LINE__,##__VA_ARGS__)
163 #define DBG(x,...) do {if (ctrl->is_debug) {DBG_Printf("%s %d:"x"\r\n", __FUNCTION__,__LINE__,##__VA_ARGS__);}} while(0)
164 #define DBG_ERR(x,...) DBG_Printf("%s %d:"x"\r\n", __FUNCTION__,__LINE__,##__VA_ARGS__)
168 #define DBG_ERR(x,...)
170 #define NW_LOCK platform_lock_mutex(ctrl->mutex)
171 #define NW_UNLOCK platform_unlock_mutex(ctrl->mutex)
173 #define SOL_SOCKET 0xfff /* options for socket level */
174 #define SO_REUSEADDR 0x0004 /* Allow local address reuse */
175 #define SO_KEEPALIVE 0x0008 /* keep connections alive */
177 #define IPPROTO_ICMP 1
178 #define IPPROTO_TCP 6
179 #define TCP_NODELAY 0x01 /* don't delay send to coalesce packets */
180 #define TCP_KEEPALIVE 0x02 /* send KEEPALIVE probes when idle for pcb->keep_idle milliseconds */
181 #define TCP_KEEPIDLE 0x03 /* set pcb->keep_idle - Same as TCP_KEEPALIVE, but use seconds for get/setsockopt */
182 #define TCP_KEEPINTVL 0x04 /* set pcb->keep_intvl - Use seconds for get/setsockopt */
183 #define TCP_KEEPCNT 0x05 /* set pcb->keep_cnt - Use number of probes sent for get/setsockopt */
187 static uint8_t network_check_ip_same(luat_ip_addr_t
*ip1
, luat_ip_addr_t
*ip2
)
190 #if defined ENABLE_PSIF
191 return ip_addr_cmp(ip1
, ip2
);
194 return ip_addr_cmp_zoneless(ip1
, ip2
);
196 return ip_addr_cmp(ip1
, ip2
);
200 if (ip1
->is_ipv6
!= ip2
->is_ipv6
)
206 return !memcmp(ip1
->ipv6_u8_addr
, ip2
->ipv6_u8_addr
, 16);
210 return (ip1
->ipv4
== ip2
->ipv4
);
215 static int network_base_tx(network_ctrl_t
*ctrl
, const uint8_t *data
, uint32_t len
, int flags
, luat_ip_addr_t
*remote_ip
, uint16_t remote_port
)
220 result
= network_socket_send(ctrl
, data
, len
, flags
, NULL
, 0);
226 result
= network_socket_send(ctrl
, data
, len
, flags
, remote_ip
, remote_port
);
230 result
= network_socket_send(ctrl
, data
, len
, flags
, ctrl
->online_ip
, ctrl
->remote_port
);
235 ctrl
->tx_size
+= len
;
239 ctrl
->need_close
= 1;
244 static LUAT_RT_RET_TYPE
tls_shorttimeout(LUAT_RT_CB_PARAM
)
246 network_ctrl_t
*ctrl
= (network_ctrl_t
*)param
;
249 platform_stop_timer(ctrl
->tls_long_timer
);
252 if (0 == ctrl
->tls_timer_state
)
254 ctrl
->tls_timer_state
= 1;
259 static LUAT_RT_RET_TYPE
tls_longtimeout(LUAT_RT_CB_PARAM
)
261 network_ctrl_t
*ctrl
= (network_ctrl_t
*)param
;
262 platform_stop_timer(ctrl
->tls_short_timer
);
267 ctrl
->tls_timer_state
= 2;
271 static void tls_settimer( void *data
, uint32_t int_ms
, uint32_t fin_ms
)
273 network_ctrl_t
*ctrl
= (network_ctrl_t
*)data
;
280 platform_stop_timer(ctrl
->tls_short_timer
);
281 platform_stop_timer(ctrl
->tls_long_timer
);
282 ctrl
->tls_timer_state
= -1;
285 platform_start_timer(ctrl
->tls_short_timer
, int_ms
, 0);
286 platform_start_timer(ctrl
->tls_long_timer
, fin_ms
, 0);
287 ctrl
->tls_timer_state
= 0;
290 static int tls_gettimer( void *data
)
292 network_ctrl_t
*ctrl
= (network_ctrl_t
*)data
;
295 return -ERROR_PARAM_INVALID
;
297 #if MBEDTLS_VERSION_NUMBER >= 0x03000000
298 if(!mbedtls_ssl_is_handshake_over(ctrl
->ssl
))
300 if (ctrl
->ssl
->state
!= MBEDTLS_SSL_HANDSHAKE_OVER
)
303 return ctrl
->tls_timer_state
;
311 static void tls_dbg(void *data
, int level
,
312 const char *file
, int line
,
315 (void)data
;(void)level
;DBG_Printf("%s %d:%s", file
, line
, str
);
318 static int tls_send(void *ctx
, const unsigned char *buf
, size_t len
)
320 network_ctrl_t
*ctrl
= (network_ctrl_t
*)ctx
;
323 return -ERROR_PERMISSION_DENIED
;
325 if (network_base_tx(ctrl
, buf
, len
, 0, NULL
, 0) != len
)
335 static int tls_recv(void *ctx
, unsigned char *buf
, size_t len
)
338 network_ctrl_t
*ctrl
= (network_ctrl_t
*)ctx
;
339 luat_ip_addr_t remote_ip
;
340 uint16_t remote_port
;
348 result
= network_socket_receive(ctrl
, buf
, len
, 0, &remote_ip
, &remote_port
);
357 if ((remote_port
== ctrl
->remote_port
) && network_check_ip_same(&remote_ip
, ctrl
->online_ip
))
364 return MBEDTLS_ERR_SSL_WANT_READ
;
370 static int network_get_host_by_name(network_ctrl_t
*ctrl
)
373 network_set_ip_invaild(&ctrl
->remote_ip
);
374 if (ipaddr_aton(ctrl
->domain_name
, &ctrl
->remote_ip
))
378 network_set_ip_invaild(&ctrl
->remote_ip
);
381 ctrl
->remote_ip
.is_ipv6
= 0xff;
382 if (network_string_is_ipv4(ctrl
->domain_name
, ctrl
->domain_name_len
))
384 ctrl
->remote_ip
.is_ipv6
= 0;
385 ctrl
->remote_ip
.ipv4
= network_string_to_ipv4(ctrl
->domain_name
, ctrl
->domain_name_len
);
389 char *name
= zalloc(ctrl
->domain_name_len
+ 1);
390 memcpy(name
, ctrl
->domain_name
, ctrl
->domain_name_len
);
391 network_string_to_ipv6(name
, &ctrl
->remote_ip
);
394 if (ctrl
->remote_ip
.is_ipv6
!= 0xff)
405 static void network_update_dns_cache(network_ctrl_t
*ctrl
)
410 static void network_get_dns_cache(network_ctrl_t
*ctrl
)
415 static int network_base_connect(network_ctrl_t
*ctrl
, luat_ip_addr_t
*remote_ip
)
418 network_adapter_t
*adapter
= &prv_adapter_table
[ctrl
->adapter_index
];
419 if (ctrl
->socket_id
>= 0)
424 mbedtls_ssl_free(ctrl
->ssl
);
427 if (network_socket_close(ctrl
))
429 network_clean_invaild_socket(ctrl
->adapter_index
);
430 network_socket_force_close(ctrl
);
432 ctrl
->need_close
= 0;
433 ctrl
->socket_id
= -1;
437 if (network_create_soceket(ctrl
, network_ip_is_ipv6(remote_ip
)) < 0)
439 network_clean_invaild_socket(ctrl
->adapter_index
);
440 if (network_create_soceket(ctrl
, network_ip_is_ipv6(remote_ip
)) < 0)
445 if (adapter
->opt
->is_posix
)
447 volatile uint32_t val
;
448 val
= ctrl
->tcp_keep_alive
;
449 network_setsockopt(ctrl
, SOL_SOCKET
, SO_KEEPALIVE
, (void *)&val
, sizeof(val
));
450 if (ctrl
->tcp_keep_alive
)
452 val
= ctrl
->tcp_keep_idle
;
453 network_setsockopt(ctrl
, IPPROTO_TCP
, TCP_KEEPIDLE
, (void*)&val
, sizeof(val
));
454 val
= ctrl
->tcp_keep_interval
;
455 network_setsockopt(ctrl
, IPPROTO_TCP
, TCP_KEEPINTVL
, (void *)&val
, sizeof(val
));
456 val
= ctrl
->tcp_keep_cnt
;
457 network_setsockopt(ctrl
, IPPROTO_TCP
, TCP_KEEPCNT
, (void *)&val
, sizeof(val
));
462 network_user_cmd(ctrl
, NW_CMD_AUTO_HEART_TIME
, ctrl
->tcp_keep_idle
);
465 return network_socket_connect(ctrl
, remote_ip
);
469 if (network_create_soceket(ctrl
, 0) < 0)
471 network_clean_invaild_socket(ctrl
->adapter_index
);
472 if (network_create_soceket(ctrl
, 0) < 0)
477 return network_socket_listen(ctrl
);
480 network_adapter_t
*adapter
= &prv_adapter_table
[ctrl
->adapter_index
];
481 if (ctrl
->socket_id
>= 0)
483 network_force_close_socket(ctrl
);
487 if (network_create_soceket(ctrl
, remote_ip
->is_ipv6
) < 0)
489 network_clean_invaild_socket(ctrl
->adapter_index
);
490 if (network_create_soceket(ctrl
, remote_ip
->is_ipv6
) < 0)
495 if (adapter
->opt
->is_posix
)
497 network_setsockopt(ctrl
, SOL_SOCKET
, SO_KEEPALIVE
, (void *)&ctrl
->tcp_keep_alive
, sizeof(ctrl
->tcp_keep_alive
));
498 if (ctrl
->tcp_keep_alive
)
500 network_setsockopt(ctrl
, IPPROTO_TCP
, TCP_KEEPIDLE
, (void*)&ctrl
->tcp_keep_idle
, sizeof(ctrl
->tcp_keep_idle
));
501 network_setsockopt(ctrl
, IPPROTO_TCP
, TCP_KEEPINTVL
, (void *)&ctrl
->tcp_keep_interval
, sizeof(ctrl
->tcp_keep_interval
));
502 network_setsockopt(ctrl
, IPPROTO_TCP
, TCP_KEEPCNT
, (void *)&ctrl
->tcp_keep_cnt
, sizeof(ctrl
->tcp_keep_cnt
));
507 network_user_cmd(ctrl
, NW_CMD_AUTO_HEART_TIME
, ctrl
->tcp_keep_idle
);
510 return network_socket_connect(ctrl
, remote_ip
);
514 luat_ip_addr_t local_ip
, net_mask
, gate_way
;
515 network_get_local_ip_info(ctrl
, &local_ip
, &net_mask
, &gate_way
);
516 if (network_create_soceket(ctrl
, local_ip
.is_ipv6
) < 0)
518 network_clean_invaild_socket(ctrl
->adapter_index
);
519 if (network_create_soceket(ctrl
, local_ip
.is_ipv6
) < 0)
524 return network_socket_listen(ctrl
);
529 static int network_prepare_connect(network_ctrl_t
*ctrl
)
532 if (network_ip_is_vaild(&ctrl
->remote_ip
))
536 else if (ctrl
->domain_name
)
538 if (network_get_host_by_name(ctrl
))
540 if (network_dns(ctrl
))
542 network_socket_force_close(ctrl
);
545 ctrl
->state
= NW_STATE_WAIT_DNS
;
555 if (network_base_connect(ctrl
, &ctrl
->remote_ip
))
557 network_socket_force_close(ctrl
);
560 ctrl
->state
= NW_STATE_CONNECTING
;
564 static int network_state_link_off(network_ctrl_t
*ctrl
, OS_EVENT
*event
, network_adapter_t
*adapter
)
566 if (EV_NW_STATE
== event
->ID
)
570 ctrl
->state
= NW_STATE_OFF_LINE
;
571 if (NW_WAIT_LINK_UP
== ctrl
->wait_target_state
)
575 else if (NW_WAIT_ON_LINE
== ctrl
->wait_target_state
)
577 if (ctrl
->is_server_mode
)
579 if (network_base_connect(ctrl
, NULL
))
583 ctrl
->state
= NW_STATE_CONNECTING
;
587 if (network_prepare_connect(ctrl
))
600 static int network_state_off_line(network_ctrl_t
*ctrl
, OS_EVENT
*event
, network_adapter_t
*adapter
)
605 static int network_state_wait_dns(network_ctrl_t
*ctrl
, OS_EVENT
*event
, network_adapter_t
*adapter
)
607 if ((ctrl
->need_close
) || ctrl
->wait_target_state
!= NW_WAIT_ON_LINE
) return -1;
611 case EV_NW_SOCKET_ERROR
:
619 case EV_NW_DNS_RESULT
:
623 ctrl
->dns_ip
= event
->Param2
;
624 ctrl
->dns_ip_nums
= event
->Param1
;
626 for(int i
= 0; i
< ctrl
->dns_ip_nums
; i
++)
628 DBG("dns ip%d, ttl %u, %s", i
, ctrl
->dns_ip
[i
].ttl_end
, ipaddr_ntoa(&ctrl
->dns_ip
[i
].ip
));
631 network_update_dns_cache(ctrl
);
635 ctrl
->dns_ip_nums
= 0;
636 network_get_dns_cache(ctrl
);
637 if (!ctrl
->dns_ip_nums
)
643 if (!ctrl
->remote_port
)
645 ctrl
->state
= NW_STATE_OFF_LINE
;
648 ctrl
->dns_ip_cnt
= 0;
649 if (network_base_connect(ctrl
, &ctrl
->dns_ip
[ctrl
->dns_ip_cnt
].ip
))
651 network_socket_force_close(ctrl
);
656 ctrl
->state
= NW_STATE_CONNECTING
;
665 static int network_state_connecting(network_ctrl_t
*ctrl
, OS_EVENT
*event
, network_adapter_t
*adapter
)
667 if ((ctrl
->need_close
) || (ctrl
->wait_target_state
!= NW_WAIT_ON_LINE
)) return -1;
672 case EV_NW_SOCKET_ERROR
:
673 case EV_NW_SOCKET_REMOTE_CLOSE
:
674 case EV_NW_SOCKET_CLOSE_OK
:
676 if (network_ip_is_vaild(&ctrl
->remote_ip
))
680 DBG("dns ip %d no connect!,%d", ctrl
->dns_ip_cnt
, ctrl
->dns_ip_nums
);
682 if (ctrl
->dns_ip_cnt
>= ctrl
->dns_ip_nums
)
684 DBG("all ip try connect failed");
687 if (network_base_connect(ctrl
, &ctrl
->dns_ip
[ctrl
->dns_ip_cnt
].ip
))
689 network_socket_force_close(ctrl
);
694 ctrl
->state
= NW_STATE_CONNECTING
;
704 case EV_NW_SOCKET_LISTEN
:
705 if (ctrl
->is_server_mode
)
707 ctrl
->state
= NW_STATE_LISTEN
;
711 case EV_NW_SOCKET_CONNECT_OK
:
715 mbedtls_ssl_free(ctrl
->ssl
);
716 memset(ctrl
->ssl
, 0, sizeof(mbedtls_ssl_context
));
717 mbedtls_ssl_setup(ctrl
->ssl
, ctrl
->config
);
718 // ctrl->ssl->f_set_timer = tls_settimer;
719 // ctrl->ssl->f_get_timer = tls_gettimer;
720 // ctrl->ssl->p_timer = ctrl;
721 mbedtls_ssl_set_timer_cb(ctrl
->ssl
, ctrl
, tls_settimer
, tls_gettimer
);
722 // ctrl->ssl->p_bio = ctrl;
723 // ctrl->ssl->f_send = tls_send;
724 // ctrl->ssl->f_recv = tls_recv;
725 mbedtls_ssl_set_bio(ctrl
->ssl
, ctrl
, tls_send
, tls_recv
, NULL
);
727 // cloudflare的https需要设置hostname才能访问
728 if (ctrl
->domain_name_len
> 0 && ctrl
->domain_name_len
< 256) {
729 char host
[257] = {0};
730 memcpy(host
, ctrl
->domain_name
, ctrl
->domain_name_len
);
731 mbedtls_ssl_set_hostname(ctrl
->ssl
, host
);
732 //LLOGD("CALL mbedtls_ssl_set_hostname(%s)", host);
735 //LLOGD("skip mbedtls_ssl_set_hostname");
738 ctrl
->state
= NW_STATE_SHAKEHAND
;
741 int result
= mbedtls_ssl_handshake_step( ctrl
->ssl
);
744 case MBEDTLS_ERR_SSL_WANT_READ
:
749 #if MBEDTLS_VERSION_NUMBER >= 0x03000000
751 DBG_ERR("0x%x, %d", -result
, ctrl
->ssl
->state
);
755 #if MBEDTLS_VERSION_NUMBER >= 0x03000000
756 }while(!mbedtls_ssl_is_handshake_over(ctrl
->ssl
));
758 }while(ctrl
->ssl
->state
!= MBEDTLS_SSL_HANDSHAKE_OVER
);
765 ctrl
->state
= NW_STATE_ONLINE
;
775 static int network_state_shakehand(network_ctrl_t
*ctrl
, OS_EVENT
*event
, network_adapter_t
*adapter
)
777 if ((ctrl
->need_close
) || ((ctrl
->wait_target_state
!= NW_WAIT_ON_LINE
) && (ctrl
->wait_target_state
!= NW_WAIT_TX_OK
))) return -1;
781 case EV_NW_SOCKET_ERROR
:
782 case EV_NW_SOCKET_REMOTE_CLOSE
:
783 case EV_NW_SOCKET_CLOSE_OK
:
784 ctrl
->need_close
= 1;
789 ctrl
->need_close
= 1;
793 case EV_NW_SOCKET_TX_OK
:
794 ctrl
->ack_size
+= event
->Param2
;
797 case EV_NW_SOCKET_RX_NEW
:
800 int result
= mbedtls_ssl_handshake_step( ctrl
->ssl
);
803 case MBEDTLS_ERR_SSL_WANT_READ
:
808 #if MBEDTLS_VERSION_NUMBER >= 0x03000000
809 DBG_ERR("0x%x", -result
);
811 DBG_ERR("0x%x, %d", -result
, ctrl
->ssl
->state
);
813 ctrl
->need_close
= 1;
816 #if MBEDTLS_VERSION_NUMBER >= 0x03000000
817 }while(!mbedtls_ssl_is_handshake_over(ctrl
->ssl
));
819 }while(ctrl
->ssl
->state
!= MBEDTLS_SSL_HANDSHAKE_OVER
);
821 ctrl
->state
= NW_STATE_ONLINE
;
822 if (NW_WAIT_TX_OK
== ctrl
->wait_target_state
)
824 if (!ctrl
->cache_data
)
826 ctrl
->need_close
= 1;
829 int result
= mbedtls_ssl_write(ctrl
->ssl
, ctrl
->cache_data
, ctrl
->cache_len
);
830 free(ctrl
->cache_data
);
831 ctrl
->cache_data
= NULL
;
835 DBG("%08x", -result
);
836 ctrl
->need_close
= 1;
843 case EV_NW_SOCKET_CONNECT_OK
:
852 static int network_state_on_line(network_ctrl_t
*ctrl
, OS_EVENT
*event
, network_adapter_t
*adapter
)
854 if ((ctrl
->need_close
) || NW_WAIT_OFF_LINE
== ctrl
->wait_target_state
)
862 case EV_NW_SOCKET_ERROR
:
863 case EV_NW_SOCKET_REMOTE_CLOSE
:
864 case EV_NW_SOCKET_CLOSE_OK
:
865 ctrl
->need_close
= 1;
870 ctrl
->need_close
= 1;
874 case EV_NW_SOCKET_TX_OK
:
875 ctrl
->ack_size
+= event
->Param2
;
876 if (NW_WAIT_TX_OK
== ctrl
->wait_target_state
)
879 if (ctrl
->ack_size
== ctrl
->tx_size
)
884 if (ctrl
->adapter_index
< NW_ADAPTER_INDEX_LWIP_NETIF_QTY
)
886 // 如果 适配器自带check_ack函数, 那就直接调用, 不需要再调用全局的
887 if (prv_adapter_table
[ctrl
->adapter_index
].opt
->check_ack
) {
888 return prv_adapter_table
[ctrl
->adapter_index
].opt
->check_ack(ctrl
->adapter_index
, ctrl
->socket_id
);
890 // TODO 待全部bsp都增加check_ack函数后, 就不再需要下面的调用了
891 return net_lwip_check_all_ack(ctrl
->socket_id
);
905 case EV_NW_SOCKET_RX_NEW
:
907 #if MBEDTLS_VERSION_NUMBER >= 0x03000000
908 if (ctrl
->tls_mode
&& !mbedtls_ssl_is_handshake_over(ctrl
->ssl
))
910 if (ctrl
->tls_mode
&& (ctrl
->ssl
->state
!= MBEDTLS_SSL_HANDSHAKE_OVER
))
913 DBG("rehandshaking");
916 int result
= mbedtls_ssl_handshake_step( ctrl
->ssl
);
919 case MBEDTLS_ERR_SSL_WANT_READ
:
924 #if MBEDTLS_VERSION_NUMBER >= 0x03000000
925 DBG_ERR("0x%x", -result
);
927 DBG_ERR("0x%x, %d", -result
, ctrl
->ssl
->state
);
929 ctrl
->need_close
= 1;
932 #if MBEDTLS_VERSION_NUMBER >= 0x03000000
933 }while(!mbedtls_ssl_is_handshake_over(ctrl
->ssl
));
935 }while(ctrl
->ssl
->state
!= MBEDTLS_SSL_HANDSHAKE_OVER
);
939 ctrl
->new_rx_flag
= 1;
940 if (NW_WAIT_TX_OK
!= ctrl
->wait_target_state
)
951 static int network_state_listen(network_ctrl_t
*ctrl
, OS_EVENT
*event
, network_adapter_t
*adapter
)
953 if ((ctrl
->need_close
) || NW_WAIT_OFF_LINE
== ctrl
->wait_target_state
)
960 case EV_NW_SOCKET_ERROR
:
961 case EV_NW_SOCKET_REMOTE_CLOSE
:
962 case EV_NW_SOCKET_CLOSE_OK
:
963 ctrl
->need_close
= 1;
968 ctrl
->need_close
= 1;
972 case EV_NW_SOCKET_NEW_CONNECT
:
973 case EV_NW_SOCKET_CONNECT_OK
:
974 ctrl
->state
= NW_STATE_ONLINE
;
982 static int network_state_disconnecting(network_ctrl_t
*ctrl
, OS_EVENT
*event
, network_adapter_t
*adapter
)
984 if (ctrl
->wait_target_state
!= NW_WAIT_OFF_LINE
)
991 case EV_NW_SOCKET_ERROR
:
992 case EV_NW_SOCKET_REMOTE_CLOSE
:
993 case EV_NW_SOCKET_CLOSE_OK
:
994 network_force_close_socket(ctrl
);
995 ctrl
->state
= NW_STATE_OFF_LINE
;
996 ctrl
->socket_id
= -1;
1005 network_force_close_socket(ctrl
);
1006 ctrl
->state
= NW_STATE_OFF_LINE
;
1007 ctrl
->socket_id
= -1;
1016 typedef int (*network_state_fun
)(network_ctrl_t
*ctrl
, OS_EVENT
*event
, network_adapter_t
*adapter
);
1017 static network_state_fun network_state_fun_list
[]=
1019 network_state_link_off
,
1020 network_state_off_line
,
1021 network_state_wait_dns
,
1022 network_state_connecting
,
1023 network_state_shakehand
,
1024 network_state_on_line
,
1025 network_state_listen
,
1026 network_state_disconnecting
,
1029 static void network_default_statemachine(network_ctrl_t
*ctrl
, OS_EVENT
*event
, network_adapter_t
*adapter
)
1032 uint8_t close_flag
= 0;
1034 if (ctrl
->state
> NW_STATE_DISCONNECTING
)
1036 ctrl
->state
= NW_STATE_LINK_OFF
;
1039 network_force_close_socket(ctrl
);
1040 event
->ID
= ctrl
->wait_target_state
+ EV_NW_RESULT_BASE
;
1045 if ((NW_STATE_DISCONNECTING
== ctrl
->state
) && (NW_WAIT_OFF_LINE
== ctrl
->wait_target_state
))
1049 result
= network_state_fun_list
[ctrl
->state
](ctrl
, event
, adapter
);
1053 if (ctrl
->new_rx_flag
&& ctrl
->user_callback
)
1055 event
->ID
= NW_WAIT_EVENT
+ EV_NW_RESULT_BASE
;
1057 ctrl
->user_callback(event
, ctrl
->user_data
);
1061 if (close_flag
&& (NW_WAIT_NONE
== ctrl
->wait_target_state
))
1063 event
->ID
= EV_NW_RESULT_CLOSE
;
1067 event
->ID
= (ctrl
->wait_target_state
?ctrl
->wait_target_state
:NW_WAIT_EVENT
) + EV_NW_RESULT_BASE
;
1069 event
->Param1
= result
;
1071 if ((ctrl
->state
!= NW_STATE_LISTEN
) || (result
< 0))
1073 ctrl
->wait_target_state
= NW_WAIT_NONE
;
1076 if (ctrl
->task_handle
)
1078 platform_send_event(ctrl
->task_handle
, event
->ID
, event
->Param1
, event
->Param2
, event
->Param3
);
1080 else if (ctrl
->user_callback
)
1082 ctrl
->user_callback(event
, ctrl
->user_data
);
1087 static int32_t network_default_socket_callback(void *data
, void *param
)
1089 OS_EVENT
*event
= (OS_EVENT
*)data
;
1090 OS_EVENT temp_event
;
1091 luat_network_cb_param_t
*cb_param
= (luat_network_cb_param_t
*)param
;
1092 network_adapter_t
*adapter
=(network_adapter_t
*)(cb_param
->param
);
1094 network_ctrl_t
*ctrl
= (network_ctrl_t
*)event
->Param3
;
1096 if (event
->ID
> EV_NW_TIMEOUT
)
1098 if (ctrl
&& ((event
->ID
== EV_NW_DNS_RESULT
) || (ctrl
->tag
== cb_param
->tag
)))
1100 if ((event
->ID
== EV_NW_DNS_RESULT
) && (ctrl
->wait_target_state
!= NW_WAIT_ON_LINE
))
1102 DBG("socket event:0x%x(%s),wait:%d(%s)", event
->ID
, network_ctrl_event_id_string(event
->ID
), ctrl
->wait_target_state
, network_ctrl_wait_state_string(ctrl
->wait_target_state
));
1105 if (ctrl
->auto_mode
)
1107 DBG("before process socket %d,event:0x%x(%s),state:%d(%s),wait:%d(%s)", ctrl
->socket_id
, event
->ID
, network_ctrl_event_id_string(event
->ID
),
1108 ctrl
->state
, network_ctrl_state_string(ctrl
->state
),
1109 ctrl
->wait_target_state
, network_ctrl_wait_state_string(ctrl
->wait_target_state
));
1110 network_default_statemachine(ctrl
, event
, adapter
);
1111 DBG("after process socket %d,state:%d(%s),wait:%d(%s)", ctrl
->socket_id
, ctrl
->state
, network_ctrl_state_string(ctrl
->state
),ctrl
->wait_target_state
, network_ctrl_wait_state_string(ctrl
->wait_target_state
));
1113 else if (ctrl
->task_handle
)
1115 platform_send_event(ctrl
->task_handle
, event
->ID
, event
->Param1
, event
->Param2
, event
->Param3
);
1117 else if (ctrl
->user_callback
)
1119 ctrl
->user_callback(event
, ctrl
->user_data
);
1124 DBG_ERR("cb ctrl invaild %x %08X", ctrl
, event
->ID
);
1126 // 原因是ctrl可能已经被释放, 再次访问会导致coredump
1127 //DBG_HexPrintf(&ctrl->tag, 8);
1128 DBG_HexPrintf(&cb_param
->tag
, 8);
1133 for (i
= 0; i
< adapter
->opt
->max_socket_num
; i
++)
1135 temp_event
= *event
;
1136 if (adapter
->ctrl_busy
[i
])
1138 ctrl
= &adapter
->ctrl_table
[i
];
1139 if (ctrl
->adapter_index
== (uint8_t)(event
->Param3
))
1141 if (ctrl
->auto_mode
)
1143 DBG("before process socket %d,event:0x%x(%s),state:%d(%s),wait:%d(%s)", ctrl
->socket_id
, event
->ID
, network_ctrl_event_id_string(event
->ID
),
1144 ctrl
->state
, network_ctrl_state_string(ctrl
->state
),
1145 ctrl
->wait_target_state
, network_ctrl_wait_state_string(ctrl
->wait_target_state
));
1146 network_default_statemachine(ctrl
, &temp_event
, adapter
);
1147 DBG("after process socket %d,state:%d(%s),wait:%d(%s)", ctrl
->socket_id
, ctrl
->state
, network_ctrl_state_string(ctrl
->state
), ctrl
->wait_target_state
, network_ctrl_wait_state_string(ctrl
->wait_target_state
));
1149 else if (ctrl
->task_handle
)
1151 platform_send_event(ctrl
->task_handle
, event
->ID
, event
->Param1
, event
->Param2
, event
->Param3
);
1153 else if (ctrl
->user_callback
)
1155 ctrl
->user_callback(&temp_event
, ctrl
->user_data
);
1166 static LUAT_RT_RET_TYPE
network_default_timer_callback(LUAT_RT_CB_PARAM
)
1168 platform_send_event(param
, EV_NW_TIMEOUT
, 0, 0, 0);
1172 #ifndef LUAT_USE_LWIP
1173 uint8_t network_string_is_ipv4(const char *string
, uint32_t len
)
1176 for(i
= 0; i
< len
; i
++)
1178 if (!isdigit((int)string
[i
]) && (string
[i
] != '.'))
1186 uint32_t network_string_to_ipv4(const char *string
, uint32_t len
)
1193 memset(Buf
, 0, sizeof(Buf
));
1194 CP
.param_max_len
= 4;
1195 CP
.param_max_num
= 4;
1197 CP
.param_str
= (int8_t *)Buf
;
1198 memcpy(temp
, string
, len
);
1200 CmdParseParam((int8_t*)temp
, &CP
, '.');
1201 for(i
= 0; i
< 4; i
++)
1203 uIP
.u8
[i
] = strtol((char *)Buf
[i
], NULL
, 10);
1205 // DBG("%d.%d.%d.%d", uIP.u8[0], uIP.u8[1], uIP.u8[2], uIP.u8[3]);
1209 #define SWAP(x) ((((x) & (uint32_t)0x000000ffUL) << 24) | \
1210 (((x) & (uint32_t)0x0000ff00UL) << 8) | \
1211 (((x) & (uint32_t)0x00ff0000UL) >> 8) | \
1212 (((x) & (uint32_t)0xff000000UL) >> 24))
1214 int network_string_to_ipv6(const char *string
, luat_ip_addr_t
*ip_addr
)
1218 uint32_t addr_index
, zero_blocks
, current_block_index
, current_block_value
;
1220 ip_addr
->is_ipv6
= 0xff;
1221 /* Count the number of colons, to count the number of blocks in a "::" sequence
1222 zero_blocks may be 1 even if there are no :: sequences */
1224 for (s
= string
; *s
!= 0; s
++) {
1227 } else if (!isxdigit((int)*s
)) {
1232 /* parse each block */
1234 current_block_index
= 0;
1235 current_block_value
= 0;
1236 for (s
= string
; *s
!= 0; s
++) {
1238 if (current_block_index
& 0x1) {
1239 ip_addr
->ipv6_u32_addr
[addr_index
++] |= current_block_value
;
1242 ip_addr
->ipv6_u32_addr
[addr_index
] = current_block_value
<< 16;
1244 current_block_index
++;
1245 current_block_value
= 0;
1246 if (current_block_index
> 7) {
1247 /* address too long! */
1252 /* invalid format: three successive colons */
1256 /* "::" found, set zeros */
1257 while (zero_blocks
> 0) {
1259 if (current_block_index
& 0x1) {
1262 ip_addr
->ipv6_u32_addr
[addr_index
] = 0;
1264 current_block_index
++;
1265 if (current_block_index
> 7) {
1266 /* address too long! */
1271 } else if (isxdigit((int)*s
)) {
1272 /* add current digit */
1273 current_block_value
= (current_block_value
<< 4) +
1274 (isxdigit((int)*s
) ? (uint32_t)(*s
- '0') :
1275 (uint32_t)(10 + (isxdigit((int)*s
) ? *s
- 'a' : *s
- 'A')));
1277 /* unexpected digit, space? CRLF? */
1283 if (current_block_index
& 0x1) {
1284 ip_addr
->ipv6_u32_addr
[addr_index
++] |= current_block_value
;
1287 ip_addr
->ipv6_u32_addr
[addr_index
] = current_block_value
<< 16;
1290 /* convert to network byte order. */
1291 for (addr_index
= 0; addr_index
< 4; addr_index
++) {
1292 ip_addr
->ipv6_u32_addr
[addr_index
] = SWAP(ip_addr
->ipv6_u32_addr
[addr_index
]);
1297 if (current_block_index
!= 7) {
1301 ip_addr
->is_ipv6
= 1;
1308 int network_get_last_register_adapter(void)
1310 if (prv_network
.default_adapter_index
!= -1) return prv_network
.default_adapter_index
;
1311 return prv_network
.last_adapter_index
;
1314 void network_register_set_default(uint8_t adapter_index
)
1316 prv_network
.default_adapter_index
= adapter_index
;
1319 int network_register_adapter(uint8_t adapter_index
, network_adapter_info
*info
, void *user_data
)
1321 prv_adapter_table
[adapter_index
].opt
= info
;
1322 prv_adapter_table
[adapter_index
].user_data
= user_data
;
1323 info
->socket_set_callback(network_default_socket_callback
, &prv_adapter_table
[adapter_index
], user_data
);
1324 #ifdef LUAT_USE_LWIP
1325 if (adapter_index
< NW_ADAPTER_INDEX_HW_PS_DEVICE
)
1327 prv_adapter_table
[adapter_index
].ctrl_table
= prv_network
.lwip_ctrl_table
;
1328 prv_adapter_table
[adapter_index
].ctrl_busy
= prv_network
.lwip_ctrl_busy
;
1333 prv_adapter_table
[adapter_index
].ctrl_table
= zalloc((info
->max_socket_num
) * sizeof(network_ctrl_t
));
1334 prv_adapter_table
[adapter_index
].ctrl_busy
= zalloc(info
->max_socket_num
);
1337 prv_adapter_table
[adapter_index
].port
= 60000;
1338 if (!prv_network
.is_init
)
1340 //prv_network.network_mutex = platform_create_mutex();
1341 INIT_LLIST_HEAD(&prv_network
.dns_cache_head
);
1342 prv_network
.is_init
= 0;
1345 prv_network
.last_adapter_index
= adapter_index
;
1349 void network_set_dns_server(uint8_t adapter_index
, uint8_t server_index
, luat_ip_addr_t
*ip
)
1351 network_adapter_t
*adapter
= &prv_adapter_table
[adapter_index
];
1352 adapter
->opt
->set_dns_server(server_index
, ip
, adapter
->user_data
);
1358 network_ctrl_t
*network_alloc_ctrl(uint8_t adapter_index
)
1361 network_ctrl_t
*ctrl
= NULL
;
1362 if (adapter_index
>= NW_ADAPTER_QTY
|| prv_adapter_table
[adapter_index
].opt
== NULL
) {
1363 DBG_ERR("adapter index %d is invalid!", adapter_index
);
1366 network_adapter_t
*adapter
= &prv_adapter_table
[adapter_index
];
1368 for (i
= 0; i
< adapter
->opt
->max_socket_num
; i
++)
1370 if (!adapter
->ctrl_busy
[i
])
1373 adapter
->ctrl_busy
[i
] = 1;
1374 ctrl
= &adapter
->ctrl_table
[i
];
1375 ctrl
->adapter_index
= adapter_index
;
1376 ctrl
->domain_ipv6
= 0;
1381 if (i
>= adapter
->opt
->max_socket_num
) {DBG_ERR("adapter no more ctrl!");}
1388 void network_release_ctrl(network_ctrl_t
*ctrl
)
1391 network_adapter_t
*adapter
= &prv_adapter_table
[ctrl
->adapter_index
];
1394 for (i
= 0; i
< adapter
->opt
->max_socket_num
; i
++)
1396 if (&adapter
->ctrl_table
[i
] == ctrl
)
1398 network_deinit_tls(ctrl
);
1401 platform_stop_timer(ctrl
->timer
);
1402 platform_release_timer(ctrl
->timer
);
1405 if (ctrl
->cache_data
)
1407 free(ctrl
->cache_data
);
1408 ctrl
->cache_data
= NULL
;
1413 ctrl
->dns_ip
= NULL
;
1415 if (ctrl
->domain_name
)
1417 free(ctrl
->domain_name
);
1418 ctrl
->domain_name
= NULL
;
1420 adapter
->ctrl_busy
[i
] = 0;
1421 platform_release_mutex(ctrl
->mutex
);
1427 if (i
>= adapter
->opt
->max_socket_num
) {DBG_ERR("adapter index maybe error!, %d, %x", ctrl
->adapter_index
, ctrl
);}
1431 void network_init_ctrl(network_ctrl_t
*ctrl
, HANDLE task_handle
, CBFuncEx_t callback
, void *param
)
1433 uint8_t adapter_index
= ctrl
->adapter_index
;
1434 network_adapter_t
*adapter
= &prv_adapter_table
[ctrl
->adapter_index
];
1438 ctrl
->dns_ip
= NULL
;
1440 if (ctrl
->cache_data
)
1442 free(ctrl
->cache_data
);
1443 ctrl
->cache_data
= NULL
;
1445 if (ctrl
->domain_name
)
1447 free(ctrl
->domain_name
);
1448 ctrl
->domain_name
= NULL
;
1450 HANDLE sem
= ctrl
->mutex
;
1451 memset(ctrl
, 0, sizeof(network_ctrl_t
));
1452 ctrl
->adapter_index
= adapter_index
;
1453 ctrl
->task_handle
= task_handle
;
1454 ctrl
->user_callback
= callback
;
1455 ctrl
->user_data
= param
;
1456 ctrl
->socket_id
= -1;
1457 ctrl
->socket_param
= ctrl
;
1458 network_set_ip_invaild(&ctrl
->remote_ip
);
1462 ctrl
->timer
= platform_create_timer(network_default_timer_callback
, task_handle
, NULL
);
1466 ctrl
->mutex
= platform_create_mutex();
1471 void network_set_base_mode(network_ctrl_t
*ctrl
, uint8_t is_tcp
, uint32_t tcp_timeout_ms
, uint8_t keep_alive
, uint32_t keep_idle
, uint8_t keep_interval
, uint8_t keep_cnt
)
1473 ctrl
->is_tcp
= is_tcp
;
1474 ctrl
->tcp_keep_alive
= keep_alive
;
1475 ctrl
->tcp_keep_idle
= keep_idle
;
1476 ctrl
->tcp_keep_interval
= keep_interval
;
1477 ctrl
->tcp_keep_cnt
= keep_cnt
;
1478 ctrl
->tcp_timeout_ms
= tcp_timeout_ms
;
1481 void network_set_debug_onoff(network_ctrl_t
*ctrl
, uint8_t on_off
)
1483 ctrl
->is_debug
= on_off
;
1486 void network_connect_ipv6_domain(network_ctrl_t
*ctrl
, uint8_t onoff
)
1488 ctrl
->domain_ipv6
= onoff
;
1491 int network_set_local_port(network_ctrl_t
*ctrl
, uint16_t local_port
)
1494 network_adapter_t
*adapter
= &prv_adapter_table
[ctrl
->adapter_index
];
1498 for (i
= 0; i
< adapter
->opt
->max_socket_num
; i
++)
1500 if (&adapter
->ctrl_table
[i
] != ctrl
)
1502 if (adapter
->ctrl_table
[i
].local_port
== local_port
)
1510 ctrl
->local_port
= local_port
;
1516 ctrl
->local_port
= 0;
1518 if (ctrl
->adapter_index
< NW_ADAPTER_INDEX_LWIP_NETIF_QTY
)
1520 ctrl
->local_port
= 0;
1525 if (adapter
->port
< 60000)
1527 adapter
->port
= 60000;
1529 ctrl
->local_port
= adapter
->port
;
1536 int network_create_soceket(network_ctrl_t
*ctrl
, uint8_t is_ipv6
)
1538 network_adapter_t
*adapter
= &prv_adapter_table
[ctrl
->adapter_index
];
1539 ctrl
->socket_id
= adapter
->opt
->create_soceket(ctrl
->is_tcp
, &ctrl
->tag
, ctrl
->socket_param
, is_ipv6
, adapter
->user_data
);
1540 if (ctrl
->socket_id
< 0)
1548 int network_socket_connect(network_ctrl_t
*ctrl
, luat_ip_addr_t
*remote_ip
)
1550 network_adapter_t
*adapter
= &prv_adapter_table
[ctrl
->adapter_index
];
1551 ctrl
->is_server_mode
= 0;
1552 ctrl
->online_ip
= remote_ip
;
1553 uint16_t local_port
= ctrl
->local_port
;
1556 if (ctrl
->adapter_index
>= NW_ADAPTER_INDEX_HW_PS_DEVICE
)
1558 adapter
->port
+= 100;
1559 local_port
= adapter
->port
;
1560 if (adapter
->port
< 60000)
1562 adapter
->port
= 60000;
1564 if (local_port
< 60000)
1568 local_port
+= ctrl
->socket_id
;
1569 DBG("%d,%d,%d", ctrl
->socket_id
, local_port
, adapter
->port
);
1572 return adapter
->opt
->socket_connect(ctrl
->socket_id
, ctrl
->tag
, local_port
, remote_ip
, ctrl
->remote_port
, adapter
->user_data
);
1575 int network_socket_listen(network_ctrl_t
*ctrl
)
1577 network_adapter_t
*adapter
= &prv_adapter_table
[ctrl
->adapter_index
];
1578 ctrl
->is_server_mode
= 1;
1579 return adapter
->opt
->socket_listen(ctrl
->socket_id
, ctrl
->tag
, ctrl
->local_port
, adapter
->user_data
);
1582 uint8_t network_accept_enable(network_ctrl_t
*ctrl
)
1584 network_adapter_t
*adapter
= &prv_adapter_table
[ctrl
->adapter_index
];
1585 return !(adapter
->opt
->no_accept
);
1587 //作为server接受一个client
1589 int network_socket_accept(network_ctrl_t
*ctrl
, network_ctrl_t
*accept_ctrl
)
1591 network_adapter_t
*adapter
= &prv_adapter_table
[ctrl
->adapter_index
];
1592 if (adapter
->opt
->no_accept
)
1594 // DBG("%x,%d,%llu,%x,%x,%x",adapter->opt->socket_accept, ctrl->socket_id, ctrl->tag, &ctrl->remote_ip, &ctrl->remote_port, adapter->user_data);
1595 adapter
->opt
->socket_accept(ctrl
->socket_id
, ctrl
->tag
, &ctrl
->remote_ip
, &ctrl
->remote_port
, adapter
->user_data
);
1598 accept_ctrl
->socket_id
= adapter
->opt
->socket_accept(ctrl
->socket_id
, ctrl
->tag
, &accept_ctrl
->remote_ip
, &accept_ctrl
->remote_port
, adapter
->user_data
);
1599 if (accept_ctrl
->socket_id
< 0)
1605 accept_ctrl
->is_tcp
= ctrl
->is_tcp
;
1606 accept_ctrl
->tcp_keep_alive
= ctrl
->tcp_keep_alive
;
1607 accept_ctrl
->tcp_keep_idle
= ctrl
->tcp_keep_idle
;
1608 accept_ctrl
->tcp_keep_interval
= ctrl
->tcp_keep_interval
;
1609 accept_ctrl
->tcp_keep_cnt
= ctrl
->tcp_keep_cnt
;
1610 accept_ctrl
->tcp_timeout_ms
= ctrl
->tcp_timeout_ms
;
1611 accept_ctrl
->local_port
= ctrl
->local_port
;
1612 accept_ctrl
->state
= NW_STATE_ONLINE
;
1616 //主动断开一个tcp连接,需要走完整个tcp流程,用户需要接收到close ok回调才能确认彻底断开
1618 int network_socket_disconnect(network_ctrl_t
*ctrl
)
1620 network_adapter_t
*adapter
= &prv_adapter_table
[ctrl
->adapter_index
];
1621 if (ctrl
->socket_id
>= 0)
1623 return adapter
->opt
->socket_disconnect(ctrl
->socket_id
, ctrl
->tag
, adapter
->user_data
);
1629 int network_socket_close(network_ctrl_t
*ctrl
)
1631 network_adapter_t
*adapter
= &prv_adapter_table
[ctrl
->adapter_index
];
1632 if (ctrl
->socket_id
>= 0)
1634 return adapter
->opt
->socket_close(ctrl
->socket_id
, ctrl
->tag
, adapter
->user_data
);
1640 int network_socket_force_close(network_ctrl_t
*ctrl
)
1642 network_adapter_t
*adapter
= &prv_adapter_table
[ctrl
->adapter_index
];
1643 if (ctrl
->socket_id
>= 0)
1645 adapter
->opt
->socket_force_close(ctrl
->socket_id
, adapter
->user_data
);
1647 ctrl
->socket_id
= -1;
1650 //tcp时,不需要remote_ip和remote_port,如果buf为NULL,则返回当前缓存区的数据量,当返回值小于len时说明已经读完了
1651 //udp时,只返回1个block数据,需要多次读直到没有数据为止
1653 int network_socket_receive(network_ctrl_t
*ctrl
,uint8_t *buf
, uint32_t len
, int flags
, luat_ip_addr_t
*remote_ip
, uint16_t *remote_port
)
1655 network_adapter_t
*adapter
= &prv_adapter_table
[ctrl
->adapter_index
];
1656 return adapter
->opt
->socket_receive(ctrl
->socket_id
, ctrl
->tag
, buf
, len
, flags
, remote_ip
, remote_port
, adapter
->user_data
);
1658 //tcp时,不需要remote_ip和remote_port
1660 int network_socket_send(network_ctrl_t
*ctrl
,const uint8_t *buf
, uint32_t len
, int flags
, luat_ip_addr_t
*remote_ip
, uint16_t remote_port
)
1662 network_adapter_t
*adapter
= &prv_adapter_table
[ctrl
->adapter_index
];
1663 return adapter
->opt
->socket_send(ctrl
->socket_id
, ctrl
->tag
, buf
, len
, flags
, remote_ip
, remote_port
, adapter
->user_data
);
1666 int network_getsockopt(network_ctrl_t
*ctrl
, int level
, int optname
, void *optval
, uint32_t *optlen
)
1668 network_adapter_t
*adapter
= &prv_adapter_table
[ctrl
->adapter_index
];
1669 return adapter
->opt
->getsockopt(ctrl
->socket_id
, ctrl
->tag
, level
, optname
, optval
, optlen
, adapter
->user_data
);
1671 int network_setsockopt(network_ctrl_t
*ctrl
, int level
, int optname
, const void *optval
, uint32_t optlen
)
1673 network_adapter_t
*adapter
= &prv_adapter_table
[ctrl
->adapter_index
];
1674 return adapter
->opt
->setsockopt(ctrl
->socket_id
, ctrl
->tag
, level
, optname
, optval
, optlen
, adapter
->user_data
);
1676 //非posix的socket,用这个根据实际硬件设置参数
1677 int network_user_cmd(network_ctrl_t
*ctrl
, uint32_t cmd
, uint32_t value
)
1679 network_adapter_t
*adapter
= &prv_adapter_table
[ctrl
->adapter_index
];
1680 return adapter
->opt
->user_cmd(ctrl
->socket_id
, ctrl
->tag
, cmd
, value
, adapter
->user_data
);
1683 int network_dns(network_ctrl_t
*ctrl
)
1685 network_adapter_t
*adapter
= &prv_adapter_table
[ctrl
->adapter_index
];
1686 if (ctrl
->domain_ipv6
)
1688 return adapter
->opt
->dns_ipv6(ctrl
->domain_name
, ctrl
->domain_name_len
, ctrl
, adapter
->user_data
);
1692 return adapter
->opt
->dns(ctrl
->domain_name
, ctrl
->domain_name_len
, ctrl
, adapter
->user_data
);
1696 int network_set_mac(uint8_t adapter_index
, uint8_t *mac
)
1698 network_adapter_t
*adapter
= &prv_adapter_table
[adapter_index
];
1699 return adapter
->opt
->set_mac(mac
, adapter
->user_data
);
1702 int network_set_static_ip_info(uint8_t adapter_index
, luat_ip_addr_t
*ip
, luat_ip_addr_t
*submask
, luat_ip_addr_t
*gateway
, luat_ip_addr_t
*ipv6
)
1704 network_adapter_t
*adapter
= &prv_adapter_table
[adapter_index
];
1705 return adapter
->opt
->set_static_ip(ip
, submask
, gateway
, ipv6
, adapter
->user_data
);
1708 int network_get_local_ip_info(network_ctrl_t
*ctrl
, luat_ip_addr_t
*ip
, luat_ip_addr_t
*submask
, luat_ip_addr_t
*gateway
)
1710 network_adapter_t
*adapter
= &prv_adapter_table
[ctrl
->adapter_index
];
1711 return adapter
->opt
->get_local_ip_info(ip
, submask
, gateway
, adapter
->user_data
);
1714 int network_get_full_local_ip_info(network_ctrl_t
*ctrl
, uint8_t index
, luat_ip_addr_t
*ip
, luat_ip_addr_t
*submask
, luat_ip_addr_t
*gateway
, luat_ip_addr_t
*ipv6
)
1716 network_adapter_t
*adapter
;
1719 adapter
= &prv_adapter_table
[ctrl
->adapter_index
];
1723 adapter
= &prv_adapter_table
[index
];
1725 return adapter
->opt
->get_full_ip_info(ip
, submask
, gateway
, ipv6
, adapter
->user_data
);
1728 void network_force_close_socket(network_ctrl_t
*ctrl
)
1733 mbedtls_ssl_free(ctrl
->ssl
);
1736 if (network_socket_close(ctrl
))
1738 network_clean_invaild_socket(ctrl
->adapter_index
);
1739 network_socket_force_close(ctrl
);
1741 ctrl
->need_close
= 0;
1742 ctrl
->socket_id
= -1;
1743 ctrl
->new_rx_flag
= 0;
1747 ctrl
->dns_ip
= NULL
;
1749 if (ctrl
->domain_name
)
1751 free(ctrl
->domain_name
);
1752 ctrl
->domain_name
= NULL
;
1754 ctrl
->dns_ip_cnt
= 0;
1755 ctrl
->dns_ip_nums
= 0;
1756 ctrl
->wait_target_state
= NW_WAIT_NONE
;
1759 void network_clean_invaild_socket(uint8_t adapter_index
)
1763 network_adapter_t
*adapter
= &prv_adapter_table
[adapter_index
];
1764 network_ctrl_t
*ctrl
;
1765 list
= malloc(adapter
->opt
->max_socket_num
* sizeof(int));
1767 for (i
= 0; i
< adapter
->opt
->max_socket_num
; i
++)
1769 ctrl
= &adapter
->ctrl_table
[i
];
1770 if (!adapter
->opt
->socket_check(ctrl
->socket_id
, ctrl
->tag
, adapter
->user_data
))
1772 list
[i
] = ctrl
->socket_id
;
1776 ctrl
->socket_id
= -1;
1779 DBG("%d,%d", i
, list
[i
]);
1782 adapter
->opt
->socket_clean(list
, adapter
->opt
->max_socket_num
, adapter
->user_data
);
1788 static int tls_verify(void *ctx
, mbedtls_x509_crt
*crt
, int Index
, uint32_t *result
)
1790 network_ctrl_t
*ctrl
= (network_ctrl_t
*)ctx
;
1791 DBG("%d, %08x", Index
, *result
);
1795 int network_set_psk_info(network_ctrl_t
*ctrl
,
1796 const unsigned char *psk
, size_t psk_len
,
1797 const unsigned char *psk_identity
, size_t psk_identity_len
)
1800 if (!ctrl
->tls_mode
)
1802 return -ERROR_PERMISSION_DENIED
;
1805 // DBG("%.*s, %.*s", psk_len, psk, psk_identity_len, psk_identity);
1806 int ret
= mbedtls_ssl_conf_psk( ctrl
->config
,
1807 psk
, psk_len
, psk_identity
, psk_identity_len
);
1811 return -ERROR_OPERATION_FAILED
;
1819 int network_set_server_cert(network_ctrl_t
*ctrl
, const unsigned char *cert
, size_t cert_len
)
1823 if (!ctrl
->tls_mode
)
1825 return -ERROR_PERMISSION_DENIED
;
1827 ret
= mbedtls_x509_crt_parse( ctrl
->ca_cert
, cert
, cert_len
);
1831 return -ERROR_OPERATION_FAILED
;
1840 int network_set_client_cert(network_ctrl_t
*ctrl
,
1841 const unsigned char *cert
, size_t certLen
,
1842 const unsigned char *key
, size_t keylen
,
1843 const unsigned char *pwd
, size_t pwdlen
)
1847 mbedtls_x509_crt
*client_cert
= NULL
;
1848 mbedtls_pk_context
*pkey
= NULL
;
1849 if (!ctrl
->tls_mode
)
1851 return -ERROR_PERMISSION_DENIED
;
1853 client_cert
= zalloc(sizeof(mbedtls_x509_crt
));
1854 pkey
= zalloc(sizeof(mbedtls_pk_context
));
1855 if (!client_cert
|| !pkey
)
1859 ret
= mbedtls_x509_crt_parse( client_cert
, cert
, certLen
);
1865 #if MBEDTLS_VERSION_NUMBER >= 0x03000000
1866 ret
= mbedtls_pk_parse_key( pkey
, key
, keylen
, pwd
, pwdlen
, tls_random
, NULL
);
1868 ret
= mbedtls_pk_parse_key( pkey
, key
, keylen
, pwd
, pwdlen
);
1875 ret
= mbedtls_ssl_conf_own_cert( ctrl
->config
, client_cert
, pkey
);
1883 if (client_cert
) free(client_cert
);
1884 if (pkey
) free(pkey
);
1891 int network_cert_verify_result(network_ctrl_t
*ctrl
)
1894 if (!ctrl
->tls_mode
)
1898 return mbedtls_ssl_get_verify_result(ctrl
->ssl
);
1904 static int tls_random( void *p_rng
,
1905 unsigned char *output
, size_t output_len
)
1907 platform_random((char*)output
, output_len
);
1911 int network_init_tls(network_ctrl_t
*ctrl
, int verify_mode
)
1917 ctrl
->ssl
= zalloc(sizeof(mbedtls_ssl_context
));
1918 ctrl
->ca_cert
= zalloc(sizeof(mbedtls_x509_crt
));
1919 ctrl
->config
= zalloc(sizeof(mbedtls_ssl_config
));
1920 mbedtls_ssl_config_defaults( ctrl
->config
, MBEDTLS_SSL_IS_CLIENT
, ctrl
->is_tcp
?MBEDTLS_SSL_TRANSPORT_STREAM
:MBEDTLS_SSL_TRANSPORT_DATAGRAM
, MBEDTLS_SSL_PRESET_DEFAULT
);
1921 // ctrl->config->authmode = verify_mode;
1922 mbedtls_ssl_conf_authmode(ctrl
->config
, verify_mode
);
1923 // ctrl->config->hs_timeout_min = 20000;
1924 #if defined(MBEDTLS_SSL_PROTO_DTLS)
1925 mbedtls_ssl_conf_handshake_timeout(ctrl
->config
, 2000, MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MAX
);
1927 // ctrl->config->f_rng = tls_random;
1928 // ctrl->config->p_rng = NULL;
1929 mbedtls_ssl_conf_rng(ctrl
->config
, tls_random
, NULL
);
1930 // ctrl->config->f_dbg = tls_dbg;
1931 // ctrl->config->p_dbg = NULL;
1932 mbedtls_ssl_conf_dbg(ctrl
->config
, tls_dbg
, NULL
);
1933 // ctrl->config->f_vrfy = tls_verify;
1934 // ctrl->config->p_vrfy = ctrl;
1935 mbedtls_ssl_conf_verify(ctrl
->config
, tls_verify
, ctrl
);
1936 // ctrl->config->ca_chain = ctrl->ca_cert;
1937 mbedtls_ssl_conf_ca_chain(ctrl
->config
, ctrl
->ca_cert
, NULL
);
1938 // ctrl->config->read_timeout = 20000;
1939 mbedtls_ssl_conf_read_timeout(ctrl
->config
, 20000);
1940 #ifdef MBEDTLS_SSL_RENEGOTIATION
1941 mbedtls_ssl_conf_renegotiation(ctrl
->config
, MBEDTLS_SSL_RENEGOTIATION_ENABLED
);
1942 mbedtls_ssl_conf_legacy_renegotiation(ctrl
->config
, MBEDTLS_SSL_LEGACY_ALLOW_RENEGOTIATION
);
1944 ctrl
->tls_long_timer
= platform_create_timer(tls_longtimeout
, ctrl
, NULL
);
1945 ctrl
->tls_short_timer
= platform_create_timer(tls_shorttimeout
, ctrl
, NULL
);
1947 ctrl
->tls_timer_state
= -1;
1950 DBG("NOT SUPPORT TLS");
1955 void network_deinit_tls(network_ctrl_t
*ctrl
)
1960 mbedtls_ssl_free(ctrl
->ssl
);
1967 mbedtls_ssl_config_free(ctrl
->config
);
1969 ctrl
->config
= NULL
;
1974 mbedtls_x509_crt_free(ctrl
->ca_cert
);
1975 free(ctrl
->ca_cert
);
1976 ctrl
->ca_cert
= NULL
;
1980 ctrl
->tls_timer_state
= -1;
1981 if (ctrl
->tls_short_timer
)
1983 platform_release_timer(ctrl
->tls_short_timer
);
1984 ctrl
->tls_short_timer
= NULL
;
1986 if (ctrl
->tls_long_timer
)
1988 platform_release_timer(ctrl
->tls_long_timer
);
1989 ctrl
->tls_long_timer
= NULL
;
1994 int network_wait_link_up(network_ctrl_t
*ctrl
, uint32_t timeout_ms
)
1997 ctrl
->auto_mode
= 1;
1998 // network_adapter_t *adapter = &prv_adapter_table[ctrl->adapter_index];
1999 if (network_check_ready(ctrl
, 0))
2001 ctrl
->state
= NW_STATE_OFF_LINE
;
2002 ctrl
->wait_target_state
= NW_WAIT_NONE
;
2006 ctrl
->state
= NW_STATE_LINK_OFF
;
2007 ctrl
->wait_target_state
= NW_WAIT_LINK_UP
;
2010 if (!ctrl
->task_handle
|| !timeout_ms
)
2017 //DBG_INFO("%s wait for active!,%u,%x", Net->Tag, To * SYS_TICK, Net->hTask);
2019 platform_start_timer(ctrl
->timer
, timeout_ms
, 0);
2022 platform_wait_event(ctrl
->task_handle
, 0, &event
, NULL
, 0);
2025 case EV_NW_RESULT_LINK
:
2026 result
= (int)event
.Param1
;
2034 if (ctrl
->user_callback
)
2036 ctrl
->user_callback((void *)&event
, ctrl
->user_data
);
2041 platform_stop_timer(ctrl
->timer
);
2045 * 1.进行ready检测和等待ready
2046 * 2.有remote_ip则开始连接服务器并等待连接结果
2047 * 3.没有remote_ip则开始对url进行dns解析,解析完成后对所有ip进行尝试连接直到有个成功或者全部失败
2048 * 4.如果是加密模式,还要走握手环节,等到握手环节完成后才能返回结果
2049 * local_port如果为0则api内部自动生成一个
2051 int network_connect(network_ctrl_t
*ctrl
, const char *domain_name
, uint32_t domain_name_len
, luat_ip_addr_t
*remote_ip
, uint16_t remote_port
, uint32_t timeout_ms
)
2053 if (ctrl
->socket_id
>= 0)
2059 ctrl
->is_server_mode
= 0;
2065 ctrl
->dns_ip
= NULL
;
2067 if (ctrl
->cache_data
)
2069 free(ctrl
->cache_data
);
2070 ctrl
->cache_data
= NULL
;
2072 ctrl
->need_close
= 0;
2073 if (ctrl
->domain_name
)
2075 free(ctrl
->domain_name
);
2077 ctrl
->domain_name
= zalloc(domain_name_len
+ 1);
2078 memcpy(ctrl
->domain_name
, domain_name
, domain_name_len
);
2079 ctrl
->domain_name_len
= domain_name_len
;
2082 ctrl
->remote_ip
= *remote_ip
;
2086 network_set_ip_invaild(&ctrl
->remote_ip
);
2088 ctrl
->auto_mode
= 1;
2089 ctrl
->remote_port
= remote_port
;
2090 network_adapter_t
*adapter
= &prv_adapter_table
[ctrl
->adapter_index
];
2091 ctrl
->wait_target_state
= NW_WAIT_ON_LINE
;
2092 if (!network_check_ready(ctrl
, 0))
2095 ctrl
->state
= NW_STATE_LINK_OFF
;
2096 goto NETWORK_CONNECT_WAIT
;
2098 if (network_prepare_connect(ctrl
))
2100 ctrl
->state
= NW_STATE_OFF_LINE
;
2101 ctrl
->wait_target_state
= NW_WAIT_NONE
;
2105 NETWORK_CONNECT_WAIT
:
2107 if (!ctrl
->task_handle
|| !timeout_ms
)
2113 OS_EVENT event
= {0};
2115 //DBG_INFO("%s wait for active!,%u,%x", Net->Tag, To * SYS_TICK, Net->hTask);
2117 platform_start_timer(ctrl
->timer
, timeout_ms
, 0);
2120 platform_wait_event(ctrl
->task_handle
, 0, &event
, NULL
, 0);
2123 case EV_NW_RESULT_CONNECT
:
2124 result
= (int)event
.Param1
;
2132 if (ctrl
->user_callback
)
2134 ctrl
->user_callback((void *)&event
, ctrl
->user_data
);
2139 platform_stop_timer(ctrl
->timer
);
2143 int network_listen(network_ctrl_t
*ctrl
, uint32_t timeout_ms
)
2145 if (NW_STATE_LISTEN
== ctrl
->state
)
2147 DBG("socket %d is listen", ctrl
->socket_id
);
2150 if (ctrl
->socket_id
>= 0)
2155 ctrl
->is_server_mode
= 1;
2156 ctrl
->auto_mode
= 1;
2157 ctrl
->need_close
= 0;
2158 network_adapter_t
*adapter
= &prv_adapter_table
[ctrl
->adapter_index
];
2159 ctrl
->wait_target_state
= NW_WAIT_ON_LINE
;
2160 if (!network_check_ready(ctrl
, 0))
2163 ctrl
->state
= NW_STATE_LINK_OFF
;
2164 goto NETWORK_LISTEN_WAIT
;
2166 if (network_base_connect(ctrl
, NULL
))
2168 ctrl
->state
= NW_STATE_OFF_LINE
;
2169 ctrl
->wait_target_state
= NW_WAIT_NONE
;
2173 ctrl
->state
= NW_STATE_CONNECTING
;
2174 NETWORK_LISTEN_WAIT
:
2176 if (!ctrl
->task_handle
|| !timeout_ms
)
2184 //DBG_INFO("%s wait for active!,%u,%x", Net->Tag, To * SYS_TICK, Net->hTask);
2186 if (timeout_ms
!= 0xffffffff)
2188 platform_start_timer(ctrl
->timer
, timeout_ms
, 0);
2192 platform_wait_event(ctrl
->task_handle
, 0, &event
, NULL
, 0);
2195 case EV_NW_RESULT_CONNECT
:
2196 result
= (int)event
.Param1
;
2204 if (ctrl
->user_callback
)
2206 ctrl
->user_callback((void *)&event
, ctrl
->user_data
);
2211 if (timeout_ms
!= 0xffffffff)
2213 platform_stop_timer(ctrl
->timer
);
2218 int network_close(network_ctrl_t
*ctrl
, uint32_t timeout_ms
)
2221 if (ctrl
->cache_data
)
2223 free(ctrl
->cache_data
);
2224 ctrl
->cache_data
= NULL
;
2226 uint8_t old_state
= ctrl
->state
;
2227 ctrl
->auto_mode
= 1;
2228 ctrl
->need_close
= 0;
2229 ctrl
->new_rx_flag
= 0;
2230 network_adapter_t
*adapter
= &prv_adapter_table
[ctrl
->adapter_index
];
2234 mbedtls_ssl_free(ctrl
->ssl
);
2237 if (ctrl
->socket_id
< 0)
2240 ctrl
->state
= NW_STATE_OFF_LINE
;
2241 ctrl
->wait_target_state
= NW_WAIT_NONE
;
2246 ctrl
->state
= NW_STATE_DISCONNECTING
;
2247 ctrl
->wait_target_state
= NW_WAIT_OFF_LINE
;
2249 if ((NW_STATE_ONLINE
== old_state
) && ctrl
->is_tcp
)
2251 if (network_socket_disconnect(ctrl
))
2253 network_force_close_socket(ctrl
);
2254 ctrl
->state
= NW_STATE_OFF_LINE
;
2255 ctrl
->wait_target_state
= NW_WAIT_NONE
;
2262 network_force_close_socket(ctrl
);
2263 ctrl
->state
= NW_STATE_OFF_LINE
;
2264 ctrl
->wait_target_state
= NW_WAIT_NONE
;
2269 if (!ctrl
->task_handle
|| !timeout_ms
)
2276 //DBG_INFO("%s wait for active!,%u,%x", Net->Tag, To * SYS_TICK, Net->hTask);
2278 platform_start_timer(ctrl
->timer
, timeout_ms
, 0);
2281 platform_wait_event(ctrl
->task_handle
, 0, &event
, NULL
, 0);
2284 case EV_NW_RESULT_CLOSE
:
2293 if (ctrl
->user_callback
)
2295 ctrl
->user_callback((void *)&event
, ctrl
->user_data
);
2300 platform_stop_timer(ctrl
->timer
);
2301 network_socket_force_close(ctrl
);
2305 * timeout_ms=0时,为非阻塞接口
2307 int network_tx(network_ctrl_t
*ctrl
, const uint8_t *data
, uint32_t len
, int flags
, luat_ip_addr_t
*remote_ip
, uint16_t remote_port
, uint32_t *tx_len
, uint32_t timeout_ms
)
2309 if ((ctrl
->need_close
) || (ctrl
->socket_id
< 0) || (ctrl
->state
!= NW_STATE_ONLINE
))
2316 ctrl
->auto_mode
= 1;
2320 if (ctrl
->tls_need_reshakehand
)
2322 ctrl
->tls_need_reshakehand
= 0;
2323 if (ctrl
->cache_data
)
2325 free(ctrl
->cache_data
);
2326 ctrl
->cache_data
= NULL
;
2328 ctrl
->cache_data
= malloc(len
);
2329 memcpy(ctrl
->cache_data
, data
, len
);
2330 ctrl
->cache_len
= len
;
2331 mbedtls_ssl_session_reset(ctrl
->ssl
);
2334 result
= mbedtls_ssl_handshake_step( ctrl
->ssl
);
2337 case MBEDTLS_ERR_SSL_WANT_READ
:
2338 ctrl
->state
= NW_STATE_SHAKEHAND
;
2339 goto NETWORK_TX_WAIT
;
2343 #if MBEDTLS_VERSION_NUMBER >= 0x03000000
2345 DBG_ERR("0x%x, %d", -result
, ctrl
->ssl
->state
);
2347 ctrl
->need_close
= 1;
2351 #if MBEDTLS_VERSION_NUMBER >= 0x03000000
2352 }while(!mbedtls_ssl_is_handshake_over(ctrl
->ssl
));
2354 }while(ctrl
->ssl
->state
!= MBEDTLS_SSL_HANDSHAKE_OVER
);
2361 result
= mbedtls_ssl_write(ctrl
->ssl
, data
+ done
, len
- done
);
2364 DBG("%08x", -result
);
2365 ctrl
->need_close
= 1;
2377 result
= network_base_tx(ctrl
, data
, len
, flags
, remote_ip
, remote_port
);
2380 ctrl
->need_close
= 1;
2395 ctrl
->wait_target_state
= NW_WAIT_TX_OK
;
2398 if (!ctrl
->task_handle
|| !timeout_ms
)
2404 //DBG_INFO("%s wait for active!,%u,%x", Net->Tag, To * SYS_TICK, Net->hTask);
2406 platform_start_timer(ctrl
->timer
, timeout_ms
, 0);
2409 platform_wait_event(ctrl
->task_handle
, 0, &event
, NULL
, 0);
2412 case EV_NW_RESULT_TX
:
2413 result
= (int)event
.Param1
;
2421 if (ctrl
->user_callback
)
2423 ctrl
->user_callback((void *)&event
, ctrl
->user_data
);
2428 platform_stop_timer(ctrl
->timer
);
2432 * 实际读到的数据量在rx_len里,如果是UDP模式且为server时,需要看remote_ip和remote_port
2434 int network_rx(network_ctrl_t
*ctrl
, uint8_t *data
, uint32_t len
, int flags
, luat_ip_addr_t
*remote_ip
, uint16_t *remote_port
, uint32_t *rx_len
)
2436 if (((ctrl
->need_close
&& !ctrl
->new_rx_flag
) || (ctrl
->socket_id
< 0) || (ctrl
->state
!= NW_STATE_ONLINE
)))
2442 ctrl
->auto_mode
= 1;
2443 uint32_t read_len
= 0;
2444 uint8_t is_error
= 0;
2449 ctrl
->new_rx_flag
= 0;
2456 result
= mbedtls_ssl_read(ctrl
->ssl
, data
+ read_len
, len
- read_len
);
2457 if (result
< 0 && (result
!= MBEDTLS_ERR_SSL_WANT_READ
))
2462 else if (result
> 0)
2465 if (read_len
>= len
)
2474 }while(network_socket_receive(ctrl
, NULL
, len
, flags
, remote_ip
, remote_port
) > 0);
2489 result
= network_socket_receive(ctrl
, data
, len
, flags
, remote_ip
, remote_port
);
2500 result
= mbedtls_ssl_read(ctrl
->ssl
, NULL
, 0);
2501 if ((result
< 0) && (result
!= (MBEDTLS_ERR_SSL_WANT_READ
)))
2509 #if MBEDTLS_VERSION_NUMBER >= 0x03000000
2510 read_len
= ctrl
->ssl
->MBEDTLS_PRIVATE(in_msglen
);
2512 read_len
= ctrl
->ssl
->in_msglen
;
2516 else if ((MBEDTLS_ERR_SSL_WANT_READ
) == result
)
2519 ctrl
->new_rx_flag
= 0;
2520 DBG("socket %d ssl data need more", ctrl
->socket_id
);
2523 }while(network_socket_receive(ctrl
, NULL
, len
, flags
, remote_ip
, remote_port
) > 0);
2537 result
= network_socket_receive(ctrl
, data
, len
, flags
, remote_ip
, remote_port
);
2554 int network_wait_event(network_ctrl_t
*ctrl
, OS_EVENT
*out_event
, uint32_t timeout_ms
, uint8_t *is_timeout
)
2556 if (ctrl
->new_rx_flag
)
2558 ctrl
->wait_target_state
= NW_WAIT_EVENT
;
2565 if ((ctrl
->need_close
) || (ctrl
->socket_id
< 0) || (ctrl
->state
!= NW_STATE_ONLINE
))
2570 ctrl
->auto_mode
= 1;
2571 ctrl
->wait_target_state
= NW_WAIT_EVENT
;
2573 if (!ctrl
->task_handle
|| !timeout_ms
)
2581 //DBG_INFO("%s wait for active!,%u,%x", Net->Tag, To * SYS_TICK, Net->hTask);
2583 platform_start_timer(ctrl
->timer
, timeout_ms
, 0);
2586 platform_wait_event(ctrl
->task_handle
, 0, &event
, NULL
, 0);
2589 case EV_NW_RESULT_EVENT
:
2590 result
= (int)event
.Param1
;
2606 case EV_NW_BREAK_WAIT
:
2622 else if (ctrl
->user_callback
)
2624 ctrl
->user_callback((void *)&event
, ctrl
->user_data
);
2629 platform_stop_timer(ctrl
->timer
);
2633 int network_wait_rx(network_ctrl_t
*ctrl
, uint32_t timeout_ms
, uint8_t *is_break
, uint8_t *is_timeout
)
2637 if (ctrl
->new_rx_flag
)
2639 ctrl
->wait_target_state
= NW_WAIT_EVENT
;
2642 if ((ctrl
->need_close
) || (ctrl
->socket_id
< 0) || (ctrl
->state
!= NW_STATE_ONLINE
))
2647 ctrl
->auto_mode
= 1;
2648 ctrl
->wait_target_state
= NW_WAIT_EVENT
;
2654 //DBG_INFO("%s wait for active!,%u,%x", Net->Tag, To * SYS_TICK, Net->hTask);
2657 platform_start_timer(ctrl
->timer
, timeout_ms
, 0);
2661 platform_wait_event(ctrl
->task_handle
, 0, &event
, NULL
, 0);
2664 case EV_NW_RESULT_EVENT
:
2665 result
= (int)event
.Param1
;
2671 else if (ctrl
->new_rx_flag
)
2682 case EV_NW_BREAK_WAIT
:
2688 if (ctrl
->user_callback
)
2690 ctrl
->user_callback((void *)&event
, ctrl
->user_data
);
2694 ctrl
->wait_target_state
= NW_WAIT_EVENT
;
2696 platform_stop_timer(ctrl
->timer
);
2700 uint8_t network_check_ready(network_ctrl_t
*ctrl
, uint8_t adapter_index
)
2702 network_adapter_t
*adapter
;
2705 adapter
= &prv_adapter_table
[ctrl
->adapter_index
];
2707 else if (adapter_index
< NW_ADAPTER_QTY
)
2709 adapter
= &prv_adapter_table
[adapter_index
];
2717 return adapter
->opt
->check_ready(adapter
->user_data
);
2726 void network_set_ip_invaild(luat_ip_addr_t
*ip
)
2728 #ifdef LUAT_USE_LWIP
2739 uint8_t network_ip_is_vaild(luat_ip_addr_t
*ip
)
2741 #ifdef LUAT_USE_LWIP
2743 return (ip
->type
!= 0xff);
2745 return (ip
->addr
!= 0);
2748 return (ip
->is_ipv6
!= 0xff);
2752 uint8_t network_ip_is_ipv6(luat_ip_addr_t
*ip
)
2754 #ifdef LUAT_USE_LWIP
2756 return (IPADDR_TYPE_V6
== ip
->type
);
2761 return (ip
->is_ipv6
&& (ip
->is_ipv6
!= 0xff));
2765 //检测IP是不是有效的IPV4类型,不是返回0
2766 uint8_t network_ip_is_vaild_ipv4(luat_ip_addr_t
*ip
)
2768 #ifdef LUAT_USE_LWIP
2770 return (IPADDR_TYPE_V4
== ip
->type
);
2772 return (ip
->addr
!= 0);
2775 return !ip
->is_ipv6
;
2779 void network_set_ip_ipv4(luat_ip_addr_t
*ip
, uint32_t ipv4
)
2781 #ifdef LUAT_USE_LWIP
2783 ip
->type
= IPADDR_TYPE_V4
;
2784 ip
->u_addr
.ip4
.addr
= ipv4
;