ReactOS  0.4.15-dev-3316-g067ca88
udp.h File Reference
#include <pshpack1.h>
#include <poppack.h>
Include dependency graph for udp.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  UDP_HEADER
 
struct  UDP_PSEUDO_HEADER
 
struct  UDP_STATISTICS
 

Macros

#define UDP_STARTING_PORT   0x8000
 
#define UDP_DYNAMIC_PORTS   0x8000
 

Typedefs

typedef struct UDP_HEADER UDP_HEADER
 
typedef struct UDP_HEADERPUDP_HEADER
 
typedef struct UDP_PSEUDO_HEADER UDP_PSEUDO_HEADER
 
typedef struct UDP_PSEUDO_HEADERPUDP_PSEUDO_HEADER
 
typedef struct UDP_STATISTICS UDP_STATISTICS
 
typedef struct UDP_STATISTICSPUDP_STATISTICS
 

Functions

VOID UDPSend (PVOID Context, PDATAGRAM_SEND_REQUEST SendRequest)
 
NTSTATUS UDPSendDatagram (PADDRESS_FILE AddrFile, PTDI_CONNECTION_INFORMATION ConnInfo, PCHAR BufferData, ULONG DataSize, PULONG DataUsed)
 
VOID UDPReceive (PIP_INTERFACE Interface, PIP_PACKET IPPacket)
 
NTSTATUS UDPStartup (VOID)
 
NTSTATUS UDPShutdown (VOID)
 
UINT UDPAllocatePort (UINT HintPort)
 
VOID UDPFreePort (UINT Port)
 

Variables

UDP_STATISTICS UDPStats
 

Macro Definition Documentation

◆ UDP_DYNAMIC_PORTS

#define UDP_DYNAMIC_PORTS   0x8000

Definition at line 11 of file udp.h.

◆ UDP_STARTING_PORT

#define UDP_STARTING_PORT   0x8000

Definition at line 10 of file udp.h.

Typedef Documentation

◆ PUDP_HEADER

◆ PUDP_PSEUDO_HEADER

◆ PUDP_STATISTICS

◆ UDP_HEADER

◆ UDP_PSEUDO_HEADER

◆ UDP_STATISTICS

Function Documentation

◆ UDPAllocatePort()

UINT UDPAllocatePort ( UINT  HintPort)

Definition at line 384 of file udp.c.

384  {
385  if( HintPort ) {
386  if( AllocatePort( &UDPPorts, HintPort ) ) return HintPort;
387  else return (UINT)-1;
388  } else return AllocatePortFromRange
391 }
PORT_SET UDPPorts
Definition: udp.c:14
BOOLEAN AllocatePort(PPORT_SET PortSet, ULONG Port)
Definition: ports.c:47
#define UDP_DYNAMIC_PORTS
Definition: udp.h:11
#define UDP_STARTING_PORT
Definition: udp.h:10
ULONG AllocatePortFromRange(PPORT_SET PortSet, ULONG Lowest, ULONG Highest)
Definition: ports.c:86
unsigned int UINT
Definition: ndis.h:50

Referenced by FileOpenAddress().

◆ UDPFreePort()

VOID UDPFreePort ( UINT  Port)

Definition at line 393 of file udp.c.

393  {
395 }
CPPORT Port[4]
Definition: headless.c:35
VOID DeallocatePort(PPORT_SET PortSet, ULONG Port)
Definition: ports.c:35
PORT_SET UDPPorts
Definition: udp.c:14

Referenced by AddrFileFree().

◆ UDPReceive()

VOID UDPReceive ( PIP_INTERFACE  Interface,
PIP_PACKET  IPPacket 
)

Definition at line 240 of file udp.c.

