1/*
2 * Copyright 2005, Ingo Weinhold <bonefish@cs.tu-berlin.de>.
3 * All rights reserved. Distributed under the terms of the MIT License.
4 */
5
6#ifndef _BOOT_UDP_H
7#define _BOOT_UDP_H
8
9#include <boot/net/IP.h>
10
11// UDPPacket
12class UDPPacket {
13public:
14	UDPPacket();
15	~UDPPacket();
16
17	status_t SetTo(const void *data, size_t size, ip_addr_t sourceAddress,
18		uint16 sourcePort, ip_addr_t destinationAddress,
19		uint16 destinationPort);
20
21	UDPPacket *Next() const;
22	void SetNext(UDPPacket *next);
23
24	const void *Data() const;
25	size_t DataSize() const;
26
27	ip_addr_t SourceAddress() const;
28	uint16 SourcePort() const;
29	ip_addr_t DestinationAddress() const;
30	uint16 DestinationPort() const;
31
32private:
33	UDPPacket	*fNext;
34	void		*fData;
35	size_t		fSize;
36	ip_addr_t	fSourceAddress;
37	ip_addr_t	fDestinationAddress;
38	uint16		fSourcePort;
39	uint16		fDestinationPort;
40};
41
42
43class UDPService;
44
45// UDPSocket
46class UDPSocket {
47public:
48	UDPSocket();
49	~UDPSocket();
50
51	ip_addr_t Address() const	{ return fAddress; }
52	uint16 Port() const			{ return fPort; }
53
54	status_t Bind(ip_addr_t address, uint16 port);
55	void Detach();
56
57	status_t Send(ip_addr_t destinationAddress, uint16 destinationPort,
58		ChainBuffer *buffer);
59	status_t Send(ip_addr_t destinationAddress, uint16 destinationPort,
60		const void *data, size_t size);
61	status_t Receive(UDPPacket **packet, bigtime_t timeout = 0);
62
63	void PushPacket(UDPPacket *packet);
64	UDPPacket *PopPacket();
65
66private:
67	UDPService	*fUDPService;
68	UDPPacket	*fFirstPacket;
69	UDPPacket	*fLastPacket;
70	ip_addr_t	fAddress;
71	uint16		fPort;
72};
73
74
75// UDPService
76class UDPService : public IPSubService {
77public:
78	UDPService(IPService *ipService);
79	virtual ~UDPService();
80
81	status_t Init();
82
83	virtual uint8 IPProtocol() const;
84
85	virtual void HandleIPPacket(IPService *ipService, ip_addr_t sourceIP,
86		ip_addr_t destinationIP, const void *data, size_t size);
87
88	status_t Send(uint16 sourcePort, ip_addr_t destinationAddress,
89		uint16 destinationPort, ChainBuffer *buffer);
90
91	void ProcessIncomingPackets();
92
93	status_t BindSocket(UDPSocket *socket, ip_addr_t address, uint16 port);
94	void UnbindSocket(UDPSocket *socket);
95
96private:
97	uint16 _ChecksumBuffer(ChainBuffer *buffer, ip_addr_t source,
98		ip_addr_t destination, uint16 length);
99	uint16 _ChecksumData(const void *data, uint16 length, ip_addr_t source,
100		ip_addr_t destination);
101
102	UDPSocket *_FindSocket(ip_addr_t address, uint16 port);
103
104	IPService			*fIPService;
105	Vector<UDPSocket*>	fSockets;
106};
107
108#endif	// _BOOT_UDP_H
109