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 return net_lwip_check_all_ack(ctrl
->socket_id
);
900 case EV_NW_SOCKET_RX_NEW
:
902 #if MBEDTLS_VERSION_NUMBER >= 0x03000000
903 if (ctrl
->tls_mode
&& !mbedtls_ssl_is_handshake_over(ctrl
->ssl
))
905 if (ctrl
->tls_mode
&& (ctrl
->ssl
->state
!= MBEDTLS_SSL_HANDSHAKE_OVER
))
908 DBG("rehandshaking");
911 int result
= mbedtls_ssl_handshake_step( ctrl
->ssl
);
914 case MBEDTLS_ERR_SSL_WANT_READ
:
919 #if MBEDTLS_VERSION_NUMBER >= 0x03000000
920 DBG_ERR("0x%x", -result
);
922 DBG_ERR("0x%x, %d", -result
, ctrl
->ssl
->state
);
924 ctrl
->need_close
= 1;
927 #if MBEDTLS_VERSION_NUMBER >= 0x03000000
928 }while(!mbedtls_ssl_is_handshake_over(ctrl
->ssl
));
930 }while(ctrl
->ssl
->state
!= MBEDTLS_SSL_HANDSHAKE_OVER
);
934 ctrl
->new_rx_flag
= 1;
935 if (NW_WAIT_TX_OK
!= ctrl
->wait_target_state
)
946 static int network_state_listen(network_ctrl_t
*ctrl
, OS_EVENT
*event
, network_adapter_t
*adapter
)
948 if ((ctrl
->need_close
) || NW_WAIT_OFF_LINE
== ctrl
->wait_target_state
)
955 case EV_NW_SOCKET_ERROR
:
956 case EV_NW_SOCKET_REMOTE_CLOSE
:
957 case EV_NW_SOCKET_CLOSE_OK
:
958 ctrl
->need_close
= 1;
963 ctrl
->need_close
= 1;
967 case EV_NW_SOCKET_NEW_CONNECT
:
968 case EV_NW_SOCKET_CONNECT_OK
:
969 ctrl
->state
= NW_STATE_ONLINE
;
977 static int network_state_disconnecting(network_ctrl_t
*ctrl
, OS_EVENT
*event
, network_adapter_t
*adapter
)
979 if (ctrl
->wait_target_state
!= NW_WAIT_OFF_LINE
)
986 case EV_NW_SOCKET_ERROR
:
987 case EV_NW_SOCKET_REMOTE_CLOSE
:
988 case EV_NW_SOCKET_CLOSE_OK
:
989 network_force_close_socket(ctrl
);
990 ctrl
->state
= NW_STATE_OFF_LINE
;
991 ctrl
->socket_id
= -1;
1000 network_force_close_socket(ctrl
);
1001 ctrl
->state
= NW_STATE_OFF_LINE
;
1002 ctrl
->socket_id
= -1;
1011 typedef int (*network_state_fun
)(network_ctrl_t
*ctrl
, OS_EVENT
*event
, network_adapter_t
*adapter
);
1012 static network_state_fun network_state_fun_list
[]=
1014 network_state_link_off
,
1015 network_state_off_line
,
1016 network_state_wait_dns
,
1017 network_state_connecting
,
1018 network_state_shakehand
,
1019 network_state_on_line
,
1020 network_state_listen
,
1021 network_state_disconnecting
,
1024 static void network_default_statemachine(network_ctrl_t
*ctrl
, OS_EVENT
*event
, network_adapter_t
*adapter
)
1028 if (ctrl
->state
> NW_STATE_DISCONNECTING
)
1030 ctrl
->state
= NW_STATE_LINK_OFF
;
1033 network_force_close_socket(ctrl
);
1034 event
->ID
= ctrl
->wait_target_state
+ EV_NW_RESULT_BASE
;
1039 result
= network_state_fun_list
[ctrl
->state
](ctrl
, event
, adapter
);
1043 if (ctrl
->new_rx_flag
&& ctrl
->user_callback
)
1045 event
->ID
= NW_WAIT_EVENT
+ EV_NW_RESULT_BASE
;
1047 ctrl
->user_callback(event
, ctrl
->user_data
);
1051 event
->ID
= (ctrl
->wait_target_state
?ctrl
->wait_target_state
:NW_WAIT_EVENT
) + EV_NW_RESULT_BASE
;
1052 event
->Param1
= result
;
1054 if ((ctrl
->state
!= NW_STATE_LISTEN
) || (result
< 0))
1056 ctrl
->wait_target_state
= NW_WAIT_NONE
;
1059 if (ctrl
->task_handle
)
1061 platform_send_event(ctrl
->task_handle
, event
->ID
, event
->Param1
, event
->Param2
, event
->Param3
);
1063 else if (ctrl
->user_callback
)
1065 ctrl
->user_callback(event
, ctrl
->user_data
);
1070 static int32_t network_default_socket_callback(void *data
, void *param
)
1072 OS_EVENT
*event
= (OS_EVENT
*)data
;
1073 OS_EVENT temp_event
;
1074 luat_network_cb_param_t
*cb_param
= (luat_network_cb_param_t
*)param
;
1075 network_adapter_t
*adapter
=(network_adapter_t
*)(cb_param
->param
);
1077 network_ctrl_t
*ctrl
= (network_ctrl_t
*)event
->Param3
;
1079 if (event
->ID
> EV_NW_TIMEOUT
)
1081 if (ctrl
&& ((event
->ID
== EV_NW_DNS_RESULT
) || (ctrl
->tag
== cb_param
->tag
)))
1083 if ((event
->ID
== EV_NW_DNS_RESULT
) && (ctrl
->wait_target_state
!= NW_WAIT_ON_LINE
))
1085 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
));
1088 if (ctrl
->auto_mode
)
1090 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
),
1091 ctrl
->state
, network_ctrl_state_string(ctrl
->state
),
1092 ctrl
->wait_target_state
, network_ctrl_wait_state_string(ctrl
->wait_target_state
));
1093 network_default_statemachine(ctrl
, event
, adapter
);
1094 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
));
1096 else if (ctrl
->task_handle
)
1098 platform_send_event(ctrl
->task_handle
, event
->ID
, event
->Param1
, event
->Param2
, event
->Param3
);
1100 else if (ctrl
->user_callback
)
1102 ctrl
->user_callback(event
, ctrl
->user_data
);
1107 DBG_ERR("cb ctrl invaild %x %08X", ctrl
, event
->ID
);
1109 // 原因是ctrl可能已经被释放, 再次访问会导致coredump
1110 //DBG_HexPrintf(&ctrl->tag, 8);
1111 DBG_HexPrintf(&cb_param
->tag
, 8);
1116 for (i
= 0; i
< adapter
->opt
->max_socket_num
; i
++)
1118 temp_event
= *event
;
1119 if (adapter
->ctrl_busy
[i
])
1121 ctrl
= &adapter
->ctrl_table
[i
];
1122 if (ctrl
->adapter_index
== (uint8_t)(event
->Param3
))
1124 if (ctrl
->auto_mode
)
1126 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
),
1127 ctrl
->state
, network_ctrl_state_string(ctrl
->state
),
1128 ctrl
->wait_target_state
, network_ctrl_wait_state_string(ctrl
->wait_target_state
));
1129 network_default_statemachine(ctrl
, &temp_event
, adapter
);
1130 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
));
1132 else if (ctrl
->task_handle
)
1134 platform_send_event(ctrl
->task_handle
, event
->ID
, event
->Param1
, event
->Param2
, event
->Param3
);
1136 else if (ctrl
->user_callback
)
1138 ctrl
->user_callback(&temp_event
, ctrl
->user_data
);
1149 static LUAT_RT_RET_TYPE
network_default_timer_callback(LUAT_RT_CB_PARAM
)
1151 platform_send_event(param
, EV_NW_TIMEOUT
, 0, 0, 0);
1155 #ifndef LUAT_USE_LWIP
1156 uint8_t network_string_is_ipv4(const char *string
, uint32_t len
)
1159 for(i
= 0; i
< len
; i
++)
1161 if (!isdigit((int)string
[i
]) && (string
[i
] != '.'))
1169 uint32_t network_string_to_ipv4(const char *string
, uint32_t len
)
1176 memset(Buf
, 0, sizeof(Buf
));
1177 CP
.param_max_len
= 4;
1178 CP
.param_max_num
= 4;
1180 CP
.param_str
= (int8_t *)Buf
;
1181 memcpy(temp
, string
, len
);
1183 CmdParseParam((int8_t*)temp
, &CP
, '.');
1184 for(i
= 0; i
< 4; i
++)
1186 uIP
.u8
[i
] = strtol((char *)Buf
[i
], NULL
, 10);
1188 // DBG("%d.%d.%d.%d", uIP.u8[0], uIP.u8[1], uIP.u8[2], uIP.u8[3]);
1192 #define SWAP(x) ((((x) & (uint32_t)0x000000ffUL) << 24) | \
1193 (((x) & (uint32_t)0x0000ff00UL) << 8) | \
1194 (((x) & (uint32_t)0x00ff0000UL) >> 8) | \
1195 (((x) & (uint32_t)0xff000000UL) >> 24))
1197 int network_string_to_ipv6(const char *string
, luat_ip_addr_t
*ip_addr
)
1201 uint32_t addr_index
, zero_blocks
, current_block_index
, current_block_value
;
1203 ip_addr
->is_ipv6
= 0xff;
1204 /* Count the number of colons, to count the number of blocks in a "::" sequence
1205 zero_blocks may be 1 even if there are no :: sequences */
1207 for (s
= string
; *s
!= 0; s
++) {
1210 } else if (!isxdigit((int)*s
)) {
1215 /* parse each block */
1217 current_block_index
= 0;
1218 current_block_value
= 0;
1219 for (s
= string
; *s
!= 0; s
++) {
1221 if (current_block_index
& 0x1) {
1222 ip_addr
->ipv6_u32_addr
[addr_index
++] |= current_block_value
;
1225 ip_addr
->ipv6_u32_addr
[addr_index
] = current_block_value
<< 16;
1227 current_block_index
++;
1228 current_block_value
= 0;
1229 if (current_block_index
> 7) {
1230 /* address too long! */
1235 /* invalid format: three successive colons */
1239 /* "::" found, set zeros */
1240 while (zero_blocks
> 0) {
1242 if (current_block_index
& 0x1) {
1245 ip_addr
->ipv6_u32_addr
[addr_index
] = 0;
1247 current_block_index
++;
1248 if (current_block_index
> 7) {
1249 /* address too long! */
1254 } else if (isxdigit((int)*s
)) {
1255 /* add current digit */
1256 current_block_value
= (current_block_value
<< 4) +
1257 (isxdigit((int)*s
) ? (uint32_t)(*s
- '0') :
1258 (uint32_t)(10 + (isxdigit((int)*s
) ? *s
- 'a' : *s
- 'A')));
1260 /* unexpected digit, space? CRLF? */
1266 if (current_block_index
& 0x1) {
1267 ip_addr
->ipv6_u32_addr
[addr_index
++] |= current_block_value
;
1270 ip_addr
->ipv6_u32_addr
[addr_index
] = current_block_value
<< 16;
1273 /* convert to network byte order. */
1274 for (addr_index
= 0; addr_index
< 4; addr_index
++) {
1275 ip_addr
->ipv6_u32_addr
[addr_index
] = SWAP(ip_addr
->ipv6_u32_addr
[addr_index
]);
1280 if (current_block_index
!= 7) {
1284 ip_addr
->is_ipv6
= 1;
1291 int network_get_last_register_adapter(void)
1293 if (prv_network
.default_adapter_index
!= -1) return prv_network
.default_adapter_index
;
1294 return prv_network
.last_adapter_index
;
1297 void network_register_set_default(uint8_t adapter_index
)
1299 prv_network
.default_adapter_index
= adapter_index
;
1302 int network_register_adapter(uint8_t adapter_index
, network_adapter_info
*info
, void *user_data
)
1304 prv_adapter_table
[adapter_index
].opt
= info
;
1305 prv_adapter_table
[adapter_index
].user_data
= user_data
;
1306 info
->socket_set_callback(network_default_socket_callback
, &prv_adapter_table
[adapter_index
], user_data
);
1307 #ifdef LUAT_USE_LWIP
1308 if (adapter_index
< NW_ADAPTER_INDEX_HW_PS_DEVICE
)
1310 prv_adapter_table
[adapter_index
].ctrl_table
= prv_network
.lwip_ctrl_table
;
1311 prv_adapter_table
[adapter_index
].ctrl_busy
= prv_network
.lwip_ctrl_busy
;
1316 prv_adapter_table
[adapter_index
].ctrl_table
= zalloc((info
->max_socket_num
) * sizeof(network_ctrl_t
));
1317 prv_adapter_table
[adapter_index
].ctrl_busy
= zalloc(info
->max_socket_num
);
1320 prv_adapter_table
[adapter_index
].port
= 60000;
1321 if (!prv_network
.is_init
)
1323 //prv_network.network_mutex = platform_create_mutex();
1324 INIT_LLIST_HEAD(&prv_network
.dns_cache_head
);
1325 prv_network
.is_init
= 0;
1328 prv_network
.last_adapter_index
= adapter_index
;
1332 void network_set_dns_server(uint8_t adapter_index
, uint8_t server_index
, luat_ip_addr_t
*ip
)
1334 network_adapter_t
*adapter
= &prv_adapter_table
[adapter_index
];
1335 adapter
->opt
->set_dns_server(server_index
, ip
, adapter
->user_data
);
1341 network_ctrl_t
*network_alloc_ctrl(uint8_t adapter_index
)
1344 network_ctrl_t
*ctrl
= NULL
;
1345 network_adapter_t
*adapter
= &prv_adapter_table
[adapter_index
];
1347 for (i
= 0; i
< adapter
->opt
->max_socket_num
; i
++)
1349 if (!adapter
->ctrl_busy
[i
])
1352 adapter
->ctrl_busy
[i
] = 1;
1353 ctrl
= &adapter
->ctrl_table
[i
];
1354 ctrl
->adapter_index
= adapter_index
;
1355 ctrl
->domain_ipv6
= 0;
1360 if (i
>= adapter
->opt
->max_socket_num
) {DBG_ERR("adapter no more ctrl!");}
1367 void network_release_ctrl(network_ctrl_t
*ctrl
)
1370 network_adapter_t
*adapter
= &prv_adapter_table
[ctrl
->adapter_index
];
1373 for (i
= 0; i
< adapter
->opt
->max_socket_num
; i
++)
1375 if (&adapter
->ctrl_table
[i
] == ctrl
)
1377 network_deinit_tls(ctrl
);
1380 platform_stop_timer(ctrl
->timer
);
1381 platform_release_timer(ctrl
->timer
);
1384 if (ctrl
->cache_data
)
1386 free(ctrl
->cache_data
);
1387 ctrl
->cache_data
= NULL
;
1392 ctrl
->dns_ip
= NULL
;
1394 if (ctrl
->domain_name
)
1396 free(ctrl
->domain_name
);
1397 ctrl
->domain_name
= NULL
;
1399 adapter
->ctrl_busy
[i
] = 0;
1400 platform_release_mutex(ctrl
->mutex
);
1406 if (i
>= adapter
->opt
->max_socket_num
) {DBG_ERR("adapter index maybe error!, %d, %x", ctrl
->adapter_index
, ctrl
);}
1410 void network_init_ctrl(network_ctrl_t
*ctrl
, HANDLE task_handle
, CBFuncEx_t callback
, void *param
)
1412 uint8_t adapter_index
= ctrl
->adapter_index
;
1413 network_adapter_t
*adapter
= &prv_adapter_table
[ctrl
->adapter_index
];
1417 ctrl
->dns_ip
= NULL
;
1419 if (ctrl
->cache_data
)
1421 free(ctrl
->cache_data
);
1422 ctrl
->cache_data
= NULL
;
1424 if (ctrl
->domain_name
)
1426 free(ctrl
->domain_name
);
1427 ctrl
->domain_name
= NULL
;
1429 HANDLE sem
= ctrl
->mutex
;
1430 memset(ctrl
, 0, sizeof(network_ctrl_t
));
1431 ctrl
->adapter_index
= adapter_index
;
1432 ctrl
->task_handle
= task_handle
;
1433 ctrl
->user_callback
= callback
;
1434 ctrl
->user_data
= param
;
1435 ctrl
->socket_id
= -1;
1436 ctrl
->socket_param
= ctrl
;
1437 network_set_ip_invaild(&ctrl
->remote_ip
);
1441 ctrl
->timer
= platform_create_timer(network_default_timer_callback
, task_handle
, NULL
);
1445 ctrl
->mutex
= platform_create_mutex();
1450 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
)
1452 ctrl
->is_tcp
= is_tcp
;
1453 ctrl
->tcp_keep_alive
= keep_alive
;
1454 ctrl
->tcp_keep_idle
= keep_idle
;
1455 ctrl
->tcp_keep_interval
= keep_interval
;
1456 ctrl
->tcp_keep_cnt
= keep_cnt
;
1457 ctrl
->tcp_timeout_ms
= tcp_timeout_ms
;
1460 void network_connect_ipv6_domain(network_ctrl_t
*ctrl
, uint8_t onoff
)
1462 ctrl
->domain_ipv6
= onoff
;
1465 int network_set_local_port(network_ctrl_t
*ctrl
, uint16_t local_port
)
1468 network_adapter_t
*adapter
= &prv_adapter_table
[ctrl
->adapter_index
];
1472 for (i
= 0; i
< adapter
->opt
->max_socket_num
; i
++)
1474 if (&adapter
->ctrl_table
[i
] != ctrl
)
1476 if (adapter
->ctrl_table
[i
].local_port
== local_port
)
1484 ctrl
->local_port
= local_port
;
1490 ctrl
->local_port
= 0;
1492 if (ctrl
->adapter_index
< NW_ADAPTER_INDEX_LWIP_NETIF_QTY
)
1494 ctrl
->local_port
= 0;
1499 if (adapter
->port
< 60000)
1501 adapter
->port
= 60000;
1503 ctrl
->local_port
= adapter
->port
;
1510 int network_create_soceket(network_ctrl_t
*ctrl
, uint8_t is_ipv6
)
1512 network_adapter_t
*adapter
= &prv_adapter_table
[ctrl
->adapter_index
];
1513 ctrl
->socket_id
= adapter
->opt
->create_soceket(ctrl
->is_tcp
, &ctrl
->tag
, ctrl
->socket_param
, is_ipv6
, adapter
->user_data
);
1514 if (ctrl
->socket_id
< 0)
1522 int network_socket_connect(network_ctrl_t
*ctrl
, luat_ip_addr_t
*remote_ip
)
1524 network_adapter_t
*adapter
= &prv_adapter_table
[ctrl
->adapter_index
];
1525 ctrl
->is_server_mode
= 0;
1526 ctrl
->online_ip
= remote_ip
;
1527 uint16_t local_port
= ctrl
->local_port
;
1530 if (ctrl
->adapter_index
>= NW_ADAPTER_INDEX_HW_PS_DEVICE
)
1532 adapter
->port
+= 100;
1533 local_port
= adapter
->port
;
1534 if (adapter
->port
< 60000)
1536 adapter
->port
= 60000;
1538 if (local_port
< 60000)
1542 local_port
+= ctrl
->socket_id
;
1543 DBG("%d,%d,%d", ctrl
->socket_id
, local_port
, adapter
->port
);
1546 return adapter
->opt
->socket_connect(ctrl
->socket_id
, ctrl
->tag
, local_port
, remote_ip
, ctrl
->remote_port
, adapter
->user_data
);
1549 int network_socket_listen(network_ctrl_t
*ctrl
)
1551 network_adapter_t
*adapter
= &prv_adapter_table
[ctrl
->adapter_index
];
1552 ctrl
->is_server_mode
= 1;
1553 return adapter
->opt
->socket_listen(ctrl
->socket_id
, ctrl
->tag
, ctrl
->local_port
, adapter
->user_data
);
1556 uint8_t network_accept_enable(network_ctrl_t
*ctrl
)
1558 network_adapter_t
*adapter
= &prv_adapter_table
[ctrl
->adapter_index
];
1559 return !(adapter
->opt
->no_accept
);
1561 //作为server接受一个client
1563 int network_socket_accept(network_ctrl_t
*ctrl
, network_ctrl_t
*accept_ctrl
)
1565 network_adapter_t
*adapter
= &prv_adapter_table
[ctrl
->adapter_index
];
1566 if (adapter
->opt
->no_accept
)
1568 // 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);
1569 adapter
->opt
->socket_accept(ctrl
->socket_id
, ctrl
->tag
, &ctrl
->remote_ip
, &ctrl
->remote_port
, adapter
->user_data
);
1572 accept_ctrl
->socket_id
= adapter
->opt
->socket_accept(ctrl
->socket_id
, ctrl
->tag
, &accept_ctrl
->remote_ip
, &accept_ctrl
->remote_port
, adapter
->user_data
);
1573 if (accept_ctrl
->socket_id
< 0)
1579 accept_ctrl
->is_tcp
= ctrl
->is_tcp
;
1580 accept_ctrl
->tcp_keep_alive
= ctrl
->tcp_keep_alive
;
1581 accept_ctrl
->tcp_keep_idle
= ctrl
->tcp_keep_idle
;
1582 accept_ctrl
->tcp_keep_interval
= ctrl
->tcp_keep_interval
;
1583 accept_ctrl
->tcp_keep_cnt
= ctrl
->tcp_keep_cnt
;
1584 accept_ctrl
->tcp_timeout_ms
= ctrl
->tcp_timeout_ms
;
1585 accept_ctrl
->local_port
= ctrl
->local_port
;
1586 accept_ctrl
->state
= NW_STATE_ONLINE
;
1590 //主动断开一个tcp连接,需要走完整个tcp流程,用户需要接收到close ok回调才能确认彻底断开
1592 int network_socket_disconnect(network_ctrl_t
*ctrl
)
1594 network_adapter_t
*adapter
= &prv_adapter_table
[ctrl
->adapter_index
];
1595 if (ctrl
->socket_id
>= 0)
1597 return adapter
->opt
->socket_disconnect(ctrl
->socket_id
, ctrl
->tag
, adapter
->user_data
);
1603 int network_socket_close(network_ctrl_t
*ctrl
)
1605 network_adapter_t
*adapter
= &prv_adapter_table
[ctrl
->adapter_index
];
1606 if (ctrl
->socket_id
>= 0)
1608 return adapter
->opt
->socket_close(ctrl
->socket_id
, ctrl
->tag
, adapter
->user_data
);
1614 int network_socket_force_close(network_ctrl_t
*ctrl
)
1616 network_adapter_t
*adapter
= &prv_adapter_table
[ctrl
->adapter_index
];
1617 if (ctrl
->socket_id
>= 0)
1619 adapter
->opt
->socket_force_close(ctrl
->socket_id
, adapter
->user_data
);
1621 ctrl
->socket_id
= -1;
1624 //tcp时,不需要remote_ip和remote_port,如果buf为NULL,则返回当前缓存区的数据量,当返回值小于len时说明已经读完了
1625 //udp时,只返回1个block数据,需要多次读直到没有数据为止
1627 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
)
1629 network_adapter_t
*adapter
= &prv_adapter_table
[ctrl
->adapter_index
];
1630 return adapter
->opt
->socket_receive(ctrl
->socket_id
, ctrl
->tag
, buf
, len
, flags
, remote_ip
, remote_port
, adapter
->user_data
);
1632 //tcp时,不需要remote_ip和remote_port
1634 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
)
1636 network_adapter_t
*adapter
= &prv_adapter_table
[ctrl
->adapter_index
];
1637 return adapter
->opt
->socket_send(ctrl
->socket_id
, ctrl
->tag
, buf
, len
, flags
, remote_ip
, remote_port
, adapter
->user_data
);
1640 int network_getsockopt(network_ctrl_t
*ctrl
, int level
, int optname
, void *optval
, uint32_t *optlen
)
1642 network_adapter_t
*adapter
= &prv_adapter_table
[ctrl
->adapter_index
];
1643 return adapter
->opt
->getsockopt(ctrl
->socket_id
, ctrl
->tag
, level
, optname
, optval
, optlen
, adapter
->user_data
);
1645 int network_setsockopt(network_ctrl_t
*ctrl
, int level
, int optname
, const void *optval
, uint32_t optlen
)
1647 network_adapter_t
*adapter
= &prv_adapter_table
[ctrl
->adapter_index
];
1648 return adapter
->opt
->setsockopt(ctrl
->socket_id
, ctrl
->tag
, level
, optname
, optval
, optlen
, adapter
->user_data
);
1650 //非posix的socket,用这个根据实际硬件设置参数
1651 int network_user_cmd(network_ctrl_t
*ctrl
, uint32_t cmd
, uint32_t value
)
1653 network_adapter_t
*adapter
= &prv_adapter_table
[ctrl
->adapter_index
];
1654 return adapter
->opt
->user_cmd(ctrl
->socket_id
, ctrl
->tag
, cmd
, value
, adapter
->user_data
);
1657 int network_dns(network_ctrl_t
*ctrl
)
1659 network_adapter_t
*adapter
= &prv_adapter_table
[ctrl
->adapter_index
];
1660 if (ctrl
->domain_ipv6
)
1662 return adapter
->opt
->dns_ipv6(ctrl
->domain_name
, ctrl
->domain_name_len
, ctrl
, adapter
->user_data
);
1666 return adapter
->opt
->dns(ctrl
->domain_name
, ctrl
->domain_name_len
, ctrl
, adapter
->user_data
);
1670 int network_set_mac(uint8_t adapter_index
, uint8_t *mac
)
1672 network_adapter_t
*adapter
= &prv_adapter_table
[adapter_index
];
1673 return adapter
->opt
->set_mac(mac
, adapter
->user_data
);
1676 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
)
1678 network_adapter_t
*adapter
= &prv_adapter_table
[adapter_index
];
1679 return adapter
->opt
->set_static_ip(ip
, submask
, gateway
, ipv6
, adapter
->user_data
);
1682 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
)
1684 network_adapter_t
*adapter
= &prv_adapter_table
[ctrl
->adapter_index
];
1685 return adapter
->opt
->get_local_ip_info(ip
, submask
, gateway
, adapter
->user_data
);
1688 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
)
1690 network_adapter_t
*adapter
;
1693 adapter
= &prv_adapter_table
[ctrl
->adapter_index
];
1697 adapter
= &prv_adapter_table
[index
];
1699 return adapter
->opt
->get_full_ip_info(ip
, submask
, gateway
, ipv6
, adapter
->user_data
);
1702 void network_force_close_socket(network_ctrl_t
*ctrl
)
1707 mbedtls_ssl_free(ctrl
->ssl
);
1710 if (network_socket_close(ctrl
))
1712 network_clean_invaild_socket(ctrl
->adapter_index
);
1713 network_socket_force_close(ctrl
);
1715 ctrl
->need_close
= 0;
1716 ctrl
->socket_id
= -1;
1717 ctrl
->new_rx_flag
= 0;
1721 ctrl
->dns_ip
= NULL
;
1723 if (ctrl
->domain_name
)
1725 free(ctrl
->domain_name
);
1726 ctrl
->domain_name
= NULL
;
1728 ctrl
->dns_ip_cnt
= 0;
1729 ctrl
->dns_ip_nums
= 0;
1730 ctrl
->wait_target_state
= NW_WAIT_NONE
;
1733 void network_clean_invaild_socket(uint8_t adapter_index
)
1737 network_adapter_t
*adapter
= &prv_adapter_table
[adapter_index
];
1738 network_ctrl_t
*ctrl
;
1739 list
= malloc(adapter
->opt
->max_socket_num
* sizeof(int));
1741 for (i
= 0; i
< adapter
->opt
->max_socket_num
; i
++)
1743 ctrl
= &adapter
->ctrl_table
[i
];
1744 if (!adapter
->opt
->socket_check(ctrl
->socket_id
, ctrl
->tag
, adapter
->user_data
))
1746 list
[i
] = ctrl
->socket_id
;
1750 ctrl
->socket_id
= -1;
1753 DBG("%d,%d", i
, list
[i
]);
1756 adapter
->opt
->socket_clean(list
, adapter
->opt
->max_socket_num
, adapter
->user_data
);
1762 static int tls_verify(void *ctx
, mbedtls_x509_crt
*crt
, int Index
, uint32_t *result
)
1764 network_ctrl_t
*ctrl
= (network_ctrl_t
*)ctx
;
1765 DBG("%d, %08x", Index
, *result
);
1769 int network_set_psk_info(network_ctrl_t
*ctrl
,
1770 const unsigned char *psk
, size_t psk_len
,
1771 const unsigned char *psk_identity
, size_t psk_identity_len
)
1774 if (!ctrl
->tls_mode
)
1776 return -ERROR_PERMISSION_DENIED
;
1779 // DBG("%.*s, %.*s", psk_len, psk, psk_identity_len, psk_identity);
1780 int ret
= mbedtls_ssl_conf_psk( ctrl
->config
,
1781 psk
, psk_len
, psk_identity
, psk_identity_len
);
1785 return -ERROR_OPERATION_FAILED
;
1793 int network_set_server_cert(network_ctrl_t
*ctrl
, const unsigned char *cert
, size_t cert_len
)
1797 if (!ctrl
->tls_mode
)
1799 return -ERROR_PERMISSION_DENIED
;
1801 ret
= mbedtls_x509_crt_parse( ctrl
->ca_cert
, cert
, cert_len
);
1805 return -ERROR_OPERATION_FAILED
;
1814 int network_set_client_cert(network_ctrl_t
*ctrl
,
1815 const unsigned char *cert
, size_t certLen
,
1816 const unsigned char *key
, size_t keylen
,
1817 const unsigned char *pwd
, size_t pwdlen
)
1821 mbedtls_x509_crt
*client_cert
= NULL
;
1822 mbedtls_pk_context
*pkey
= NULL
;
1823 if (!ctrl
->tls_mode
)
1825 return -ERROR_PERMISSION_DENIED
;
1827 client_cert
= zalloc(sizeof(mbedtls_x509_crt
));
1828 pkey
= zalloc(sizeof(mbedtls_pk_context
));
1829 if (!client_cert
|| !pkey
)
1833 ret
= mbedtls_x509_crt_parse( client_cert
, cert
, certLen
);
1839 #if MBEDTLS_VERSION_NUMBER >= 0x03000000
1840 ret
= mbedtls_pk_parse_key( pkey
, key
, keylen
, pwd
, pwdlen
, tls_random
, NULL
);
1842 ret
= mbedtls_pk_parse_key( pkey
, key
, keylen
, pwd
, pwdlen
);
1849 ret
= mbedtls_ssl_conf_own_cert( ctrl
->config
, client_cert
, pkey
);
1857 if (client_cert
) free(client_cert
);
1858 if (pkey
) free(pkey
);
1865 int network_cert_verify_result(network_ctrl_t
*ctrl
)
1868 if (!ctrl
->tls_mode
)
1872 return mbedtls_ssl_get_verify_result(ctrl
->ssl
);
1878 static int tls_random( void *p_rng
,
1879 unsigned char *output
, size_t output_len
)
1881 platform_random((char*)output
, output_len
);
1885 int network_init_tls(network_ctrl_t
*ctrl
, int verify_mode
)
1891 ctrl
->ssl
= zalloc(sizeof(mbedtls_ssl_context
));
1892 ctrl
->ca_cert
= zalloc(sizeof(mbedtls_x509_crt
));
1893 ctrl
->config
= zalloc(sizeof(mbedtls_ssl_config
));
1894 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
);
1895 // ctrl->config->authmode = verify_mode;
1896 mbedtls_ssl_conf_authmode(ctrl
->config
, verify_mode
);
1897 // ctrl->config->hs_timeout_min = 20000;
1898 #if defined(MBEDTLS_SSL_PROTO_DTLS)
1899 mbedtls_ssl_conf_handshake_timeout(ctrl
->config
, 2000, MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MAX
);
1901 // ctrl->config->f_rng = tls_random;
1902 // ctrl->config->p_rng = NULL;
1903 mbedtls_ssl_conf_rng(ctrl
->config
, tls_random
, NULL
);
1904 // ctrl->config->f_dbg = tls_dbg;
1905 // ctrl->config->p_dbg = NULL;
1906 mbedtls_ssl_conf_dbg(ctrl
->config
, tls_dbg
, NULL
);
1907 // ctrl->config->f_vrfy = tls_verify;
1908 // ctrl->config->p_vrfy = ctrl;
1909 mbedtls_ssl_conf_verify(ctrl
->config
, tls_verify
, ctrl
);
1910 // ctrl->config->ca_chain = ctrl->ca_cert;
1911 mbedtls_ssl_conf_ca_chain(ctrl
->config
, ctrl
->ca_cert
, NULL
);
1912 // ctrl->config->read_timeout = 20000;
1913 mbedtls_ssl_conf_read_timeout(ctrl
->config
, 20000);
1914 #ifdef MBEDTLS_SSL_RENEGOTIATION
1915 mbedtls_ssl_conf_renegotiation(ctrl
->config
, MBEDTLS_SSL_RENEGOTIATION_ENABLED
);
1916 mbedtls_ssl_conf_legacy_renegotiation(ctrl
->config
, MBEDTLS_SSL_LEGACY_ALLOW_RENEGOTIATION
);
1918 ctrl
->tls_long_timer
= platform_create_timer(tls_longtimeout
, ctrl
, NULL
);
1919 ctrl
->tls_short_timer
= platform_create_timer(tls_shorttimeout
, ctrl
, NULL
);
1921 ctrl
->tls_timer_state
= -1;
1924 DBG("NOT SUPPORT TLS");
1929 void network_deinit_tls(network_ctrl_t
*ctrl
)
1934 mbedtls_ssl_free(ctrl
->ssl
);
1941 mbedtls_ssl_config_free(ctrl
->config
);
1943 ctrl
->config
= NULL
;
1948 mbedtls_x509_crt_free(ctrl
->ca_cert
);
1949 free(ctrl
->ca_cert
);
1950 ctrl
->ca_cert
= NULL
;
1954 ctrl
->tls_timer_state
= -1;
1955 if (ctrl
->tls_short_timer
)
1957 platform_release_timer(ctrl
->tls_short_timer
);
1958 ctrl
->tls_short_timer
= NULL
;
1960 if (ctrl
->tls_long_timer
)
1962 platform_release_timer(ctrl
->tls_long_timer
);
1963 ctrl
->tls_long_timer
= NULL
;
1968 int network_wait_link_up(network_ctrl_t
*ctrl
, uint32_t timeout_ms
)
1971 ctrl
->auto_mode
= 1;
1972 // network_adapter_t *adapter = &prv_adapter_table[ctrl->adapter_index];
1973 if (network_check_ready(ctrl
, 0))
1975 ctrl
->state
= NW_STATE_OFF_LINE
;
1976 ctrl
->wait_target_state
= NW_WAIT_NONE
;
1980 ctrl
->state
= NW_STATE_LINK_OFF
;
1981 ctrl
->wait_target_state
= NW_WAIT_LINK_UP
;
1984 if (!ctrl
->task_handle
|| !timeout_ms
)
1991 //DBG_INFO("%s wait for active!,%u,%x", Net->Tag, To * SYS_TICK, Net->hTask);
1993 platform_start_timer(ctrl
->timer
, timeout_ms
, 0);
1996 platform_wait_event(ctrl
->task_handle
, 0, &event
, NULL
, 0);
1999 case EV_NW_RESULT_LINK
:
2000 result
= (int)event
.Param1
;
2008 if (ctrl
->user_callback
)
2010 ctrl
->user_callback((void *)&event
, ctrl
->user_data
);
2015 platform_stop_timer(ctrl
->timer
);
2019 * 1.进行ready检测和等待ready
2020 * 2.有remote_ip则开始连接服务器并等待连接结果
2021 * 3.没有remote_ip则开始对url进行dns解析,解析完成后对所有ip进行尝试连接直到有个成功或者全部失败
2022 * 4.如果是加密模式,还要走握手环节,等到握手环节完成后才能返回结果
2023 * local_port如果为0则api内部自动生成一个
2025 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
)
2027 if (ctrl
->socket_id
>= 0)
2033 ctrl
->is_server_mode
= 0;
2039 ctrl
->dns_ip
= NULL
;
2041 if (ctrl
->cache_data
)
2043 free(ctrl
->cache_data
);
2044 ctrl
->cache_data
= NULL
;
2046 ctrl
->need_close
= 0;
2047 if (ctrl
->domain_name
)
2049 free(ctrl
->domain_name
);
2051 ctrl
->domain_name
= zalloc(domain_name_len
+ 1);
2052 memcpy(ctrl
->domain_name
, domain_name
, domain_name_len
);
2053 ctrl
->domain_name_len
= domain_name_len
;
2056 ctrl
->remote_ip
= *remote_ip
;
2060 network_set_ip_invaild(&ctrl
->remote_ip
);
2062 ctrl
->auto_mode
= 1;
2063 ctrl
->remote_port
= remote_port
;
2064 network_adapter_t
*adapter
= &prv_adapter_table
[ctrl
->adapter_index
];
2065 ctrl
->wait_target_state
= NW_WAIT_ON_LINE
;
2066 if (!network_check_ready(ctrl
, 0))
2069 ctrl
->state
= NW_STATE_LINK_OFF
;
2070 goto NETWORK_CONNECT_WAIT
;
2072 if (network_prepare_connect(ctrl
))
2074 ctrl
->state
= NW_STATE_OFF_LINE
;
2075 ctrl
->wait_target_state
= NW_WAIT_NONE
;
2079 NETWORK_CONNECT_WAIT
:
2081 if (!ctrl
->task_handle
|| !timeout_ms
)
2087 OS_EVENT event
= {0};
2089 //DBG_INFO("%s wait for active!,%u,%x", Net->Tag, To * SYS_TICK, Net->hTask);
2091 platform_start_timer(ctrl
->timer
, timeout_ms
, 0);
2094 platform_wait_event(ctrl
->task_handle
, 0, &event
, NULL
, 0);
2097 case EV_NW_RESULT_CONNECT
:
2098 result
= (int)event
.Param1
;
2106 if (ctrl
->user_callback
)
2108 ctrl
->user_callback((void *)&event
, ctrl
->user_data
);
2113 platform_stop_timer(ctrl
->timer
);
2117 int network_listen(network_ctrl_t
*ctrl
, uint32_t timeout_ms
)
2119 if (NW_STATE_LISTEN
== ctrl
->state
)
2121 DBG("socket %d is listen", ctrl
->socket_id
);
2124 if (ctrl
->socket_id
>= 0)
2129 ctrl
->is_server_mode
= 1;
2130 ctrl
->auto_mode
= 1;
2131 ctrl
->need_close
= 0;
2132 network_adapter_t
*adapter
= &prv_adapter_table
[ctrl
->adapter_index
];
2133 ctrl
->wait_target_state
= NW_WAIT_ON_LINE
;
2134 if (!network_check_ready(ctrl
, 0))
2137 ctrl
->state
= NW_STATE_LINK_OFF
;
2138 goto NETWORK_LISTEN_WAIT
;
2140 if (network_base_connect(ctrl
, NULL
))
2142 ctrl
->state
= NW_STATE_OFF_LINE
;
2143 ctrl
->wait_target_state
= NW_WAIT_NONE
;
2147 ctrl
->state
= NW_STATE_CONNECTING
;
2148 NETWORK_LISTEN_WAIT
:
2150 if (!ctrl
->task_handle
|| !timeout_ms
)
2158 //DBG_INFO("%s wait for active!,%u,%x", Net->Tag, To * SYS_TICK, Net->hTask);
2160 if (timeout_ms
!= 0xffffffff)
2162 platform_start_timer(ctrl
->timer
, timeout_ms
, 0);
2166 platform_wait_event(ctrl
->task_handle
, 0, &event
, NULL
, 0);
2169 case EV_NW_RESULT_CONNECT
:
2170 result
= (int)event
.Param1
;
2178 if (ctrl
->user_callback
)
2180 ctrl
->user_callback((void *)&event
, ctrl
->user_data
);
2185 if (timeout_ms
!= 0xffffffff)
2187 platform_stop_timer(ctrl
->timer
);
2192 int network_close(network_ctrl_t
*ctrl
, uint32_t timeout_ms
)
2195 if (ctrl
->cache_data
)
2197 free(ctrl
->cache_data
);
2198 ctrl
->cache_data
= NULL
;
2200 uint8_t old_state
= ctrl
->state
;
2201 ctrl
->auto_mode
= 1;
2202 ctrl
->need_close
= 0;
2203 ctrl
->new_rx_flag
= 0;
2204 network_adapter_t
*adapter
= &prv_adapter_table
[ctrl
->adapter_index
];
2208 mbedtls_ssl_free(ctrl
->ssl
);
2211 if (ctrl
->socket_id
< 0)
2214 ctrl
->state
= NW_STATE_OFF_LINE
;
2215 ctrl
->wait_target_state
= NW_WAIT_NONE
;
2220 ctrl
->state
= NW_STATE_DISCONNECTING
;
2221 ctrl
->wait_target_state
= NW_WAIT_OFF_LINE
;
2223 if ((NW_STATE_ONLINE
== old_state
) && ctrl
->is_tcp
)
2225 if (network_socket_disconnect(ctrl
))
2227 network_force_close_socket(ctrl
);
2228 ctrl
->state
= NW_STATE_OFF_LINE
;
2229 ctrl
->wait_target_state
= NW_WAIT_NONE
;
2236 network_force_close_socket(ctrl
);
2237 ctrl
->state
= NW_STATE_OFF_LINE
;
2238 ctrl
->wait_target_state
= NW_WAIT_NONE
;
2243 if (!ctrl
->task_handle
|| !timeout_ms
)
2250 //DBG_INFO("%s wait for active!,%u,%x", Net->Tag, To * SYS_TICK, Net->hTask);
2252 platform_start_timer(ctrl
->timer
, timeout_ms
, 0);
2255 platform_wait_event(ctrl
->task_handle
, 0, &event
, NULL
, 0);
2258 case EV_NW_RESULT_CLOSE
:
2267 if (ctrl
->user_callback
)
2269 ctrl
->user_callback((void *)&event
, ctrl
->user_data
);
2274 platform_stop_timer(ctrl
->timer
);
2275 network_socket_force_close(ctrl
);
2279 * timeout_ms=0时,为非阻塞接口
2281 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
)
2283 if ((ctrl
->need_close
) || (ctrl
->socket_id
< 0) || (ctrl
->state
!= NW_STATE_ONLINE
))
2290 ctrl
->auto_mode
= 1;
2294 if (ctrl
->tls_need_reshakehand
)
2296 ctrl
->tls_need_reshakehand
= 0;
2297 if (ctrl
->cache_data
)
2299 free(ctrl
->cache_data
);
2300 ctrl
->cache_data
= NULL
;
2302 ctrl
->cache_data
= malloc(len
);
2303 memcpy(ctrl
->cache_data
, data
, len
);
2304 ctrl
->cache_len
= len
;
2305 mbedtls_ssl_session_reset(ctrl
->ssl
);
2308 result
= mbedtls_ssl_handshake_step( ctrl
->ssl
);
2311 case MBEDTLS_ERR_SSL_WANT_READ
:
2312 ctrl
->state
= NW_STATE_SHAKEHAND
;
2313 goto NETWORK_TX_WAIT
;
2317 #if MBEDTLS_VERSION_NUMBER >= 0x03000000
2319 DBG_ERR("0x%x, %d", -result
, ctrl
->ssl
->state
);
2321 ctrl
->need_close
= 1;
2325 #if MBEDTLS_VERSION_NUMBER >= 0x03000000
2326 }while(!mbedtls_ssl_is_handshake_over(ctrl
->ssl
));
2328 }while(ctrl
->ssl
->state
!= MBEDTLS_SSL_HANDSHAKE_OVER
);
2335 result
= mbedtls_ssl_write(ctrl
->ssl
, data
+ done
, len
- done
);
2338 DBG("%08x", -result
);
2339 ctrl
->need_close
= 1;
2351 result
= network_base_tx(ctrl
, data
, len
, flags
, remote_ip
, remote_port
);
2354 ctrl
->need_close
= 1;
2368 ctrl
->wait_target_state
= NW_WAIT_TX_OK
;
2371 if (!ctrl
->task_handle
|| !timeout_ms
)
2377 //DBG_INFO("%s wait for active!,%u,%x", Net->Tag, To * SYS_TICK, Net->hTask);
2379 platform_start_timer(ctrl
->timer
, timeout_ms
, 0);
2382 platform_wait_event(ctrl
->task_handle
, 0, &event
, NULL
, 0);
2385 case EV_NW_RESULT_TX
:
2386 result
= (int)event
.Param1
;
2394 if (ctrl
->user_callback
)
2396 ctrl
->user_callback((void *)&event
, ctrl
->user_data
);
2401 platform_stop_timer(ctrl
->timer
);
2405 * 实际读到的数据量在rx_len里,如果是UDP模式且为server时,需要看remote_ip和remote_port
2407 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
)
2409 if (((ctrl
->need_close
&& !ctrl
->new_rx_flag
) || (ctrl
->socket_id
< 0) || (ctrl
->state
!= NW_STATE_ONLINE
)))
2415 ctrl
->auto_mode
= 1;
2416 uint32_t read_len
= 0;
2417 uint8_t is_error
= 0;
2422 ctrl
->new_rx_flag
= 0;
2429 result
= mbedtls_ssl_read(ctrl
->ssl
, data
+ read_len
, len
- read_len
);
2430 if (result
< 0 && (result
!= MBEDTLS_ERR_SSL_WANT_READ
))
2435 else if (result
> 0)
2438 if (read_len
>= len
)
2447 }while(network_socket_receive(ctrl
, NULL
, len
, flags
, remote_ip
, remote_port
) > 0);
2462 result
= network_socket_receive(ctrl
, data
, len
, flags
, remote_ip
, remote_port
);
2473 result
= mbedtls_ssl_read(ctrl
->ssl
, NULL
, 0);
2474 if ((result
< 0) && (result
!= (MBEDTLS_ERR_SSL_WANT_READ
)))
2482 #if MBEDTLS_VERSION_NUMBER >= 0x03000000
2483 read_len
= ctrl
->ssl
->MBEDTLS_PRIVATE(in_msglen
);
2485 read_len
= ctrl
->ssl
->in_msglen
;
2489 else if ((MBEDTLS_ERR_SSL_WANT_READ
) == result
)
2492 ctrl
->new_rx_flag
= 0;
2493 DBG("socket %d ssl data need more", ctrl
->socket_id
);
2496 }while(network_socket_receive(ctrl
, NULL
, len
, flags
, remote_ip
, remote_port
) > 0);
2510 result
= network_socket_receive(ctrl
, data
, len
, flags
, remote_ip
, remote_port
);
2527 int network_wait_event(network_ctrl_t
*ctrl
, OS_EVENT
*out_event
, uint32_t timeout_ms
, uint8_t *is_timeout
)
2529 if (ctrl
->new_rx_flag
)
2531 ctrl
->wait_target_state
= NW_WAIT_EVENT
;
2538 if ((ctrl
->need_close
) || (ctrl
->socket_id
< 0) || (ctrl
->state
!= NW_STATE_ONLINE
))
2543 ctrl
->auto_mode
= 1;
2544 ctrl
->wait_target_state
= NW_WAIT_EVENT
;
2546 if (!ctrl
->task_handle
|| !timeout_ms
)
2554 //DBG_INFO("%s wait for active!,%u,%x", Net->Tag, To * SYS_TICK, Net->hTask);
2556 platform_start_timer(ctrl
->timer
, timeout_ms
, 0);
2559 platform_wait_event(ctrl
->task_handle
, 0, &event
, NULL
, 0);
2562 case EV_NW_RESULT_EVENT
:
2563 result
= (int)event
.Param1
;
2579 case EV_NW_BREAK_WAIT
:
2595 else if (ctrl
->user_callback
)
2597 ctrl
->user_callback((void *)&event
, ctrl
->user_data
);
2602 platform_stop_timer(ctrl
->timer
);
2606 int network_wait_rx(network_ctrl_t
*ctrl
, uint32_t timeout_ms
, uint8_t *is_break
, uint8_t *is_timeout
)
2610 if (ctrl
->new_rx_flag
)
2612 ctrl
->wait_target_state
= NW_WAIT_EVENT
;
2615 if ((ctrl
->need_close
) || (ctrl
->socket_id
< 0) || (ctrl
->state
!= NW_STATE_ONLINE
))
2620 ctrl
->auto_mode
= 1;
2621 ctrl
->wait_target_state
= NW_WAIT_EVENT
;
2627 //DBG_INFO("%s wait for active!,%u,%x", Net->Tag, To * SYS_TICK, Net->hTask);
2630 platform_start_timer(ctrl
->timer
, timeout_ms
, 0);
2634 platform_wait_event(ctrl
->task_handle
, 0, &event
, NULL
, 0);
2637 case EV_NW_RESULT_EVENT
:
2638 result
= (int)event
.Param1
;
2644 else if (ctrl
->new_rx_flag
)
2655 case EV_NW_BREAK_WAIT
:
2661 if (ctrl
->user_callback
)
2663 ctrl
->user_callback((void *)&event
, ctrl
->user_data
);
2667 ctrl
->wait_target_state
= NW_WAIT_EVENT
;
2669 platform_stop_timer(ctrl
->timer
);
2673 uint8_t network_check_ready(network_ctrl_t
*ctrl
, uint8_t adapter_index
)
2675 network_adapter_t
*adapter
;
2678 adapter
= &prv_adapter_table
[ctrl
->adapter_index
];
2680 else if (adapter_index
< NW_ADAPTER_QTY
)
2682 adapter
= &prv_adapter_table
[adapter_index
];
2690 return adapter
->opt
->check_ready(adapter
->user_data
);
2699 void network_set_ip_invaild(luat_ip_addr_t
*ip
)
2701 #ifdef LUAT_USE_LWIP
2712 uint8_t network_ip_is_vaild(luat_ip_addr_t
*ip
)
2714 #ifdef LUAT_USE_LWIP
2716 return (ip
->type
!= 0xff);
2718 return (ip
->addr
!= 0);
2721 return (ip
->is_ipv6
!= 0xff);
2725 uint8_t network_ip_is_ipv6(luat_ip_addr_t
*ip
)
2727 #ifdef LUAT_USE_LWIP
2729 return (IPADDR_TYPE_V6
== ip
->type
);
2734 return (ip
->is_ipv6
&& (ip
->is_ipv6
!= 0xff));
2738 //检测IP是不是有效的IPV4类型,不是返回0
2739 uint8_t network_ip_is_vaild_ipv4(luat_ip_addr_t
*ip
)
2741 #ifdef LUAT_USE_LWIP
2743 return (IPADDR_TYPE_V4
== ip
->type
);
2745 return (ip
->addr
!= 0);
2748 return !ip
->is_ipv6
;
2752 void network_set_ip_ipv4(luat_ip_addr_t
*ip
, uint32_t ipv4
)
2754 #ifdef LUAT_USE_LWIP
2756 ip
->type
= IPADDR_TYPE_V4
;
2757 ip
->u_addr
.ip4
.addr
= ipv4
;