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 45extern "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 struct udp_hdr { 55 PACK_STRUCT_FIELD(u16_t src); 56 PACK_STRUCT_FIELD(u16_t dest); /* src/dest UDP ports */ 57 PACK_STRUCT_FIELD(u16_t len); 58 PACK_STRUCT_FIELD(u16_t chksum); 59 } PACK_STRUCT_STRUCT; 60 PACK_STRUCT_END 61#ifdef PACK_STRUCT_USE_INCLUDES 62#include "arch/epstruct.h" 63#endif 64#define UDP_FLAGS_NOCHKSUM 0x01U 65#define UDP_FLAGS_UDPLITE 0x02U 66#define UDP_FLAGS_CONNECTED 0x04U 67 struct udp_pcb { 68/* Common members of all PCB types */ 69 IP_PCB; 70 71/* Protocol specific PCB members */ 72 73 struct udp_pcb *next; 74 75 u8_t flags; 76 /* ports are in host byte order */ 77 u16_t local_port, remote_port; 78 79#if LWIP_IGMP 80 /* outgoing network interface for multicast packets */ 81 struct ip_addr multicast_ip; 82#endif /* LWIP_IGMP */ 83 84#if LWIP_UDPLITE 85 /* used for UDP_LITE only */ 86 u16_t chksum_len_rx, chksum_len_tx; 87#endif /* LWIP_UDPLITE */ 88 89 /* receive callback function 90 * addr and port are in same byte order as in the pcb 91 * The callback is responsible for freeing the pbuf 92 * if it's not used any more. 93 * 94 * @param arg user supplied argument (udp_pcb.recv_arg) 95 * @param pcb the udp_pcb which received data 96 * @param p the packet buffer that was received 97 * @param addr the remote IP address from which the packet was received 98 * @param port the remote port from which the packet was received 99 */ 100 void (*recv) (void *arg, struct udp_pcb * pcb, struct pbuf * p, 101 struct ip_addr * addr, u16_t port); 102 /* user-supplied argument for the recv callback */ 103 void *recv_arg; 104 }; 105/* udp_pcbs export for exernal reference (e.g. SNMP agent) */ 106 extern struct udp_pcb *udp_pcbs; 107 108/* The following functions is the application layer interface to the 109 UDP code. */ 110 struct udp_pcb *udp_new(void); 111 void udp_remove(struct udp_pcb *pcb); 112 err_t udp_bind(struct udp_pcb *pcb, struct ip_addr *ipaddr, u16_t port); 113 err_t udp_connect(struct udp_pcb *pcb, struct ip_addr *ipaddr, u16_t port); 114 void udp_disconnect(struct udp_pcb *pcb); 115 void udp_recv(struct udp_pcb *pcb, 116 void (*recv) (void *arg, struct udp_pcb * upcb, 117 struct pbuf * p, 118 struct ip_addr * addr, 119 u16_t port), void *recv_arg); 120 err_t udp_sendto_if(struct udp_pcb *pcb, struct pbuf *p, 121 struct ip_addr *dst_ip, u16_t dst_port, 122 struct netif *netif); 123 err_t udp_sendto(struct udp_pcb *pcb, struct pbuf *p, 124 struct ip_addr *dst_ip, u16_t dst_port); 125 err_t udp_send(struct udp_pcb *pcb, struct pbuf *p); 126 127#define udp_flags(pcb) ((pcb)->flags) 128#define udp_setflags(pcb, f) ((pcb)->flags = (f)) 129 130/* The following functions are the lower layer interface to UDP. */ 131 void udp_input(struct pbuf *p, struct netif *inp); 132 133#define udp_init() /* Compatibility define, not init needed. */ 134 135#if UDP_DEBUG 136 void udp_debug_print(struct udp_hdr *udphdr); 137#else 138#define udp_debug_print(udphdr) 139#endif 140 141#ifdef __cplusplus 142} 143#endif 144#endif /* LWIP_UDP */ 145#endif /* __LWIP_UDP_H__ */ 146