Renamed registry and packet packages

net.onrc.onos.registry.controller.* => net.onrc.onos.core.registry.*
net.onrc.onos.packet => net.onrc.onos.core.packet

Change-Id: I595e325a2c0bab709f248dde5d84ff7b6185cf8b
diff --git a/src/main/java/net/onrc/onos/core/packet/BSN.java b/src/main/java/net/onrc/onos/core/packet/BSN.java
new file mode 100644
index 0000000..fead254
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/packet/BSN.java
@@ -0,0 +1,172 @@
+/**
+*    Copyright 2012, Big Switch Networks, Inc. 
+* 
+*    Licensed under the Apache License, Version 2.0 (the "License"); you may
+*    not use this file except in compliance with the License. You may obtain
+*    a copy of the License at
+*
+*         http://www.apache.org/licenses/LICENSE-2.0
+*
+*    Unless required by applicable law or agreed to in writing, software
+*    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+*    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+*    License for the specific language governing permissions and limitations
+*    under the License.
+**/
+
+/**
+ * 
+ */
+package net.onrc.onos.core.packet;
+
+import java.nio.ByteBuffer;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author Shudong Zhou (shudong.zhou@bigswitch.com)
+ *
+ */
+public class BSN extends BasePacket {
+	public static final int BSN_MAGIC = 0x20000604;
+	public static final short BSN_VERSION_CURRENT = 0x0;
+	public static final short BSN_TYPE_PROBE = 0x1;
+	public static final short BSN_TYPE_BDDP  = 0x2;
+	public static Map<Short, Class<? extends IPacket>> typeClassMap;
+	
+    static {
+        typeClassMap = new HashMap<Short, Class<? extends IPacket>>();
+        typeClassMap.put(BSN_TYPE_PROBE, BSNPROBE.class);
+        typeClassMap.put(BSN_TYPE_BDDP, LLDP.class);
+    }
+
+	protected short type;
+	protected short version;
+
+	public BSN() {
+    	version = BSN_VERSION_CURRENT;
+	}
+	
+    public BSN(short type) {
+    	this.type = type;
+    	version = BSN_VERSION_CURRENT;
+    }
+
+    public short getType() {
+		return type;
+	}
+
+	public BSN setType(short type) {
+		this.type = type;
+		return this;
+	}
+	
+    public short getVersion() {
+		return version;
+	}
+
+	public BSN setVersion(short version) {
+		this.version = version;
+		return this;
+	}
+
+    @Override
+    public byte[] serialize() {
+    	short length = 4 /* magic */ + 2 /* type */ + 2 /* version */;
+    	
+    	byte[] payloadData = null;
+    	if (this.payload != null) {
+            payload.setParent(this);
+            payloadData = payload.serialize();
+            length += payloadData.length;
+        }
+    
+        byte[] data = new byte[length];
+        ByteBuffer bb = ByteBuffer.wrap(data);
+        bb.putInt(BSN_MAGIC);
+        bb.putShort(this.type);
+        bb.putShort(this.version);
+        if (payloadData != null)
+        	bb.put(payloadData);
+
+        if (this.parent != null && this.parent instanceof Ethernet)
+            ((Ethernet)this.parent).setEtherType(Ethernet.TYPE_BSN);
+
+        return data;
+    }
+
+    @Override
+    public IPacket deserialize(byte[] data, int offset, int length) {
+        ByteBuffer bb = ByteBuffer.wrap(data, offset, length);
+        
+        int magic = bb.getInt();
+        if (magic != BSN_MAGIC) {
+        	throw new RuntimeException("Invalid BSN magic " + magic);
+        }
+        
+        this.type = bb.getShort();
+        this.version = bb.getShort();
+        if (this.version != BSN_VERSION_CURRENT) {
+        	throw new RuntimeException(
+        			"Invalid BSN packet version " + this.version + ", should be "
+        	        + BSN_VERSION_CURRENT);
+        }
+        
+        IPacket payload;
+        if (typeClassMap.containsKey(this.type)) {
+            Class<? extends IPacket> clazz = typeClassMap.get(this.type);
+            try {
+                payload = clazz.newInstance();
+            } catch (Exception e) {
+                throw new RuntimeException("Error parsing payload for BSN packet" + e);
+            }
+        } else {
+            payload = new Data();
+        }
+        
+        this.payload = new Data();
+        this.payload = payload.deserialize(data, bb.position(), bb.limit() - bb.position());
+        this.payload.setParent(this);
+        
+        return this;
+    }
+
+    /* (non-Javadoc)
+     * @see java.lang.Object#hashCode()
+     */
+    @Override
+    public int hashCode() {
+        final int prime = 883;
+        int result = super.hashCode();
+        result = prime * result + version;
+        result = prime * result + type;
+        return result;
+    }
+
+    /* (non-Javadoc)
+     * @see java.lang.Object#equals(java.lang.Object)
+     */
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (!super.equals(obj))
+            return false;
+        if (!(obj instanceof BSN))
+            return false;
+        BSN other = (BSN) obj;
+        return (type == other.type &&
+        		version == other.version);
+    }
+    
+    public String toString() {
+    	StringBuffer sb = new StringBuffer("\n");
+    	sb.append("BSN packet");
+        if (typeClassMap.containsKey(this.type))
+        	sb.append(" type: " + typeClassMap.get(this.type).getCanonicalName());
+        else
+        	sb.append(" type: " + this.type);
+        
+    	return sb.toString();
+    }
+}