#ifndef PACKETPP_NULL_LOOPBACK_LAYER
#define PACKETPP_NULL_LOOPBACK_LAYER

/// @file

#include <Layer.h>

namespace pcpp
{

	/** IPv4 protocol **/
	#define PCPP_BSD_AF_INET          2
	/** XEROX NS protocols */
	#define PCPP_BSD_AF_NS            6
	/** ISO */
	#define PCPP_BSD_AF_ISO           7
	/** AppleTalk */
	#define PCPP_BSD_AF_APPLETALK     16
	/** IPX */
	#define PCPP_BSD_AF_IPX           23
	/** OpenBSD (and probably NetBSD), BSD/OS IPv6 */
	#define PCPP_BSD_AF_INET6_BSD     24
	/** FreeBSD IPv6 */
	#define PCPP_BSD_AF_INET6_FREEBSD 28
	/** Darwin IPv6 */
	#define PCPP_BSD_AF_INET6_DARWIN  30

	/**
	 * @class NullLoopbackLayer
	 * Represents a NULL/Loopback layer
	 */
	class NullLoopbackLayer : public Layer
	{
	public:
		 /** A constructor that creates the layer from an existing packet raw data
		 * @param[in] data A pointer to the raw data
		 * @param[in] dataLen Size of the data in bytes
		 * @param[in] packet A pointer to the Packet instance where layer will be stored in
		 */
		NullLoopbackLayer(uint8_t* data, size_t dataLen, Packet* packet) : Layer(data, dataLen, NULL, packet) { m_Protocol = NULL_LOOPBACK; }

		/**
		 * A constructor that allocates a new Null/Loopback header
		 * @param[in] family The family protocol to set
		 */
		NullLoopbackLayer(uint32_t family);

		/**
		 * A destructor for this layer (does nothing)
		 */
		~NullLoopbackLayer() {}

		/**
		 * @return The protocol family in this layer
		 */
		uint32_t getFamily();

		/**
		 * Set a protocol family
		 * @param[in] family The family protocol to set
		 */
		void setFamily(uint32_t family);


		// implement abstract methods

		/**
		 * Identifies the next layers by family:
		 * - for ::PCPP_BSD_AF_INET the next layer is IPv4Layer
		 * - for ::PCPP_BSD_AF_INET6_BSD, ::PCPP_BSD_AF_INET6_FREEBSD, ::PCPP_BSD_AF_INET6_DARWIN the next layer is IPv6Layer
		 * - for other values the next layer in PayloadLayer (unknown protocol)
		 */
		void parseNextLayer();

		/**
		 * @return Size of Null/Loopback header = 4B
		 */
		inline size_t getHeaderLen() { return sizeof(uint32_t); }

		/**
		 * Does nothing for this layer
		 */
		void computeCalculateFields() {}

		std::string toString();

		OsiModelLayer getOsiModelLayer() { return OsiModelDataLinkLayer; }
	};

} // namespace pcpp

#endif /* PACKETPP_NULL_LOOPBACK_LAYER */
