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.ICMPv6; import com.netifera.platform.net.packets.tcpip.IP; import com.netifera.platform.net.packets.tcpip.IPv6; import com.netifera.platform.net.packets.tcpip.TCP; import com.netifera.platform.net.packets.tcpip.UDP; import com.netifera.platform.util.NetworkConstants; class IPv6Decoder extends AbstractIPDecoder { private IPacketDecoder ipv4Decoder; /* package private constructor */ IPv6Decoder() {} void setIPv4Decoder(IPv4Decoder decoder) { ipv4Decoder = decoder; } protected IP createIP() { return new IPv6(); } protected IPacketHeader decodeNext(int protocol, ByteBuffer buffer) { IPacketHeader next = null; switch(protocol) { case NetworkConstants.IPPROTO_IP: /* IPv4 over IPv6 tunnels */ return ipv4Decoder.decode(buffer); case NetworkConstants.IPPROTO_IPV6: /* IPv6 over IPv6 tunnels */ next = new IPv6(); break; case NetworkConstants.IPPROTO_ICMPV6: next = new ICMPv6(); break; case NetworkConstants.IPPROTO_UDP: next = new UDP(); break; case NetworkConstants.IPPROTO_TCP: next = new TCP(); break; default: break; } 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; } }