package com.netifera.platform.net.packets.decoders; import java.nio.ByteBuffer; import com.netifera.platform.net.packets.IPacketDecoder; import com.netifera.platform.net.packets.IPacketHeader; import com.netifera.platform.net.packets.PacketPayload; import com.netifera.platform.net.packets.link.ARP; import com.netifera.platform.net.packets.link.Ethernet; import com.netifera.platform.util.NetworkConstants; public class EthernetDecoder implements IPacketDecoder { private final static IPDecoder ipDecoder = new IPDecoder(); public IPacketHeader decode(ByteBuffer buffer) { final Ethernet ethernet = new Ethernet(); final ByteBuffer ethernetBuffer = buffer.slice(); if(!ethernet.unpack(ethernetBuffer)) { return new PacketPayload(ethernetBuffer); } ethernet.setNextPacket(decodeNext(ethernet.getNextProtocol(), ethernetBuffer.slice())); return ethernet; } private IPacketHeader decodeNext(int protocol, ByteBuffer buffer) { switch(protocol) { case NetworkConstants.ETHERTYPE_ARP: final IPacketHeader arp = new ARP(); if(arp.unpack(buffer)) { return arp; } return new PacketPayload(buffer); case NetworkConstants.ETHERTYPE_IPv4: return ipDecoder.getIPv4Decoder().decode(buffer); case NetworkConstants.ETHERTYPE_IPv6: return ipDecoder.getIPv6Decoder().decode(buffer); default: return new PacketPayload(buffer); } } }