370 lines
18 KiB
C
370 lines
18 KiB
C
/*
|
|
*********************************************************************************************************
|
|
* uC/TCP-IP
|
|
* The Embedded TCP/IP Suite
|
|
*
|
|
* Copyright 2004-2020 Silicon Laboratories Inc. www.silabs.com
|
|
*
|
|
* SPDX-License-Identifier: APACHE-2.0
|
|
*
|
|
* This software is subject to an open source license and is distributed by
|
|
* Silicon Laboratories Inc. pursuant to the terms of the Apache License,
|
|
* Version 2.0 available at www.apache.org/licenses/LICENSE-2.0.
|
|
*
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
*
|
|
* NETWORK UDP LAYER
|
|
* (USER DATAGRAM PROTOCOL)
|
|
*
|
|
* Filename : net_udp.h
|
|
* Version : V3.06.00
|
|
*********************************************************************************************************
|
|
* Note(s) : (1) Supports User Datagram Protocol as described in RFC #768.
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
*********************************************************************************************************
|
|
* MODULE
|
|
*********************************************************************************************************
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
#ifndef NET_UDP_MODULE_PRESENT
|
|
#define NET_UDP_MODULE_PRESENT
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
*********************************************************************************************************
|
|
* INCLUDE FILES
|
|
*********************************************************************************************************
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
#include "net_cfg_net.h"
|
|
#include "net_def.h"
|
|
#include "net_type.h"
|
|
#include "net_err.h"
|
|
#include <cpu.h>
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
*********************************************************************************************************
|
|
* DEFINES
|
|
*********************************************************************************************************
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* UDP APPLICATION-PROTOCOL-INTERFACE SELECT DEFINES
|
|
*
|
|
* Note(s) : (1) The following UDP values MUST be pre-#define'd in 'net_def.h' PRIOR to 'net_cfg.h' so
|
|
* that the developer can configure UDP for the desired application receive demultiplex
|
|
* selection (see 'net_def.h UDP LAYER DEFINES Note #1') :
|
|
*
|
|
* NET_UDP_APP_API_SEL_SOCK
|
|
* NET_UDP_APP_API_SEL_APP
|
|
* NET_UDP_APP_API_SEL_SOCK_APP
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
#if 0 /* See Note #1. */
|
|
#define NET_UDP_APP_API_SEL_NONE 0u
|
|
#define NET_UDP_APP_API_SEL_SOCK 1u
|
|
#define NET_UDP_APP_API_SEL_APP 2u
|
|
#define NET_UDP_APP_API_SEL_SOCK_APP 3u
|
|
#endif
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* UDP HEADER DEFINES
|
|
*
|
|
* Note(s) : (1) The following UDP values MUST be pre-#define'd in 'net_def.h' PRIOR to 'net_buf.h' so that
|
|
* the Network Buffer Module can configure minimum/maximum buffer header sizes (see 'net_def.h
|
|
* UDP LAYER DEFINES' & 'net_buf.h NETWORK BUFFER INDEX & SIZE DEFINES Note #1a') :
|
|
*
|
|
* (a) NET_UDP_HDR_SIZE_MIN 8
|
|
* (b) NET_UDP_HDR_SIZE_MAX 8
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
|
|
#if 0 /* See Note #1. */
|
|
#define NET_UDP_HDR_SIZE_MIN NET_UDP_HDR_SIZE
|
|
#define NET_UDP_HDR_SIZE_MAX NET_UDP_HDR_SIZE
|
|
#endif
|
|
|
|
|
|
#define NET_UDP_PSEUDO_HDR_SIZE 12 /* = sizeof(NET_UDP_PSEUDO_HDR) */
|
|
|
|
|
|
#define NET_UDP_PORT_NBR_RESERVED NET_PORT_NBR_RESERVED
|
|
#define NET_UDP_PORT_NBR_NONE NET_UDP_PORT_NBR_RESERVED
|
|
|
|
|
|
#define NET_UDP_HDR_CHK_SUM_POS_ZERO 0x0000u
|
|
#define NET_UDP_HDR_CHK_SUM_NEG_ZERO 0xFFFFu
|
|
#define NET_UDP_HDR_CHK_SUM_NONE NET_UDP_HDR_CHK_SUM_POS_ZERO
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* UDP DATA/TOTAL LENGTH DEFINES
|
|
*
|
|
* Note(s) : (1) (a) UDP total length #define's (NET_UDP_TOT_LEN) relate to the total size of a complete
|
|
* UDP packet, including the packet's UDP header. Note that a complete UDP packet MAY
|
|
* be fragmented in multiple Internet Protocol packets.
|
|
*
|
|
* (b) UDP data length #define's (NET_UDP_DATA_LEN) relate to the data size of a complete
|
|
* UDP packet, equal to the total UDP packet length minus its UDP header size. Note
|
|
* that a complete UDP packet MAY be fragmented in multiple Internet Protocol packets.
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
/* See Notes #1a & #1b. */
|
|
#define NET_UDP_DATA_LEN_MIN 0
|
|
|
|
#define NET_UDP_TOT_LEN_MIN (NET_UDP_HDR_SIZE + NET_UDP_DATA_LEN_MIN )
|
|
#if defined(NET_IPv4_MODULE_EN)
|
|
#define NET_UDP_TOT_LEN_MAX (NET_IPv4_TOT_LEN_MAX - NET_IPv4_HDR_SIZE_MIN)
|
|
#define NET_UDP_DATA_LEN_MAX (NET_UDP_TOT_LEN_MAX - NET_UDP_HDR_SIZE )
|
|
#elif defined(NET_IPv6_MODULE_EN)
|
|
#define NET_UDP_TOT_LEN_MAX (NET_IPv6_TOT_LEN_MAX - NET_IPv6_HDR_SIZE)
|
|
#define NET_UDP_DATA_LEN_MAX (NET_UDP_TOT_LEN_MAX - NET_UDP_HDR_SIZE )
|
|
#endif
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* UDP FLAG DEFINES
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
/* ------------------ NET UDP FLAGS ------------------- */
|
|
#define NET_UDP_FLAG_NONE DEF_BIT_NONE
|
|
|
|
/* ------------------ UDP TX FLAGS ------------------- */
|
|
#define NET_UDP_FLAG_TX_CHK_SUM_DIS DEF_BIT_00 /* DISABLE tx chk sums. */
|
|
#define NET_UDP_FLAG_TX_BLOCK DEF_BIT_07
|
|
|
|
/* ------------------ UDP RX FLAGS ------------------- */
|
|
#define NET_UDP_FLAG_RX_CHK_SUM_NONE_DISCARD DEF_BIT_08 /* Discard rx'd NULL chk sum UDP datagrams. */
|
|
#define NET_UDP_FLAG_RX_DATA_PEEK DEF_BIT_09
|
|
#define NET_UDP_FLAG_RX_BLOCK DEF_BIT_15
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
*********************************************************************************************************
|
|
* DATA TYPES
|
|
*********************************************************************************************************
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* UDP PORT NUMBER DATA TYPE
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
typedef NET_PORT_NBR NET_UDP_PORT_NBR; /* Defines UDP port nbr size. */
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* UDP FLAGS DATA TYPE
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
typedef NET_FLAGS NET_UDP_FLAGS;
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* UDP HEADER
|
|
*
|
|
* Note(s) : (1) See RFC #768, Section 'Format' for UDP datagram header format.
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
/* ------------------- NET UDP HDR -------------------- */
|
|
typedef struct net_udp_hdr {
|
|
NET_UDP_PORT_NBR PortSrc; /* UDP datagram src port. */
|
|
NET_UDP_PORT_NBR PortDest; /* UDP datagram dest port. */
|
|
CPU_INT16U DatagramLen; /* UDP datagram msg len. */
|
|
NET_CHK_SUM ChkSum; /* UDP datagram chk sum. */
|
|
} NET_UDP_HDR;
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* UDP PSEUDO-HEADER
|
|
*
|
|
* Note(s) : (1) See RFC #768, Section 'Fields : Checksum' for UDP datagram pseudo-header format.
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
/* ---------------- NET UDP PSEUDO-HDR ---------------- */
|
|
typedef struct net_udp_pseudo_hdr {
|
|
NET_IPv4_ADDR AddrSrc; /* UDP datagram src addr. */
|
|
NET_IPv4_ADDR AddrDest; /* UDP datagram dest addr. */
|
|
CPU_INT08U Zero; /* Field MUST be zero'd; i.e. ALL bits clr'd. */
|
|
CPU_INT08U Protocol; /* UDP datagram protocol. */
|
|
CPU_INT16U DatagramLen; /* UDP datagram tot len. */
|
|
} NET_UDP_PSEUDO_HDR;
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
*********************************************************************************************************
|
|
* FUNCTION PROTOTYPES
|
|
*********************************************************************************************************
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* EXTERNAL C LANGUAGE LINKAGE
|
|
*
|
|
* Note(s) : (1) C++ compilers MUST 'extern'ally declare ALL C function prototypes & variable/object
|
|
* declarations for correct C language linkage.
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
|
|
void NetUDP_Init(void);
|
|
|
|
|
|
/* --------------------- RX FNCTS --------------------- */
|
|
void NetUDP_Rx(NET_BUF *pbuf,
|
|
NET_ERR *p_err);
|
|
|
|
CPU_INT16U NetUDP_RxAppData(NET_BUF *pbuf,
|
|
void *pdata_buf,
|
|
CPU_INT16U data_buf_len,
|
|
NET_UDP_FLAGS flags,
|
|
void *pip_opts_buf,
|
|
CPU_INT08U ip_opts_buf_len,
|
|
CPU_INT08U *pip_opts_len,
|
|
NET_ERR *p_err);
|
|
|
|
|
|
/* --------------------- TX FNCTS --------------------- */
|
|
CPU_INT16U NetUDP_TxAppDataIPv4(void *p_data,
|
|
CPU_INT16U data_len,
|
|
NET_IPv4_ADDR src_addr,
|
|
NET_UDP_PORT_NBR src_port,
|
|
NET_IPv4_ADDR dest_addr,
|
|
NET_UDP_PORT_NBR dest_port,
|
|
NET_IPv4_TOS TOS,
|
|
NET_IPv4_TTL TTL,
|
|
NET_UDP_FLAGS flags_udp,
|
|
NET_IPv4_FLAGS flags_ip,
|
|
void *popts_ip,
|
|
NET_ERR *p_err);
|
|
|
|
CPU_INT16U NetUDP_TxAppDataIPv6(void *p_data,
|
|
CPU_INT16U data_len,
|
|
NET_IPv6_ADDR *p_src_addr,
|
|
NET_UDP_PORT_NBR src_port,
|
|
NET_IPv6_ADDR *p_dest_addr,
|
|
NET_UDP_PORT_NBR dest_port,
|
|
NET_IPv6_TRAFFIC_CLASS traffic_class,
|
|
NET_IPv6_FLOW_LABEL flow_label,
|
|
NET_IPv6_HOP_LIM hop_lim,
|
|
NET_UDP_FLAGS flags_udp,
|
|
NET_ERR *p_err);
|
|
|
|
CPU_INT16U NetUDP_TxAppDataHandlerIPv4(void *p_data,
|
|
CPU_INT16U data_len,
|
|
NET_IPv4_ADDR src_addr,
|
|
NET_UDP_PORT_NBR src_port,
|
|
NET_IPv4_ADDR dest_addr,
|
|
NET_UDP_PORT_NBR dest_port,
|
|
NET_IPv4_TOS TOS,
|
|
NET_IPv4_TTL TTL,
|
|
NET_UDP_FLAGS flags_udp,
|
|
NET_IPv4_FLAGS flags_ip,
|
|
void *popts_ip,
|
|
NET_ERR *p_err);
|
|
|
|
CPU_INT16U NetUDP_TxAppDataHandlerIPv6(void *p_data,
|
|
CPU_INT16U data_len,
|
|
NET_IPv6_ADDR *p_src_addr,
|
|
NET_UDP_PORT_NBR src_port,
|
|
NET_IPv6_ADDR *p_dest_addr,
|
|
NET_UDP_PORT_NBR dest_port,
|
|
NET_IPv6_TRAFFIC_CLASS traffic_class,
|
|
NET_IPv6_FLOW_LABEL flow_label,
|
|
NET_IPv6_HOP_LIM hop_lim,
|
|
NET_UDP_FLAGS flags_udp,
|
|
NET_ERR *p_err);
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
* EXTERNAL C LANGUAGE LINKAGE END
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
/*
|
|
*********************************************************************************************************
|
|
*********************************************************************************************************
|
|
* CONFIGURATION ERRORS
|
|
*********************************************************************************************************
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
|
|
#ifndef NET_UDP_CFG_RX_CHK_SUM_DISCARD_EN
|
|
#error "NET_UDP_CFG_RX_CHK_SUM_DISCARD_EN not #define'd in 'net_cfg.h'"
|
|
#error " [MUST be DEF_DISABLED] "
|
|
#error " [ || DEF_ENABLED ] "
|
|
|
|
#elif ((NET_UDP_CFG_RX_CHK_SUM_DISCARD_EN != DEF_DISABLED) && \
|
|
(NET_UDP_CFG_RX_CHK_SUM_DISCARD_EN != DEF_ENABLED ))
|
|
#error "NET_UDP_CFG_RX_CHK_SUM_DISCARD_EN illegally #define'd in 'net_cfg.h'"
|
|
#error " [MUST be DEF_DISABLED] "
|
|
#error " [ || DEF_ENABLED ] "
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef NET_UDP_CFG_TX_CHK_SUM_EN
|
|
#error "NET_UDP_CFG_TX_CHK_SUM_EN not #define'd in 'net_cfg.h'"
|
|
#error " [MUST be DEF_DISABLED] "
|
|
#error " [ || DEF_ENABLED ] "
|
|
|
|
#elif ((NET_UDP_CFG_TX_CHK_SUM_EN != DEF_DISABLED) && \
|
|
(NET_UDP_CFG_TX_CHK_SUM_EN != DEF_ENABLED ))
|
|
#error "NET_UDP_CFG_TX_CHK_SUM_EN illegally #define'd in 'net_cfg.h'"
|
|
#error " [MUST be DEF_DISABLED] "
|
|
#error " [ || DEF_ENABLED ] "
|
|
#endif
|
|
|
|
|
|
/*
|
|
*********************************************************************************************************
|
|
*********************************************************************************************************
|
|
* MODULE END
|
|
*********************************************************************************************************
|
|
*********************************************************************************************************
|
|
*/
|
|
|
|
#endif /* NET_UDP_MODULE_PRESENT */
|