xref: /haiku/src/add-ons/kernel/network/ppp/pppoe/DiscoveryPacket.h (revision 4e0ad75221194c01b01ad7f13afe0a7aa6256a83)
15a4503c3SWaldemar Kornewald //----------------------------------------------------------------------
25a4503c3SWaldemar Kornewald //  This software is part of the OpenBeOS distribution and is covered
35a4503c3SWaldemar Kornewald //  by the OpenBeOS license.
45a4503c3SWaldemar Kornewald //
55a4503c3SWaldemar Kornewald //  Copyright (c) 2003 Waldemar Kornewald, Waldemar.Kornewald@web.de
65a4503c3SWaldemar Kornewald //---------------------------------------------------------------------
75a4503c3SWaldemar Kornewald 
85a4503c3SWaldemar Kornewald #ifndef DISCOVERY_PACKET__H
95a4503c3SWaldemar Kornewald #define DISCOVERY_PACKET__H
105a4503c3SWaldemar Kornewald 
115a4503c3SWaldemar Kornewald #include "PPPoE.h"
125a4503c3SWaldemar Kornewald 
135a4503c3SWaldemar Kornewald #include <List.h>
145a4503c3SWaldemar Kornewald 
155a4503c3SWaldemar Kornewald 
165a4503c3SWaldemar Kornewald enum PPPoE_TAG_TYPE {
175a4503c3SWaldemar Kornewald 	END_OF_LIST = 0x0000,
185a4503c3SWaldemar Kornewald 	SERVICE_NAME = 0x0101,
195a4503c3SWaldemar Kornewald 	AC_NAME = 0x0102,
205a4503c3SWaldemar Kornewald 	HOST_UNIQ = 0x0103,
215a4503c3SWaldemar Kornewald 	AC_COOKIE = 0x0104,
225a4503c3SWaldemar Kornewald 	VENDOR_SPECIFIC = 0x0105,
235a4503c3SWaldemar Kornewald 	RELAY_SESSION_ID = 0x0110,
245a4503c3SWaldemar Kornewald 	SERVICE_NAME_ERROR = 0x0201,
255a4503c3SWaldemar Kornewald 	AC_SYSTEM_ERROR = 0x0202,
265a4503c3SWaldemar Kornewald 	GENERIC_ERROR = 0x0203
275a4503c3SWaldemar Kornewald };
285a4503c3SWaldemar Kornewald 
295a4503c3SWaldemar Kornewald enum PPPoE_CODE {
305a4503c3SWaldemar Kornewald 	PADI = 0x09,
315a4503c3SWaldemar Kornewald 	PADO = 0x07,
325a4503c3SWaldemar Kornewald 	PADR = 0x19,
335a4503c3SWaldemar Kornewald 	PADS = 0x65,
345a4503c3SWaldemar Kornewald 	PADT = 0xA7
355a4503c3SWaldemar Kornewald };
365a4503c3SWaldemar Kornewald 
375a4503c3SWaldemar Kornewald 
385a4503c3SWaldemar Kornewald typedef struct pppoe_tag {
395a4503c3SWaldemar Kornewald 	uint16 type;
405a4503c3SWaldemar Kornewald 	uint16 length;
415a4503c3SWaldemar Kornewald 	uint8 data[0];
425a4503c3SWaldemar Kornewald };
435a4503c3SWaldemar Kornewald 
445a4503c3SWaldemar Kornewald 
455a4503c3SWaldemar Kornewald class DiscoveryPacket {
465a4503c3SWaldemar Kornewald 	public:
475a4503c3SWaldemar Kornewald 		DiscoveryPacket(uint8 code, uint16 sessionID = 0x0000);
48*4e0ad752SWaldemar Kornewald 		DiscoveryPacket(struct mbuf *packet, uint32 start = 0);
495a4503c3SWaldemar Kornewald 		~DiscoveryPacket();
505a4503c3SWaldemar Kornewald 
51*4e0ad752SWaldemar Kornewald 		status_t InitCheck() const
52*4e0ad752SWaldemar Kornewald 			{ return fInitStatus; }
53*4e0ad752SWaldemar Kornewald 
545a4503c3SWaldemar Kornewald 		void SetCode(uint8 code)
555a4503c3SWaldemar Kornewald 			{ fCode = code; }
565a4503c3SWaldemar Kornewald 		uint8 Code() const
575a4503c3SWaldemar Kornewald 			{ return fCode; }
585a4503c3SWaldemar Kornewald 
595a4503c3SWaldemar Kornewald 		void SetSessionID(uint16 sessionID)
605a4503c3SWaldemar Kornewald 			{ fSessionID = sessionID; }
615a4503c3SWaldemar Kornewald 		uint16 SessionID() const
625a4503c3SWaldemar Kornewald 			{ return fSessionID; }
635a4503c3SWaldemar Kornewald 
645a4503c3SWaldemar Kornewald 		bool AddTag(uint16 type, uint16 length, void *data, int32 index = -1);
655a4503c3SWaldemar Kornewald 		bool RemoveTag(pppoe_tag *tag);
665a4503c3SWaldemar Kornewald 		int32 CountTags() const
675a4503c3SWaldemar Kornewald 			{ return fTags.CountItems(); }
685a4503c3SWaldemar Kornewald 		pppoe_tag *TagAt(int32 index) const;
695a4503c3SWaldemar Kornewald 		pppoe_tag *TagWithType(uint16 type) const;
705a4503c3SWaldemar Kornewald 
71*4e0ad752SWaldemar Kornewald 		struct mbuf *ToMbuf(uint32 MTU, uint32 reserve = ETHER_HDR_LEN);
725a4503c3SWaldemar Kornewald 			// the user is responsible for freeing the mbuf
735a4503c3SWaldemar Kornewald 
745a4503c3SWaldemar Kornewald 	private:
755a4503c3SWaldemar Kornewald 		uint8 fCode;
765a4503c3SWaldemar Kornewald 		uint16 fSessionID;
775a4503c3SWaldemar Kornewald 		List<pppoe_tag*> fTags;
78*4e0ad752SWaldemar Kornewald 		status_t fInitStatus;
795a4503c3SWaldemar Kornewald };
805a4503c3SWaldemar Kornewald 
815a4503c3SWaldemar Kornewald 
825a4503c3SWaldemar Kornewald #endif
83