www.pudn.com > pppcode.rar > udp.c


#include "ip.h" 
#include "commdrv.h" 
 
#include "udp.h" 
#include "ppp.h" 
#define UDP_HEADER_LENGTH 8 
static WORD UDPLocalPort = 1080; // Default UDP port (can be set to anything) 
static void UDPDefaultCallBack (BYTE *udpdata, BYTE size, DWORD RemoteIP, WORD Port); 
static UDPCALLBACK UDPCallback = UDPDefaultCallBack; 
extern UDPDatagram *udp_in; // Pointer to incoming UDP packet 
extern UDPDatagram *udp_out; // Pointer for output UDP packet 
/*********************************************************************** 
Function : UDPSetCallbackProc 
Parameters : Proc: A pointer to a function to callback each time a UDP/IP 
packet is received from the Internet 
Date : December 2000 
Desc : Sets the callback function to call each time a UDP packet is received 
over the physical interface 
***********************************************************************/ 
void UDPSetCALLBACK (UDPCALLBACK Proc) { 
DisableInterrupts; 
UDPCallback = Proc; 
EnableInterrupts; 
} 
/*********************************************************************** 
Function : UDPDefaultCallBack 
Parameters : None 
Date : December 2000 
Desc : The default callback available after RESET not accesible 
from outside this module 
***********************************************************************/ 
static void UDPDefaultCallBack (BYTE *udpdata, BYTE size, DWORD RemoteIP, WORD Port) { 
 
} 
/*********************************************************************** 
Function : UDPBind 
Parameters : Port: local port to use in UDP packets to transmit 
Date : November 2000 
Desc : Specifies the local port to use for sending UDP 
packets over IP 
***********************************************************************/ 
void UDPBind (WORD Port) { 
UDPLocalPort = Port; // Set source UDP port 
} 
/********************************************************************** 
Function : UDP_Checksum 
Parameters : udp: A pointer to the start of a udp/ip packet (0x45) 
Date : November 2000 
Desc : Calculates the pseudo-header checksum of a UDP packet 
***********************************************************************/ 
WORD UDP_Checksum (BYTE* udp) { 
DWORD Checksum = 0; 
Checksum = IPCheckSum (&(udp[12]), (8 + (udp[25]) >> 1)); 
Checksum = ~Checksum + 0x11; 
Checksum += udp [25]; 
Checksum = (Checksum >> 16) + (Checksum & 0xFFFF); 
Checksum += (Checksum >> 16); 
return (WORD)~Checksum; 
} 
/*********************************************************************** 
Function : UDPHandler 
Parameters : udp: a pointer to the udp (struct UDPDatagram) packet received 
Date : November 2000 
Desc : Invokes the callback proc so the application can handle the 
UDP data received 
***********************************************************************/ 
void UDP_Handler (UDPDatagram *udp) { 
udp_in =udp; 
udp_in->Payload [udp_in->Length - UDP_HEADER_LENGTH] = 0x00; 
UDPCallback ( // Invoque the CALLBACK function 
(BYTE *)udp_in->Payload, 
((udp_in->Length)- UDP_HEADER_LENGTH), 
*((DWORD *)&udp_in->SourceIP), 
udp_in->DestPort); 
} 
/*********************************************************************** 
Function : UDPSendData 
Parameters : BYTE Ip[]: The IP address of the remote host 
Port: UDP port of the remote host 
Payload: Data to send 
Size: Number of bytes to send to remote host 
Date : November 2000 
Desc : Sends data (payload) over UDP to a remote host specified by IP [] using 
Port as the destination UDP port. 
***********************************************************************/ 
void UDPSendData (BYTE Ip[], WORD Port, BYTE* Payload, BYTE size) { 
WORD Checksum = 0; 
ip_out->DestAddress [0] = Ip [0]; // Store source and destination 
ip_out->DestAddress [1] = Ip [1]; // IP addresses 
ip_out->DestAddress [2] = Ip [2]; 
ip_out->DestAddress [3] = Ip [3]; 
ip_out->SourceAddress [0] = IPAddress [0]; 
ip_out->SourceAddress [1] = IPAddress [1]; 
ip_out->SourceAddress [2] = IPAddress [2]; 
ip_out->SourceAddress [3] = IPAddress [3]; 
udp_out = (UDPDatagram *) &ip_out->SourceAddress; 
// Insert Data Payload if available as an argument 
if (Payload) 
Move (Payload, &udp_out->Payload[0], size); 
// Format payload as a null terminated string 
udp_out->Payload[size] = 0x00; 
if (size % 2) { // Pad the payload 
size++; 
} 
udp_out->Length = size + UDP_HEADER_LENGTH; // Calculate the UDP length 
ip_out->Length = size + UDP_HEADER_LENGTH + 20;// get IP packet length 
ip_out->Protocol = UDP; // Protocol set to UDP 
udp_out->SourcePort = htons(UDPLocalPort);// Set source and destination ports 
udp_out->DestPort = htons(Port); 
udp_out->LengthUpper = 0; // Packet cannot be longer than 256 
// bytes 
// (in this implementation) 
udp_out->Checksum = 0; // Set checksum to 0 
Checksum = UDP_Checksum ((BYTE *)ip_out); // Obtain the packet checksum 
udp_out->Checksum = htons (Checksum); 
IPNetSend (ip_out); // Send the packet to the IP layer 
}