250 {
251  AF_SEARCH SearchContext;
253  PADDRESS_FILE AddrFile;
255  PIP_ADDRESS DstAddress, SrcAddress;
256  UINT DataSize, i;
257 
258  TI_DbgPrint(MAX_TRACE, ("Called.\n"));
259 
260  switch (IPPacket->Type) {
261  /* IPv4 packet */
262  case IP_ADDRESS_V4:
263  IPv4Header = IPPacket->Header;
264  DstAddress = &IPPacket->DstAddr;
265  SrcAddress = &IPPacket->SrcAddr;
266  break;
267 
268  /* IPv6 packet */
269  case IP_ADDRESS_V6:
270  TI_DbgPrint(MIN_TRACE, ("Discarded IPv6 UDP datagram (%i bytes).\n", IPPacket->TotalSize));
271 
272  /* FIXME: IPv6 is not supported */
273  return;
274 
275  default:
276  return;
277  }
278 
279  UDPHeader = (PUDP_HEADER)IPPacket->Data;
280 
281  /* Calculate and validate UDP checksum */
283  (PUCHAR)UDPHeader,
284  WH2N(UDPHeader->Length));
285  if (i != DH2N(0x0000FFFF) && UDPHeader->Checksum != 0)
286  {
287  TI_DbgPrint(MIN_TRACE, ("Bad checksum on packet received.\n"));
288  return;
289  }
290 
291  /* Sanity checks */
292  i = WH2N(UDPHeader->Length);
293  if ((i < sizeof(UDP_HEADER)) || (i > IPPacket->TotalSize - IPPacket->Position)) {
294  /* Incorrect or damaged packet received, discard it */
295  TI_DbgPrint(MIN_TRACE, ("Incorrect or damaged UDP packet received.\n"));
296  return;
297  }
298 
299  DataSize = i - sizeof(UDP_HEADER);
300 
301  /* Go to UDP data area */
302  IPPacket->Data = (PVOID)((ULONG_PTR)IPPacket->Data + sizeof(UDP_HEADER));
303 
304  /* Locate a receive request on destination address file object
305  and deliver the packet if one is found. If there is no receive
306  request on the address file object, call the associated receive
307  handler. If no receive handler is registered, drop the packet */
308 
309  AddrFile = AddrSearchFirst(DstAddress,
310  UDPHeader->DestPort,
311  IPPROTO_UDP,
312  &SearchContext);
313  if (AddrFile) {
314  do {
315  DGDeliverData(AddrFile,
316  SrcAddress,
317  DstAddress,
318  UDPHeader->SourcePort,
319  UDPHeader->DestPort,
320  IPPacket,
321  DataSize);
322  DereferenceObject(AddrFile);
323  } while ((AddrFile = AddrSearchNext(&SearchContext)) != NULL);
324  } else {
325  /* There are no open address files that will take this datagram */
326  /* FIXME: IPv4 only */
327  TI_DbgPrint(MID_TRACE, ("Cannot deliver IPv4 UDP datagram to address (0x%X).\n",
328  DN2H(DstAddress->Address.IPv4Address)));
329 
330  /* FIXME: Send ICMP reply */
331  }
332  TI_DbgPrint(MAX_TRACE, ("Leaving.\n"));
333 }
#define TI_DbgPrint(_t_, _x_)
Definition: debug.h:45
IPv4_RAW_ADDRESS IPv4Address
Definition: ip.h:26
struct UDP_HEADER UDP_HEADER
#define MID_TRACE
Definition: debug.h:15
unsigned char * PUCHAR
Definition: retypes.h:3
IP_ADDRESS SrcAddr
Definition: ip.h:89
#define WH2N(w)
Definition: addrconv.c:40
VOID DGDeliverData(PADDRESS_FILE AddrFile, PIP_ADDRESS SrcAddress, PIP_ADDRESS DstAddress, USHORT SrcPort, USHORT DstPort, PIP_PACKET IPPacket, UINT DataSize)
Definition: datagram.c:52
struct _tagUDPHeader UDPHeader
ULONG UDPv4ChecksumCalculate(PIPv4_HEADER IPHeader, PUCHAR PacketBuffer, ULONG DataLength)
Definition: checksum.c:60
#define DereferenceObject(Object)
Definition: titypes.h:24
uint32_t ULONG_PTR
Definition: typedefs.h:65
struct _tagIPv4Header IPv4Header
PVOID Data
Definition: ip.h:85
Definition: ip.h:23
PADDRESS_FILE AddrSearchFirst(PIP_ADDRESS Address, USHORT Port, USHORT Protocol, PAF_SEARCH SearchContext)
Definition: fileobjs.c:38
#define IP_ADDRESS_V4
Definition: ip.h:32
PVOID Header
Definition: ip.h:83
union IP_ADDRESS::@975 Address
void * PVOID
Definition: retypes.h:9
#define IP_ADDRESS_V6
Definition: ip.h:33
Definition: udp.h:15
UINT Position
Definition: ip.h:87
UINT TotalSize
Definition: ip.h:86
UCHAR Type
Definition: ip.h:79
PADDRESS_FILE AddrSearchNext(PAF_SEARCH SearchContext)
Definition: fileobjs.c:231
#define MAX_TRACE
Definition: debug.h:16
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
struct UDP_HEADER * PUDP_HEADER
#define DN2H(dw)
Definition: addrconv.c:21
#define DH2N(dw)
Definition: addrconv.c:28
unsigned int UINT
Definition: ndis.h:50
#define NULL
Definition: types.h:112
Definition: ip.h:37
#define MIN_TRACE
Definition: debug.h:14
IP_ADDRESS DstAddr
Definition: ip.h:90
_In_ NDIS_STATUS _In_ ULONG _In_ USHORT _In_opt_ PVOID _In_ ULONG DataSize
Definition: ndis.h:4751

