⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 udp.c

📁 最新版IAR FOR ARM(EWARM)5.11中的代码例子
💻 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 + -