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/BPDU.java b/src/main/java/net/onrc/onos/core/packet/BPDU.java
new file mode 100644
index 0000000..1dc7296
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/packet/BPDU.java
@@ -0,0 +1,138 @@
+/**
+* Copyright 2011, Big Switch Networks, Inc.
+* Originally created by David Erickson, Stanford University
+*
+* 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;
+
+/**
+ * This class is a Rapid Spanning Tree Protocol
+ * Bridge Protocol Data Unit
+ * @author alexreimers
+ */
+public class BPDU extends BasePacket {
+ public enum BPDUType {
+ CONFIG,
+ TOPOLOGY_CHANGE;
+ }
+
+ private final long destMac = 0x0180c2000000L; // 01-80-c2-00-00-00
+
+ // TODO - check this for RSTP
+ private LLC llcHeader;
+ private short protocolId = 0;
+ private byte version = 0;
+ private byte type;
+ private byte flags;
+ private byte[] rootBridgeId;
+ private int rootPathCost;
+ private byte[] senderBridgeId; // switch cluster MAC
+ private short portId; // port it was transmitted from
+ private short messageAge; // 256ths of a second
+ private short maxAge; // 256ths of a second
+ private short helloTime; // 256ths of a second
+ private short forwardDelay; // 256ths of a second
+
+ public BPDU(BPDUType type) {
+ rootBridgeId = new byte[8];
+ senderBridgeId = new byte[8];
+
+ llcHeader = new LLC();
+ llcHeader.setDsap((byte) 0x42);
+ llcHeader.setSsap((byte) 0x42);
+ llcHeader.setCtrl((byte) 0x03);
+
+ switch(type) {
+ case CONFIG:
+ this.type = 0x0;
+ break;
+ case TOPOLOGY_CHANGE:
+ this.type = (byte) 0x80; // 1000 0000
+ break;
+ default:
+ this.type = 0;
+ break;
+ }
+ }
+
+ @Override
+ public byte[] serialize() {
+ byte[] data;
+ // TODO check these
+ if (type == 0x0) {
+ // config
+ data = new byte[38];
+ } else {
+ // topology change
+ data = new byte[7]; // LLC + TC notification
+ }
+
+ ByteBuffer bb = ByteBuffer.wrap(data);
+ // Serialize the LLC header
+ byte[] llc = llcHeader.serialize();
+ bb.put(llc, 0, llc.length);
+ bb.putShort(protocolId);
+ bb.put(version);
+ bb.put(type);
+
+ if (type == 0x0) {
+ bb.put(flags);
+ bb.put(rootBridgeId, 0, rootBridgeId.length);
+ bb.putInt(rootPathCost);
+ bb.put(senderBridgeId, 0, senderBridgeId.length);
+ bb.putShort(portId);
+ bb.putShort(messageAge);
+ bb.putShort(maxAge);
+ bb.putShort(helloTime);
+ bb.putShort(forwardDelay);
+ }
+
+ return data;
+ }
+
+ @Override
+ public IPacket deserialize(byte[] data, int offset, int length) {
+ ByteBuffer bb = ByteBuffer.wrap(data, offset, length);
+
+ // LLC header
+ llcHeader.deserialize(data, offset, 3);
+
+ this.protocolId = bb.getShort();
+ this.version = bb.get();
+ this.type = bb.get();
+
+ // These fields only exist if it's a configuration BPDU
+ if (this.type == 0x0) {
+ this.flags = bb.get();
+ bb.get(rootBridgeId, 0, 6);
+ this.rootPathCost = bb.getInt();
+ bb.get(this.senderBridgeId, 0, 6);
+ this.portId = bb.getShort();
+ this.messageAge = bb.getShort();
+ this.maxAge = bb.getShort();
+ this.helloTime = bb.getShort();
+ this.forwardDelay = bb.getShort();
+ }
+ // TODO should we set other fields to 0?
+
+ return this;
+ }
+
+ public long getDestMac() {
+ return destMac;
+ }
+}