Referenced by UDPStartup().

◆ UDPSend()

VOID UDPSend ( PVOID  Context,
PDATAGRAM_SEND_REQUEST  SendRequest 
)

◆ UDPSendDatagram()

NTSTATUS UDPSendDatagram ( PADDRESS_FILE  AddrFile,
PTDI_CONNECTION_INFORMATION  ConnInfo,
PCHAR  BufferData,
ULONG  DataSize,
PULONG  DataUsed 
)

Definition at line 150 of file udp.c.

166 {
168  PTA_IP_ADDRESS RemoteAddressTa = (PTA_IP_ADDRESS)ConnInfo->RemoteAddress;
171  USHORT RemotePort;
174 
175  LockObject(AddrFile);
176 
177  TI_DbgPrint(MID_TRACE,("Sending Datagram(%x %x %x %d)\n",
178  AddrFile, ConnInfo, BufferData, DataSize));
179  TI_DbgPrint(MID_TRACE,("RemoteAddressTa: %x\n", RemoteAddressTa));
180 
181  switch( RemoteAddressTa->Address[0].AddressType ) {
182  case TDI_ADDRESS_TYPE_IP:
184  RemoteAddress.Address.IPv4Address =
185  RemoteAddressTa->Address[0].Address[0].in_addr;
186  RemotePort = RemoteAddressTa->Address[0].Address[0].sin_port;
187  break;
188 
189  default:
190  UnlockObject(AddrFile);
191  return STATUS_UNSUCCESSFUL;
192  }
193 
194  LocalAddress = AddrFile->Address;
196  {
197  /* If the local address is unspecified (0),
198  * then use the unicast address of the
199  * interface we're sending over
200  */
201  if(!(NCE = RouteGetRouteToDestination( &RemoteAddress ))) {
202  UnlockObject(AddrFile);
204  }
205 
206  LocalAddress = NCE->Interface->Unicast;
207  }
208  else
209  {
210  if(!(NCE = NBLocateNeighbor( &LocalAddress, NULL ))) {
211  UnlockObject(AddrFile);
213  }
214  }
215 
216  Status = BuildUDPPacket( AddrFile,
217  &Packet,
218  &RemoteAddress,
219  RemotePort,
220  &LocalAddress,
221  AddrFile->Port,
222  BufferData,
223  DataSize );
224 
225  UnlockObject(AddrFile);
226 
227  if( !NT_SUCCESS(Status) )
228  return Status;
229 
230  Status = IPSendDatagram(&Packet, NCE);
231  if (!NT_SUCCESS(Status))
232  return Status;
233 
234  *DataUsed = DataSize;
235 
236  return STATUS_SUCCESS;
237 }
BOOLEAN AddrIsUnspecified(PIP_ADDRESS Address)
Definition: address.c:113
#define TI_DbgPrint(_t_, _x_)
Definition: debug.h:45
#define MID_TRACE
Definition: debug.h:15
_In_ NDIS_HANDLE _In_ PNDIS_PACKET Packet
Definition: ndis.h:1548
Definition: neighbor.h:28
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
struct _TA_ADDRESS_IP * PTA_IP_ADDRESS
LONG NTSTATUS
Definition: precomp.h:26
PNEIGHBOR_CACHE_ENTRY RouteGetRouteToDestination(PIP_ADDRESS Destination)
Definition: router.c:300
PNEIGHBOR_CACHE_ENTRY NBLocateNeighbor(PIP_ADDRESS Address, PIP_INTERFACE Interface)
Definition: neighbor.c:417
Definition: ip.h:23
#define IP_ADDRESS_V4
Definition: ip.h:32
NTSTATUS IPSendDatagram(PIP_PACKET IPPacket, PNEIGHBOR_CACHE_ENTRY NCE)
Definition: transmit.c:223
struct _TA_ADDRESS_IP::_AddrIp Address[1]
Status
Definition: gdiplustypes.h:24
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
#define TDI_ADDRESS_TYPE_IP
Definition: tdi.h:345
#define UnlockObject(Object)
Definition: titypes.h:44
NTSTATUS BuildUDPPacket(PADDRESS_FILE AddrFile, PIP_PACKET Packet, PIP_ADDRESS RemoteAddress, USHORT RemotePort, PIP_ADDRESS LocalAddress, USHORT LocalPort, PCHAR DataBuffer, UINT DataLen)
Definition: udp.c:78
unsigned short USHORT
Definition: pedump.c:61
IP_ADDRESS Address
Definition: titypes.h:117
#define NULL
Definition: types.h:112
Definition: ip.h:77
USHORT Port
Definition: titypes.h:120
#define STATUS_SUCCESS
Definition: shellext.h:65
#define STATUS_NETWORK_UNREACHABLE
Definition: ntstatus.h:704
_In_ NDIS_STATUS _In_ ULONG _In_ USHORT _In_opt_ PVOID _In_ ULONG DataSize
Definition: ndis.h:4751
_Must_inspect_result_ _In_ ULONG _In_ PSOCKADDR _In_ PSOCKADDR RemoteAddress
Definition: wsk.h:170
_Must_inspect_result_ _In_ ULONG _In_ PSOCKADDR LocalAddress
Definition: wsk.h:170
#define LockObject(Object)
Definition: titypes.h:34

