1/*
2 * Copyright 2003-2004, Waldemar Kornewald <wkornew@gmx.net>
3 * Distributed under the terms of the MIT License.
4 */
5
6#ifndef DISCOVERY_PACKET__H
7#define DISCOVERY_PACKET__H
8
9#include "PPPoE.h"
10
11#include <TemplateList.h>
12
13#define ETHER_HDR_LEN 14
14
15enum PPPoE_TAG_TYPE {
16	END_OF_LIST = 0x0000,
17	SERVICE_NAME = 0x0101,
18	AC_NAME = 0x0102,
19	HOST_UNIQ = 0x0103,
20	AC_COOKIE = 0x0104,
21	VENDOR_SPECIFIC = 0x0105,
22	RELAY_SESSION_ID = 0x0110,
23	SERVICE_NAME_ERROR = 0x0201,
24	AC_SYSTEM_ERROR = 0x0202,
25	GENERIC_ERROR = 0x0203
26};
27
28enum PPPoE_CODE {
29	PADI = 0x09,
30	PADO = 0x07,
31	PADR = 0x19,
32	PADS = 0x65,
33	PADT = 0xA7
34};
35
36
37typedef struct pppoe_tag {
38	uint16 type;
39	uint16 length;
40	uint8 data[0];
41} pppoe_tag;
42
43
44class DiscoveryPacket {
45	public:
46		DiscoveryPacket(uint8 code, uint16 sessionID = 0x0000);
47		DiscoveryPacket(net_buffer *packet, uint32 start = 0);
48		~DiscoveryPacket();
49
50		status_t InitCheck() const
51			{ return fInitStatus; }
52
53		void SetCode(uint8 code)
54			{ fCode = code; }
55		uint8 Code() const
56			{ return fCode; }
57
58		void SetSessionID(uint16 sessionID)
59			{ fSessionID = sessionID; }
60		uint16 SessionID() const
61			{ return fSessionID; }
62
63		bool AddTag(uint16 type, const void *data, uint16 length, int32 index = -1);
64		bool RemoveTag(pppoe_tag *tag);
65		int32 CountTags() const
66			{ return fTags.CountItems(); }
67		pppoe_tag *TagAt(int32 index) const;
68		pppoe_tag *TagWithType(uint16 type) const;
69
70		net_buffer *ToNetBuffer(uint32 MTU);
71			// the user is responsible for freeing the net_buffer
72
73	private:
74		uint8 fCode;
75		uint16 fSessionID;
76		TemplateList<pppoe_tag*> fTags;
77		status_t fInitStatus;
78};
79
80
81#endif
82