package net.floodlightcontroller.packet; import java.nio.ByteBuffer; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; public class DNSQuery { private String name; private short type = (short)1; private short cls = (short)1; private final int EXTRA = 6; private int length = 0; public byte[] serialize() { length += getName().length(); length += EXTRA; byte[] data = new byte[length]; ByteBuffer bb = ByteBuffer.wrap(data); serializeName(bb); bb.putShort(getType()); bb.putShort(getCls()); return data; } private void serializeName(ByteBuffer bb){ String[] nameParts = getName().split("\\."); for(int i=0; i<nameParts.length; i++){ bb.put((byte)nameParts[i].length()); for(int j=0; j<nameParts[i].length(); j++){ bb.put((byte)nameParts[i].charAt(j)); } } bb.put((byte)0); } public DNSQuery deserialize(ByteBuffer bb){ byte count; StringBuilder sb = new StringBuilder(); while(true){ count = bb.get(); if(count != (short)0){ for(byte i = (byte)0; i<count; i++){ sb.append((char)bb.get()); } sb.append('.'); } else { break; } } sb.deleteCharAt(sb.length()-1); setName(sb.toString()); setType(bb.getShort()); setCls(bb.getShort()); return this; } @Override public int hashCode() { final int prime = 569; int result = 1; result += result * prime + getName().hashCode(); result += result * prime + getType(); result += result * prime + getCls(); return result; } @Override public String toString(){ ObjectMapper mapper = new ObjectMapper(); String result = null; try { result = mapper.writeValueAsString(this); } catch (JsonProcessingException e) { e.printStackTrace(); } return result; } @Override public boolean equals(Object obj) { if (this == obj){ return true; } if (!super.equals(obj)){ return false; } if (!(obj instanceof DNSQuery)){ return false; } DNSQuery other = (DNSQuery) obj; if (!this.getName().equals(other.getName())){ return false; } if (this.getType() != other.getType()){ return false; } if (this.getCls() != other.getCls()){ return false; } return true; } public String getName() { return name; } public DNSQuery setName(String name) { this.name = name; return this; } public short getType() { return type; } public DNSQuery setType(short type) { this.type = type; return this; } public short getCls() { return cls; } public DNSQuery setCls(short cls) { this.cls = cls; return this; } public int getLength() { return getName().length() + EXTRA; } }