Referenced by FileOpenAddress().

◆ UDPShutdown()

NTSTATUS UDPShutdown ( VOID  )

Definition at line 363 of file udp.c.

370 {
371  if (!UDPInitialized)
372  return STATUS_SUCCESS;
373 
375 
376  /* Deregister this protocol with IP layer */
378 
380 
381  return STATUS_SUCCESS;
382 }
VOID IPRegisterProtocol(UINT ProtocolNumber, IP_PROTOCOL_HANDLER Handler)
Definition: ip.c:390
#define FALSE
Definition: types.h:117
PORT_SET UDPPorts
Definition: udp.c:14
BOOLEAN UDPInitialized
Definition: udp.c:13
#define NULL
Definition: types.h:112
VOID PortsShutdown(PPORT_SET PortSet)
Definition: ports.c:31
#define STATUS_SUCCESS
Definition: shellext.h:65

Referenced by TiUnload().

◆ UDPStartup()

NTSTATUS UDPStartup ( VOID  )

Definition at line 336 of file udp.c.

343 {
345 
346 #ifdef __NTDRIVER__
348 #endif
349 
351 
352  if( !NT_SUCCESS(Status) ) return Status;
353 
354  /* Register this protocol with IP layer */
356 
358 
359  return STATUS_SUCCESS;
360 }
NTSTATUS PortsStartup(PPORT_SET PortSet, UINT StartingPort, UINT PortsToManage)
Definition: ports.c:13
#define TRUE
Definition: types.h:120
LONG NTSTATUS
Definition: precomp.h:26
VOID IPRegisterProtocol(UINT ProtocolNumber, IP_PROTOCOL_HANDLER Handler)
Definition: ip.c:390
PORT_SET UDPPorts
Definition: udp.c:14
VOID UDPReceive(PIP_INTERFACE Interface, PIP_PACKET IPPacket)
Definition: udp.c:240
#define UDP_DYNAMIC_PORTS
Definition: udp.h:11
Status
Definition: gdiplustypes.h:24
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define UDP_STARTING_PORT
Definition: udp.h:10
BOOLEAN UDPInitialized
Definition: udp.c:13
UDP_STATISTICS UDPStats
Definition: main.c:26
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
#define STATUS_SUCCESS
Definition: shellext.h:65

Referenced by DriverEntry().

Variable Documentation

◆ UDPStats

UDP_STATISTICS UDPStats

Definition at line 26 of file main.c.

Referenced by RawIPStartup(), and UDPStartup().