📄 udp.c
字号:
//-----------------------------------------------------------------------------
// UDP
//-----------------------------------------------------------------------------
#include <string.h>
#include "tcpip_stack.h"
#include "ip.h"
#include "udp.h"
#include "hal_mac.h"
//-----------------------------------------------------------------------------
//Name:Udp_Sum()
//Funcionality: Calculates the UDP header checksum
//-----------------------------------------------------------------------------
u16 Udp_Sum(u16 udp_hdr_len, u8 buff[])
{
u16 word16;
u32 sum=0;
u16 i;
for (i=0;i< udp_hdr_len;i=i+2){
word16 =((buff[i]<<8)&0xFF00)+(buff[i+1]&0xFF);
if (i!=6)sum = sum + (u32) word16;
}
while (sum>>16)
sum = (sum & 0xFFFF)+(sum >> 16);
sum = ~sum;
sum = ((sum >> 8) & 0x00FF) + ((sum << 8) & 0xFF00);
return ((u16) sum);
}
//-----------------------------------------------------------------------------
//Name:Tx_Udp_Frame()
//Funcionality: Prepares the UDP header structure and prepares data to be
//processed by the IP stack part
//-----------------------------------------------------------------------------
void Tx_Udp_Frame(EthernetFrame *frame, u8 *szData, u16 nLength)
{
udp_hdr *tx_udp_hdr = (udp_hdr *)((u8 *)frame + IP_HEADER_LENGTH + ETHER_HEADER_LENGTH);
ip_hdr *tx_ip_hdr = (ip_hdr *)((u8 *)frame + ETHER_HEADER_LENGTH);
u8 *udp_data = (u8 *)(((u8 *)frame) + IP_HEADER_LENGTH + UDP_HEADER_LENGTH + ETHER_HEADER_LENGTH);
u8 *checksum_hdr = (u8 *)tx_udp_hdr;
//fill ip part
tx_ip_hdr->offset = 0x0040;
//fill the UDP header
tx_udp_hdr->src_port = SRC_UDP_PORT;
tx_udp_hdr->dst_port = DST_UDP_PORT;
tx_udp_hdr->length = UDP_HEADER_LENGTH + nLength;
tx_udp_hdr->checksum = Udp_Sum(UDP_HEADER_LENGTH, checksum_hdr);
//fill the UDP data
memcpy(udp_data, szData, nLength);
//call to add the ip header
Tx_Ip_Frame(frame, nLength + UDP_HEADER_LENGTH, IP_UDP);
}
//-----------------------------------------------------------------------------
//Name:Rx_Udp_Frame()
//Funcionality: Checks the validity of the UDP header part, checksum
//and correspondence of ports
//-----------------------------------------------------------------------------
u8 Rx_Udp_Frame(EthernetFrame *frame)
{
udp_hdr *rx_udp_hdr = (udp_hdr *)((u8 *)frame + ETHER_HEADER_LENGTH + IP_HEADER_LENGTH);
u8 *checksum_hdr = (u8 *)rx_udp_hdr;
// check the checksum
if (!(rx_udp_hdr->checksum == Udp_Sum(UDP_HEADER_LENGTH, checksum_hdr)))
return 0;
// check the port numbers
if (!((rx_udp_hdr->src_port == SRC_UDP_PORT) && (rx_udp_hdr->dst_port == DST_UDP_PORT)))
return 0;
//place your code here
return 1;
}
//-----------------------------------------------------------------------------
//Name:Receive_UDP()
//Funcionality: Can be used as an entry point to the UDP stack part
//-----------------------------------------------------------------------------
void Receive_UDP(EthernetFrame *frame){
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -