alshabib

lldp discovery independent of OF

Change-Id: I720f727f6628e30e5d732e6d7bf742d1b7050812
Showing 42 changed files with 966 additions and 91 deletions
...@@ -90,11 +90,15 @@ public class IntentPushTestCommand extends AbstractShellCommand ...@@ -90,11 +90,15 @@ public class IntentPushTestCommand extends AbstractShellCommand
90 service.submit(intent); 90 service.submit(intent);
91 } 91 }
92 try { 92 try {
93 - latch.await(5, TimeUnit.SECONDS); 93 + if (latch.await(10, TimeUnit.SECONDS)) {
94 printResults(count); 94 printResults(count);
95 + } else {
96 + print("I FAIL MISERABLY -> %d", latch.getCount());
97 + }
95 } catch (InterruptedException e) { 98 } catch (InterruptedException e) {
96 print(e.toString()); 99 print(e.toString());
97 } 100 }
101 +
98 service.removeListener(this); 102 service.removeListener(this);
99 } 103 }
100 104
...@@ -140,6 +144,8 @@ public class IntentPushTestCommand extends AbstractShellCommand ...@@ -140,6 +144,8 @@ public class IntentPushTestCommand extends AbstractShellCommand
140 } else { 144 } else {
141 log.warn("install event latch is null"); 145 log.warn("install event latch is null");
142 } 146 }
147 + } else {
148 + log.info("I FAIL -> {}", event);
143 } 149 }
144 } 150 }
145 } 151 }
......
1 package org.onlab.onos.net; 1 package org.onlab.onos.net;
2 2
3 import org.onlab.onos.net.provider.ProviderId; 3 import org.onlab.onos.net.provider.ProviderId;
4 +import org.onlab.packet.ChassisId;
4 5
5 import java.util.Objects; 6 import java.util.Objects;
6 7
...@@ -16,6 +17,7 @@ public class DefaultDevice extends AbstractElement implements Device { ...@@ -16,6 +17,7 @@ public class DefaultDevice extends AbstractElement implements Device {
16 private final String serialNumber; 17 private final String serialNumber;
17 private final String hwVersion; 18 private final String hwVersion;
18 private final String swVersion; 19 private final String swVersion;
20 + private final ChassisId chassisId;
19 21
20 // For serialization 22 // For serialization
21 private DefaultDevice() { 23 private DefaultDevice() {
...@@ -24,6 +26,7 @@ public class DefaultDevice extends AbstractElement implements Device { ...@@ -24,6 +26,7 @@ public class DefaultDevice extends AbstractElement implements Device {
24 this.hwVersion = null; 26 this.hwVersion = null;
25 this.swVersion = null; 27 this.swVersion = null;
26 this.serialNumber = null; 28 this.serialNumber = null;
29 + this.chassisId = null;
27 } 30 }
28 31
29 /** 32 /**
...@@ -40,13 +43,15 @@ public class DefaultDevice extends AbstractElement implements Device { ...@@ -40,13 +43,15 @@ public class DefaultDevice extends AbstractElement implements Device {
40 */ 43 */
41 public DefaultDevice(ProviderId providerId, DeviceId id, Type type, 44 public DefaultDevice(ProviderId providerId, DeviceId id, Type type,
42 String manufacturer, String hwVersion, String swVersion, 45 String manufacturer, String hwVersion, String swVersion,
43 - String serialNumber, Annotations... annotations) { 46 + String serialNumber, ChassisId chassisId,
47 + Annotations... annotations) {
44 super(providerId, id, annotations); 48 super(providerId, id, annotations);
45 this.type = type; 49 this.type = type;
46 this.manufacturer = manufacturer; 50 this.manufacturer = manufacturer;
47 this.hwVersion = hwVersion; 51 this.hwVersion = hwVersion;
48 this.swVersion = swVersion; 52 this.swVersion = swVersion;
49 this.serialNumber = serialNumber; 53 this.serialNumber = serialNumber;
54 + this.chassisId = chassisId;
50 } 55 }
51 56
52 @Override 57 @Override
...@@ -80,6 +85,11 @@ public class DefaultDevice extends AbstractElement implements Device { ...@@ -80,6 +85,11 @@ public class DefaultDevice extends AbstractElement implements Device {
80 } 85 }
81 86
82 @Override 87 @Override
88 + public ChassisId chassisId() {
89 + return chassisId;
90 + }
91 +
92 + @Override
83 public int hashCode() { 93 public int hashCode() {
84 return Objects.hash(id, type, manufacturer, hwVersion, swVersion, serialNumber); 94 return Objects.hash(id, type, manufacturer, hwVersion, swVersion, serialNumber);
85 } 95 }
......
1 package org.onlab.onos.net; 1 package org.onlab.onos.net;
2 2
3 +import org.onlab.packet.ChassisId;
4 +
3 /** 5 /**
4 * Representation of a network infrastructure device. 6 * Representation of a network infrastructure device.
5 */ 7 */
...@@ -54,6 +56,13 @@ public interface Device extends Element { ...@@ -54,6 +56,13 @@ public interface Device extends Element {
54 */ 56 */
55 String serialNumber(); 57 String serialNumber();
56 58
59 + /**
60 + * Returns the device chassis id.
61 + *
62 + * @return chassis id
63 + */
64 + ChassisId chassisId();
65 +
57 // Device realizedBy(); ? 66 // Device realizedBy(); ?
58 67
59 // ports are not provided directly, but rather via DeviceService.getPorts(Device device); 68 // ports are not provided directly, but rather via DeviceService.getPorts(Device device);
......
...@@ -2,6 +2,7 @@ package org.onlab.onos.net.device; ...@@ -2,6 +2,7 @@ package org.onlab.onos.net.device;
2 2
3 import org.onlab.onos.net.AbstractDescription; 3 import org.onlab.onos.net.AbstractDescription;
4 import org.onlab.onos.net.SparseAnnotations; 4 import org.onlab.onos.net.SparseAnnotations;
5 +import org.onlab.packet.ChassisId;
5 6
6 import java.net.URI; 7 import java.net.URI;
7 8
...@@ -20,6 +21,7 @@ public class DefaultDeviceDescription extends AbstractDescription ...@@ -20,6 +21,7 @@ public class DefaultDeviceDescription extends AbstractDescription
20 private final String hwVersion; 21 private final String hwVersion;
21 private final String swVersion; 22 private final String swVersion;
22 private final String serialNumber; 23 private final String serialNumber;
24 + private final ChassisId chassisId;
23 25
24 /** 26 /**
25 * Creates a device description using the supplied information. 27 * Creates a device description using the supplied information.
...@@ -34,7 +36,7 @@ public class DefaultDeviceDescription extends AbstractDescription ...@@ -34,7 +36,7 @@ public class DefaultDeviceDescription extends AbstractDescription
34 */ 36 */
35 public DefaultDeviceDescription(URI uri, Type type, String manufacturer, 37 public DefaultDeviceDescription(URI uri, Type type, String manufacturer,
36 String hwVersion, String swVersion, 38 String hwVersion, String swVersion,
37 - String serialNumber, 39 + String serialNumber, ChassisId chassis,
38 SparseAnnotations... annotations) { 40 SparseAnnotations... annotations) {
39 super(annotations); 41 super(annotations);
40 this.uri = checkNotNull(uri, "Device URI cannot be null"); 42 this.uri = checkNotNull(uri, "Device URI cannot be null");
...@@ -43,6 +45,7 @@ public class DefaultDeviceDescription extends AbstractDescription ...@@ -43,6 +45,7 @@ public class DefaultDeviceDescription extends AbstractDescription
43 this.hwVersion = hwVersion; 45 this.hwVersion = hwVersion;
44 this.swVersion = swVersion; 46 this.swVersion = swVersion;
45 this.serialNumber = serialNumber; 47 this.serialNumber = serialNumber;
48 + this.chassisId = chassis;
46 } 49 }
47 50
48 /** 51 /**
...@@ -54,7 +57,7 @@ public class DefaultDeviceDescription extends AbstractDescription ...@@ -54,7 +57,7 @@ public class DefaultDeviceDescription extends AbstractDescription
54 SparseAnnotations... annotations) { 57 SparseAnnotations... annotations) {
55 this(base.deviceURI(), base.type(), base.manufacturer(), 58 this(base.deviceURI(), base.type(), base.manufacturer(),
56 base.hwVersion(), base.swVersion(), base.serialNumber(), 59 base.hwVersion(), base.swVersion(), base.serialNumber(),
57 - annotations); 60 + base.chassisId(), annotations);
58 } 61 }
59 62
60 @Override 63 @Override
...@@ -88,6 +91,11 @@ public class DefaultDeviceDescription extends AbstractDescription ...@@ -88,6 +91,11 @@ public class DefaultDeviceDescription extends AbstractDescription
88 } 91 }
89 92
90 @Override 93 @Override
94 + public ChassisId chassisId() {
95 + return chassisId;
96 + }
97 +
98 + @Override
91 public String toString() { 99 public String toString() {
92 return toStringHelper(this) 100 return toStringHelper(this)
93 .add("uri", uri).add("type", type).add("mfr", manufacturer) 101 .add("uri", uri).add("type", type).add("mfr", manufacturer)
...@@ -104,5 +112,6 @@ public class DefaultDeviceDescription extends AbstractDescription ...@@ -104,5 +112,6 @@ public class DefaultDeviceDescription extends AbstractDescription
104 this.hwVersion = null; 112 this.hwVersion = null;
105 this.swVersion = null; 113 this.swVersion = null;
106 this.serialNumber = null; 114 this.serialNumber = null;
115 + this.chassisId = null;
107 } 116 }
108 } 117 }
......
...@@ -2,6 +2,7 @@ package org.onlab.onos.net.device; ...@@ -2,6 +2,7 @@ package org.onlab.onos.net.device;
2 2
3 import org.onlab.onos.net.Description; 3 import org.onlab.onos.net.Description;
4 import org.onlab.onos.net.Device; 4 import org.onlab.onos.net.Device;
5 +import org.onlab.packet.ChassisId;
5 6
6 import java.net.URI; 7 import java.net.URI;
7 8
...@@ -54,4 +55,11 @@ public interface DeviceDescription extends Description { ...@@ -54,4 +55,11 @@ public interface DeviceDescription extends Description {
54 */ 55 */
55 String serialNumber(); 56 String serialNumber();
56 57
58 + /**
59 + * Returns a device chassis id.
60 + *
61 + * @return chassis id
62 + */
63 + ChassisId chassisId();
64 +
57 } 65 }
......
...@@ -3,6 +3,7 @@ package org.onlab.onos.net; ...@@ -3,6 +3,7 @@ package org.onlab.onos.net;
3 import com.google.common.testing.EqualsTester; 3 import com.google.common.testing.EqualsTester;
4 import org.junit.Test; 4 import org.junit.Test;
5 import org.onlab.onos.net.provider.ProviderId; 5 import org.onlab.onos.net.provider.ProviderId;
6 +import org.onlab.packet.ChassisId;
6 7
7 import static org.junit.Assert.assertEquals; 8 import static org.junit.Assert.assertEquals;
8 import static org.onlab.onos.net.Device.Type.SWITCH; 9 import static org.onlab.onos.net.Device.Type.SWITCH;
...@@ -21,14 +22,15 @@ public class DefaultDeviceTest { ...@@ -21,14 +22,15 @@ public class DefaultDeviceTest {
21 static final String SW = "3.9.1"; 22 static final String SW = "3.9.1";
22 static final String SN1 = "43311-12345"; 23 static final String SN1 = "43311-12345";
23 static final String SN2 = "42346-43512"; 24 static final String SN2 = "42346-43512";
25 + static final ChassisId CID = new ChassisId();
24 26
25 @Test 27 @Test
26 public void testEquality() { 28 public void testEquality() {
27 - Device d1 = new DefaultDevice(PID, DID1, SWITCH, MFR, HW, SW, SN1); 29 + Device d1 = new DefaultDevice(PID, DID1, SWITCH, MFR, HW, SW, SN1, CID);
28 - Device d2 = new DefaultDevice(PID, DID1, SWITCH, MFR, HW, SW, SN1); 30 + Device d2 = new DefaultDevice(PID, DID1, SWITCH, MFR, HW, SW, SN1, CID);
29 - Device d3 = new DefaultDevice(PID, DID2, SWITCH, MFR, HW, SW, SN2); 31 + Device d3 = new DefaultDevice(PID, DID2, SWITCH, MFR, HW, SW, SN2, CID);
30 - Device d4 = new DefaultDevice(PID, DID2, SWITCH, MFR, HW, SW, SN2); 32 + Device d4 = new DefaultDevice(PID, DID2, SWITCH, MFR, HW, SW, SN2, CID);
31 - Device d5 = new DefaultDevice(PID, DID2, SWITCH, MFR, HW, SW, SN1); 33 + Device d5 = new DefaultDevice(PID, DID2, SWITCH, MFR, HW, SW, SN1, CID);
32 34
33 new EqualsTester().addEqualityGroup(d1, d2) 35 new EqualsTester().addEqualityGroup(d1, d2)
34 .addEqualityGroup(d3, d4) 36 .addEqualityGroup(d3, d4)
...@@ -38,13 +40,13 @@ public class DefaultDeviceTest { ...@@ -38,13 +40,13 @@ public class DefaultDeviceTest {
38 40
39 @Test 41 @Test
40 public void basics() { 42 public void basics() {
41 - Device device = new DefaultDevice(PID, DID1, SWITCH, MFR, HW, SW, SN1); 43 + Device device = new DefaultDevice(PID, DID1, SWITCH, MFR, HW, SW, SN1, CID);
42 validate(device); 44 validate(device);
43 } 45 }
44 46
45 @Test 47 @Test
46 public void annotations() { 48 public void annotations() {
47 - Device device = new DefaultDevice(PID, DID1, SWITCH, MFR, HW, SW, SN1, 49 + Device device = new DefaultDevice(PID, DID1, SWITCH, MFR, HW, SW, SN1, CID,
48 DefaultAnnotations.builder().set("foo", "bar").build()); 50 DefaultAnnotations.builder().set("foo", "bar").build());
49 validate(device); 51 validate(device);
50 assertEquals("incorrect provider", "bar", device.annotations().value("foo")); 52 assertEquals("incorrect provider", "bar", device.annotations().value("foo"));
......
...@@ -3,6 +3,7 @@ package org.onlab.onos.net; ...@@ -3,6 +3,7 @@ package org.onlab.onos.net;
3 import com.google.common.testing.EqualsTester; 3 import com.google.common.testing.EqualsTester;
4 import org.junit.Test; 4 import org.junit.Test;
5 import org.onlab.onos.net.provider.ProviderId; 5 import org.onlab.onos.net.provider.ProviderId;
6 +import org.onlab.packet.ChassisId;
6 7
7 import static org.junit.Assert.assertEquals; 8 import static org.junit.Assert.assertEquals;
8 import static org.onlab.onos.net.Device.Type.SWITCH; 9 import static org.onlab.onos.net.Device.Type.SWITCH;
...@@ -22,7 +23,8 @@ public class DefaultPortTest { ...@@ -22,7 +23,8 @@ public class DefaultPortTest {
22 23
23 @Test 24 @Test
24 public void testEquality() { 25 public void testEquality() {
25 - Device device = new DefaultDevice(PID, DID1, SWITCH, "m", "h", "s", "n"); 26 + Device device = new DefaultDevice(PID, DID1, SWITCH, "m", "h", "s", "n",
27 + new ChassisId());
26 Port p1 = new DefaultPort(device, portNumber(1), true); 28 Port p1 = new DefaultPort(device, portNumber(1), true);
27 Port p2 = new DefaultPort(device, portNumber(1), true); 29 Port p2 = new DefaultPort(device, portNumber(1), true);
28 Port p3 = new DefaultPort(device, portNumber(2), true); 30 Port p3 = new DefaultPort(device, portNumber(2), true);
...@@ -37,7 +39,8 @@ public class DefaultPortTest { ...@@ -37,7 +39,8 @@ public class DefaultPortTest {
37 39
38 @Test 40 @Test
39 public void basics() { 41 public void basics() {
40 - Device device = new DefaultDevice(PID, DID1, SWITCH, "m", "h", "s", "n"); 42 + Device device = new DefaultDevice(PID, DID1, SWITCH, "m", "h", "s", "n",
43 + new ChassisId());
41 Port port = new DefaultPort(device, portNumber(1), true); 44 Port port = new DefaultPort(device, portNumber(1), true);
42 assertEquals("incorrect element", device, port.element()); 45 assertEquals("incorrect element", device, port.element());
43 assertEquals("incorrect number", portNumber(1), port.number()); 46 assertEquals("incorrect number", portNumber(1), port.number());
......
1 package org.onlab.onos.net; 1 package org.onlab.onos.net;
2 2
3 import org.onlab.onos.net.provider.ProviderId; 3 import org.onlab.onos.net.provider.ProviderId;
4 +import org.onlab.packet.ChassisId;
4 import org.onlab.packet.IpPrefix; 5 import org.onlab.packet.IpPrefix;
5 6
6 import java.util.ArrayList; 7 import java.util.ArrayList;
...@@ -37,7 +38,7 @@ public final class NetTestTools { ...@@ -37,7 +38,7 @@ public final class NetTestTools {
37 // Crates a new device with the specified id 38 // Crates a new device with the specified id
38 public static Device device(String id) { 39 public static Device device(String id) {
39 return new DefaultDevice(PID, did(id), Device.Type.SWITCH, 40 return new DefaultDevice(PID, did(id), Device.Type.SWITCH,
40 - "mfg", "1.0", "1.1", "1234"); 41 + "mfg", "1.0", "1.1", "1234", new ChassisId());
41 } 42 }
42 43
43 // Crates a new host with the specified id 44 // Crates a new host with the specified id
......
1 package org.onlab.onos.net.device; 1 package org.onlab.onos.net.device;
2 2
3 import org.junit.Test; 3 import org.junit.Test;
4 +import org.onlab.packet.ChassisId;
4 5
5 import java.net.URI; 6 import java.net.URI;
6 7
...@@ -18,12 +19,13 @@ public class DefaultDeviceDescriptionTest { ...@@ -18,12 +19,13 @@ public class DefaultDeviceDescriptionTest {
18 private static final String HW = "1.1.x"; 19 private static final String HW = "1.1.x";
19 private static final String SW = "3.9.1"; 20 private static final String SW = "3.9.1";
20 private static final String SN = "43311-12345"; 21 private static final String SN = "43311-12345";
22 + private static final ChassisId CID = new ChassisId();
21 23
22 24
23 @Test 25 @Test
24 public void basics() { 26 public void basics() {
25 DeviceDescription device = 27 DeviceDescription device =
26 - new DefaultDeviceDescription(DURI, SWITCH, MFR, HW, SW, SN); 28 + new DefaultDeviceDescription(DURI, SWITCH, MFR, HW, SW, SN, CID);
27 assertEquals("incorrect uri", DURI, device.deviceURI()); 29 assertEquals("incorrect uri", DURI, device.deviceURI());
28 assertEquals("incorrect type", SWITCH, device.type()); 30 assertEquals("incorrect type", SWITCH, device.type());
29 assertEquals("incorrect manufacturer", MFR, device.manufacturer()); 31 assertEquals("incorrect manufacturer", MFR, device.manufacturer());
...@@ -31,6 +33,7 @@ public class DefaultDeviceDescriptionTest { ...@@ -31,6 +33,7 @@ public class DefaultDeviceDescriptionTest {
31 assertEquals("incorrect sw", SW, device.swVersion()); 33 assertEquals("incorrect sw", SW, device.swVersion());
32 assertEquals("incorrect serial", SN, device.serialNumber()); 34 assertEquals("incorrect serial", SN, device.serialNumber());
33 assertTrue("incorrect toString", device.toString().contains("uri=of:foo")); 35 assertTrue("incorrect toString", device.toString().contains("uri=of:foo"));
36 + assertTrue("Incorrect chassis", device.chassisId().value() == 0);
34 } 37 }
35 38
36 } 39 }
......
...@@ -11,6 +11,7 @@ import org.onlab.onos.net.Device; ...@@ -11,6 +11,7 @@ import org.onlab.onos.net.Device;
11 import org.onlab.onos.net.Port; 11 import org.onlab.onos.net.Port;
12 import org.onlab.onos.net.PortNumber; 12 import org.onlab.onos.net.PortNumber;
13 import org.onlab.onos.net.provider.ProviderId; 13 import org.onlab.onos.net.provider.ProviderId;
14 +import org.onlab.packet.ChassisId;
14 15
15 /** 16 /**
16 * Tests of the device event. 17 * Tests of the device event.
...@@ -19,7 +20,7 @@ public class DeviceEventTest extends AbstractEventTest { ...@@ -19,7 +20,7 @@ public class DeviceEventTest extends AbstractEventTest {
19 20
20 private Device createDevice() { 21 private Device createDevice() {
21 return new DefaultDevice(new ProviderId("of", "foo"), deviceId("of:foo"), 22 return new DefaultDevice(new ProviderId("of", "foo"), deviceId("of:foo"),
22 - Device.Type.SWITCH, "box", "hw", "sw", "sn"); 23 + Device.Type.SWITCH, "box", "hw", "sw", "sn", new ChassisId());
23 } 24 }
24 25
25 @Override 26 @Override
......
...@@ -18,9 +18,9 @@ public class DefaultGraphDescriptionTest { ...@@ -18,9 +18,9 @@ public class DefaultGraphDescriptionTest {
18 18
19 private static final DeviceId D3 = deviceId("3"); 19 private static final DeviceId D3 = deviceId("3");
20 20
21 - static final Device DEV1 = new DefaultDevice(PID, D1, SWITCH, "", "", "", ""); 21 + static final Device DEV1 = new DefaultDevice(PID, D1, SWITCH, "", "", "", "", null);
22 - static final Device DEV2 = new DefaultDevice(PID, D2, SWITCH, "", "", "", ""); 22 + static final Device DEV2 = new DefaultDevice(PID, D2, SWITCH, "", "", "", "", null);
23 - static final Device DEV3 = new DefaultDevice(PID, D3, SWITCH, "", "", "", ""); 23 + static final Device DEV3 = new DefaultDevice(PID, D3, SWITCH, "", "", "", "", null);
24 24
25 @Test 25 @Test
26 public void basics() { 26 public void basics() {
......
...@@ -346,7 +346,7 @@ public class DeviceManager ...@@ -346,7 +346,7 @@ public class DeviceManager
346 new DefaultDeviceDescription( 346 new DefaultDeviceDescription(
347 did.uri(), device.type(), device.manufacturer(), 347 did.uri(), device.type(), device.manufacturer(),
348 device.hwVersion(), device.swVersion(), 348 device.hwVersion(), device.swVersion(),
349 - device.serialNumber())); 349 + device.serialNumber(), device.chassisId()));
350 } 350 }
351 351
352 applyRole(did, MastershipRole.MASTER); 352 applyRole(did, MastershipRole.MASTER);
......
...@@ -96,7 +96,7 @@ public class PathIntentInstaller implements IntentInstaller<PathIntent> { ...@@ -96,7 +96,7 @@ public class PathIntentInstaller implements IntentInstaller<PathIntent> {
96 96
97 FlowRule rule = new DefaultFlowRule(link.src().deviceId(), 97 FlowRule rule = new DefaultFlowRule(link.src().deviceId(),
98 builder.build(), treatment, 98 builder.build(), treatment,
99 - 123, appId, 600); 99 + 123, appId, 15);
100 rules.add(new FlowRuleBatchEntry(FlowRuleOperation.ADD, rule)); 100 rules.add(new FlowRuleBatchEntry(FlowRuleOperation.ADD, rule));
101 prev = link.dst(); 101 prev = link.dst();
102 } 102 }
......
...@@ -37,6 +37,7 @@ import org.onlab.onos.net.device.PortDescription; ...@@ -37,6 +37,7 @@ import org.onlab.onos.net.device.PortDescription;
37 import org.onlab.onos.net.provider.AbstractProvider; 37 import org.onlab.onos.net.provider.AbstractProvider;
38 import org.onlab.onos.net.provider.ProviderId; 38 import org.onlab.onos.net.provider.ProviderId;
39 import org.onlab.onos.store.trivial.impl.SimpleDeviceStore; 39 import org.onlab.onos.store.trivial.impl.SimpleDeviceStore;
40 +import org.onlab.packet.ChassisId;
40 import org.onlab.packet.IpPrefix; 41 import org.onlab.packet.IpPrefix;
41 42
42 import java.util.ArrayList; 43 import java.util.ArrayList;
...@@ -62,6 +63,7 @@ public class DeviceManagerTest { ...@@ -62,6 +63,7 @@ public class DeviceManagerTest {
62 private static final String SW1 = "3.8.1"; 63 private static final String SW1 = "3.8.1";
63 private static final String SW2 = "3.9.5"; 64 private static final String SW2 = "3.9.5";
64 private static final String SN = "43311-12345"; 65 private static final String SN = "43311-12345";
66 + private static final ChassisId CID = new ChassisId();
65 67
66 private static final PortNumber P1 = PortNumber.portNumber(1); 68 private static final PortNumber P1 = PortNumber.portNumber(1);
67 private static final PortNumber P2 = PortNumber.portNumber(2); 69 private static final PortNumber P2 = PortNumber.portNumber(2);
...@@ -111,7 +113,7 @@ public class DeviceManagerTest { ...@@ -111,7 +113,7 @@ public class DeviceManagerTest {
111 private void connectDevice(DeviceId deviceId, String swVersion) { 113 private void connectDevice(DeviceId deviceId, String swVersion) {
112 DeviceDescription description = 114 DeviceDescription description =
113 new DefaultDeviceDescription(deviceId.uri(), SWITCH, MFR, 115 new DefaultDeviceDescription(deviceId.uri(), SWITCH, MFR,
114 - HW, swVersion, SN); 116 + HW, swVersion, SN, CID);
115 providerService.deviceConnected(deviceId, description); 117 providerService.deviceConnected(deviceId, description);
116 assertNotNull("device should be found", service.getDevice(DID1)); 118 assertNotNull("device should be found", service.getDevice(DID1));
117 } 119 }
......
...@@ -68,7 +68,7 @@ public class FlowRuleManagerTest { ...@@ -68,7 +68,7 @@ public class FlowRuleManagerTest {
68 private static final DeviceId DID = DeviceId.deviceId("of:001"); 68 private static final DeviceId DID = DeviceId.deviceId("of:001");
69 private static final int TIMEOUT = 10; 69 private static final int TIMEOUT = 10;
70 private static final Device DEV = new DefaultDevice( 70 private static final Device DEV = new DefaultDevice(
71 - PID, DID, Type.SWITCH, "", "", "", ""); 71 + PID, DID, Type.SWITCH, "", "", "", "", null);
72 72
73 private FlowRuleManager mgr; 73 private FlowRuleManager mgr;
74 74
...@@ -407,7 +407,6 @@ public class FlowRuleManagerTest { ...@@ -407,7 +407,6 @@ public class FlowRuleManagerTest {
407 FlowEntryState.PENDING_ADD)); 407 FlowEntryState.PENDING_ADD));
408 408
409 409
410 -
411 } 410 }
412 411
413 412
......
...@@ -41,6 +41,7 @@ import org.onlab.onos.store.cluster.messaging.MessageSubject; ...@@ -41,6 +41,7 @@ import org.onlab.onos.store.cluster.messaging.MessageSubject;
41 import org.onlab.onos.store.common.impl.Timestamped; 41 import org.onlab.onos.store.common.impl.Timestamped;
42 import org.onlab.onos.store.serializers.KryoSerializer; 42 import org.onlab.onos.store.serializers.KryoSerializer;
43 import org.onlab.onos.store.serializers.DistributedStoreSerializers; 43 import org.onlab.onos.store.serializers.DistributedStoreSerializers;
44 +import org.onlab.packet.ChassisId;
44 import org.onlab.util.KryoPool; 45 import org.onlab.util.KryoPool;
45 import org.onlab.util.NewConcurrentHashMap; 46 import org.onlab.util.NewConcurrentHashMap;
46 import org.slf4j.Logger; 47 import org.slf4j.Logger;
...@@ -745,6 +746,7 @@ public class GossipDeviceStore ...@@ -745,6 +746,7 @@ public class GossipDeviceStore
745 String hwVersion = base.hwVersion(); 746 String hwVersion = base.hwVersion();
746 String swVersion = base.swVersion(); 747 String swVersion = base.swVersion();
747 String serialNumber = base.serialNumber(); 748 String serialNumber = base.serialNumber();
749 + ChassisId chassisId = base.chassisId();
748 DefaultAnnotations annotations = DefaultAnnotations.builder().build(); 750 DefaultAnnotations annotations = DefaultAnnotations.builder().build();
749 annotations = merge(annotations, base.annotations()); 751 annotations = merge(annotations, base.annotations());
750 752
...@@ -762,7 +764,8 @@ public class GossipDeviceStore ...@@ -762,7 +764,8 @@ public class GossipDeviceStore
762 } 764 }
763 765
764 return new DefaultDevice(primary, deviceId , type, manufacturer, 766 return new DefaultDevice(primary, deviceId , type, manufacturer,
765 - hwVersion, swVersion, serialNumber, annotations); 767 + hwVersion, swVersion, serialNumber,
768 + chassisId, annotations);
766 } 769 }
767 770
768 /** 771 /**
......
...@@ -53,6 +53,7 @@ import org.onlab.onos.store.cluster.messaging.ClusterCommunicationService; ...@@ -53,6 +53,7 @@ import org.onlab.onos.store.cluster.messaging.ClusterCommunicationService;
53 import org.onlab.onos.store.cluster.messaging.ClusterMessage; 53 import org.onlab.onos.store.cluster.messaging.ClusterMessage;
54 import org.onlab.onos.store.cluster.messaging.ClusterMessageHandler; 54 import org.onlab.onos.store.cluster.messaging.ClusterMessageHandler;
55 import org.onlab.onos.store.cluster.messaging.MessageSubject; 55 import org.onlab.onos.store.cluster.messaging.MessageSubject;
56 +import org.onlab.packet.ChassisId;
56 import org.onlab.packet.IpPrefix; 57 import org.onlab.packet.IpPrefix;
57 58
58 import com.google.common.collect.Iterables; 59 import com.google.common.collect.Iterables;
...@@ -74,6 +75,7 @@ public class GossipDeviceStoreTest { ...@@ -74,6 +75,7 @@ public class GossipDeviceStoreTest {
74 private static final String SW1 = "3.8.1"; 75 private static final String SW1 = "3.8.1";
75 private static final String SW2 = "3.9.5"; 76 private static final String SW2 = "3.9.5";
76 private static final String SN = "43311-12345"; 77 private static final String SN = "43311-12345";
78 + private static final ChassisId CID = new ChassisId();
77 79
78 private static final PortNumber P1 = PortNumber.portNumber(1); 80 private static final PortNumber P1 = PortNumber.portNumber(1);
79 private static final PortNumber P2 = PortNumber.portNumber(2); 81 private static final PortNumber P2 = PortNumber.portNumber(2);
...@@ -158,7 +160,7 @@ public class GossipDeviceStoreTest { ...@@ -158,7 +160,7 @@ public class GossipDeviceStoreTest {
158 SparseAnnotations... annotations) { 160 SparseAnnotations... annotations) {
159 DeviceDescription description = 161 DeviceDescription description =
160 new DefaultDeviceDescription(deviceId.uri(), SWITCH, MFR, 162 new DefaultDeviceDescription(deviceId.uri(), SWITCH, MFR,
161 - HW, swVersion, SN, annotations); 163 + HW, swVersion, SN, CID, annotations);
162 reset(clusterCommunicator); 164 reset(clusterCommunicator);
163 try { 165 try {
164 expect(clusterCommunicator.broadcast(anyObject(ClusterMessage.class))) 166 expect(clusterCommunicator.broadcast(anyObject(ClusterMessage.class)))
...@@ -175,7 +177,7 @@ public class GossipDeviceStoreTest { ...@@ -175,7 +177,7 @@ public class GossipDeviceStoreTest {
175 SparseAnnotations... annotations) { 177 SparseAnnotations... annotations) {
176 DeviceDescription description = 178 DeviceDescription description =
177 new DefaultDeviceDescription(deviceId.uri(), SWITCH, MFR, 179 new DefaultDeviceDescription(deviceId.uri(), SWITCH, MFR,
178 - HW, swVersion, SN, annotations); 180 + HW, swVersion, SN, CID, annotations);
179 deviceStore.createOrUpdateDevice(PIDA, deviceId, description); 181 deviceStore.createOrUpdateDevice(PIDA, deviceId, description);
180 } 182 }
181 183
...@@ -315,7 +317,7 @@ public class GossipDeviceStoreTest { ...@@ -315,7 +317,7 @@ public class GossipDeviceStoreTest {
315 public final void testCreateOrUpdateDevice() throws IOException { 317 public final void testCreateOrUpdateDevice() throws IOException {
316 DeviceDescription description = 318 DeviceDescription description =
317 new DefaultDeviceDescription(DID1.uri(), SWITCH, MFR, 319 new DefaultDeviceDescription(DID1.uri(), SWITCH, MFR,
318 - HW, SW1, SN); 320 + HW, SW1, SN, CID);
319 Capture<ClusterMessage> bcast = new Capture<>(); 321 Capture<ClusterMessage> bcast = new Capture<>();
320 322
321 resetCommunicatorExpectingSingleBroadcast(bcast); 323 resetCommunicatorExpectingSingleBroadcast(bcast);
...@@ -328,7 +330,7 @@ public class GossipDeviceStoreTest { ...@@ -328,7 +330,7 @@ public class GossipDeviceStoreTest {
328 330
329 DeviceDescription description2 = 331 DeviceDescription description2 =
330 new DefaultDeviceDescription(DID1.uri(), SWITCH, MFR, 332 new DefaultDeviceDescription(DID1.uri(), SWITCH, MFR,
331 - HW, SW2, SN); 333 + HW, SW2, SN, CID);
332 resetCommunicatorExpectingSingleBroadcast(bcast); 334 resetCommunicatorExpectingSingleBroadcast(bcast);
333 DeviceEvent event2 = deviceStore.createOrUpdateDevice(PID, DID1, description2); 335 DeviceEvent event2 = deviceStore.createOrUpdateDevice(PID, DID1, description2);
334 assertEquals(DEVICE_UPDATED, event2.type()); 336 assertEquals(DEVICE_UPDATED, event2.type());
...@@ -346,7 +348,7 @@ public class GossipDeviceStoreTest { ...@@ -346,7 +348,7 @@ public class GossipDeviceStoreTest {
346 // add 348 // add
347 DeviceDescription description = 349 DeviceDescription description =
348 new DefaultDeviceDescription(DID1.uri(), SWITCH, MFR, 350 new DefaultDeviceDescription(DID1.uri(), SWITCH, MFR,
349 - HW, SW1, SN, A2); 351 + HW, SW1, SN, CID, A2);
350 Capture<ClusterMessage> bcast = new Capture<>(); 352 Capture<ClusterMessage> bcast = new Capture<>();
351 353
352 resetCommunicatorExpectingSingleBroadcast(bcast); 354 resetCommunicatorExpectingSingleBroadcast(bcast);
...@@ -362,7 +364,7 @@ public class GossipDeviceStoreTest { ...@@ -362,7 +364,7 @@ public class GossipDeviceStoreTest {
362 // update from primary 364 // update from primary
363 DeviceDescription description2 = 365 DeviceDescription description2 =
364 new DefaultDeviceDescription(DID1.uri(), SWITCH, MFR, 366 new DefaultDeviceDescription(DID1.uri(), SWITCH, MFR,
365 - HW, SW2, SN, A1); 367 + HW, SW2, SN, CID, A1);
366 resetCommunicatorExpectingSingleBroadcast(bcast); 368 resetCommunicatorExpectingSingleBroadcast(bcast);
367 369
368 DeviceEvent event2 = deviceStore.createOrUpdateDevice(PID, DID1, description2); 370 DeviceEvent event2 = deviceStore.createOrUpdateDevice(PID, DID1, description2);
...@@ -392,7 +394,7 @@ public class GossipDeviceStoreTest { ...@@ -392,7 +394,7 @@ public class GossipDeviceStoreTest {
392 // But, Ancillary annotations will be in effect 394 // But, Ancillary annotations will be in effect
393 DeviceDescription description3 = 395 DeviceDescription description3 =
394 new DefaultDeviceDescription(DID1.uri(), SWITCH, MFR, 396 new DefaultDeviceDescription(DID1.uri(), SWITCH, MFR,
395 - HW, SW1, SN, A2_2); 397 + HW, SW1, SN, CID, A2_2);
396 resetCommunicatorExpectingSingleBroadcast(bcast); 398 resetCommunicatorExpectingSingleBroadcast(bcast);
397 399
398 DeviceEvent event3 = deviceStore.createOrUpdateDevice(PIDA, DID1, description3); 400 DeviceEvent event3 = deviceStore.createOrUpdateDevice(PIDA, DID1, description3);
...@@ -775,7 +777,7 @@ public class GossipDeviceStoreTest { ...@@ -775,7 +777,7 @@ public class GossipDeviceStoreTest {
775 777
776 DeviceDescription description = 778 DeviceDescription description =
777 new DefaultDeviceDescription(DID1.uri(), SWITCH, MFR, 779 new DefaultDeviceDescription(DID1.uri(), SWITCH, MFR,
778 - HW, SW1, SN); 780 + HW, SW1, SN, CID);
779 deviceStore.setDelegate(checkAdd); 781 deviceStore.setDelegate(checkAdd);
780 deviceStore.createOrUpdateDevice(PID, DID1, description); 782 deviceStore.createOrUpdateDevice(PID, DID1, description);
781 assertTrue("Add event fired", addLatch.await(1, TimeUnit.SECONDS)); 783 assertTrue("Add event fired", addLatch.await(1, TimeUnit.SECONDS));
...@@ -783,7 +785,7 @@ public class GossipDeviceStoreTest { ...@@ -783,7 +785,7 @@ public class GossipDeviceStoreTest {
783 785
784 DeviceDescription description2 = 786 DeviceDescription description2 =
785 new DefaultDeviceDescription(DID1.uri(), SWITCH, MFR, 787 new DefaultDeviceDescription(DID1.uri(), SWITCH, MFR,
786 - HW, SW2, SN); 788 + HW, SW2, SN, CID);
787 deviceStore.unsetDelegate(checkAdd); 789 deviceStore.unsetDelegate(checkAdd);
788 deviceStore.setDelegate(checkUpdate); 790 deviceStore.setDelegate(checkUpdate);
789 deviceStore.createOrUpdateDevice(PID, DID1, description2); 791 deviceStore.createOrUpdateDevice(PID, DID1, description2);
......
...@@ -169,7 +169,7 @@ public class DistributedDeviceStore ...@@ -169,7 +169,7 @@ public class DistributedDeviceStore
169 DefaultDevice device = new DefaultDevice(providerId, deviceId, desc.type(), 169 DefaultDevice device = new DefaultDevice(providerId, deviceId, desc.type(),
170 desc.manufacturer(), 170 desc.manufacturer(),
171 desc.hwVersion(), desc.swVersion(), 171 desc.hwVersion(), desc.swVersion(),
172 - desc.serialNumber()); 172 + desc.serialNumber(), desc.chassisId());
173 173
174 synchronized (this) { 174 synchronized (this) {
175 final byte[] deviceIdBytes = serialize(deviceId); 175 final byte[] deviceIdBytes = serialize(deviceId);
...@@ -193,7 +193,8 @@ public class DistributedDeviceStore ...@@ -193,7 +193,8 @@ public class DistributedDeviceStore
193 desc.manufacturer(), 193 desc.manufacturer(),
194 desc.hwVersion(), 194 desc.hwVersion(),
195 desc.swVersion(), 195 desc.swVersion(),
196 - desc.serialNumber()); 196 + desc.serialNumber(),
197 + desc.chassisId());
197 synchronized (this) { 198 synchronized (this) {
198 final byte[] deviceIdBytes = serialize(device.id()); 199 final byte[] deviceIdBytes = serialize(device.id());
199 rawDevices.put(deviceIdBytes, serialize(updated)); 200 rawDevices.put(deviceIdBytes, serialize(updated));
......
...@@ -40,6 +40,7 @@ import com.google.common.collect.Iterables; ...@@ -40,6 +40,7 @@ import com.google.common.collect.Iterables;
40 import com.google.common.collect.Sets; 40 import com.google.common.collect.Sets;
41 import com.hazelcast.config.Config; 41 import com.hazelcast.config.Config;
42 import com.hazelcast.core.Hazelcast; 42 import com.hazelcast.core.Hazelcast;
43 +import org.onlab.packet.ChassisId;
43 44
44 /** 45 /**
45 * Test of the Hazelcast based distributed DeviceStore implementation. 46 * Test of the Hazelcast based distributed DeviceStore implementation.
...@@ -54,6 +55,7 @@ public class DistributedDeviceStoreTest { ...@@ -54,6 +55,7 @@ public class DistributedDeviceStoreTest {
54 private static final String SW1 = "3.8.1"; 55 private static final String SW1 = "3.8.1";
55 private static final String SW2 = "3.9.5"; 56 private static final String SW2 = "3.9.5";
56 private static final String SN = "43311-12345"; 57 private static final String SN = "43311-12345";
58 + private static final ChassisId CID = new ChassisId();
57 59
58 private static final PortNumber P1 = PortNumber.portNumber(1); 60 private static final PortNumber P1 = PortNumber.portNumber(1);
59 private static final PortNumber P2 = PortNumber.portNumber(2); 61 private static final PortNumber P2 = PortNumber.portNumber(2);
...@@ -95,7 +97,7 @@ public class DistributedDeviceStoreTest { ...@@ -95,7 +97,7 @@ public class DistributedDeviceStoreTest {
95 private void putDevice(DeviceId deviceId, String swVersion) { 97 private void putDevice(DeviceId deviceId, String swVersion) {
96 DeviceDescription description = 98 DeviceDescription description =
97 new DefaultDeviceDescription(deviceId.uri(), SWITCH, MFR, 99 new DefaultDeviceDescription(deviceId.uri(), SWITCH, MFR,
98 - HW, swVersion, SN); 100 + HW, swVersion, SN, CID);
99 deviceStore.createOrUpdateDevice(PID, deviceId, description); 101 deviceStore.createOrUpdateDevice(PID, deviceId, description);
100 } 102 }
101 103
...@@ -154,14 +156,14 @@ public class DistributedDeviceStoreTest { ...@@ -154,14 +156,14 @@ public class DistributedDeviceStoreTest {
154 public final void testCreateOrUpdateDevice() { 156 public final void testCreateOrUpdateDevice() {
155 DeviceDescription description = 157 DeviceDescription description =
156 new DefaultDeviceDescription(DID1.uri(), SWITCH, MFR, 158 new DefaultDeviceDescription(DID1.uri(), SWITCH, MFR,
157 - HW, SW1, SN); 159 + HW, SW1, SN, CID);
158 DeviceEvent event = deviceStore.createOrUpdateDevice(PID, DID1, description); 160 DeviceEvent event = deviceStore.createOrUpdateDevice(PID, DID1, description);
159 assertEquals(DEVICE_ADDED, event.type()); 161 assertEquals(DEVICE_ADDED, event.type());
160 assertDevice(DID1, SW1, event.subject()); 162 assertDevice(DID1, SW1, event.subject());
161 163
162 DeviceDescription description2 = 164 DeviceDescription description2 =
163 new DefaultDeviceDescription(DID1.uri(), SWITCH, MFR, 165 new DefaultDeviceDescription(DID1.uri(), SWITCH, MFR,
164 - HW, SW2, SN); 166 + HW, SW2, SN, CID);
165 DeviceEvent event2 = deviceStore.createOrUpdateDevice(PID, DID1, description2); 167 DeviceEvent event2 = deviceStore.createOrUpdateDevice(PID, DID1, description2);
166 assertEquals(DEVICE_UPDATED, event2.type()); 168 assertEquals(DEVICE_UPDATED, event2.type());
167 assertDevice(DID1, SW2, event2.subject()); 169 assertDevice(DID1, SW2, event2.subject());
...@@ -362,7 +364,7 @@ public class DistributedDeviceStoreTest { ...@@ -362,7 +364,7 @@ public class DistributedDeviceStoreTest {
362 364
363 DeviceDescription description = 365 DeviceDescription description =
364 new DefaultDeviceDescription(DID1.uri(), SWITCH, MFR, 366 new DefaultDeviceDescription(DID1.uri(), SWITCH, MFR,
365 - HW, SW1, SN); 367 + HW, SW1, SN, CID);
366 deviceStore.setDelegate(checkAdd); 368 deviceStore.setDelegate(checkAdd);
367 deviceStore.createOrUpdateDevice(PID, DID1, description); 369 deviceStore.createOrUpdateDevice(PID, DID1, description);
368 assertTrue("Add event fired", addLatch.await(1, TimeUnit.SECONDS)); 370 assertTrue("Add event fired", addLatch.await(1, TimeUnit.SECONDS));
...@@ -370,7 +372,7 @@ public class DistributedDeviceStoreTest { ...@@ -370,7 +372,7 @@ public class DistributedDeviceStoreTest {
370 372
371 DeviceDescription description2 = 373 DeviceDescription description2 =
372 new DefaultDeviceDescription(DID1.uri(), SWITCH, MFR, 374 new DefaultDeviceDescription(DID1.uri(), SWITCH, MFR,
373 - HW, SW2, SN); 375 + HW, SW2, SN, CID);
374 deviceStore.unsetDelegate(checkAdd); 376 deviceStore.unsetDelegate(checkAdd);
375 deviceStore.setDelegate(checkUpdate); 377 deviceStore.setDelegate(checkUpdate);
376 deviceStore.createOrUpdateDevice(PID, DID1, description2); 378 deviceStore.createOrUpdateDevice(PID, DID1, description2);
......
...@@ -27,6 +27,7 @@ import org.onlab.onos.net.device.DefaultPortDescription; ...@@ -27,6 +27,7 @@ import org.onlab.onos.net.device.DefaultPortDescription;
27 import org.onlab.onos.net.link.DefaultLinkDescription; 27 import org.onlab.onos.net.link.DefaultLinkDescription;
28 import org.onlab.onos.net.provider.ProviderId; 28 import org.onlab.onos.net.provider.ProviderId;
29 import org.onlab.onos.store.Timestamp; 29 import org.onlab.onos.store.Timestamp;
30 +import org.onlab.packet.ChassisId;
30 import org.onlab.packet.IpAddress; 31 import org.onlab.packet.IpAddress;
31 import org.onlab.packet.IpPrefix; 32 import org.onlab.packet.IpPrefix;
32 import org.onlab.util.KryoPool; 33 import org.onlab.util.KryoPool;
...@@ -61,6 +62,7 @@ public final class KryoPoolUtil { ...@@ -61,6 +62,7 @@ public final class KryoPoolUtil {
61 // 62 //
62 ControllerNode.State.class, 63 ControllerNode.State.class,
63 Device.Type.class, 64 Device.Type.class,
65 + ChassisId.class,
64 DefaultAnnotations.class, 66 DefaultAnnotations.class,
65 DefaultControllerNode.class, 67 DefaultControllerNode.class,
66 DefaultDevice.class, 68 DefaultDevice.class,
......
...@@ -26,6 +26,7 @@ import org.onlab.onos.net.MastershipRole; ...@@ -26,6 +26,7 @@ import org.onlab.onos.net.MastershipRole;
26 import org.onlab.onos.net.PortNumber; 26 import org.onlab.onos.net.PortNumber;
27 import org.onlab.onos.net.SparseAnnotations; 27 import org.onlab.onos.net.SparseAnnotations;
28 import org.onlab.onos.net.provider.ProviderId; 28 import org.onlab.onos.net.provider.ProviderId;
29 +import org.onlab.packet.ChassisId;
29 import org.onlab.packet.IpAddress; 30 import org.onlab.packet.IpAddress;
30 import org.onlab.packet.IpPrefix; 31 import org.onlab.packet.IpPrefix;
31 import org.onlab.util.KryoPool; 32 import org.onlab.util.KryoPool;
...@@ -49,7 +50,9 @@ public class KryoSerializerTest { ...@@ -49,7 +50,9 @@ public class KryoSerializerTest {
49 private static final String SW1 = "3.8.1"; 50 private static final String SW1 = "3.8.1";
50 private static final String SW2 = "3.9.5"; 51 private static final String SW2 = "3.9.5";
51 private static final String SN = "43311-12345"; 52 private static final String SN = "43311-12345";
52 - private static final Device DEV1 = new DefaultDevice(PID, DID1, Device.Type.SWITCH, MFR, HW, SW1, SN); 53 + private static final ChassisId CID = new ChassisId();
54 + private static final Device DEV1 = new DefaultDevice(PID, DID1, Device.Type.SWITCH, MFR, HW,
55 + SW1, SN, CID);
53 private static final SparseAnnotations A1 = DefaultAnnotations.builder() 56 private static final SparseAnnotations A1 = DefaultAnnotations.builder()
54 .set("A1", "a1") 57 .set("A1", "a1")
55 .set("B1", "b1") 58 .set("B1", "b1")
......
...@@ -30,6 +30,7 @@ import org.onlab.onos.net.device.DeviceStoreDelegate; ...@@ -30,6 +30,7 @@ import org.onlab.onos.net.device.DeviceStoreDelegate;
30 import org.onlab.onos.net.device.PortDescription; 30 import org.onlab.onos.net.device.PortDescription;
31 import org.onlab.onos.net.provider.ProviderId; 31 import org.onlab.onos.net.provider.ProviderId;
32 import org.onlab.onos.store.AbstractStore; 32 import org.onlab.onos.store.AbstractStore;
33 +import org.onlab.packet.ChassisId;
33 import org.onlab.util.NewConcurrentHashMap; 34 import org.onlab.util.NewConcurrentHashMap;
34 import org.slf4j.Logger; 35 import org.slf4j.Logger;
35 36
...@@ -404,6 +405,7 @@ public class SimpleDeviceStore ...@@ -404,6 +405,7 @@ public class SimpleDeviceStore
404 String hwVersion = base.hwVersion(); 405 String hwVersion = base.hwVersion();
405 String swVersion = base.swVersion(); 406 String swVersion = base.swVersion();
406 String serialNumber = base.serialNumber(); 407 String serialNumber = base.serialNumber();
408 + ChassisId chassisId = base.chassisId();
407 DefaultAnnotations annotations = DefaultAnnotations.builder().build(); 409 DefaultAnnotations annotations = DefaultAnnotations.builder().build();
408 annotations = merge(annotations, base.annotations()); 410 annotations = merge(annotations, base.annotations());
409 411
...@@ -421,7 +423,8 @@ public class SimpleDeviceStore ...@@ -421,7 +423,8 @@ public class SimpleDeviceStore
421 } 423 }
422 424
423 return new DefaultDevice(primary, deviceId , type, manufacturer, 425 return new DefaultDevice(primary, deviceId , type, manufacturer,
424 - hwVersion, swVersion, serialNumber, annotations); 426 + hwVersion, swVersion, serialNumber,
427 + chassisId, annotations);
425 } 428 }
426 429
427 /** 430 /**
......
...@@ -17,6 +17,7 @@ import org.onlab.onos.net.topology.GraphDescription; ...@@ -17,6 +17,7 @@ import org.onlab.onos.net.topology.GraphDescription;
17 import org.onlab.onos.net.topology.LinkWeight; 17 import org.onlab.onos.net.topology.LinkWeight;
18 import org.onlab.onos.net.topology.TopologyCluster; 18 import org.onlab.onos.net.topology.TopologyCluster;
19 import org.onlab.onos.net.topology.TopologyEdge; 19 import org.onlab.onos.net.topology.TopologyEdge;
20 +import org.onlab.packet.ChassisId;
20 21
21 import java.util.Set; 22 import java.util.Set;
22 23
...@@ -119,7 +120,7 @@ public class DefaultTopologyTest { ...@@ -119,7 +120,7 @@ public class DefaultTopologyTest {
119 // Crates a new device with the specified id 120 // Crates a new device with the specified id
120 public static Device device(String id) { 121 public static Device device(String id) {
121 return new DefaultDevice(PID, did(id), Device.Type.SWITCH, 122 return new DefaultDevice(PID, did(id), Device.Type.SWITCH,
122 - "mfg", "1.0", "1.1", "1234"); 123 + "mfg", "1.0", "1.1", "1234", new ChassisId());
123 } 124 }
124 125
125 // Short-hand for producing a device id from a string 126 // Short-hand for producing a device id from a string
......
...@@ -40,6 +40,7 @@ import org.onlab.onos.net.provider.ProviderId; ...@@ -40,6 +40,7 @@ import org.onlab.onos.net.provider.ProviderId;
40 40
41 import com.google.common.collect.Iterables; 41 import com.google.common.collect.Iterables;
42 import com.google.common.collect.Sets; 42 import com.google.common.collect.Sets;
43 +import org.onlab.packet.ChassisId;
43 44
44 /** 45 /**
45 * Test of the simple DeviceStore implementation. 46 * Test of the simple DeviceStore implementation.
...@@ -55,6 +56,7 @@ public class SimpleDeviceStoreTest { ...@@ -55,6 +56,7 @@ public class SimpleDeviceStoreTest {
55 private static final String SW1 = "3.8.1"; 56 private static final String SW1 = "3.8.1";
56 private static final String SW2 = "3.9.5"; 57 private static final String SW2 = "3.9.5";
57 private static final String SN = "43311-12345"; 58 private static final String SN = "43311-12345";
59 + private static final ChassisId CID = new ChassisId();
58 60
59 private static final PortNumber P1 = PortNumber.portNumber(1); 61 private static final PortNumber P1 = PortNumber.portNumber(1);
60 private static final PortNumber P2 = PortNumber.portNumber(2); 62 private static final PortNumber P2 = PortNumber.portNumber(2);
...@@ -107,7 +109,7 @@ public class SimpleDeviceStoreTest { ...@@ -107,7 +109,7 @@ public class SimpleDeviceStoreTest {
107 SparseAnnotations... annotations) { 109 SparseAnnotations... annotations) {
108 DeviceDescription description = 110 DeviceDescription description =
109 new DefaultDeviceDescription(deviceId.uri(), SWITCH, MFR, 111 new DefaultDeviceDescription(deviceId.uri(), SWITCH, MFR,
110 - HW, swVersion, SN, annotations); 112 + HW, swVersion, SN, CID, annotations);
111 deviceStore.createOrUpdateDevice(PID, deviceId, description); 113 deviceStore.createOrUpdateDevice(PID, deviceId, description);
112 } 114 }
113 115
...@@ -115,7 +117,7 @@ public class SimpleDeviceStoreTest { ...@@ -115,7 +117,7 @@ public class SimpleDeviceStoreTest {
115 SparseAnnotations... annotations) { 117 SparseAnnotations... annotations) {
116 DeviceDescription description = 118 DeviceDescription description =
117 new DefaultDeviceDescription(deviceId.uri(), SWITCH, MFR, 119 new DefaultDeviceDescription(deviceId.uri(), SWITCH, MFR,
118 - HW, swVersion, SN, annotations); 120 + HW, swVersion, SN, CID, annotations);
119 deviceStore.createOrUpdateDevice(PIDA, deviceId, description); 121 deviceStore.createOrUpdateDevice(PIDA, deviceId, description);
120 } 122 }
121 123
...@@ -193,14 +195,14 @@ public class SimpleDeviceStoreTest { ...@@ -193,14 +195,14 @@ public class SimpleDeviceStoreTest {
193 public final void testCreateOrUpdateDevice() { 195 public final void testCreateOrUpdateDevice() {
194 DeviceDescription description = 196 DeviceDescription description =
195 new DefaultDeviceDescription(DID1.uri(), SWITCH, MFR, 197 new DefaultDeviceDescription(DID1.uri(), SWITCH, MFR,
196 - HW, SW1, SN); 198 + HW, SW1, SN, CID);
197 DeviceEvent event = deviceStore.createOrUpdateDevice(PID, DID1, description); 199 DeviceEvent event = deviceStore.createOrUpdateDevice(PID, DID1, description);
198 assertEquals(DEVICE_ADDED, event.type()); 200 assertEquals(DEVICE_ADDED, event.type());
199 assertDevice(DID1, SW1, event.subject()); 201 assertDevice(DID1, SW1, event.subject());
200 202
201 DeviceDescription description2 = 203 DeviceDescription description2 =
202 new DefaultDeviceDescription(DID1.uri(), SWITCH, MFR, 204 new DefaultDeviceDescription(DID1.uri(), SWITCH, MFR,
203 - HW, SW2, SN); 205 + HW, SW2, SN, CID);
204 DeviceEvent event2 = deviceStore.createOrUpdateDevice(PID, DID1, description2); 206 DeviceEvent event2 = deviceStore.createOrUpdateDevice(PID, DID1, description2);
205 assertEquals(DEVICE_UPDATED, event2.type()); 207 assertEquals(DEVICE_UPDATED, event2.type());
206 assertDevice(DID1, SW2, event2.subject()); 208 assertDevice(DID1, SW2, event2.subject());
...@@ -212,7 +214,7 @@ public class SimpleDeviceStoreTest { ...@@ -212,7 +214,7 @@ public class SimpleDeviceStoreTest {
212 public final void testCreateOrUpdateDeviceAncillary() { 214 public final void testCreateOrUpdateDeviceAncillary() {
213 DeviceDescription description = 215 DeviceDescription description =
214 new DefaultDeviceDescription(DID1.uri(), SWITCH, MFR, 216 new DefaultDeviceDescription(DID1.uri(), SWITCH, MFR,
215 - HW, SW1, SN, A2); 217 + HW, SW1, SN, CID, A2);
216 DeviceEvent event = deviceStore.createOrUpdateDevice(PIDA, DID1, description); 218 DeviceEvent event = deviceStore.createOrUpdateDevice(PIDA, DID1, description);
217 assertEquals(DEVICE_ADDED, event.type()); 219 assertEquals(DEVICE_ADDED, event.type());
218 assertDevice(DID1, SW1, event.subject()); 220 assertDevice(DID1, SW1, event.subject());
...@@ -222,7 +224,7 @@ public class SimpleDeviceStoreTest { ...@@ -222,7 +224,7 @@ public class SimpleDeviceStoreTest {
222 224
223 DeviceDescription description2 = 225 DeviceDescription description2 =
224 new DefaultDeviceDescription(DID1.uri(), SWITCH, MFR, 226 new DefaultDeviceDescription(DID1.uri(), SWITCH, MFR,
225 - HW, SW2, SN, A1); 227 + HW, SW2, SN, CID, A1);
226 DeviceEvent event2 = deviceStore.createOrUpdateDevice(PID, DID1, description2); 228 DeviceEvent event2 = deviceStore.createOrUpdateDevice(PID, DID1, description2);
227 assertEquals(DEVICE_UPDATED, event2.type()); 229 assertEquals(DEVICE_UPDATED, event2.type());
228 assertDevice(DID1, SW2, event2.subject()); 230 assertDevice(DID1, SW2, event2.subject());
...@@ -238,7 +240,7 @@ public class SimpleDeviceStoreTest { ...@@ -238,7 +240,7 @@ public class SimpleDeviceStoreTest {
238 // But, Ancillary annotations will be in effect 240 // But, Ancillary annotations will be in effect
239 DeviceDescription description3 = 241 DeviceDescription description3 =
240 new DefaultDeviceDescription(DID1.uri(), SWITCH, MFR, 242 new DefaultDeviceDescription(DID1.uri(), SWITCH, MFR,
241 - HW, SW1, SN, A2_2); 243 + HW, SW1, SN, CID, A2_2);
242 DeviceEvent event3 = deviceStore.createOrUpdateDevice(PIDA, DID1, description3); 244 DeviceEvent event3 = deviceStore.createOrUpdateDevice(PIDA, DID1, description3);
243 assertEquals(DEVICE_UPDATED, event3.type()); 245 assertEquals(DEVICE_UPDATED, event3.type());
244 // basic information will be the one from Primary 246 // basic information will be the one from Primary
...@@ -508,7 +510,7 @@ public class SimpleDeviceStoreTest { ...@@ -508,7 +510,7 @@ public class SimpleDeviceStoreTest {
508 510
509 DeviceDescription description = 511 DeviceDescription description =
510 new DefaultDeviceDescription(DID1.uri(), SWITCH, MFR, 512 new DefaultDeviceDescription(DID1.uri(), SWITCH, MFR,
511 - HW, SW1, SN); 513 + HW, SW1, SN, CID);
512 deviceStore.setDelegate(checkAdd); 514 deviceStore.setDelegate(checkAdd);
513 deviceStore.createOrUpdateDevice(PID, DID1, description); 515 deviceStore.createOrUpdateDevice(PID, DID1, description);
514 assertTrue("Add event fired", addLatch.await(1, TimeUnit.SECONDS)); 516 assertTrue("Add event fired", addLatch.await(1, TimeUnit.SECONDS));
...@@ -516,7 +518,7 @@ public class SimpleDeviceStoreTest { ...@@ -516,7 +518,7 @@ public class SimpleDeviceStoreTest {
516 518
517 DeviceDescription description2 = 519 DeviceDescription description2 =
518 new DefaultDeviceDescription(DID1.uri(), SWITCH, MFR, 520 new DefaultDeviceDescription(DID1.uri(), SWITCH, MFR,
519 - HW, SW2, SN); 521 + HW, SW2, SN, CID);
520 deviceStore.unsetDelegate(checkAdd); 522 deviceStore.unsetDelegate(checkAdd);
521 deviceStore.setDelegate(checkUpdate); 523 deviceStore.setDelegate(checkUpdate);
522 deviceStore.createOrUpdateDevice(PID, DID1, description2); 524 deviceStore.createOrUpdateDevice(PID, DID1, description2);
......
...@@ -101,8 +101,8 @@ ...@@ -101,8 +101,8 @@
101 <bundle>mvn:org.onlab.onos/onos-of-api/1.0.0-SNAPSHOT</bundle> 101 <bundle>mvn:org.onlab.onos/onos-of-api/1.0.0-SNAPSHOT</bundle>
102 <bundle>mvn:org.onlab.onos/onos-of-ctl/1.0.0-SNAPSHOT</bundle> 102 <bundle>mvn:org.onlab.onos/onos-of-ctl/1.0.0-SNAPSHOT</bundle>
103 103
104 + <bundle>mvn:org.onlab.onos/onos-lldp-provider/1.0.0-SNAPSHOT</bundle>
104 <bundle>mvn:org.onlab.onos/onos-of-provider-device/1.0.0-SNAPSHOT</bundle> 105 <bundle>mvn:org.onlab.onos/onos-of-provider-device/1.0.0-SNAPSHOT</bundle>
105 - <bundle>mvn:org.onlab.onos/onos-of-provider-link/1.0.0-SNAPSHOT</bundle>
106 <bundle>mvn:org.onlab.onos/onos-of-provider-host/1.0.0-SNAPSHOT</bundle> 106 <bundle>mvn:org.onlab.onos/onos-of-provider-host/1.0.0-SNAPSHOT</bundle>
107 <bundle>mvn:org.onlab.onos/onos-of-provider-packet/1.0.0-SNAPSHOT</bundle> 107 <bundle>mvn:org.onlab.onos/onos-of-provider-packet/1.0.0-SNAPSHOT</bundle>
108 <bundle>mvn:org.onlab.onos/onos-of-provider-flow/1.0.0-SNAPSHOT</bundle> 108 <bundle>mvn:org.onlab.onos/onos-of-provider-flow/1.0.0-SNAPSHOT</bundle>
......
1 +<?xml version="1.0" encoding="UTF-8"?>
2 +<project xmlns="http://maven.apache.org/POM/4.0.0"
3 + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
5 + <modelVersion>4.0.0</modelVersion>
6 +
7 +
8 + <parent>
9 + <groupId>org.onlab.onos</groupId>
10 + <artifactId>onos-providers</artifactId>
11 + <version>1.0.0-SNAPSHOT</version>
12 + <relativePath>../pom.xml</relativePath>
13 + </parent>
14 +
15 + <artifactId>onos-lldp-provider</artifactId>
16 + <packaging>bundle</packaging>
17 +
18 + <description>ONOS LLDP Link Discovery</description>
19 +
20 +</project>
1 +package org.onlab.onos.provider.lldp.impl;
2 +
3 +import org.apache.felix.scr.annotations.Activate;
4 +import org.apache.felix.scr.annotations.Component;
5 +import org.apache.felix.scr.annotations.Deactivate;
6 +import org.apache.felix.scr.annotations.Reference;
7 +import org.apache.felix.scr.annotations.ReferenceCardinality;
8 +import org.onlab.onos.net.ConnectPoint;
9 +import org.onlab.onos.net.Device;
10 +import org.onlab.onos.net.DeviceId;
11 +import org.onlab.onos.net.device.DeviceEvent;
12 +import org.onlab.onos.net.device.DeviceListener;
13 +import org.onlab.onos.net.device.DeviceService;
14 +import org.onlab.onos.net.link.LinkProvider;
15 +import org.onlab.onos.net.link.LinkProviderRegistry;
16 +import org.onlab.onos.net.link.LinkProviderService;
17 +import org.onlab.onos.net.packet.PacketContext;
18 +import org.onlab.onos.net.packet.PacketProcessor;
19 +import org.onlab.onos.net.packet.PacketService;
20 +import org.onlab.onos.net.provider.AbstractProvider;
21 +import org.onlab.onos.net.provider.ProviderId;
22 +import org.slf4j.Logger;
23 +
24 +import java.util.Map;
25 +import java.util.concurrent.ConcurrentHashMap;
26 +
27 +import static org.slf4j.LoggerFactory.getLogger;
28 +
29 +
30 +/**
31 + * Provider which uses an OpenFlow controller to detect network
32 + * infrastructure links.
33 + */
34 +@Component(immediate = true)
35 +public class LLDPLinkProvider extends AbstractProvider implements LinkProvider {
36 +
37 + private final Logger log = getLogger(getClass());
38 +
39 + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
40 + protected LinkProviderRegistry providerRegistry;
41 +
42 + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
43 + protected DeviceService deviceService;
44 +
45 + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
46 + protected PacketService packetSevice;
47 +
48 + private LinkProviderService providerService;
49 +
50 + private final boolean useBDDP = true;
51 +
52 +
53 + private final InternalLinkProvider listener = new InternalLinkProvider();
54 +
55 + protected final Map<DeviceId, LinkDiscovery> discoverers = new ConcurrentHashMap<>();
56 +
57 + /**
58 + * Creates an OpenFlow link provider.
59 + */
60 + public LLDPLinkProvider() {
61 + super(new ProviderId("lldp", "org.onlab.onos.provider.lldp"));
62 + }
63 +
64 + @Activate
65 + public void activate() {
66 + providerService = providerRegistry.register(this);
67 + deviceService.addListener(listener);
68 + packetSevice.addProcessor(listener, 0);
69 +
70 + log.info("Started");
71 + }
72 +
73 + @Deactivate
74 + public void deactivate() {
75 + for (LinkDiscovery ld : discoverers.values()) {
76 + ld.stop();
77 + }
78 + providerRegistry.unregister(this);
79 + deviceService.removeListener(listener);
80 + packetSevice.removeProcessor(listener);
81 + providerService = null;
82 +
83 + log.info("Stopped");
84 + }
85 +
86 +
87 + private class InternalLinkProvider implements PacketProcessor, DeviceListener {
88 +
89 + @Override
90 + public void event(DeviceEvent event) {
91 + LinkDiscovery ld = null;
92 + Device device = event.subject();
93 + // it's not a switch so leave.
94 + if (device.type() != Device.Type.SWITCH) {
95 + return;
96 + }
97 + switch (event.type()) {
98 + case DEVICE_ADDED:
99 + discoverers.put(event.subject().id(),
100 + new LinkDiscovery(event.subject(), packetSevice,
101 + providerService, useBDDP));
102 + break;
103 + case PORT_ADDED:
104 + case PORT_UPDATED:
105 + if (event.port().isEnabled()) {
106 + ld = discoverers.get(event.subject().id());
107 + if (ld == null) {
108 + return;
109 + }
110 + ld.addPort(event.port());
111 + } else {
112 + ConnectPoint point = new ConnectPoint(event.subject().id(),
113 + event.port().number());
114 + providerService.linksVanished(point);
115 + }
116 + break;
117 + case PORT_REMOVED:
118 + ConnectPoint point = new ConnectPoint(event.subject().id(),
119 + event.port().number());
120 + providerService.linksVanished(point);
121 + break;
122 + case DEVICE_REMOVED:
123 + case DEVICE_SUSPENDED:
124 + ld = discoverers.get(event.subject().id());
125 + if (ld == null) {
126 + return;
127 + }
128 + ld.stop();
129 + providerService.linksVanished(event.subject().id());
130 + break;
131 + case DEVICE_AVAILABILITY_CHANGED:
132 + ld = discoverers.get(event.subject().id());
133 + if (ld == null) {
134 + return;
135 + }
136 + if (deviceService.isAvailable(event.subject().id())) {
137 + ld.start();
138 + } else {
139 + providerService.linksVanished(event.subject().id());
140 + ld.stop();
141 + }
142 + break;
143 + case DEVICE_UPDATED:
144 + case DEVICE_MASTERSHIP_CHANGED:
145 + break;
146 + default:
147 + log.debug("Unknown event {}", event);
148 + }
149 + }
150 +
151 + @Override
152 + public void process(PacketContext context) {
153 + LinkDiscovery ld = discoverers.get(
154 + context.inPacket().receivedFrom().deviceId());
155 + if (ld == null) {
156 + return;
157 + }
158 +
159 + if (ld.handleLLDP(context)) {
160 + context.block();
161 + }
162 + }
163 + }
164 +
165 +}
1 +/*******************************************************************************
2 + * Copyright 2014 Open Networking Laboratory
3 + *
4 + * Licensed under the Apache License, Version 2.0 (the "License");
5 + * you may not use this file except in compliance with the License.
6 + * You may obtain a copy of the License at
7 + *
8 + * http://www.apache.org/licenses/LICENSE-2.0
9 + *
10 + * Unless required by applicable law or agreed to in writing, software
11 + * distributed under the License is distributed on an "AS IS" BASIS,
12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 + * See the License for the specific language governing permissions and
14 + * limitations under the License.
15 + ******************************************************************************/
16 +package org.onlab.onos.provider.lldp.impl;
17 +
18 +
19 +import static org.slf4j.LoggerFactory.getLogger;
20 +
21 +import java.nio.ByteBuffer;
22 +import java.util.Collections;
23 +import java.util.HashMap;
24 +import java.util.HashSet;
25 +import java.util.Iterator;
26 +import java.util.Map;
27 +import java.util.Set;
28 +import java.util.concurrent.TimeUnit;
29 +import java.util.concurrent.atomic.AtomicInteger;
30 +
31 +import org.jboss.netty.util.Timeout;
32 +import org.jboss.netty.util.TimerTask;
33 +import org.onlab.onos.net.ConnectPoint;
34 +import org.onlab.onos.net.Device;
35 +import org.onlab.onos.net.DeviceId;
36 +import org.onlab.onos.net.Link.Type;
37 +import org.onlab.onos.net.Port;
38 +import org.onlab.onos.net.PortNumber;
39 +import org.onlab.onos.net.flow.DefaultTrafficTreatment;
40 +import org.onlab.onos.net.link.DefaultLinkDescription;
41 +import org.onlab.onos.net.link.LinkDescription;
42 +import org.onlab.onos.net.link.LinkProviderService;
43 +import org.onlab.onos.net.packet.DefaultOutboundPacket;
44 +import org.onlab.onos.net.packet.OutboundPacket;
45 +import org.onlab.onos.net.packet.PacketContext;
46 +import org.onlab.onos.net.packet.PacketService;
47 +import org.onlab.packet.Ethernet;
48 +import org.onlab.packet.ONOSLLDP;
49 +import org.onlab.util.Timer;
50 +import org.slf4j.Logger;
51 +
52 +
53 +
54 +/**
55 + * Run discovery process from a physical switch. Ports are initially labeled as
56 + * slow ports. When an LLDP is successfully received, label the remote port as
57 + * fast. Every probeRate milliseconds, loop over all fast ports and send an
58 + * LLDP, send an LLDP for a single slow port. Based on FlowVisor topology
59 + * discovery implementation.
60 + *
61 + * TODO: add 'fast discovery' mode: drop LLDPs in destination switch but listen
62 + * for flow_removed messages
63 + */
64 +public class LinkDiscovery implements TimerTask {
65 +
66 + private final Device device;
67 + // send 1 probe every probeRate milliseconds
68 + private final long probeRate;
69 + private final Set<Long> slowPorts;
70 + private final Set<Long> fastPorts;
71 + // number of unacknowledged probes per port
72 + private final Map<Long, AtomicInteger> portProbeCount;
73 + // number of probes to send before link is removed
74 + private static final short MAX_PROBE_COUNT = 3;
75 + private final Logger log = getLogger(getClass());
76 + private final ONOSLLDP lldpPacket;
77 + private final Ethernet ethPacket;
78 + private Ethernet bddpEth;
79 + private final boolean useBDDP;
80 + private final LinkProviderService linkProvider;
81 + private final PacketService pktService;
82 + private Timeout timeout;
83 +
84 + /**
85 + * Instantiates discovery manager for the given physical switch. Creates a
86 + * generic LLDP packet that will be customized for the port it is sent out on.
87 + * Starts the the timer for the discovery process.
88 + *
89 + * @param device the physical switch
90 + * @param useBDDP flag to also use BDDP for discovery
91 + */
92 + public LinkDiscovery(Device device, PacketService pktService,
93 + LinkProviderService providerService, Boolean... useBDDP) {
94 + this.device = device;
95 + this.probeRate = 3000;
96 + this.linkProvider = providerService;
97 + this.pktService = pktService;
98 + this.slowPorts = Collections.synchronizedSet(new HashSet<Long>());
99 + this.fastPorts = Collections.synchronizedSet(new HashSet<Long>());
100 + this.portProbeCount = new HashMap<>();
101 + this.lldpPacket = new ONOSLLDP();
102 + this.lldpPacket.setChassisId(device.chassisId());
103 + this.lldpPacket.setDevice(device.id().toString());
104 +
105 +
106 + this.ethPacket = new Ethernet();
107 + this.ethPacket.setEtherType(Ethernet.TYPE_LLDP);
108 + this.ethPacket.setDestinationMACAddress(ONOSLLDP.LLDP_NICIRA);
109 + this.ethPacket.setPayload(this.lldpPacket);
110 + this.ethPacket.setPad(true);
111 + this.useBDDP = useBDDP.length > 0 ? useBDDP[0] : false;
112 + if (this.useBDDP) {
113 + this.bddpEth = new Ethernet();
114 + this.bddpEth.setPayload(this.lldpPacket);
115 + this.bddpEth.setEtherType(Ethernet.TYPE_BSN);
116 + this.bddpEth.setDestinationMACAddress(ONOSLLDP.BDDP_MULTICAST);
117 + this.bddpEth.setPad(true);
118 + log.info("Using BDDP to discover network");
119 + }
120 +
121 + start();
122 + this.log.debug("Started discovery manager for switch {}",
123 + device.id());
124 +
125 + }
126 +
127 + /**
128 + * Add physical port port to discovery process.
129 + * Send out initial LLDP and label it as slow port.
130 + *
131 + * @param port the port
132 + */
133 + public void addPort(final Port port) {
134 + this.log.debug("sending init probe to port {}",
135 + port.number().toLong());
136 +
137 + sendProbes(port.number().toLong());
138 +
139 + synchronized (this) {
140 + this.slowPorts.add(port.number().toLong());
141 + }
142 +
143 +
144 + }
145 +
146 + /**
147 + * Removes physical port from discovery process.
148 + *
149 + * @param port the port
150 + */
151 + public void removePort(final Port port) {
152 + // Ignore ports that are not on this switch
153 +
154 + long portnum = port.number().toLong();
155 + synchronized (this) {
156 + if (this.slowPorts.contains(portnum)) {
157 + this.slowPorts.remove(portnum);
158 +
159 + } else if (this.fastPorts.contains(portnum)) {
160 + this.fastPorts.remove(portnum);
161 + this.portProbeCount.remove(portnum);
162 + // no iterator to update
163 + } else {
164 + this.log.warn(
165 + "tried to dynamically remove non-existing port {}",
166 + portnum);
167 + }
168 + }
169 + }
170 +
171 + /**
172 + * Method called by remote port to acknowledge receipt of LLDP sent by
173 + * this port. If slow port, updates label to fast. If fast port, decrements
174 + * number of unacknowledged probes.
175 + *
176 + * @param portNumber the port
177 + */
178 + public void ackProbe(final Long portNumber) {
179 +
180 + synchronized (this) {
181 + if (this.slowPorts.contains(portNumber)) {
182 + this.log.debug("Setting slow port to fast: {}:{}",
183 + this.device.id(), portNumber);
184 + this.slowPorts.remove(portNumber);
185 + this.fastPorts.add(portNumber);
186 + this.portProbeCount.put(portNumber, new AtomicInteger(0));
187 + } else {
188 + if (this.fastPorts.contains(portNumber)) {
189 + this.portProbeCount.get(portNumber).set(0);
190 + } else {
191 + this.log.debug(
192 + "Got ackProbe for non-existing port: {}",
193 + portNumber);
194 + }
195 + }
196 + }
197 + }
198 +
199 +
200 + /**
201 + * Handles an incoming LLDP packet. Creates link in topology and sends ACK
202 + * to port where LLDP originated.
203 + */
204 + public boolean handleLLDP(PacketContext context) {
205 + Ethernet eth = context.inPacket().parsed();
206 + ONOSLLDP onoslldp = ONOSLLDP.parseONOSLLDP(eth);
207 + if (onoslldp != null) {
208 + final PortNumber dstPort =
209 + context.inPacket().receivedFrom().port();
210 + final PortNumber srcPort = PortNumber.portNumber(onoslldp.getPort());
211 + final DeviceId srcDeviceId = DeviceId.deviceId(onoslldp.getDeviceString());
212 + final DeviceId dstDeviceId = context.inPacket().receivedFrom().deviceId();
213 + this.ackProbe(srcPort.toLong());
214 + ConnectPoint src = new ConnectPoint(srcDeviceId, srcPort);
215 + ConnectPoint dst = new ConnectPoint(dstDeviceId, dstPort);
216 +
217 + LinkDescription ld;
218 + if (eth.getEtherType() == Ethernet.TYPE_BSN) {
219 + ld = new DefaultLinkDescription(src, dst, Type.INDIRECT);
220 + } else {
221 + ld = new DefaultLinkDescription(src, dst, Type.DIRECT);
222 + }
223 + linkProvider.linkDetected(ld);
224 + return true;
225 + }
226 + return false;
227 + }
228 +
229 +
230 +
231 + /**
232 + * Execute this method every t milliseconds. Loops over all ports
233 + * labeled as fast and sends out an LLDP. Send out an LLDP on a single slow
234 + * port.
235 + *
236 + * @param t timeout
237 + * @throws Exception
238 + */
239 + @Override
240 + public void run(final Timeout t) {
241 + this.log.debug("sending probes");
242 + synchronized (this) {
243 + final Iterator<Long> fastIterator = this.fastPorts.iterator();
244 + Long portNumber;
245 + Integer probeCount;
246 + while (fastIterator.hasNext()) {
247 + portNumber = fastIterator.next();
248 + probeCount = this.portProbeCount.get(portNumber)
249 + .getAndIncrement();
250 +
251 + if (probeCount < LinkDiscovery.MAX_PROBE_COUNT) {
252 + this.log.debug("sending fast probe to port");
253 + sendProbes(portNumber);
254 + } else {
255 + // Update fast and slow ports
256 + //fastIterator.remove();
257 + //this.slowPorts.add(portNumber);
258 + //this.portProbeCount.remove(portNumber);
259 +
260 +
261 + ConnectPoint cp = new ConnectPoint(
262 + device.id(),
263 + PortNumber.portNumber(portNumber));
264 + log.debug("Link down -> {}", cp);
265 + linkProvider.linksVanished(cp);
266 + }
267 + }
268 +
269 + // send a probe for the next slow port
270 + if (!this.slowPorts.isEmpty()) {
271 + Iterator<Long> slowIterator = this.slowPorts.iterator();
272 + while (slowIterator.hasNext()) {
273 + portNumber = slowIterator.next();
274 + this.log.debug("sending slow probe to port {}", portNumber);
275 +
276 + sendProbes(portNumber);
277 +
278 + }
279 + }
280 + }
281 +
282 + // reschedule timer
283 + timeout = Timer.getTimer().newTimeout(this, this.probeRate,
284 + TimeUnit.MILLISECONDS);
285 + }
286 +
287 + public void stop() {
288 + timeout.cancel();
289 + }
290 +
291 + public void start() {
292 + timeout = Timer.getTimer().newTimeout(this, 0,
293 + TimeUnit.MILLISECONDS);
294 + }
295 +
296 + /**
297 + * Creates packet_out LLDP for specified output port.
298 + *
299 + * @param port the port
300 + * @return Packet_out message with LLDP data
301 + */
302 + private OutboundPacket createOutBoundLLDP(final Long port) {
303 + if (port == null) {
304 + return null;
305 + }
306 + this.lldpPacket.setPortId(port.intValue());
307 + this.ethPacket.setSourceMACAddress("DE:AD:BE:EF:BA:11");
308 +
309 + final byte[] lldp = this.ethPacket.serialize();
310 + OutboundPacket outboundPacket = new DefaultOutboundPacket(
311 + this.device.id(),
312 + DefaultTrafficTreatment.builder().setOutput(
313 + PortNumber.portNumber(port)).build(),
314 + ByteBuffer.wrap(lldp));
315 + return outboundPacket;
316 + }
317 +
318 + /**
319 + * Creates packet_out BDDP for specified output port.
320 + *
321 + * @param port the port
322 + * @return Packet_out message with LLDP data
323 + */
324 + private OutboundPacket createOutBoundBDDP(final Long port) {
325 + if (port == null) {
326 + return null;
327 + }
328 + this.lldpPacket.setPortId(port.intValue());
329 + this.bddpEth.setSourceMACAddress("DE:AD:BE:EF:BA:11");
330 +
331 + final byte[] bddp = this.bddpEth.serialize();
332 + OutboundPacket outboundPacket = new DefaultOutboundPacket(
333 + this.device.id(),
334 + DefaultTrafficTreatment.builder()
335 + .setOutput(PortNumber.portNumber(port)).build(),
336 + ByteBuffer.wrap(bddp));
337 + return outboundPacket;
338 + }
339 +
340 + private void sendProbes(Long portNumber) {
341 + OutboundPacket pkt = this.createOutBoundLLDP(portNumber);
342 + pktService.emit(pkt);
343 + if (useBDDP) {
344 + OutboundPacket bpkt = this.createOutBoundBDDP(portNumber);
345 + pktService.emit(bpkt);
346 + }
347 + }
348 +
349 +}
1 +/**
2 + * Provider that uses the core as a means of infrastructure link inference.
3 + */
4 +package org.onlab.onos.provider.lldp.impl;
...@@ -23,6 +23,7 @@ import org.onlab.onos.openflow.controller.OpenFlowController; ...@@ -23,6 +23,7 @@ import org.onlab.onos.openflow.controller.OpenFlowController;
23 import org.onlab.onos.openflow.controller.OpenFlowSwitch; 23 import org.onlab.onos.openflow.controller.OpenFlowSwitch;
24 import org.onlab.onos.openflow.controller.OpenFlowSwitchListener; 24 import org.onlab.onos.openflow.controller.OpenFlowSwitchListener;
25 import org.onlab.onos.openflow.controller.RoleState; 25 import org.onlab.onos.openflow.controller.RoleState;
26 +import org.onlab.packet.ChassisId;
26 import org.projectfloodlight.openflow.protocol.OFPortConfig; 27 import org.projectfloodlight.openflow.protocol.OFPortConfig;
27 import org.projectfloodlight.openflow.protocol.OFPortDesc; 28 import org.projectfloodlight.openflow.protocol.OFPortDesc;
28 import org.projectfloodlight.openflow.protocol.OFPortState; 29 import org.projectfloodlight.openflow.protocol.OFPortState;
...@@ -117,13 +118,14 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr ...@@ -117,13 +118,14 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr
117 } 118 }
118 DeviceId did = deviceId(uri(dpid)); 119 DeviceId did = deviceId(uri(dpid));
119 OpenFlowSwitch sw = controller.getSwitch(dpid); 120 OpenFlowSwitch sw = controller.getSwitch(dpid);
120 - 121 + ChassisId cId = new ChassisId(dpid.value());
121 DeviceDescription description = 122 DeviceDescription description =
122 new DefaultDeviceDescription(did.uri(), Device.Type.SWITCH, 123 new DefaultDeviceDescription(did.uri(), Device.Type.SWITCH,
123 sw.manfacturerDescription(), 124 sw.manfacturerDescription(),
124 sw.hardwareDescription(), 125 sw.hardwareDescription(),
125 sw.softwareDescription(), 126 sw.softwareDescription(),
126 - sw.serialNumber()); 127 + sw.serialNumber(),
128 + cId);
127 providerService.deviceConnected(did, description); 129 providerService.deviceConnected(did, description);
128 providerService.updatePorts(did, buildPortDescriptions(sw.getPorts())); 130 providerService.updatePorts(did, buildPortDescriptions(sw.getPorts()));
129 } 131 }
......
...@@ -59,7 +59,7 @@ public class OpenFlowDeviceProviderTest { ...@@ -59,7 +59,7 @@ public class OpenFlowDeviceProviderTest {
59 private static final List<OFPortDesc> PLIST = Lists.newArrayList(PD1, PD2); 59 private static final List<OFPortDesc> PLIST = Lists.newArrayList(PD1, PD2);
60 60
61 private static final Device DEV1 = 61 private static final Device DEV1 =
62 - new DefaultDevice(PID, DID1, SWITCH, "", "", "", ""); 62 + new DefaultDevice(PID, DID1, SWITCH, "", "", "", "", null);
63 63
64 private static final TestOpenFlowSwitch SW1 = new TestOpenFlowSwitch(); 64 private static final TestOpenFlowSwitch SW1 = new TestOpenFlowSwitch();
65 65
......
1 package org.onlab.onos.provider.of.flow.impl; 1 package org.onlab.onos.provider.of.flow.impl;
2 2
3 -import static org.slf4j.LoggerFactory.getLogger; 3 +import com.google.common.collect.ArrayListMultimap;
4 - 4 +import com.google.common.collect.Lists;
5 -import java.util.HashMap; 5 +import com.google.common.collect.Maps;
6 -import java.util.HashSet; 6 +import com.google.common.collect.Multimap;
7 -import java.util.List;
8 -import java.util.Map;
9 -import java.util.Set;
10 -import java.util.concurrent.ConcurrentHashMap;
11 -import java.util.concurrent.CountDownLatch;
12 -import java.util.concurrent.ExecutionException;
13 -import java.util.concurrent.Future;
14 -import java.util.concurrent.TimeUnit;
15 -import java.util.concurrent.TimeoutException;
16 -import java.util.concurrent.atomic.AtomicBoolean;
17 -
18 import org.apache.felix.scr.annotations.Activate; 7 import org.apache.felix.scr.annotations.Activate;
19 import org.apache.felix.scr.annotations.Component; 8 import org.apache.felix.scr.annotations.Component;
20 import org.apache.felix.scr.annotations.Deactivate; 9 import org.apache.felix.scr.annotations.Deactivate;
...@@ -68,10 +57,20 @@ import org.projectfloodlight.openflow.types.OFPort; ...@@ -68,10 +57,20 @@ import org.projectfloodlight.openflow.types.OFPort;
68 import org.projectfloodlight.openflow.types.U32; 57 import org.projectfloodlight.openflow.types.U32;
69 import org.slf4j.Logger; 58 import org.slf4j.Logger;
70 59
71 -import com.google.common.collect.ArrayListMultimap; 60 +import java.util.HashMap;
72 -import com.google.common.collect.Lists; 61 +import java.util.HashSet;
73 -import com.google.common.collect.Maps; 62 +import java.util.List;
74 -import com.google.common.collect.Multimap; 63 +import java.util.Map;
64 +import java.util.Set;
65 +import java.util.concurrent.ConcurrentHashMap;
66 +import java.util.concurrent.CountDownLatch;
67 +import java.util.concurrent.ExecutionException;
68 +import java.util.concurrent.Future;
69 +import java.util.concurrent.TimeUnit;
70 +import java.util.concurrent.TimeoutException;
71 +import java.util.concurrent.atomic.AtomicBoolean;
72 +
73 +import static org.slf4j.LoggerFactory.getLogger;
75 74
76 /** 75 /**
77 * Provider which uses an OpenFlow controller to detect network 76 * Provider which uses an OpenFlow controller to detect network
...@@ -166,6 +165,9 @@ public class OpenFlowRuleProvider extends AbstractProvider implements FlowRulePr ...@@ -166,6 +165,9 @@ public class OpenFlowRuleProvider extends AbstractProvider implements FlowRulePr
166 for (FlowRuleBatchEntry fbe : batch.getOperations()) { 165 for (FlowRuleBatchEntry fbe : batch.getOperations()) {
167 FlowRule flowRule = fbe.getTarget(); 166 FlowRule flowRule = fbe.getTarget();
168 OpenFlowSwitch sw = controller.getSwitch(Dpid.dpid(flowRule.deviceId().uri())); 167 OpenFlowSwitch sw = controller.getSwitch(Dpid.dpid(flowRule.deviceId().uri()));
168 + if (sw == null) {
169 + log.warn("WTF {}", flowRule.deviceId());
170 + }
169 sws.add(new Dpid(sw.getId())); 171 sws.add(new Dpid(sw.getId()));
170 FlowModBuilder builder = new FlowModBuilder(flowRule, sw.factory()); 172 FlowModBuilder builder = new FlowModBuilder(flowRule, sw.factory());
171 switch (fbe.getOperator()) { 173 switch (fbe.getOperator()) {
...@@ -322,6 +324,7 @@ public class OpenFlowRuleProvider extends AbstractProvider implements FlowRulePr ...@@ -322,6 +324,7 @@ public class OpenFlowRuleProvider extends AbstractProvider implements FlowRulePr
322 324
323 public void fail(OFErrorMsg msg, Dpid dpid) { 325 public void fail(OFErrorMsg msg, Dpid dpid) {
324 ok.set(false); 326 ok.set(false);
327 + removeRequirement(dpid);
325 FlowEntry fe = null; 328 FlowEntry fe = null;
326 FlowRuleBatchEntry fbe = fms.get(msg.getXid()); 329 FlowRuleBatchEntry fbe = fms.get(msg.getXid());
327 FlowRule offending = fbe.getTarget(); 330 FlowRule offending = fbe.getTarget();
...@@ -375,10 +378,7 @@ public class OpenFlowRuleProvider extends AbstractProvider implements FlowRulePr ...@@ -375,10 +378,7 @@ public class OpenFlowRuleProvider extends AbstractProvider implements FlowRulePr
375 378
376 public void satisfyRequirement(Dpid dpid) { 379 public void satisfyRequirement(Dpid dpid) {
377 log.warn("Satisfaction from switch {}", dpid); 380 log.warn("Satisfaction from switch {}", dpid);
378 - sws.remove(dpid); 381 + removeRequirement(dpid);
379 - countDownLatch.countDown();
380 - cleanUp();
381 -
382 } 382 }
383 383
384 384
...@@ -395,6 +395,7 @@ public class OpenFlowRuleProvider extends AbstractProvider implements FlowRulePr ...@@ -395,6 +395,7 @@ public class OpenFlowRuleProvider extends AbstractProvider implements FlowRulePr
395 395
396 @Override 396 @Override
397 public boolean cancel(boolean mayInterruptIfRunning) { 397 public boolean cancel(boolean mayInterruptIfRunning) {
398 + ok.set(false);
398 this.state = BatchState.CANCELLED; 399 this.state = BatchState.CANCELLED;
399 cleanUp(); 400 cleanUp();
400 for (FlowRuleBatchEntry fbe : fms.values()) { 401 for (FlowRuleBatchEntry fbe : fms.values()) {
...@@ -431,6 +432,7 @@ public class OpenFlowRuleProvider extends AbstractProvider implements FlowRulePr ...@@ -431,6 +432,7 @@ public class OpenFlowRuleProvider extends AbstractProvider implements FlowRulePr
431 throws InterruptedException, ExecutionException, 432 throws InterruptedException, ExecutionException,
432 TimeoutException { 433 TimeoutException {
433 if (countDownLatch.await(timeout, unit)) { 434 if (countDownLatch.await(timeout, unit)) {
435 +
434 this.state = BatchState.FINISHED; 436 this.state = BatchState.FINISHED;
435 return new CompletedBatchOperation(ok.get(), offendingFlowMods); 437 return new CompletedBatchOperation(ok.get(), offendingFlowMods);
436 } 438 }
...@@ -438,7 +440,7 @@ public class OpenFlowRuleProvider extends AbstractProvider implements FlowRulePr ...@@ -438,7 +440,7 @@ public class OpenFlowRuleProvider extends AbstractProvider implements FlowRulePr
438 } 440 }
439 441
440 private void cleanUp() { 442 private void cleanUp() {
441 - if (sws.isEmpty()) { 443 + if (isDone() || isCancelled()) {
442 pendingFutures.remove(pendingXid); 444 pendingFutures.remove(pendingXid);
443 for (Long xid : fms.keySet()) { 445 for (Long xid : fms.keySet()) {
444 pendingFMs.remove(xid); 446 pendingFMs.remove(xid);
...@@ -446,6 +448,12 @@ public class OpenFlowRuleProvider extends AbstractProvider implements FlowRulePr ...@@ -446,6 +448,12 @@ public class OpenFlowRuleProvider extends AbstractProvider implements FlowRulePr
446 } 448 }
447 } 449 }
448 450
451 + private void removeRequirement(Dpid dpid) {
452 + countDownLatch.countDown();
453 + sws.remove(dpid);
454 + cleanUp();
455 + }
456 +
449 } 457 }
450 458
451 } 459 }
......
...@@ -28,7 +28,6 @@ import org.onlab.onos.openflow.controller.OpenFlowController; ...@@ -28,7 +28,6 @@ import org.onlab.onos.openflow.controller.OpenFlowController;
28 import org.onlab.onos.openflow.controller.OpenFlowPacketContext; 28 import org.onlab.onos.openflow.controller.OpenFlowPacketContext;
29 import org.onlab.onos.openflow.controller.OpenFlowSwitch; 29 import org.onlab.onos.openflow.controller.OpenFlowSwitch;
30 import org.onlab.onos.openflow.controller.PacketListener; 30 import org.onlab.onos.openflow.controller.PacketListener;
31 -import org.onlab.packet.Ethernet;
32 import org.projectfloodlight.openflow.protocol.OFPacketOut; 31 import org.projectfloodlight.openflow.protocol.OFPacketOut;
33 import org.projectfloodlight.openflow.protocol.OFPortDesc; 32 import org.projectfloodlight.openflow.protocol.OFPortDesc;
34 import org.projectfloodlight.openflow.protocol.action.OFAction; 33 import org.projectfloodlight.openflow.protocol.action.OFAction;
...@@ -96,13 +95,13 @@ public class OpenFlowPacketProvider extends AbstractProvider implements PacketPr ...@@ -96,13 +95,13 @@ public class OpenFlowPacketProvider extends AbstractProvider implements PacketPr
96 return; 95 return;
97 } 96 }
98 97
99 - Ethernet eth = new Ethernet(); 98 + //Ethernet eth = new Ethernet();
100 - eth.deserialize(packet.data().array(), 0, packet.data().array().length); 99 + //eth.deserialize(packet.data().array(), 0, packet.data().array().length);
101 OFPortDesc p = null; 100 OFPortDesc p = null;
102 for (Instruction inst : packet.treatment().instructions()) { 101 for (Instruction inst : packet.treatment().instructions()) {
103 if (inst.type().equals(Instruction.Type.OUTPUT)) { 102 if (inst.type().equals(Instruction.Type.OUTPUT)) {
104 p = portDesc(((OutputInstruction) inst).port()); 103 p = portDesc(((OutputInstruction) inst).port());
105 - OFPacketOut po = packetOut(sw, eth, p.getPortNo()); 104 + OFPacketOut po = packetOut(sw, packet.data().array(), p.getPortNo());
106 sw.sendMsg(po); 105 sw.sendMsg(po);
107 } 106 }
108 } 107 }
...@@ -116,7 +115,7 @@ public class OpenFlowPacketProvider extends AbstractProvider implements PacketPr ...@@ -116,7 +115,7 @@ public class OpenFlowPacketProvider extends AbstractProvider implements PacketPr
116 return builder.build(); 115 return builder.build();
117 } 116 }
118 117
119 - private OFPacketOut packetOut(OpenFlowSwitch sw, Ethernet eth, OFPort out) { 118 + private OFPacketOut packetOut(OpenFlowSwitch sw, byte[] eth, OFPort out) {
120 OFPacketOut.Builder builder = sw.factory().buildPacketOut(); 119 OFPacketOut.Builder builder = sw.factory().buildPacketOut();
121 OFAction act = sw.factory().actions() 120 OFAction act = sw.factory().actions()
122 .buildOutput() 121 .buildOutput()
...@@ -126,7 +125,7 @@ public class OpenFlowPacketProvider extends AbstractProvider implements PacketPr ...@@ -126,7 +125,7 @@ public class OpenFlowPacketProvider extends AbstractProvider implements PacketPr
126 .setBufferId(OFBufferId.NO_BUFFER) 125 .setBufferId(OFBufferId.NO_BUFFER)
127 .setInPort(OFPort.NO_MASK) 126 .setInPort(OFPort.NO_MASK)
128 .setActions(Collections.singletonList(act)) 127 .setActions(Collections.singletonList(act))
129 - .setData(eth.serialize()) 128 + .setData(eth)
130 .build(); 129 .build();
131 } 130 }
132 131
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
18 18
19 <modules> 19 <modules>
20 <module>openflow</module> 20 <module>openflow</module>
21 + <module>lldp</module>
21 </modules> 22 </modules>
22 23
23 <dependencies> 24 <dependencies>
......
...@@ -2,5 +2,5 @@ ...@@ -2,5 +2,5 @@
2 2
3 export ONOS_FEATURES="webconsole,onos-api,onos-core-trivial,onos-cli,onos-openflow,onos-app-fwd,onos-app-mobility,onos-app-tvue,onos-app-proxyarp" 3 export ONOS_FEATURES="webconsole,onos-api,onos-core-trivial,onos-cli,onos-openflow,onos-app-fwd,onos-app-mobility,onos-app-tvue,onos-app-proxyarp"
4 4
5 -export ONOS_NIC="10.128.4.*" 5 +export ONOS_NIC="10.1.10.*"
6 -export OC1="10.128.4.60" 6 +export OC1="10.1.10.223"
......
1 +package org.onlab.packet;
2 +
3 +/**
4 + * The class representing a network device chassisId.
5 + * This class is immutable.
6 + */
7 +// TODO: Move this to a reasonable place.
8 +public final class ChassisId {
9 +
10 + private static final long UNKNOWN = 0;
11 + private final long value;
12 +
13 + /**
14 + * Default constructor.
15 + */
16 + public ChassisId() {
17 + this.value = ChassisId.UNKNOWN;
18 + }
19 +
20 + /**
21 + * Constructor from a long value.
22 + *
23 + * @param value the value to use.
24 + */
25 + public ChassisId(long value) {
26 + this.value = value;
27 + }
28 +
29 + /**
30 + * Constructor from a string.
31 + *
32 + * @param value the value to use.
33 + */
34 + public ChassisId(String value) {
35 + this.value = Long.valueOf(value);
36 + }
37 +
38 + /**
39 + * Get the value of the chassis id.
40 + *
41 + * @return the value of the chassis id.
42 + */
43 + public long value() {
44 + return value;
45 + }
46 +
47 + /**
48 + * Convert the Chassis Id value to a ':' separated hexadecimal string.
49 + *
50 + * @return the Chassis Id value as a ':' separated hexadecimal string.
51 + */
52 + @Override
53 + public String toString() {
54 + return Long.toHexString(this.value);
55 + }
56 +
57 + @Override
58 + public boolean equals(Object other) {
59 + if (!(other instanceof ChassisId)) {
60 + return false;
61 + }
62 +
63 + ChassisId otherChassisId = (ChassisId) other;
64 +
65 + return value == otherChassisId.value;
66 + }
67 +
68 + @Override
69 + public int hashCode() {
70 + int hash = 17;
71 + hash += 31 * hash + (int) (value ^ value >>> 32);
72 + return hash;
73 + }
74 +}
...@@ -58,6 +58,7 @@ public class Ethernet extends BasePacket { ...@@ -58,6 +58,7 @@ public class Ethernet extends BasePacket {
58 Ethernet.etherTypeClassMap.put(Ethernet.TYPE_RARP, ARP.class); 58 Ethernet.etherTypeClassMap.put(Ethernet.TYPE_RARP, ARP.class);
59 Ethernet.etherTypeClassMap.put(Ethernet.TYPE_IPV4, IPv4.class); 59 Ethernet.etherTypeClassMap.put(Ethernet.TYPE_IPV4, IPv4.class);
60 Ethernet.etherTypeClassMap.put(Ethernet.TYPE_LLDP, LLDP.class); 60 Ethernet.etherTypeClassMap.put(Ethernet.TYPE_LLDP, LLDP.class);
61 + Ethernet.etherTypeClassMap.put(Ethernet.TYPE_BSN, LLDP.class);
61 } 62 }
62 63
63 protected MacAddress destinationMACAddress; 64 protected MacAddress destinationMACAddress;
......
...@@ -150,7 +150,7 @@ public class LLDP extends BasePacket { ...@@ -150,7 +150,7 @@ public class LLDP extends BasePacket {
150 final ByteBuffer bb = ByteBuffer.wrap(data, offset, length); 150 final ByteBuffer bb = ByteBuffer.wrap(data, offset, length);
151 LLDPTLV tlv; 151 LLDPTLV tlv;
152 do { 152 do {
153 - tlv = new LLDPTLV().deserialize(bb); 153 + tlv = new LLDPOrganizationalTLV().deserialize(bb);
154 154
155 // if there was a failure to deserialize stop processing TLVs 155 // if there was a failure to deserialize stop processing TLVs
156 if (tlv == null) { 156 if (tlv == null) {
...@@ -169,6 +169,7 @@ public class LLDP extends BasePacket { ...@@ -169,6 +169,7 @@ public class LLDP extends BasePacket {
169 case 0x3: 169 case 0x3:
170 this.ttl = tlv; 170 this.ttl = tlv;
171 break; 171 break;
172 +
172 default: 173 default:
173 this.optionalTLVList.add(tlv); 174 this.optionalTLVList.add(tlv);
174 break; 175 break;
......
...@@ -140,6 +140,9 @@ public class LLDPOrganizationalTLV extends LLDPTLV { ...@@ -140,6 +140,9 @@ public class LLDPOrganizationalTLV extends LLDPTLV {
140 140
141 @Override 141 @Override
142 public byte[] serialize() { 142 public byte[] serialize() {
143 + if (this.type != LLDPOrganizationalTLV.ORGANIZATIONAL_TLV_TYPE) {
144 + return super.serialize();
145 + }
143 final int valueLength = LLDPOrganizationalTLV.OUI_LENGTH 146 final int valueLength = LLDPOrganizationalTLV.OUI_LENGTH
144 + LLDPOrganizationalTLV.SUBTYPE_LENGTH + this.infoString.length; 147 + LLDPOrganizationalTLV.SUBTYPE_LENGTH + this.infoString.length;
145 this.value = new byte[valueLength]; 148 this.value = new byte[valueLength];
...@@ -152,7 +155,11 @@ public class LLDPOrganizationalTLV extends LLDPTLV { ...@@ -152,7 +155,11 @@ public class LLDPOrganizationalTLV extends LLDPTLV {
152 155
153 @Override 156 @Override
154 public LLDPTLV deserialize(final ByteBuffer bb) { 157 public LLDPTLV deserialize(final ByteBuffer bb) {
155 - super.deserialize(bb); 158 + LLDPTLV tlv = super.deserialize(bb);
159 + if (tlv.getType() != LLDPOrganizationalTLV.ORGANIZATIONAL_TLV_TYPE) {
160 + return tlv;
161 + }
162 +
156 final ByteBuffer optionalField = ByteBuffer.wrap(this.value); 163 final ByteBuffer optionalField = ByteBuffer.wrap(this.value);
157 164
158 final byte[] oui = new byte[LLDPOrganizationalTLV.OUI_LENGTH]; 165 final byte[] oui = new byte[LLDPOrganizationalTLV.OUI_LENGTH];
......
...@@ -111,6 +111,7 @@ public class LLDPTLV { ...@@ -111,6 +111,7 @@ public class LLDPTLV {
111 sscratch = bb.getShort(); 111 sscratch = bb.getShort();
112 this.type = (byte) (sscratch >> 9 & 0x7f); 112 this.type = (byte) (sscratch >> 9 & 0x7f);
113 this.length = (short) (sscratch & 0x1ff); 113 this.length = (short) (sscratch & 0x1ff);
114 +
114 if (this.length > 0) { 115 if (this.length > 0) {
115 this.value = new byte[this.length]; 116 this.value = new byte[this.length];
116 117
...@@ -120,6 +121,7 @@ public class LLDPTLV { ...@@ -120,6 +121,7 @@ public class LLDPTLV {
120 } 121 }
121 bb.get(this.value); 122 bb.get(this.value);
122 } 123 }
124 +
123 return this; 125 return this;
124 } 126 }
125 127
......
...@@ -30,6 +30,7 @@ import org.slf4j.LoggerFactory; ...@@ -30,6 +30,7 @@ import org.slf4j.LoggerFactory;
30 * Refer to IEEE Std 802.1ABTM-2009 for more information. 30 * Refer to IEEE Std 802.1ABTM-2009 for more information.
31 * 31 *
32 */ 32 */
33 +@Deprecated
33 public class ONLabLddp extends LLDP { 34 public class ONLabLddp extends LLDP {
34 35
35 private static final Logger LOG = LoggerFactory.getLogger(ONLabLddp.class); 36 private static final Logger LOG = LoggerFactory.getLogger(ONLabLddp.class);
......
1 +package org.onlab.packet;
2 +
3 +import com.google.common.collect.Lists;
4 +import org.apache.commons.lang.ArrayUtils;
5 +
6 +import java.nio.ByteBuffer;
7 +
8 +/**
9 + * ONOS LLDP containing organizational TLV for ONOS device dicovery.
10 + */
11 +public class ONOSLLDP extends LLDP {
12 +
13 + public static final byte[] ONLAB_OUI = {(byte) 0xa4, 0x23, 0x05};
14 + public static final String DEFAULT_DEVICE = "INVALID";
15 + public static final String DEFAULT_NAME = "ONOS Discovery";
16 +
17 + public static final byte[] LLDP_NICIRA = {0x01, 0x23, 0x20, 0x00, 0x00,
18 + 0x01};
19 + public static final byte[] LLDP_MULTICAST = {0x01, (byte) 0x80,
20 + (byte) 0xc2, 0x00, 0x00, 0x0e};
21 + public static final byte[] BDDP_MULTICAST = {(byte) 0xff, (byte) 0xff,
22 + (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff};
23 +
24 + private static final byte NAME_SUBTYPE = 1;
25 + private static final byte DEVICE_SUBTYPE = 2;
26 + private static final short NAME_LENGTH = 4; //1 for subtype + 3 for OUI
27 + private static final short DEVICE_LENGTH = 4; //1 for subtype + 3 for OUI
28 + private final LLDPOrganizationalTLV nameTLV = new LLDPOrganizationalTLV();
29 + private final LLDPOrganizationalTLV deviceTLV = new LLDPOrganizationalTLV();
30 +
31 + // TLV constants: type, size and subtype
32 + // Organizationally specific TLV also have packet offset and contents of TLV
33 + // header
34 + private static final byte CHASSIS_TLV_TYPE = 1;
35 + private static final byte CHASSIS_TLV_SIZE = 7;
36 + private static final byte CHASSIS_TLV_SUBTYPE = 4;
37 +
38 + private static final byte PORT_TLV_TYPE = 2;
39 + private static final byte PORT_TLV_SIZE = 5;
40 + private static final byte PORT_TLV_SUBTYPE = 2;
41 +
42 + private static final byte TTL_TLV_TYPE = 3;
43 +
44 +
45 + private final byte[] ttlValue = new byte[] {0, 0x78};
46 +
47 + public ONOSLLDP() {
48 + super();
49 + setName(DEFAULT_NAME);
50 + setDevice(DEFAULT_DEVICE);
51 + setOptionalTLVList(Lists.<LLDPTLV>newArrayList(nameTLV, deviceTLV));
52 + setTtl(new LLDPTLV().setType((byte) TTL_TLV_TYPE)
53 + .setLength((short) ttlValue.length)
54 + .setValue(ttlValue));
55 +
56 + }
57 +
58 + private ONOSLLDP(LLDP lldp) {
59 + this.portId = lldp.getPortId();
60 + this.chassisId = lldp.getChassisId();
61 + this.ttl = lldp.getTtl();
62 + this.optionalTLVList = lldp.getOptionalTLVList();
63 + }
64 +
65 + public void setName(String name) {
66 + nameTLV.setLength((short) (name.length() + NAME_LENGTH));
67 + nameTLV.setInfoString(name);
68 + nameTLV.setSubType(NAME_SUBTYPE);
69 + nameTLV.setOUI(ONLAB_OUI);
70 + }
71 +
72 + public void setDevice(String device) {
73 + deviceTLV.setInfoString(device);
74 + deviceTLV.setLength((short) (device.length() + DEVICE_LENGTH));
75 + deviceTLV.setSubType(DEVICE_SUBTYPE);
76 + deviceTLV.setOUI(ONLAB_OUI);
77 + }
78 +
79 + public void setChassisId(final ChassisId chassisId) {
80 + MacAddress chassisMac = MacAddress.valueOf(chassisId.value());
81 + byte[] chassis = ArrayUtils.addAll(new byte[] {CHASSIS_TLV_SUBTYPE},
82 + chassisMac.getAddress());
83 +
84 + LLDPTLV chassisTLV = new LLDPTLV();
85 + chassisTLV.setLength(CHASSIS_TLV_SIZE);
86 + chassisTLV.setType(CHASSIS_TLV_TYPE);
87 + chassisTLV.setValue(chassis);
88 + this.setChassisId(chassisTLV);
89 + }
90 +
91 + public void setPortId(final int portNumber) {
92 + byte[] port = ArrayUtils.addAll(new byte[] {PORT_TLV_SUBTYPE},
93 + ByteBuffer.allocate(4).putInt(portNumber).array());
94 +
95 + LLDPTLV portTLV = new LLDPTLV();
96 + portTLV.setLength(PORT_TLV_SIZE);
97 + portTLV.setType(PORT_TLV_TYPE);
98 + portTLV.setValue(port);
99 + this.setPortId(portTLV);
100 + }
101 +
102 + public LLDPOrganizationalTLV getNameTLV() {
103 + for (LLDPTLV tlv : this.getOptionalTLVList()) {
104 + if (tlv.getType() == LLDPOrganizationalTLV.ORGANIZATIONAL_TLV_TYPE) {
105 + LLDPOrganizationalTLV orgTLV = (LLDPOrganizationalTLV) tlv;
106 + if (orgTLV.getSubType() == NAME_SUBTYPE) {
107 + return orgTLV;
108 + }
109 + }
110 + }
111 + return null;
112 + }
113 +
114 + public LLDPOrganizationalTLV getDeviceTLV() {
115 + for (LLDPTLV tlv : this.getOptionalTLVList()) {
116 + if (tlv.getType() == LLDPOrganizationalTLV.ORGANIZATIONAL_TLV_TYPE) {
117 + LLDPOrganizationalTLV orgTLV = (LLDPOrganizationalTLV) tlv;
118 + if (orgTLV.getSubType() == DEVICE_SUBTYPE) {
119 + return orgTLV;
120 + }
121 + }
122 + }
123 + return null;
124 + }
125 +
126 + public String getNameString() {
127 + LLDPOrganizationalTLV tlv = getNameTLV();
128 + if (tlv != null) {
129 + return new String(tlv.getInfoString());
130 + }
131 + return null;
132 + }
133 +
134 + public String getDeviceString() {
135 + LLDPOrganizationalTLV tlv = getDeviceTLV();
136 + if (tlv != null) {
137 + return new String(tlv.getInfoString());
138 + }
139 + return null;
140 + }
141 +
142 + public Integer getPort() {
143 + ByteBuffer portBB = ByteBuffer.wrap(this.getPortId().getValue());
144 + portBB.position(1);
145 + return portBB.getInt();
146 + }
147 +
148 + /**
149 + * Given an ethernet packet, determines if this is an LLDP from
150 + * ONOS and returns the device the LLDP came from.
151 + * @param eth an ethernet packet
152 + * @return a the lldp packet or null
153 + */
154 + public static ONOSLLDP parseONOSLLDP(Ethernet eth) {
155 + if (eth.getEtherType() == Ethernet.TYPE_LLDP ||
156 + eth.getEtherType() == Ethernet.TYPE_BSN) {
157 + ONOSLLDP onosLldp = new ONOSLLDP((LLDP) eth.getPayload()); //(ONOSLLDP) eth.getPayload();
158 + if (ONOSLLDP.DEFAULT_NAME.equals(onosLldp.getNameString())) {
159 + return onosLldp;
160 + }
161 + }
162 + return null;
163 + }
164 +
165 +
166 +
167 +
168 +
169 +}