Main Page   Modules   Alphabetical List   Data Structures   File List   Data Fields   Globals   Related Pages  

udp.c File Reference

UDP (User Datagram Protocol) layer. More...

#include <const.h>
#include <errno.h>
#include <kernel/console.h>
#include <net/ip.h>
#include <net/network.h>
#include <net/udp.h>

Go to the source code of this file.

Functions

uint16_t udp_checksum (const void *buff, size_t len, in_addr_t src_addr, in_addr_t dest_addr)
 Calculate the UDP checksum (calculated with the whole packet).
Parameters:
buff  The UDP packet.
len  The UDP packet length.
src_addr  The IP source address (in network format).
dest_addr  The IP destination address (in network format).
Returns:
The result of the checksum.


void to_udp_layer (udp_t *packet, in_addr_t ip_src, in_addr_t ip_dst)
 Process an UDP packet received from the IP layer.
Parameters:
packet  The UDP packet.
ip_src  The IP source address (in network format).
ip_dst  The IP destination address (in network format).


int recv_udp_packet (udp_t *buf, size_t len, int flags)
 Receive an UDP packet.
Parameters:
buf  The buffer where the received packet will be copied.
len  The maximum size of the buffer.
flags  Flags.
Returns:
The size of the packet received in bytes.



Detailed Description

UDP (User Datagram Protocol) layer.

Author:
Andrea Righi <drizzt@inwind.it>
Date:
Last update:
2003-01-21 Andrea Righi: Suppressed deferencing type-punned pointer warning.
Note:
Copyright (©) 2003 Andrea Righi

Definition in file udp.c.


Function Documentation

int recv_udp_packet udp_t   buf,
size_t    len,
int    flags
 

Receive an UDP packet.

Parameters:
buf  The buffer where the received packet will be copied.
len  The maximum size of the buffer.
flags  Flags.
Returns:
The size of the packet received in bytes.

Todo:
Routine not implemented! For now return protocol not available error.

Definition at line 132 of file udp.c.

00133 {
00134         return( -ENOPROTOOPT );
00135 }

void to_udp_layer udp_t   packet,
in_addr_t    ip_src,
in_addr_t    ip_dst
 

Process an UDP packet received from the IP layer.

Parameters:
packet  The UDP packet.
ip_src  The IP source address (in network format).
ip_dst  The IP destination address (in network format).

Definition at line 73 of file udp.c.

00074 {
00075         int i;
00076         bool chk;
00077         uint16_t len = ntohs(packet->udp_len) - sizeof(udp_t);
00078 
00079         // For UDP packets the checksum is optional; a value of 0 in    //
00080         // the checksum means the checksum is not used. A value of      //
00081         // 0xFFFF means the checksum is used and its value is 0.        //
00082         if ( packet->udp_chk != 0 )
00083         {
00084                 // The checksum is used                                 //
00085                 if ( packet->udp_chk == 0xFFFF )
00086                         packet->udp_chk = 0x0000;
00087 
00088                 // Calculate the checksum                               //
00089                 chk = udp_checksum(
00090                                 packet,
00091                                 ntohs(packet->udp_len),
00092                                 ip_src,
00093                                 ip_dst
00094                                 );
00095                 if ( chk )
00096                 {
00097                         kprintf("\n\rUDP checksum error! %04X", chk);
00098                         return;
00099                 }
00100         }
00101 
00102         // Dump the UDP packet                                          //
00103         kprintf(        "\n\rUDP packet received (%u bytes of data)"
00104                 "\n\rsender  = %u.%u.%u.%u:%u"
00105                 "\n\rreceiver= %u.%u.%u.%u:%u",
00106                 len,
00107 
00108                 IP_A(ntohl(ip_src)), IP_B(ntohl(ip_src)),
00109                 IP_C(ntohl(ip_src)), IP_D(ntohl(ip_src)),
00110                 ntohs(packet->udp_src),
00111 
00112                 IP_A(ntohl(ip_dst)), IP_B(ntohl(ip_dst)),
00113                 IP_C(ntohl(ip_dst)), IP_D(ntohl(ip_dst)),
00114                 ntohs(packet->udp_dst)
00115         );
00116 
00117         kprintf("\n\rData:\n\r");
00118         for(i=0; i<len; i++)
00119                 kputchar( (((uint8_t *)packet)+sizeof(udp_t))[i]  );
00120 }

uint16_t udp_checksum const void *    buff,
size_t    len,
in_addr_t    src_addr,
in_addr_t    dest_addr
 

Calculate the UDP checksum (calculated with the whole packet).

Parameters:
buff  The UDP packet.
len  The UDP packet length.
src_addr  The IP source address (in network format).
dest_addr  The IP destination address (in network format).
Returns:
The result of the checksum.

Definition at line 29 of file udp.c.

00030 {
00031         const uint16_t *buf=buff;
00032         uint16_t *ip_src=(void *)&src_addr, *ip_dst=(void *)&dest_addr;
00033         uint32_t sum;
00034         size_t length=len;
00035 
00036         // Calculate the sum                                            //
00037         sum = 0;
00038         while (len > 1)
00039         {
00040                 sum += *buf++;
00041                 if (sum & 0x80000000)
00042                         sum = (sum & 0xFFFF) + (sum >> 16);
00043                 len -= 2;
00044         }
00045 
00046         if ( len & 1 )
00047                 // Add the padding if the packet lenght is odd          //
00048                 sum += *((uint8_t *)buf);
00049 
00050         // Add the pseudo-header                                        //
00051         sum += *(ip_src++);
00052         sum += *ip_src;
00053 
00054         sum += *(ip_dst++);
00055         sum += *ip_dst;
00056 
00057         sum += htons(IPPROTO_UDP);
00058         sum += htons(length);
00059 
00060         // Add the carries                                              //
00061         while (sum >> 16)
00062                 sum = (sum & 0xFFFF) + (sum >> 16);
00063 
00064         // Return the one's complement of sum                           //
00065         return ( (uint16_t)(~sum)  );
00066 }


Generated on Fri Feb 20 15:32:20 2004 for Minirighi by doxygen1.2.18