/*
 * 模块名称：Network Types
 * 模块功能：网络子系统类型定义，包括地址结构体、Socket状态、
 *          事件类型、Socket控制块等
 * 适用平台：STM32F4 系列（CH395F 以太网芯片）
 * 作者：王建锋
 * 创建日期：2026-07-18
 * 修改记录：
 */

#ifndef __NET_TYPES_H
#define __NET_TYPES_H

#ifdef __cplusplus
extern "C" {
#endif

#include <stdint.h>
#include "net_config.h"

/*
 * 地址族定义
 */
#define NET_AF_INET                 2       /* IPv4 */
#define NET_AF_INET6                10      /* IPv6（未支持） */
#define NET_AF_UNSPEC               0       /* 未指定 */

/*
 * Socket 类型定义
 */
#define NET_SOCK_STREAM             1       /* TCP */
#define NET_SOCK_DGRAM              2       /* UDP */

/*
 * 协议号定义
 */
#define NET_IPPROTO_TCP             6
#define NET_IPPROTO_UDP             17
#define NET_IPPROTO_ICMP            1

/*
 * 特殊地址定义
 */
#define NET_INADDR_ANY              0       /* 任意地址 */
#define NET_INADDR_NONE             0xFFFFFFFF  /* 无效地址 */

/*
 * 接收标志定义
 */
#define NET_MSG_DONTWAIT            0x01    /* 非阻塞模式 */

/*
 * 网络字节序转换宏
 */
#ifdef __BIG_ENDIAN
#define NET_htonl(x)                (x)
#define NET_htons(x)                (x)
#define NET_ntohl(x)                (x)
#define NET_ntohs(x)                (x)
#else
#define NET_htonl(x)                (((uint32_t)(x) << 24) | \
                                     (((uint32_t)(x) & 0xFF00) << 8) | \
                                     (((uint32_t)(x) & 0xFF0000) >> 8) | \
                                     ((uint32_t)(x) >> 24))
#define NET_htons(x)                (((uint16_t)(x) << 8) | ((uint16_t)(x) >> 8))
#define NET_ntohl(x)                NET_htonl(x)
#define NET_ntohs(x)                NET_htons(x)
#endif

/*
 * 套接字地址结构体
 */
struct net_sockaddr {
    uint16_t sa_family;                 /* 地址族 */
    char     sa_data[14];               /* 地址数据 */
};

/*
 * IPv4 套接字地址结构体
 */
struct net_sockaddr_in {
    uint16_t sin_family;                /* 地址族，必须为 AF_INET */
    uint16_t sin_port;                  /* 端口号（网络字节序） */
    struct {
        uint32_t s_addr;                /* IP 地址（网络字节序） */
    } sin_addr;
    char sin_zero[8];                   /* 填充字节 */
};

/*
 * Socket 错误码定义
 */
#define NET_OK                       0      /* 成功 */
#define NET_ERR                     -1      /* 通用错误 */
#define NET_ERR_BADF                -2      /* 无效 socket 描述符 */
#define NET_ERR_INVAL               -3      /* 无效参数 */
#define NET_ERR_NOMEM               -4      /* 内存不足 */
#define NET_ERR_NOTCONN             -5      /* 未连接 */
#define NET_ERR_ISCONN              -6      /* 已连接 */
#define NET_ERR_WOULDBLOCK          -7      /* 非阻塞模式下操作未完成 */
#define NET_ERR_CONNRESET           -8      /* 连接被重置 */
#define NET_ERR_TIMEDOUT            -9      /* 操作超时 */
#define NET_ERR_NOSPACE             -10     /* 发送缓冲区无空间 */
#define NET_ERR_BUSY                -11     /* 操作未完成（CH395F BUSY） */

/*
 * Socket 状态枚举
 */
typedef enum {
    NET_SOCK_STATE_CLOSED = 0,               /* 未使用 */
    NET_SOCK_STATE_CREATED,                  /* 已创建，未绑定 */
    NET_SOCK_STATE_BOUND,                    /* 已绑定 */
    NET_SOCK_STATE_LISTENING,                /* TCP Server 监听中（仅监听 Socket） */
    NET_SOCK_STATE_CONNECTING,               /* TCP Client 连接中 */
    NET_SOCK_STATE_ESTABLISHED,              /* TCP 已连接 */
    NET_SOCK_STATE_UDP_OPEN,                 /* UDP 已打开 */
    NET_SOCK_STATE_TCP_CLIENT_RECONNECTING,  /* TCP Client 重连中 */
} net_sock_state_t;

/*
 * 网络事件类型枚举
 */
typedef enum {
    NET_EVENT_CONNECTED = 0,         /* 连接建立 */
    NET_EVENT_DISCONNECTED,          /* 连接断开 */
    NET_EVENT_DATA_RECEIVED,         /* 收到数据 */
    NET_EVENT_SEND_COMPLETE,         /* 发送完成 */
    NET_EVENT_TIMEOUT,               /* 操作超时 */
    NET_EVENT_ERROR,                 /* 错误发生 */
} net_event_t;

/*
 * 事件回调函数类型定义
 * 参数：sockfd - socket 描述符
 *       event  - 事件类型
 *       arg    - 用户参数
 */
typedef void (*net_event_cb_t)(int sockfd, net_event_t event, void *arg);

/*
 * Socket 控制块结构体
 * 每个 socket 对应一个控制块，管理其状态和参数
 */
typedef struct {
    uint8_t             ch395_sock;             /* CH395F 物理 Socket 索引 (0~7) */
    net_sock_state_t    state;                  /* Socket 状态 */
    uint8_t             type;                   /* SOCK_STREAM / SOCK_DGRAM */
    uint8_t             in_use;                 /* 是否在用标志 */
    uint16_t            local_port;             /* 本地端口（主机序） */
    uint16_t            remote_port;            /* 远端端口（主机序） */
    uint32_t            remote_ip;              /* 远端 IP（网络字节序） */
    uint8_t             remote_ip_arr[4];       /* 远端 IP 数组（低字节在前） */

    /* 事件回调（可选） */
    net_event_cb_t      event_cb;
    void               *event_arg;

    /* 发送就绪标志 */
    uint8_t             send_ready;

    /* 统计信息 */
    uint32_t            recv_bytes;             /* 累计接收字节数 */
    uint32_t            send_bytes;             /* 累计发送字节数 */
} net_sock_t;

#ifdef __cplusplus
}
#endif

#endif /* __NET_TYPES_H */
