修改测试
This commit is contained in:
@@ -107,7 +107,8 @@ int net_init(const char *ip, const char *mask, const char *gateway) {
|
||||
ch395f_reset();
|
||||
DBG_INFO("net_init: set_fun_para...");
|
||||
|
||||
/* CH395F 超时/DISCONNECT 后不要自动关闭 Socket,由软件手动管理 */
|
||||
/* 启用单连接模式 + 手动关闭 Socket(bit3=1, bit1=0)
|
||||
* bit3=1: DISCONNECT/TIMEOUT 时不自动清空缓冲区,由软件排空数据后手动关闭 */
|
||||
ch395f_set_fun_para(0x08);
|
||||
DBG_INFO("net_init: set_tcp_mss...");
|
||||
|
||||
@@ -776,6 +777,11 @@ int net_connect(int sockfd, const struct net_sockaddr *addr, int addrlen) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* SPI DMA 单次事务最大有效载荷(取 CH395F 驱动公开常量)
|
||||
*/
|
||||
#define NET_DMA_MAX_PAYLOAD ((int)CH395F_SPI_DMA_MAX_PAYLOAD)
|
||||
|
||||
/*
|
||||
* 函数功能:发送数据(内部锁定版本,必须在 netTask 上下文调用)
|
||||
*/
|
||||
@@ -798,8 +804,8 @@ static int net_send_locked(net_sock_t *p_sock, const void *buf, int len) {
|
||||
|
||||
while (sent < len) {
|
||||
int chunk = len - sent;
|
||||
if (chunk > NET_SEND_BUF_SIZE) {
|
||||
chunk = NET_SEND_BUF_SIZE;
|
||||
if (chunk > NET_DMA_MAX_PAYLOAD) {
|
||||
chunk = NET_DMA_MAX_PAYLOAD;
|
||||
}
|
||||
|
||||
if (!p_sock->send_ready) {
|
||||
@@ -869,8 +875,18 @@ static int net_recv_locked(net_sock_t *p_sock, void *buf, int len, int flags) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (p_sock->state == NET_SOCK_STATE_TCP_ACCEPT ||
|
||||
p_sock->state == NET_SOCK_STATE_CLOSED) {
|
||||
if (p_sock->state == NET_SOCK_STATE_TCP_ACCEPT) {
|
||||
return 0;
|
||||
}
|
||||
if (p_sock->state == NET_SOCK_STATE_CLOSED) {
|
||||
/* 断开前尝试排空 CH395F 接收缓冲区(Trap 13:FIN 可能比数据先到) */
|
||||
uint16_t rem = ch395f_get_recv_len(sockfd);
|
||||
if (rem > 0) {
|
||||
int rd = (rem > (uint16_t)len) ? len : (int)rem;
|
||||
ch395f_read_recv_buf(sockfd, (uint8_t *)buf, (uint16_t)rd);
|
||||
p_sock->recv_bytes += (uint32_t)rd;
|
||||
return rd;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@@ -1188,9 +1204,9 @@ int net_recvfrom(int sockfd, void *buf, int len, int flags,
|
||||
/* 读取数据 */
|
||||
if (recv_len > 0) {
|
||||
int read_len = (recv_len > (uint16_t)len) ? len : (int)recv_len;
|
||||
ch395f_read_recv_buf(sockfd, (uint8_t *)buf, (uint16_t)read_len);
|
||||
p_sock->recv_bytes += (uint32_t)read_len;
|
||||
return read_len;
|
||||
ch395f_read_recv_buf(sockfd, (uint8_t *)buf, (uint16_t)read_len);
|
||||
p_sock->recv_bytes += (uint32_t)read_len;
|
||||
return read_len;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1481,11 +1497,9 @@ static void handle_disconnect_event(net_sock_t *p_sock) {
|
||||
}
|
||||
else if (p_sock->state == NET_SOCK_STATE_ESTABLISHED) {
|
||||
if (p_sock->standalone_accept) {
|
||||
/* 独立监听模式(PASV 数据通道):通知断开但不释放 Socket,
|
||||
* 留给传输命令(STOR/LIST)的 accept 检测 CLOSED 状态后统一清理。
|
||||
* 但必须先关闭 CH395F 硬件 Socket,否则后续 ch395f_open_socket 失败 */
|
||||
/* 独立监听模式:先不关 CH395F Socket,
|
||||
* 留给 net_recv_locked 把剩余数据读出来再关 */
|
||||
DBG_INFO("sock%d DISCONNECTED, releasing", p_sock->ch395_sock);
|
||||
ch395f_close_socket(p_sock->ch395_sock);
|
||||
p_sock->state = NET_SOCK_STATE_CLOSED;
|
||||
fire_event(p_sock, NET_EVENT_DISCONNECTED);
|
||||
} else {
|
||||
@@ -1512,11 +1526,9 @@ static void handle_disconnect_event(net_sock_t *p_sock) {
|
||||
/*
|
||||
* 函数功能:处理数据接收事<E694B6>? */
|
||||
static void handle_recv_event(net_sock_t *p_sock) {
|
||||
uint16_t recv_len = ch395f_get_recv_len(p_sock->ch395_sock);
|
||||
|
||||
if (recv_len > 0) {
|
||||
fire_event(p_sock, NET_EVENT_DATA_RECEIVED);
|
||||
}
|
||||
/* RECV_OK 中断已触发,直接通知上层。不在此读 recv_len,
|
||||
* 避免和 net_recv_locked 里面的 ch395f_get_recv_len 冲突(Trap 13) */
|
||||
fire_event(p_sock, NET_EVENT_DATA_RECEIVED);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1534,12 +1546,8 @@ static void handle_timeout_event(net_sock_t *p_sock) {
|
||||
p_sock->state = NET_SOCK_STATE_CREATED;
|
||||
}
|
||||
else if (p_sock->state == NET_SOCK_STATE_ESTABLISHED) {
|
||||
if (p_sock->standalone_accept) {
|
||||
DBG_INFO("sock%d TIMEOUT (ignored)", p_sock->ch395_sock);
|
||||
} else {
|
||||
DBG_ERROR("sock%d TIMEOUT", p_sock->ch395_sock);
|
||||
p_sock->state = NET_SOCK_STATE_TCP_ACCEPT;
|
||||
}
|
||||
DBG_ERROR("sock%d TIMEOUT", p_sock->ch395_sock);
|
||||
p_sock->state = p_sock->standalone_accept ? NET_SOCK_STATE_CLOSED : NET_SOCK_STATE_TCP_ACCEPT;
|
||||
}
|
||||
else if (p_sock->state == NET_SOCK_STATE_LISTENING) {
|
||||
/* 监听超时(异常情况) */
|
||||
|
||||
Reference in New Issue
Block a user