57#include "lwip/ip_addr.h"
67#ifndef UDP_LOCAL_PORT_RANGE_START
70#define UDP_LOCAL_PORT_RANGE_START 0xc000
71#define UDP_LOCAL_PORT_RANGE_END 0xffff
72#define UDP_ENSURE_LOCAL_PORT_RANGE(port) (((port) & ~UDP_LOCAL_PORT_RANGE_START) + UDP_LOCAL_PORT_RANGE_START)
76static u16_t udp_port = UDP_LOCAL_PORT_RANGE_START;
80struct udp_pcb *udp_pcbs;
88#if LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS && defined(LWIP_RAND)
89 udp_port = UDP_ENSURE_LOCAL_PORT_RANGE(LWIP_RAND());
105 if (udp_port++ == UDP_LOCAL_PORT_RANGE_END) {
106 udp_port = UDP_LOCAL_PORT_RANGE_START;
109 for(pcb = udp_pcbs; pcb !=
NULL; pcb = pcb->
next) {
110 if (pcb->local_port == udp_port) {
111 if (++
n > (UDP_LOCAL_PORT_RANGE_END - UDP_LOCAL_PORT_RANGE_START)) {
119 struct udp_pcb *ipcb = udp_pcbs;
120 while ((ipcb !=
NULL) && (udp_port != UDP_LOCAL_PORT_RANGE_END)) {
121 if (ipcb->local_port == udp_port) {
154 struct udp_pcb *pcb, *prev;
155 struct udp_pcb *uncon_pcb;
165 iphdr = (
struct ip_hdr *)
p->payload;
172 (
"udp_input: short UDP datagram (%"U16_F" bytes) discarded\n",
p->tot_len));
180 udphdr = (
struct udp_hdr *)
p->payload;
206 if (
dest == DHCP_CLIENT_PORT) {
208 if (
src == DHCP_SERVER_PORT) {
209 if ((inp->dhcp !=
NULL) && (inp->dhcp->pcb !=
NULL)) {
215 pcb = inp->dhcp->pcb;
229 for (pcb = udp_pcbs; pcb !=
NULL; pcb = pcb->
next) {
241 if (pcb->local_port ==
dest) {
258 if ((uncon_pcb ==
NULL) &&
259 ((pcb->flags & UDP_FLAGS_CONNECTED) == 0)) {
266 if ((local_match != 0) &&
267 (pcb->remote_port ==
src) &&
274 prev->next = pcb->next;
275 pcb->next = udp_pcbs;
296#if CHECKSUM_CHECK_UDP
298 if (chklen <
sizeof(
struct udp_hdr)) {
316 (
"udp_input: UDP Lite datagram discarded due to failing checksum\n"));
327#if CHECKSUM_CHECK_UDP
328 if (
udphdr->chksum != 0) {
332 (
"udp_input: UDP datagram discarded due to failing checksum\n"));
352#if SO_REUSE && SO_REUSE_RXTOALL
357 struct udp_pcb *mpcb;
358 u8_t p_header_changed = 0;
359 for (mpcb = udp_pcbs; mpcb !=
NULL; mpcb = mpcb->
next) {
362 if ((mpcb->local_port ==
dest) &&
374 if (mpcb->recv !=
NULL) {
377 if (p_header_changed == 0) {
379 p_header_changed = 1;
394 if (p_header_changed) {
401 if (pcb->recv !=
NULL) {
419 LWIP_ASSERT(
"p->payload == iphdr", (
p->payload == iphdr));
454udp_send(
struct udp_pcb *pcb,
struct pbuf *
p)
457 return udp_sendto(pcb,
p, &pcb->remote_ip, pcb->remote_port);
460#if LWIP_CHECKSUM_ON_COPY
464udp_send_chksum(
struct udp_pcb *pcb,
struct pbuf *
p,
468 return udp_sendto_chksum(pcb,
p, &pcb->remote_ip, pcb->remote_port,
491udp_sendto(
struct udp_pcb *pcb,
struct pbuf *
p,
494#if LWIP_CHECKSUM_ON_COPY
495 return udp_sendto_chksum(pcb,
p, dst_ip, dst_port, 0, 0);
500udp_sendto_chksum(
struct udp_pcb *pcb,
struct pbuf *
p,
ip_addr_t *dst_ip,
522#if LWIP_CHECKSUM_ON_COPY
523 return udp_sendto_if_chksum(pcb,
p, dst_ip, dst_port,
netif, have_chksum,
chksum);
525 return udp_sendto_if(pcb,
p, dst_ip, dst_port,
netif);
549udp_sendto_if(
struct udp_pcb *pcb,
struct pbuf *
p,
552#if LWIP_CHECKSUM_ON_COPY
553 return udp_sendto_if_chksum(pcb,
p, dst_ip, dst_port,
netif, 0, 0);
558udp_sendto_if_chksum(
struct udp_pcb *pcb,
struct pbuf *
p,
ip_addr_t *dst_ip,
572 (
"udp_sendto_if: SOF_BROADCAST not enabled on pcb %p\n", (
void *)pcb));
578 if (pcb->local_port == 0) {
580 err = udp_bind(pcb, &pcb->local_ip, pcb->local_port);
596 if (
p->tot_len != 0) {
602 (
"udp_send: added header pbuf %p before given pbuf %p\n", (
void *)
q, (
void *)
p));
609 LWIP_ASSERT(
"check that first pbuf can hold struct udp_hdr",
610 (
q->len >=
sizeof(
struct udp_hdr)));
612 udphdr = (
struct udp_hdr *)
q->payload;
644 src_ip = &(pcb->local_ip);
651 if (pcb->flags & UDP_FLAGS_UDPLITE) {
652 u16_t chklen, chklen_hdr;
655 chklen_hdr = chklen = pcb->chksum_len_tx;
656 if ((chklen <
sizeof(
struct udp_hdr)) || (chklen >
q->tot_len)) {
677 (have_chksum ? UDP_HLEN : chklen));
686 if (
udphdr->chksum == 0x0000) {
702 if ((pcb->flags & UDP_FLAGS_NOCHKSUM) == 0) {
704#if LWIP_CHECKSUM_ON_COPY
708 q->tot_len, UDP_HLEN);
718 if (udpchksum == 0x0000) {
721 udphdr->chksum = udpchksum;
768 struct udp_pcb *ipcb;
777 for (ipcb = udp_pcbs; ipcb !=
NULL; ipcb = ipcb->
next) {
796 if ((ipcb->local_port ==
port) &&
803 (
"udp_bind: local port %"U16_F" already bound by another pcb\n",
port));
813 port = udp_new_port();
820 pcb->local_port =
port;
825 pcb->next = udp_pcbs;
855 struct udp_pcb *ipcb;
857 if (pcb->local_port == 0) {
858 err_t err = udp_bind(pcb, &pcb->local_ip, pcb->local_port);
865 pcb->remote_port =
port;
866 pcb->flags |= UDP_FLAGS_CONNECTED;
883 pcb->local_ip.addr = 0;
893 for (ipcb = udp_pcbs; ipcb !=
NULL; ipcb = ipcb->
next) {
900 pcb->
next = udp_pcbs;
911udp_disconnect(
struct udp_pcb *pcb)
915 pcb->remote_port = 0;
917 pcb->flags &= ~UDP_FLAGS_CONNECTED;
930udp_recv(
struct udp_pcb *pcb, udp_recv_fn
recv,
void *recv_arg)
934 pcb->recv_arg = recv_arg;
946udp_remove(
struct udp_pcb *pcb)
948 struct udp_pcb *pcb2;
952 if (udp_pcbs == pcb) {
954 udp_pcbs = udp_pcbs->next;
957 for (pcb2 = udp_pcbs; pcb2 !=
NULL; pcb2 = pcb2->
next) {
959 if (pcb2->next !=
NULL && pcb2->
next == pcb) {
961 pcb2->next = pcb->next;
987 memset(pcb, 0,
sizeof(
struct udp_pcb));
1000udp_debug_print(
struct udp_hdr *
udphdr)
INT WSAAPI recv(IN SOCKET s, OUT CHAR FAR *buf, IN INT len, IN INT flags)
#define ip_get_option(pcb, opt)
#define ip_current_src_addr()
#define ip_current_dest_addr()
#define LWIP_DBG_LEVEL_SERIOUS
#define LWIP_DEBUGF(debug, message)
#define LWIP_ASSERT(message, assertion)
#define snmp_insert_udpidx_tree(pcb)
#define snmp_inc_udpnoports()
#define snmp_inc_udpindatagrams()
#define snmp_delete_udpidx_tree(pcb)
#define snmp_inc_udpinerrors()
#define snmp_inc_udpoutdatagrams()
GLdouble GLdouble GLdouble GLdouble q
static u32_t chksum(void *dataptr, u16_t len)
u16_t inet_chksum_pseudo(struct pbuf *p, ip_addr_t *src, ip_addr_t *dest, u8_t proto, u16_t proto_len)
u16_t inet_chksum_pseudo_partial(struct pbuf *p, ip_addr_t *src, ip_addr_t *dest, u8_t proto, u16_t proto_len, u16_t chksum_len)
#define ip_addr_cmp(addr1, addr2)
#define ip_addr_isany(addr1)
#define ip4_addr1_16(ipaddr)
#define ip_addr_ismulticast(addr1)
#define ip_addr_netcmp(addr1, addr2, mask)
#define ip4_addr2_16(ipaddr)
#define ip_addr_set(dest, src)
typedefPACK_STRUCT_END struct ip_addr ip_addr_t
#define ip_addr_isbroadcast(ipaddr, netif)
#define ip_addr_set_any(ipaddr)
#define ip4_addr3_16(ipaddr)
#define ip4_addr4_16(ipaddr)
#define ip_addr_debug_print(debug, ipaddr)
ip_addr_t current_iphdr_src
err_t ip_output_if(struct pbuf *p, ip_addr_t *src, ip_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto, struct netif *netif)
ip_addr_t current_iphdr_dest
struct netif * ip_route(ip_addr_t *dest)
void * memp_malloc(memp_t type)
void memp_free(memp_t type, void *mem)
#define NETIF_SET_HWADDRHINT(netif, hint)
#define IP_SOF_BROADCAST_RECV
#define LWIP_CHECKSUM_ON_COPY
u8_t pbuf_header(struct pbuf *p, s16_t header_size_increment)
void pbuf_chain(struct pbuf *h, struct pbuf *t)
struct pbuf * pbuf_alloc(pbuf_layer layer, u16_t length, pbuf_type type)
u8_t pbuf_free(struct pbuf *p)
err_t pbuf_copy(struct pbuf *p_to, struct pbuf *p_from)
#define PBUF_FLAG_MCASTLOOP