// See the file "COPYING" in the main distribution directory for copyright.

#include "zeek/packet_analysis/protocol/linux_sll/LinuxSLL.h"

using namespace zeek::packet_analysis::LinuxSLL;

LinuxSLLAnalyzer::LinuxSLLAnalyzer() : zeek::packet_analysis::Analyzer("LinuxSLL") { }

bool LinuxSLLAnalyzer::AnalyzePacket(size_t len, const uint8_t* data, Packet* packet)
	{
	auto len_sll_hdr = sizeof(SLLHeader);
	if ( len_sll_hdr >= len )
		{
		Weird("truncated_Linux_SLL_header", packet);
		return false;
		}

	// Note: We assume to see an Ethertype and don't consider different ARPHRD_types
	// (see https://www.tcpdump.org/linktypes/LINKTYPE_LINUX_SLL.html)
	auto hdr = (const SLLHeader*)data;

	uint32_t protocol = ntohs(hdr->protocol_type);
	packet->l2_src = (u_char*)&(hdr->addr);

	// SLL doesn't include a destination address in the header, but not setting l2_dst to something
	// here will cause crashes elsewhere.
	packet->l2_dst = Packet::L2_EMPTY_ADDR;

	return ForwardPacket(len - len_sll_hdr, data + len_sll_hdr, packet, protocol);
	}
