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.tcpip.ICMPv4; import com.netifera.platform.net.packets.tcpip.IP; import com.netifera.platform.net.packets.tcpip.IPv4; import com.netifera.platform.net.packets.tcpip.TCP; import com.netifera.platform.net.packets.tcpip.UDP; import com.netifera.platform.util.NetworkConstants; class IPv4Decoder extends AbstractIPDecoder { private IPacketDecoder ipv6Decoder; IPv4Decoder() {} void setIPv6Decoder(IPv6Decoder decoder) { ipv6Decoder = decoder; } protected IP createIP() { return new IPv4(); } protected IPacketHeader decodeNext(int protocol, ByteBuffer buffer) { IPacketHeader next = null; switch(protocol) { case NetworkConstants.IPPROTO_ICMP: next = new ICMPv4(); break; case NetworkConstants.IPPROTO_IPIP: /* IPv4 over IPv4 tunnels */ next = new IPv4(); break; case NetworkConstants.IPPROTO_UDP: next = new UDP(); break; case NetworkConstants.IPPROTO_TCP: next = new TCP(); break; case NetworkConstants.IPPROTO_IPV6: /* IPv6 over IPv4 tunnels */ return ipv6Decoder.decode(buffer); } if(next == null || !next.unpack(buffer)) { return new PacketPayload(buffer); } // process encapsulated protocols if (next.getNextProtocol() != -1) { next.setNextPacket(decodeNext(next.getNextProtocol(), buffer.slice())); } return next; } }