534struct UdpSocketDataSet
543 uint16_t io_counter=0;
612 BOOL m_bIsFragBuffer;
617 friend PoolPtr CreateDnsResponse4(
IPADDR4 serverIp,
IPADDR4 clientIp, uint16_t serverPort, uint16_t clientPort,
const char *name,
IPADDR hostIp, uint32_t ttl);
785 UDPPacket(OS_FIFO *pFifo, uint32_t timeout);
2049 inline bool Receive(OS_FIFO *pFifo, uint32_t wait_ticks)
2054 FragFreeBuffer(m_p);
2061 m_p = OSPoolFifoPend(pFifo, wait_ticks);
2066 puint8_t pb = (puint8_t)m_p;
2067 if ((((puint8_t)m_p) >= pFragmentBuffers) && (((puint8_t)m_p) < pMaxFragmentBuffer))
2069 m_bIsFragBuffer = TRUE;
2074 m_bIsFragBuffer = FALSE;
2079 puint8_t pb = (puint8_t)m_p;
2080 if ((((puint8_t)m_p) >= pFragmentBuffers) && (((puint8_t)m_p) < pMaxFragmentBuffer))
2082 m_bIsFragBuffer = TRUE;
2087 m_bIsFragBuffer = FALSE;
2108 if (m_p == NULL)
return false;
2338 IPADDR4 GetSourceAddress4(
void);
2339 IPADDR4 GetDestinationAddress4();
2450 IPADDR GetSourceAddress6(
void);
2451 IPADDR GetDestinationAddress6();
2453 PUDPPKT InitUdpPkt(
bool IpV6 =
false);
2599 inline bool bIsIPV6()
const {
return (m_pIP6f != NULL); }
3039 void SendAndKeep4(
IPADDR4 destIP, uint8_t ttl = 0);
3040 void Send4(
IPADDR4 destIP, uint8_t ttl = 0);
3041 void SendAndKeepViaInterfaceNum4(
IPADDR4 to,
int interface, uint8_t ttl = 0);
3042 void SendViaInterfaceNum4(
IPADDR4 destIP,
int interface, uint8_t ttl = 0);
3045 void SendAndKeep6(
const IPADDR &to, uint8_t ttl = 0);
3046 void Send6(
const IPADDR &to, uint8_t ttl = 0);
3047 void SendAndKeepViaInterfaceNum6(
const IPADDR &to,
int interface, uint8_t ttl = 0);
3048 void SendViaInterfaceNum6(
const IPADDR &to,
int interface, uint8_t ttl = 0);
3391inline void Send(
const IPADDR &to, uint8_t ttl = 0) { Send6(to, ttl); }
3580 SendAndKeepViaInterfaceNum6(to, interface, ttl);
3802 SendViaInterfaceNum6(to, interface, ttl);
3806 inline void Send(
IPADDR4 to, uint8_t ttl = 0) { Send4(to, ttl); };
3812 void FragFreeBuffer(
PoolPtr mp);
3813 void ReleaseBuffer(
void);
3815 void FixTransmitBuffers();
3817 void ReleaseBuffer(
void)
3825 PoolPtr GetPoolPtr(
void) {
return m_p; };
3828#if defined MULTIHOME || defined AUTOIP
3829 void SendViaIfAddr4(
IPADDR4 to,
IPADDR4 *from_ip, uint8_t ttl = 0);
3830 void SendViaIfAddrAndNum4(
IPADDR4 to,
IPADDR4 *from_ip,
int interface, uint8_t ttl = 0);
3831 void SendAndKeepViaIfAddr4(
IPADDR4 to,
IPADDR4 *from_ip, uint8_t ttl = 0);
3834 void SendAndKeepViaIfAddr6(
const IPADDR &to,
const IPADDR &from_ip, uint8_t ttl = 0);
3854 void SendViaIfAddr6(
const IPADDR &to,
const IPADDR &from_ip, uint8_t ttl = 0);
3879 bool process_all_udp();
3887 FragFreeBuffer(m_p);
3894 m_pPkt = cpyfrm.m_pPkt;
3896 cpyfrm.m_pPkt = NULL;
3898 m_pIP6f = cpyfrm.m_pIP6f;
3899 cpyfrm.m_pIP6f = NULL;
3902 m_bIsFragBuffer = cpyFrm.m_bIsFragBuffer;
3910extern uint8_t pFragmentBuffers[UDP_FRAGMENTS * (65536 + 4)];
3911extern puint8_t pMaxFragmentBuffer;
4762#define UDP_ERR_NOSUCH_SOCKET (-1)
4763#define UDP_ERR_NOTOPEN_TO_WRITE (-2)
4764#define UDP_ERR_NOTOPEN_TO_READ (-3)
5404int CreateTxUdpSocket4(
const IPADDR4 send_to_addr, uint16_t remote_port, uint16_t local_port);
5405int CreateRxTxUdpSocket4(
const IPADDR4 send_to_addr, uint16_t send_to_remote_port, uint16_t local_port);
5408int CreateTxUdpSocket6(
const IPADDR &send_to_addr, uint16_t remote_port, uint16_t local_port);
5565 return CreateTxUdpSocket6(send_to_addr, remote_port, local_port);
5570 return CreateTxUdpSocket4(send_to_addr, remote_port, local_port);
5575int CreateRxTxUdpSocket6(
const IPADDR &send_to_addr, uint16_t send_to_remote_port, uint16_t local_port);
5750 return CreateRxTxUdpSocket6(send_to_addr, send_to_remote_port, local_port);
5755 return CreateRxTxUdpSocket4(send_to_addr, send_to_remote_port, local_port);
5759int sendto4(
int sock, puint8_t what_to_send,
int len_to_send,
IPADDR4 to_addr, uint16_t remote_port);
5762int sendto6(
int sock, puint8_t what_to_send,
int len_to_send,
const IPADDR &to_addr, uint16_t remote_port);
5876inline int sendto(
int sock, puint8_t what_to_send,
int len_to_send,
const IPADDR &to_addr, uint16_t remote_port)
5878 return sendto6(sock, what_to_send, len_to_send, to_addr, remote_port);
5881inline int sendto(
int sock, puint8_t what_to_send,
int len_to_send,
IPADDR4 to_addr, uint16_t remote_port)
5883 return sendto4(sock, what_to_send, len_to_send, to_addr, remote_port);
5887#if defined MULTIHOME || defined AUTOIP
5888int sendtovia4(
int sock, puint8_t what_to_send,
int len_to_send,
IPADDR4 to_addr, uint16_t remote_port,
int intfnum);
5890int sendtovia6(
int sock, puint8_t what_to_send,
int len_to_send,
const IPADDR &to_addr, uint16_t remote_port,
int intfnum);
5891[[deprecated]]
inline int sendto6via(
int sock, puint8_t what_to_send,
int len_to_send,
const IPADDR &to_addr, uint16_t remote_port,
int intfnum)
5893 return sendtovia6(sock, what_to_send, len_to_send, to_addr, remote_port, intfnum);
5899inline int sendtovia(
int sock, puint8_t what_to_send,
int len_to_send,
const IPADDR &to_addr, uint16_t remote_port,
int intfnum)
5901 return sendtovia6(sock, what_to_send, len_to_send, to_addr, remote_port, intfnum);
5904inline int sendtovia(
int sock, puint8_t what_to_send,
int len_to_send,
IPADDR4 to_addr, uint16_t remote_port,
int intfnum)
5906 return sendtovia4(sock, what_to_send, len_to_send, to_addr, remote_port, intfnum);
5911int recvfrom4(
int sock, puint8_t buffer,
int len,
IPADDR4 *pAddr, uint16_t *pLocal_port, uint16_t *pRemote_port);
5914int recvfrom6(
int sock, puint8_t buffer,
int len,
IPADDR *pAddr, uint16_t *pLocal_port, uint16_t *pRemote_port);
5960inline int recvfrom(
int sock, puint8_t buffer,
int len,
IPADDR *pAddr, uint16_t *pLocal_port, uint16_t *pRemote_port)
5962 return recvfrom6(sock, buffer, len, pAddr, pLocal_port, pRemote_port);
5965inline int recvfrom(
int sock, puint8_t buffer,
int len,
IPADDR4 *pAddr, uint16_t *pLocal_port, uint16_t *pRemote_port)
5967 return recvfrom4(sock, buffer, len, pAddr, pLocal_port, pRemote_port);
5971int SendFragmentedUdpPacket4(
IPADDR4 to, uint16_t source_port, uint16_t dest_port, puint8_t data,
int length);
5974int SendFragmentedUdpPacket6(
const IPADDR &to, uint16_t source_port, uint16_t dest_port, puint8_t data,
int length);
6020 return SendFragmentedUdpPacket6(to, source_port, dest_port, data, length);
6025 return SendFragmentedUdpPacket4(to, source_port, dest_port, data, length);
6031#error Must select an IP version in udp.h
6037#error Must select IPV4ONLY or IPV6 but not both
6041int CreateRxUdpSocketVia(uint16_t listening_port,
int interfacenum);
6042int CreateRxUdpSocketVia(uint16_t listening_port,
const IPADDR interfaceIp);
6044int CreateTxUdpSocketVia4(
const IPADDR4 send_to_addr, uint16_t remote_port, uint16_t local_port,
int interfacenum);
6045int CreateTxUdpSocketVia4(
const IPADDR4 send_to_addr, uint16_t remote_port, uint16_t local_port,
const IPADDR4 interfaceIp);
6046int CreateRxTxUdpSocketVia4(
const IPADDR4 send_to_addr, uint16_t send_to_remote_port, uint16_t local_port,
int interfacenum);
6047int CreateRxTxUdpSocketVia4(
const IPADDR4 send_to_addr, uint16_t send_to_remote_port, uint16_t local_port,
const IPADDR4 interfaceIp);
6049[[deprecated]]
inline int CreateTxUdpSocket4Via(
const IPADDR4 send_to_addr, uint16_t remote_port, uint16_t local_port,
int interfacenum)
6051 return CreateTxUdpSocketVia4(send_to_addr, remote_port, local_port, interfacenum);
6053[[deprecated]]
inline int CreateTxUdpSocket4Via(
const IPADDR4 send_to_addr, uint16_t remote_port, uint16_t local_port,
const IPADDR4 interfaceIp)
6055 return CreateTxUdpSocketVia4(send_to_addr, remote_port, local_port, interfaceIp);
6057[[deprecated]]
inline int CreateRxTxUdpSocket4Via(
const IPADDR4 send_to_addr, uint16_t send_to_remote_port, uint16_t local_port,
int interfacenum)
6059 return CreateRxTxUdpSocketVia4(send_to_addr, send_to_remote_port, local_port, interfacenum);
6061[[deprecated]]
inline int CreateRxTxUdpSocket4Via(
const IPADDR4 send_to_addr, uint16_t send_to_remote_port, uint16_t local_port,
const IPADDR4 interfaceIp)
6063 return CreateRxTxUdpSocketVia4(send_to_addr, send_to_remote_port, local_port, interfaceIp);
6067int CreateRxTxUdpSocketVia6(
const IPADDR send_to_addr, uint16_t send_to_remote_port, uint16_t local_port,
int interfacenum);
6068int CreateRxTxUdpSocketVia6(
const IPADDR send_to_addr, uint16_t send_to_remote_port, uint16_t local_port,
const IPADDR interfaceIp);
6069int CreateTxUdpSocketVia6(
const IPADDR send_to_addr, uint16_t remote_port, uint16_t local_port,
int interfacenum);
6070int CreateTxUdpSocketVia6(
const IPADDR send_to_addr, uint16_t remote_port, uint16_t local_port,
const IPADDR interfaceIp);
6072[[deprecated]]
inline int CreateRxTxUdpSocket6Via(
const IPADDR send_to_addr, uint16_t send_to_remote_port, uint16_t local_port,
int interfacenum)
6074 return CreateRxTxUdpSocketVia6(send_to_addr, send_to_remote_port, local_port, interfacenum);
6076[[deprecated]]
inline int CreateRxTxUdpSocket6Via(
const IPADDR send_to_addr, uint16_t send_to_remote_port, uint16_t local_port,
const IPADDR interfaceIp)
6078 return CreateRxTxUdpSocketVia6(send_to_addr, send_to_remote_port, local_port, interfaceIp);
6080[[deprecated]]
inline int CreateTxUdpSocket6Via(
const IPADDR send_to_addr, uint16_t remote_port, uint16_t local_port,
int interfacenum)
6082 return CreateTxUdpSocketVia6(send_to_addr, remote_port, local_port, interfacenum);
6084[[deprecated]]
inline int CreateTxUdpSocket6Via(
const IPADDR send_to_addr, uint16_t remote_port, uint16_t local_port,
const IPADDR interfaceIp)
6086 return CreateTxUdpSocketVia6(send_to_addr, remote_port, local_port, interfaceIp);
6089inline int CreateRxTxUdpSocketVia(
const IPADDR send_to_addr, uint16_t send_to_remote_port, uint16_t local_port,
int interfacenum)
6091 return CreateRxTxUdpSocketVia6(send_to_addr, send_to_remote_port, local_port, interfacenum);
6094inline int CreateRxTxUdpSocketVia(
const IPADDR send_to_addr, uint16_t send_to_remote_port, uint16_t local_port,
IPADDR interfaceIp)
6096 return CreateRxTxUdpSocketVia6(send_to_addr, send_to_remote_port, local_port, interfaceIp);
6099inline int CreateTxUdpSocketVia(
const IPADDR send_to_addr, uint16_t remote_port, uint16_t local_port,
int interfacenum)
6101 return CreateTxUdpSocketVia6(send_to_addr, remote_port, local_port, interfacenum);
6104inline int CreateTxUdpSocketVia(
const IPADDR send_to_addr, uint16_t remote_port, uint16_t local_port,
IPADDR interfaceIp)
6106 return CreateTxUdpSocketVia6(send_to_addr, remote_port, local_port, interfaceIp);
6109inline int CreateRxTxUdpSocketVia(
const IPADDR4 send_to_addr, uint16_t send_to_remote_port, uint16_t local_port,
int interfacenum)
6111 return CreateRxTxUdpSocketVia4(send_to_addr, send_to_remote_port, local_port, interfacenum);
6114inline int CreateRxTxUdpSocketVia(
const IPADDR4 send_to_addr, uint16_t send_to_remote_port, uint16_t local_port,
IPADDR4 interfaceIp)
6116 return CreateRxTxUdpSocketVia4(send_to_addr, send_to_remote_port, local_port, interfaceIp);
6119inline int CreateTxUdpSocketVia(
const IPADDR4 send_to_addr, uint16_t remote_port, uint16_t local_port,
int interfacenum)
6121 return CreateTxUdpSocketVia4(send_to_addr, remote_port, local_port, interfacenum);
6124inline int CreateTxUdpSocketVia(
const IPADDR4 send_to_addr, uint16_t remote_port, uint16_t local_port,
IPADDR4 interfaceIp)
6126 return CreateTxUdpSocketVia4(send_to_addr, remote_port, local_port, interfaceIp);
Used to store and manipulate IPv4 addresses in dual stack mode.
Definition nettypes.h:225
Used to hold and manipulate IPv4 and IPv6 addresses in dual stack mode.
Definition ipv6_addr.h:41
Used to store and manipulate MAC addresses.
Definition nettypes.h:69
UDP Packet Class - Complete UDP packet management.
Definition udp.h:602
void SendViaIfAddr(const IPADDR &to, const IPADDR &from_ip, uint8_t ttl=0)
Send a packet via a specific interface address.
Definition udp.h:3872
~UDPPacket()
Destructor - automatically frees pool buffer.
UDPPacket(bool bIsIpv6=false)
Construct a new UDP packet object.
void SendAndKeep(const IPADDR &to, uint8_t ttl=0)
Send copy, keep original (for sending to multiple destinations)
Definition udp.h:3195
IPADDR GetSourceAddress(void)
Get source IP address of the packet.
Definition udp.h:2496
void Send(const IPADDR &to, uint8_t ttl=0)
Send and free buffer (recommended - most efficient)
Definition udp.h:3391
void SendViaInterfaceNum(const IPADDR &to, int interface, uint8_t ttl=0)
Send via specific interface and free buffer.
Definition udp.h:3800
void ResetData(void)
Reset data size to 0 (clears packet)
void SetDestinationPort(uint16_t port)
Set destination port (standard services: 53=DNS, 80=HTTP, 123=NTP, 161=SNMP)
UDPPacket(int sock)
Create UDP packet from socket (blocks until data available)
void SetDSCP(uint8_t dscp)
Set DSCP for QoS (0=best effort, 46=VoIP/EF, 34=video/AF41, 8=bulk/CS1)
uint16_t GetPacketId(void)
Get IP packet ID (used for fragment reassembly and packet tracking)
void SetSourcePort(uint16_t port)
Set source port (0=auto-assign ephemeral port, 1024-65535=specific port)
BOOL Validate(void)
Validate received packet (checks checksum and data presence)
void AddData(PCSTR pData)
Add null-terminated string (includes NULL in packet)
IPADDR GetDestinationAddress(void)
Get destination IP address of the packet.
Definition udp.h:2543
MACADR GetMacSource()
Get sender's MAC address (link-layer identification)
UDPPacket(OS_FIFO *pFifo, TickTimeout timeout)
Create UDP packet from FIFO with timeout.
bool Receive(OS_FIFO *pFifo, uint32_t wait_ticks)
Reuse packet object for multiple receives (efficiency optimization)
Definition udp.h:2049
uint16_t GetDataSize(void) const
Get current data size in bytes.
bool bIsIPV6() const
Check if packet uses IPv6 addressing.
Definition udp.h:2599
uint16_t GetDestinationPort(void) const
Get destination port (for received packets: local port that received it)
uint8_t GetDSCP(void) const
Get DSCP value (0-63)
void AddData(puint8_t pData, uint16_t len)
Add binary data (auto-updates size - no SetDataSize() needed)
void SetDataSize(uint16_t numBytes)
Set data size (REQUIRED after GetDataBuffer() writes)
puint8_t GetDataBuffer(bool bReAllocateIfNeeded=false)
Get data buffer pointer for reading or writing.
uint16_t GetSourcePort(void) const
Get source port from received packet or previously set value.
void SendAndKeepViaInterfaceNum(const IPADDR &to, int interface, uint8_t ttl=0)
Send copy via specific interface, keep original.
Definition udp.h:3578
UDPPacket(UDPPacket &pkt)
Move constructor - transfers ownership.
void AddDataWord(uint16_t w)
Add 16-bit value.
void SendAndKeepViaIfAddr(const IPADDR &to, const IPADDR &from_ip, uint8_t ttl=0)
Send a packet and retain a copy via a specific interface address.
Definition udp.h:3852
void AddDataByte(uint8_t b)
Add 8-bit value.
UDPPacket(PoolPtr p)
Create from raw pool buffer (ADVANCED - rarely needed)
void FreeBuffer(PoolPtr nbuf)
Free a buffer and return it to the unused pool.
PIPPKT GetIpPkt(PoolPtr p)
Get IP packet pointer from network buffer pool buffer.
Definition ip.h:632
PUDPPKT GetUdpPkt(PIPPKT pIp)
Get UDP packet pointer from IP packet pointer.
Definition ip.h:676
uint16_t RegisterEphemeralFifo(OS_FIFO *pfifo, int ifn=-1)
Register UDP FIFO on a random unused ephemeral port.
void UnregisterUDPFifo(uint16_t listenPort, bool drain=false)
Unregister UDP FIFO and stop receiving packets on specified port.
bool RegisterUDPFifoVia(uint16_t listenPort, OS_FIFO *pFifo, int interface)
Register FIFO to receive UDP packets on specified port via specific network interface.
bool RegisterUDPFifoWithNotify(uint16_t listenPort, OS_FIFO *pFifo, udp_data_notify *pNotifyFunction)
Register UDP FIFO with callback notification on packet arrival.
bool RegisterUDPFifo(uint16_t listenPort, OS_FIFO *pFifo)
Register FIFO to receive UDP packets on specified port.
bool RegisterUDPFifoWithNotifyVia(uint16_t listenPort, OS_FIFO *pFifo, udp_data_notify *pNotifyFunction, int interface)
Register UDP FIFO with callback notification on specific network interface.
void udp_data_notify(OS_FIFO *pfifo, uint16_t port)
UDP packet arrival notification callback function type.
Definition udp.h:4002
int recvfrom(int sock, puint8_t buffer, int len, IPADDR *pAddr, uint16_t *pLocal_port, uint16_t *pRemote_port)
Receive UDP packet from socket with sender information.
Definition udp.h:5960
int sendtovia(int sock, puint8_t what_to_send, int len_to_send, const IPADDR &to_addr, uint16_t remote_port, int intfnum)
Send via specific interface.
Definition udp.h:5899
int sendto(int sock, puint8_t what_to_send, int len_to_send, const IPADDR &to_addr, uint16_t remote_port)
Send UDP packet through socket to specified destination.
Definition udp.h:5876
int CreateTxUdpSocket(const IPADDR &send_to_addr, uint16_t remote_port, uint16_t local_port)
Create transmit-only UDP socket for sending to specified destination.
Definition udp.h:5563
int CreateRxUdpSocket(uint16_t listening_port)
Create receive-only UDP socket bound to specified port.
int CreateRxTxUdpSocket(const IPADDR &send_to_addr, uint16_t send_to_remote_port, uint16_t local_port)
Create bidirectional UDP socket for both sending and receiving.
Definition udp.h:5748
int SendFragmentedUdpPacket(const IPADDR &to, uint16_t source_port, uint16_t dest_port, puint8_t data, int length)
Send large UDP packet (>MTU) with IP fragmentation.
Definition udp.h:6018
Internal IPv4 Header Representation.
Definition ip.h:169
uint8_t DATA[]
Flexible array member - payload data follows header (actual length varies by packet)
Definition ip.h:183
uint8_t bVerHdrLen
Version and header length (same as versionNLength in IpHeaderIPv4)
Definition ip.h:170
IPv6 frame processing structure for packet analysis and header walking.
Definition ipv6_interface.h:69
Internal UDP Packet Header Structure.
Definition ip.h:201
Main buffer structure for network and serial communication.
Definition buffers.h:90