Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


Release 1.0
[palacios.git] / geekos / include / lwip / lwip / udp.h
1 /*
2  * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
3  * All rights reserved. 
4  * 
5  * Redistribution and use in source and binary forms, with or without modification, 
6  * are permitted provided that the following conditions are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright notice,
9  *    this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright notice,
11  *    this list of conditions and the following disclaimer in the documentation
12  *    and/or other materials provided with the distribution.
13  * 3. The name of the author may not be used to endorse or promote products
14  *    derived from this software without specific prior written permission. 
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 
17  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
18  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 
19  * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
20  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 
21  * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
22  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
23  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 
24  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 
25  * OF SUCH DAMAGE.
26  *
27  * This file is part of the lwIP TCP/IP stack.
28  * 
29  * Author: Adam Dunkels <adam@sics.se>
30  *
31  */
32 #ifndef __LWIP_UDP_H__
33 #define __LWIP_UDP_H__
34
35 #include "lwip/opt.h"
36
37 #if LWIP_UDP /* don't build if not configured for use in lwipopts.h */
38
39 #include "lwip/pbuf.h"
40 #include "lwip/netif.h"
41 #include "lwip/ip_addr.h"
42 #include "lwip/ip.h"
43
44 #ifdef __cplusplus
45 extern "C" {
46 #endif
47
48 #define UDP_HLEN 8
49
50 /* Fields are (of course) in network byte order. */
51 #ifdef PACK_STRUCT_USE_INCLUDES
52 #  include "arch/bpstruct.h"
53 #endif
54 PACK_STRUCT_BEGIN
55 struct udp_hdr {
56   PACK_STRUCT_FIELD(u16_t src);
57   PACK_STRUCT_FIELD(u16_t dest);  /* src/dest UDP ports */
58   PACK_STRUCT_FIELD(u16_t len);
59   PACK_STRUCT_FIELD(u16_t chksum);
60 } PACK_STRUCT_STRUCT;
61 PACK_STRUCT_END
62 #ifdef PACK_STRUCT_USE_INCLUDES
63 #  include "arch/epstruct.h"
64 #endif
65
66 #define UDP_FLAGS_NOCHKSUM 0x01U
67 #define UDP_FLAGS_UDPLITE  0x02U
68 #define UDP_FLAGS_CONNECTED  0x04U
69
70 struct udp_pcb {
71 /* Common members of all PCB types */
72   IP_PCB;
73
74 /* Protocol specific PCB members */
75
76   struct udp_pcb *next;
77
78   u8_t flags;
79   /* ports are in host byte order */
80   u16_t local_port, remote_port;
81
82 #if LWIP_IGMP
83   /* outgoing network interface for multicast packets */
84   struct ip_addr multicast_ip;
85 #endif /* LWIP_IGMP */
86
87 #if LWIP_UDPLITE
88   /* used for UDP_LITE only */
89   u16_t chksum_len_rx, chksum_len_tx;
90 #endif /* LWIP_UDPLITE */
91
92   /* receive callback function
93    * addr and port are in same byte order as in the pcb
94    * The callback is responsible for freeing the pbuf
95    * if it's not used any more.
96    *
97    * @param arg user supplied argument (udp_pcb.recv_arg)
98    * @param pcb the udp_pcb which received data
99    * @param p the packet buffer that was received
100    * @param addr the remote IP address from which the packet was received
101    * @param port the remote port from which the packet was received
102    */
103   void (* recv)(void *arg, struct udp_pcb *pcb, struct pbuf *p,
104     struct ip_addr *addr, u16_t port);
105   /* user-supplied argument for the recv callback */
106   void *recv_arg;  
107 };
108 /* udp_pcbs export for exernal reference (e.g. SNMP agent) */
109 extern struct udp_pcb *udp_pcbs;
110
111 /* The following functions is the application layer interface to the
112    UDP code. */
113 struct udp_pcb * udp_new        (void);
114 void             udp_remove     (struct udp_pcb *pcb);
115 err_t            udp_bind       (struct udp_pcb *pcb, struct ip_addr *ipaddr,
116                  u16_t port);
117 err_t            udp_connect    (struct udp_pcb *pcb, struct ip_addr *ipaddr,
118                  u16_t port);
119 void             udp_disconnect    (struct udp_pcb *pcb);
120 void             udp_recv       (struct udp_pcb *pcb,
121          void (* recv)(void *arg, struct udp_pcb *upcb,
122                  struct pbuf *p,
123                  struct ip_addr *addr,
124                  u16_t port),
125          void *recv_arg);
126 err_t            udp_sendto_if  (struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *dst_ip, u16_t dst_port, struct netif *netif);
127 err_t            udp_sendto     (struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *dst_ip, u16_t dst_port);
128 err_t            udp_send       (struct udp_pcb *pcb, struct pbuf *p);
129
130 #define          udp_flags(pcb)  ((pcb)->flags)
131 #define          udp_setflags(pcb, f)  ((pcb)->flags = (f))
132
133 /* The following functions are the lower layer interface to UDP. */
134 void             udp_input      (struct pbuf *p, struct netif *inp);
135
136 #define udp_init() /* Compatibility define, not init needed. */
137
138 #if UDP_DEBUG
139 void udp_debug_print(struct udp_hdr *udphdr);
140 #else
141 #define udp_debug_print(udphdr)
142 #endif
143
144 #ifdef __cplusplus
145 }
146 #endif
147
148 #endif /* LWIP_UDP */
149
150 #endif /* __LWIP_UDP_H__ */