📄 udp.h
字号:
#define ARP_OLD_NUM 3 /* 老化后,ARP 3次不成功就要复位ARP */
/* 接收的以太网帧结构 */
typedef struct
{
UWORK8 ucaDestNodID[NOD_ID_LENGTH]; /* 目的网卡地址 */
UWORK8 ucaSourceNodID[NOD_ID_LENGTH]; /* 原网卡地址 */
UWORK16 usprotocol; /* 下一层协议 */
UWORK8 ucaPacket[PACKET_LENGTH]; /* 接收以太网包的内容 */
}ST_RECEIVE_ETHERNET;
/* ARP分组格式 */
typedef struct
{
UWORK16 usHTYPE; /* 硬件类型 */
UWORK16 usPTYPE; /* 协议类型 */
UWORK8 ucHLEN; /* 硬件长度 */
UWORK8 ucPLEN; /* 协议长度 */
UWORK16 usOPER; /* 操作 */
UWORK8 ucaSHA[MAC_LEN]; /* 源硬件地址 */
UWORK8 ucaSPA[IP_LEN]; /* 源协议地址 */
UWORK8 ucaTHA[MAC_LEN]; /* 目标硬件地址 */
UWORK8 ucaTPA[IP_LEN]; /* 目标协议地址 */
}ST_ARP_FORMAT;
/* ARP高速缓存 */
typedef struct
{
UWORK8 ucIPValible; /* IP有效 */
UWORK8 ucIpOrRouter; /* 是否本地网段 */
UWORK8 ucStatus; /* 状态 */
UWORK8 ucaIP[IP_LEN]; /* IP地址 */
UWORK8 ucaArpIp[IP_LEN]; /* ARP指向的IP */
UWORK8 ucaMAC[MAC_LEN]; /* MAC地址 */
UWORK16 usRemotePort; /* 远程端口号 */
}ST_ARP_CACHE;
/* ARP请求的各个阶段 */
enum
{
ARP_FIRST_REQUEST, /* ARP第一次请求 */
ARP_SECOND_REQUEST, /* ARP再次请求 */
ARP_OLD /* ARP老化 */
};
#define HTYPE 0x01 /* 以太网类型 */
#define PTYPE 0x0800 /* IPV4类型 */
#define HLEN 0x06 /* 以太网硬件类型 */
#define PLEN 0x04 /* IPV4长度 */
#define OPER_REQUEST 0x01 /* ARP请求 */
#define OPER_APLY 0x02 /* ARP应答 */
/*************************************************************************************/
/* IP格式 */
typedef struct
{
UWORK8 ucVerAndLen; /* 版本号和长度,各占4位 */
UWORK8 ucDs; /* 区分服务 */
UWORK16 usTotalLen; /* 总长度 */
UWORK16 usID; /* 标识 */
UWORK16 usSegOffset; /* 分片偏移 */
UWORK8 ucTTL; /* 生存时间 */
UWORK8 ucprotocol; /* 协议 */
UWORK16 usCheckSum; /* 校验和 */
UWORK8 ucSourceIP[IP_LEN]; /* 源IP地址 */
UWORK8 ucDestIP[IP_LEN]; /* 目的IP地址 */
}ST_IP_HEAD_FORMAT;
/*************************************************************************************/
/* ICMP报文头结构 */
typedef struct
{
UWORK8 ucType;
UWORK8 ucCode;
UWORK16 usCheckSum;
UWORK16 usID;
UWORK16 usSeqNum;
}ST_ICMP_HEAD_FORMAT;
/* ARP分组格式 */
typedef struct
{
UWORK16 usSPORT; /* 源端口号*/
UWORK16 usMPORT; /* 目标端口号 */
UWORK32 ucSERIESNUM; /*序号 */
UWORK32 ucTRUECODE; /*确认号 */
UWORK16 ucMOVENUM; //偏移量
UWORK16 ucWINDOWBIG; //窗口大小
UWORK16 ucTCPCHECK; //校验位
UWORK16 ucMUSGPOINT; //紧急指针
}ST_TCP_FORMAT;
#define ICMP_ECHO 8 /* 回送请求 */
#define ICMP_ECHO_REPLY 0 /* 回送回答 */
#define ICMP_ROUTER_RE 10 /* 路由询问 */
#define ICMP_ROUTER_REPLY 9 /* 路由通告 */
#define ICMP_ROUTER_CHANGE 5 /* 路由改变 */
#define ICMP_PORT_UNREACHABLE 3 /* 目的端口不可达 */
#define ICMP_SOURCE_QUENCH 4 /* 源端抑制 */
/* 目的端口不可达类型 */
#define NET_UNREACHABLE 0
#define HOST_UNREACHABLE 1
#define PROTOCAL_UNREACHABLE 2
#define PORT_UNREACHABLE 3
#define NET_UNKNOW 6
#define HOST_UNKNOW 7
#define NET_UNPEMETED 9
#define HOST_UNPEMETED 10
#define HOST_UNREACHABLE13 13
#define HOST_UNREACHABLE14 14
#define HOST_UNREACHABLE15 15
#define SOUECE_RESTRAIN_DELAY 3 /* 收到源端抑制后需要延时发送周期数 */
/*************************************************************************************/
#define CONFIG_PORT 65534 /* 广播配置端口 */
#define UDP_DATA_START 28 /* 28 = 20(IP头) + 8(UDP头) */
/* UDP报文头结构 */
typedef struct
{
UWORK16 usSourcePort;
UWORK16 usDesPort;
UWORK16 usTotalLen;
UWORK16 usCheckSum;
}ST_UDP_HEAD_FORMAT;
typedef struct
{
UWORK32 ulUDPSendDataNum; /* UDP发送的数据个数 */
UWORK32 ulUDPReceiveDataNum; /* UDP接收的数据个数 */
UWORK32 ulUDPPortError; /* UDP报文中端口号错误次数 */
UWORK32 ulUDPCheckSumError; /* UDP报文中校验和错误次数 */
}ST_UDP_STATISTICS;
/*************************************************************************************/
#define COMMAND_START_ADDR 60 /* 配置报文命令位置 */
#define SAVE_OK 61 /* 保存成功 */
#define EQUNAME_LEN 61 /* 1个字节,名字长度 */
#define EUQ_NAME 62 /* 15个字节作为名字空间 */
#define IP_MODE 77 /* 1个字节,IP模式 */
#define MAC_ADDR 78 /* 6个字节,MAC地址 */
#define IP_ADDR 84 /* 4个字节,本地IP地址 */
#define NET_MASK 88 /* 4个字节,子网掩码 */
#define GATE_WAY 92 /* 4个字节,网关 */
#define REMOTE_IPADDR1 96 /* 4个字节,远程IP1 */
#define LOCAL_PORT 100 /* 2个字节,本地端口号 */
#define REMOTE_PORT1 102 /* 2个字节,远程端口号1 */
/* 保留64个字节 */
#define BAUND_RATE 168 /* 1个字节,波特率 */
/* 保留32个字节 */
#define RUN_DAYS 201 /* 2个字节,运行天数 */
#define RUN_HOURS 203 /* 1个字节,小时数 */
#define RUN_MINUTES 204 /* 1个字节,分钟数 */
#define RUN_SECONDS 205 /* 1个字节,秒数 */
#define UDP_RCV_BYTES 206 /* 4个字节,UDP接收字节数 */
#define UDP_SEND_BYTES 210 /* 4个字节,UDP发送字节数 */
#define UART_RCV_BYTES 214 /* 4个字节,串口接收字节数 */
#define UART_SEND_BYTES 218 /* 4个字节,串口发送字节数 */
#define UART_RCV_SOFT_OVERFLOW 222 /* 4个字节,串口接收软件溢出 */
#define UART_SEND_SOFT_OVERFLOW 226 /* 4个字节,串口发送软件溢出 */
#define HARD_SOFT_EIDTION 230 /* 7个字节版本号,ASCII码 */
/* 保留100个字节 */
#define END_PARA 300 /* */
/* 收到配置软件的参数配置请求命令 */
#define BROADCAST_SEARCH 0x00 /* 广播搜索 */
#define CONFIG_REQUEST 0x02 /* 请求配置 */
#define SAVE_NET_CONFIG 0x04 /* 保存网口配置 */
#define REFLESH_STATISTIC 0x06 /* 刷新统计信息 */
#define CLEAR_STATISTIC 0x08 /* 清零统计信息请求 */
#define RESET_SYSTEM 0x0a /* 复位系统 */
/* 发给配置软件的命令 */
#define REPLY_BROADCAST 0x01 /* 广播搜索回应 */
#define REPLY_CONFIG 0x03 /* 配置请求回应 */
#define REPLY_SAVE_NETCONFIG 0x05 /* 保存网口配置回应 */
#define REPLY_FLESH 0x07 /* 刷新应答 */
#define REPLY_CLEAR_STATISTIC 0x09 /* 清零统计信息应答 */
extern bit EthernetBuf0DataFlag; // 以太网卡缓冲0已有数据 */
extern bit EthernetLinkFlag; /* 以太网是否LINK上 */
extern bit EthernetNoDataFlag; /* 以太网芯片中没有数据 */
extern UWORK16 RTL8019asRcvNum; /* 在缓存中以太网包的个数,16K存满64页,每页256字节 */
extern xdata ST_RECEIVE_ETHERNET gstaRevEthernet; /* 接收以太网包 */
extern xdata ST_ETHERNET_STATISTICS gstEthernetStatistics; /* 以太网卡收发统计 */
extern xdata UWORK8 gucaTmacSmacType[ETHER_HEAD_LEN]; /* 以太网头(目的MAC,源MAC,协议) */
extern xdata UWORK8 gucaNetSendBuff[NET_SEND_BUFF]; /* 以太网发送缓冲 */
extern xdata UWORK8 gucaSegTemp[SEGMENT_DATA]; /* 分片数据 */
/*************************************************************************************/
extern bit ARPFinishFlag; /* ARP完成标志*/
extern bit IPConflitTestFlag; /* IP冲突测试 */
extern bit IPOrMacConfiltFlag; /* IP,MAC冲突标志 */
extern bit StartConfiltLedFlag; /* 冲突时启动快闪 */
/************************************************************************/
extern xdata ST_ARP_FORMAT ArpRequestFormat; /* ARP帧请求格式 */
extern xdata ST_ARP_FORMAT ArpAnswerFormat; /* ARP应答格式 */
extern xdata ST_ARP_CACHE ArpCache_Buf[REMOTE_IP_NUM]; /* ARP高速缓存 */
extern UWORK8 IpModeNum; /* 在不同模式下IP数据不一样 */
extern UWORK8 ArpCachePoniter; /* ARP高速缓存指针 */
extern xdata UWORK8 gucARPOddNum; /* 老化后,ARP完不成的次数 */
extern xdata UWORK8 ArpPhases; /* ARP阶段 */
/************************************************************************/
extern xdata ST_IP_HEAD_FORMAT gstIphead;
extern xdata UWORK16 LocalIpID; /* 本地IP的ID号 */
extern xdata UWORK16 RevIpID; /* 接收的ID号 */
extern xdata UWORK8 IPAddress_buf[IP_LEN]; /* IP地址 */
extern xdata UWORK8 SubNetMask_buf[IP_LEN]; /* 子网掩码 */
extern xdata UWORK8 GateWay_buf[IP_LEN]; /* 网关 */
extern bit gbMoreSegFlag; /* 还有更多的分片标志 */
extern bit gbHaveFragment; /* 有分片标志 */
/***********************************************************************/
extern xdata UWORK8 SetupIP_RcvSignal[32]; /* 接收前导和标志信号 */
extern xdata UWORK8 SetupIP_SendSignal[32]; /* 发送前导和标志信号 */
extern xdata ST_UDP_STATISTICS gstUDPStatistics; /* UDP统计 */
extern void ArpProcess(void);
extern void ArpRequest(UWORK8 *pucaIP);
extern UWORK16 CheckSum(UWORK16 *pusPointer,UWORK16 usDataLen);
extern void ConfigParameter(void);
extern void IcmpReceive(UWORK16 usTotalLen);
extern UWORK8 If8019SendReady(void);
extern void InitPara(void);
extern void IpOrRouter(void);
extern void IpReceive(void);
extern void IpSend(void);
extern void RcvEthernetData(void);
extern UWORK8 RevEthernetPacket(void);
extern UWORK8 RTL8019asCheck(void);
extern UWORK8 RTL8019asInit(void);
extern UWORK8 RTL8019asReset(void);
extern void SendDiagnoseData(void);
extern UWORK8 SendEthernetPacket(UWORK16 usEthDataSendLen);
extern void ShowStatistic(void);
extern void StopArpCounter(void);
extern void UDPConfigSend(UWORK16 usUdpDataLen);
extern void UdpReceive(void);
extern void UdpSend(UWORK8 *pucAddr,UWORK16 usLen);
#endif
/*************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -