package de.tu_darmstadt.tk.SmartHomeNetworkSim.core.protocols.packets; import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.Packet; import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.Port; import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.util.ICMPv6Checksum; /** * IcMPv6 Ping Packages * * @see http://www.networksorcery.com/enp/protocol/icmpv6.htm * @see RFC4443 * @author Andreas T. Meyer-Berg */ public class Ping_packet extends Packet { /** * Echo Request type */ public static byte EchoRequest = 0x10; // 128; /** * Echo reply type */ public static byte EchoReply = 0x11; //129; /** * Type of the packet */ private byte type; /** * Code byte */ private byte code = 0x00; /** * Checksum */ private byte[] checksum = new byte[]{0x00,0x00}; /** * Identifier */ private byte[] id = new byte[]{0x00,0x00}; /** * Sequence Number */ private byte[] sequenceNumber = new byte[]{0x00,0x00}; /** * Payload data */ private byte[] data = "abcdefghijklmnopqrstuvwabcdefghi".getBytes(); /* * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Type | Code | Checksum | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Identifier | Sequence Number | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Data ... * +-+-+-+-+- */ /* Failure codes on response * 0 network unreachable * 1 host unreachable * 2 protocol unreachable * 3 port unreachable * 4 fragmentation needed but don‘t fragment bit set * 5 source route failed * 6 destination network unknown * 7 destination host unknown * 8 source host isolated * 9 destination network administratively prohibited * 10 destination host administratively prohibited * 11 network unreachable for requested type of service * 12 host unreachable for requested type of service * 13 communication administratively prohibited by filtering * 14 host precedence violation * 15 precedence cutoff in effect */ /** * Ping package * @param timestamp time the package was sent * @param source source of the package * @param destination destination of the package * @param type type, should be EchoRequest, EchoReply * @param identifier number in the sequence, specified by sender * @param sequenceNumber number in the sequence, specified by sender */ public Ping_packet(long timestamp, Port source, Port destination, byte type, short identifier, short sequenceNumber) { super(timestamp, source, destination); this.type = type; this.id = new byte[2]; id[0] = (byte)(identifier & 0xff); id[1] = (byte)((identifier>>8) & 0xff); this.sequenceNumber[0] = (byte)(sequenceNumber & 0xff); this.sequenceNumber[1] = (byte)((sequenceNumber >> 8) & 0xff); } /** * Ping package without identifier * @param timestamp time the package was sent * @param source source of the package * @param destination destination of the package * @param type type, should be EchoRequest, EchoReply * @param sequenceNumber number in the sequence, specified by sender */ public Ping_packet(long timestamp, Port source, Port destination, byte type, short sequenceNumber) { super(timestamp, source, destination); this.type = type; this.id = new byte[]{0x00, 0x00}; this.sequenceNumber[0] = (byte)(sequenceNumber & 0xff); this.sequenceNumber[1] = (byte)((sequenceNumber >> 8) & 0xff); } @Override public byte[] dumpBytes() { byte[] bytes = new byte[8+data.length]; //Checksum cleared for calculation byte[] header = new byte[]{type,code,0x00,0x00,id[0],id[1],sequenceNumber[0],sequenceNumber[1]}; int i; for(i = 0; i < 8; i++) bytes[i] = header[i]; for(int j=0;j>8 & 0xff); bytes[2] = checksum[0]; bytes[3] = checksum[1]; return bytes; } @Override public String getTextualRepresentation() { return "[Ping: "+getType()+"; time:"+timestamp+"; source:"+source.getOwner().getName()+":"+source.getPortNumber()+"; destination:"+destination.getOwner().getName()+":"+destination.getPortNumber()+"; Payload: "+getPayload()+"]"; } @Override public String getPayload() { return new String(data); } /** * Type as String * * @return String representation of the Type */ private String getType(){ if(type == EchoRequest) return "EchoRequest"; if(type == EchoReply) return "EchoReply"; return "unknown"; } /** * Create package and checksum * @param args unused */ public static void main(String[] args) { Ping_packet pinPacket = new Ping_packet(1000, null, null, EchoRequest, (short) 12); byte[] bytes = pinPacket.dumpBytes(); for(int i = 0; i