tom

Merge remote-tracking branch 'origin/master'

Showing 22 changed files with 209 additions and 25 deletions
...@@ -20,6 +20,18 @@ public final class Criteria { ...@@ -20,6 +20,18 @@ public final class Criteria {
20 return null; 20 return null;
21 } 21 }
22 22
23 + /**
24 + * Creates a match on ETH_DST field using the specified value. This value
25 + * may be a wildcard mask.
26 + *
27 + * @param macValue MAC address value or wildcard mask
28 + * @return match criterion
29 + */
30 + public static Criterion matchEthDst(MACValue macValue) {
31 + return null;
32 + }
33 +
34 +
23 // Dummy to illustrate the concept for now; delete ASAP 35 // Dummy to illustrate the concept for now; delete ASAP
24 private static class MACValue { } 36 private static class MACValue { }
25 } 37 }
......
...@@ -2,14 +2,14 @@ package org.onlab.onos.net.flow; ...@@ -2,14 +2,14 @@ package org.onlab.onos.net.flow;
2 2
3 import org.onlab.onos.net.DeviceId; 3 import org.onlab.onos.net.DeviceId;
4 4
5 -import java.util.List;
6 -
7 /** 5 /**
8 * Represents a generalized match & action pair to be applied to 6 * Represents a generalized match & action pair to be applied to
9 * an infrastucture device. 7 * an infrastucture device.
10 */ 8 */
11 public interface FlowRule { 9 public interface FlowRule {
12 10
11 + //TODO: build cookie value
12 +
13 /** 13 /**
14 * Returns the flow rule priority given in natural order; higher numbers 14 * Returns the flow rule priority given in natural order; higher numbers
15 * mean higher priorities. 15 * mean higher priorities.
...@@ -38,6 +38,6 @@ public interface FlowRule { ...@@ -38,6 +38,6 @@ public interface FlowRule {
38 * 38 *
39 * @return traffic treatment 39 * @return traffic treatment
40 */ 40 */
41 - List<Treatment> treatments(); 41 + TrafficTreatment treatment();
42 42
43 } 43 }
......
...@@ -22,4 +22,11 @@ public interface FlowRuleProviderService extends ProviderService<FlowRuleProvide ...@@ -22,4 +22,11 @@ public interface FlowRuleProviderService extends ProviderService<FlowRuleProvide
22 */ 22 */
23 void flowMissing(FlowRule flowRule); 23 void flowMissing(FlowRule flowRule);
24 24
25 + /**
26 + * Signals that a flow rule was indeed added.
27 + *
28 + * @param flowRule the added flow rule
29 + */
30 + void flowAdded(FlowRule flowRule);
31 +
25 } 32 }
......
...@@ -26,6 +26,15 @@ public interface FlowRuleService { ...@@ -26,6 +26,15 @@ public interface FlowRuleService {
26 void applyFlowRules(FlowRule... flowRules); 26 void applyFlowRules(FlowRule... flowRules);
27 27
28 /** 28 /**
29 + * Removes the specified flow rules from their respective devices.
30 + *
31 + * @param flowRules one or more flow rules
32 + * throws SomeKindOfException that indicates which ones were removed and
33 + * which ones failed
34 + */
35 + void removeFlowRules(FlowRule... flowRules);
36 +
37 + /**
29 * Adds the specified flow rule listener. 38 * Adds the specified flow rule listener.
30 * 39 *
31 * @param listener flow rule listener 40 * @param listener flow rule listener
......
...@@ -24,8 +24,9 @@ public interface TrafficSelector { ...@@ -24,8 +24,9 @@ public interface TrafficSelector {
24 * already been added, it will be replaced by this one. 24 * already been added, it will be replaced by this one.
25 * 25 *
26 * @param criterion new criterion 26 * @param criterion new criterion
27 + * @return self
27 */ 28 */
28 - void add(Criterion criterion); 29 + Builder add(Criterion criterion);
29 30
30 /** 31 /**
31 * Builds an immutable traffic selector. 32 * Builds an immutable traffic selector.
......
...@@ -25,7 +25,7 @@ public interface TrafficTreatment { ...@@ -25,7 +25,7 @@ public interface TrafficTreatment {
25 * 25 *
26 * @param instruction new instruction 26 * @param instruction new instruction
27 */ 27 */
28 - void add(Instruction instruction); 28 + Builder add(Instruction instruction);
29 29
30 /** 30 /**
31 * Builds an immutable traffic treatment descriptor. 31 * Builds an immutable traffic treatment descriptor.
......
1 +package org.onlab.onos.net.packet;
2 +
3 +
4 +public abstract class DefaultPacketContext implements PacketContext {
5 +
6 + private final long time;
7 + private final InboundPacket inPkt;
8 + private final OutboundPacket outPkt;
9 + private boolean block = false;
10 +
11 + protected DefaultPacketContext(long time, InboundPacket inPkt,
12 + OutboundPacket outPkt, boolean block) {
13 + super();
14 + this.time = time;
15 + this.inPkt = inPkt;
16 + this.outPkt = outPkt;
17 + this.block = block;
18 + }
19 +
20 + @Override
21 + public long time() {
22 + return time;
23 + }
24 +
25 + @Override
26 + public InboundPacket inPacket() {
27 + return inPkt;
28 + }
29 +
30 + @Override
31 + public OutboundPacket outPacket() {
32 + return outPkt;
33 + }
34 +
35 + @Override
36 + public abstract void send();
37 +
38 + @Override
39 + public void block() {
40 + this.block = true;
41 + }
42 +
43 + @Override
44 + public boolean isHandled() {
45 + return this.block;
46 + }
47 +
48 +}
1 package org.onlab.onos.net.packet; 1 package org.onlab.onos.net.packet;
2 2
3 +
4 +
3 /** 5 /**
4 * Abstraction of an inbound packet processor. 6 * Abstraction of an inbound packet processor.
5 */ 7 */
6 public interface PacketProcessor { 8 public interface PacketProcessor {
7 9
10 + public static final int ADVISOR_MAX = Integer.MAX_VALUE / 3;
11 + public static final int DIRECTOR_MAX = (Integer.MAX_VALUE / 3) * 2;
12 + public static final int OBSERVER_MAX = Integer.MAX_VALUE;
13 +
8 /** 14 /**
9 * Processes the inbound packet as specified in the given context. 15 * Processes the inbound packet as specified in the given context.
10 * 16 *
......
1 package org.onlab.onos.net.packet; 1 package org.onlab.onos.net.packet;
2 2
3 +import org.onlab.onos.net.provider.Provider;
4 +
3 /** 5 /**
4 * Abstraction of a packet provider capable of emitting packets. 6 * Abstraction of a packet provider capable of emitting packets.
5 */ 7 */
6 -public interface PacketProvider { 8 +public interface PacketProvider extends Provider {
7 9
8 /** 10 /**
9 * Emits the specified outbound packet onto the network. 11 * Emits the specified outbound packet onto the network.
......
1 +package org.onlab.onos.net.packet;
2 +
3 +import org.onlab.onos.net.provider.ProviderRegistry;
4 +
5 +/**
6 + * Abstraction of an infrastructure packet provider registry.
7 + */
8 +public interface PacketProviderRegistry
9 +extends ProviderRegistry<PacketProvider, PacketProviderService> {
10 +}
1 package org.onlab.onos.net.packet; 1 package org.onlab.onos.net.packet;
2 2
3 +import org.onlab.onos.net.provider.ProviderService;
4 +
3 /** 5 /**
4 * Entity capable of processing inbound packets. 6 * Entity capable of processing inbound packets.
5 */ 7 */
6 -public interface PacketProviderService { 8 +public interface PacketProviderService extends ProviderService<PacketProvider> {
7 9
8 /** 10 /**
9 * Submits inbound packet context for processing. This processing will be 11 * Submits inbound packet context for processing. This processing will be
......
...@@ -18,7 +18,7 @@ public interface PacketService { ...@@ -18,7 +18,7 @@ public interface PacketService {
18 * @throws java.lang.IllegalArgumentException if a processor with the 18 * @throws java.lang.IllegalArgumentException if a processor with the
19 * given priority already exists 19 * given priority already exists
20 */ 20 */
21 - void addProcessor(PacketProcessor processor, long priority); 21 + void addProcessor(PacketProcessor processor, int priority);
22 22
23 /** 23 /**
24 * Removes the specified processor from the processing pipeline. 24 * Removes the specified processor from the processing pipeline.
......
1 +package org.onlab.onos.net;
2 +
3 +import static org.junit.Assert.assertEquals;
4 +
5 +import org.junit.Test;
6 +
7 +import com.google.common.testing.EqualsTester;
8 +
9 +public class DefaultHostTest extends TestDeviceParams {
10 +
11 + @Test
12 + public void testEquality() {
13 + Host h1 = new DefaultHost(PID, HID1, MAC1, VLAN1, LOC1, IPSET1);
14 + Host h2 = new DefaultHost(PID, HID1, MAC1, VLAN1, LOC1, IPSET1);
15 + Host h3 = new DefaultHost(PID, HID2, MAC2, VLAN2, LOC2, IPSET2);
16 + Host h4 = new DefaultHost(PID, HID2, MAC2, VLAN2, LOC2, IPSET2);
17 + Host h5 = new DefaultHost(PID, HID2, MAC2, VLAN1, LOC2, IPSET1);
18 +
19 + new EqualsTester().addEqualityGroup(h1, h2)
20 + .addEqualityGroup(h3, h4)
21 + .addEqualityGroup(h5)
22 + .testEquals();
23 + }
24 +
25 + @Test
26 + public void basics() {
27 + Host host = new DefaultHost(PID, HID1, MAC1, VLAN1, LOC1, IPSET1);
28 + assertEquals("incorrect provider", PID, host.providerId());
29 + assertEquals("incorrect id", HID1, host.id());
30 + assertEquals("incorrect type", MAC1, host.mac());
31 + assertEquals("incorrect VLAN", VLAN1, host.vlan());
32 + assertEquals("incorrect location", LOC1, host.location());
33 + assertEquals("incorrect IP's", IPSET1, host.ipAddresses());
34 + }
35 +
36 +}
1 package org.onlab.onos.net; 1 package org.onlab.onos.net;
2 2
3 import com.google.common.testing.EqualsTester; 3 import com.google.common.testing.EqualsTester;
4 +
4 import org.junit.Test; 5 import org.junit.Test;
6 +import org.onlab.packet.MACAddress;
7 +import org.onlab.packet.VLANID;
5 8
6 import static org.onlab.onos.net.HostId.hostId; 9 import static org.onlab.onos.net.HostId.hostId;
7 10
8 /** 11 /**
9 - * Test of the host identifier. 12 + * Test for the host identifier.
10 */ 13 */
11 public class HostIdTest extends ElementIdTest { 14 public class HostIdTest extends ElementIdTest {
12 15
16 + private static final MACAddress MAC1 = MACAddress.valueOf("00:11:00:00:00:01");
17 + private static final MACAddress MAC2 = MACAddress.valueOf("00:22:00:00:00:02");
18 + private static final VLANID VLAN1 = VLANID.vlanId((short) 11);
19 + private static final VLANID VLAN2 = VLANID.vlanId((short) 22);
20 +
21 + @Override
13 @Test 22 @Test
14 public void basics() { 23 public void basics() {
15 new EqualsTester() 24 new EqualsTester()
16 - .addEqualityGroup(hostId("nic:foo"), 25 + .addEqualityGroup(hostId("nic:00:11:00:00:00:01/11"),
17 - hostId("nic:foo")) 26 + hostId(MAC1, VLAN1))
18 - .addEqualityGroup(hostId("nic:bar")) 27 + .addEqualityGroup(hostId(MAC2, VLAN2))
19 .testEquals(); 28 .testEquals();
20 } 29 }
21 30
......
1 +package org.onlab.onos.net;
2 +
3 +import static org.onlab.onos.net.DeviceId.deviceId;
4 +
5 +import java.util.Set;
6 +
7 +import org.onlab.onos.net.provider.ProviderId;
8 +import org.onlab.packet.IPAddress;
9 +import org.onlab.packet.MACAddress;
10 +import org.onlab.packet.VLANID;
11 +
12 +import com.google.common.collect.Sets;
13 +
14 +/**
15 + * Provides a set of test DefaultDevice parameters for use with Host-
16 + * related tests.
17 + */
18 +public abstract class TestDeviceParams {
19 +
20 + protected static final ProviderId PID = new ProviderId("foo");
21 + protected static final DeviceId DID1 = deviceId("of:foo");
22 + protected static final DeviceId DID2 = deviceId("of:bar");
23 + protected static final MACAddress MAC1 = MACAddress.valueOf("00:11:00:00:00:01");
24 + protected static final MACAddress MAC2 = MACAddress.valueOf("00:22:00:00:00:02");
25 + protected static final VLANID VLAN1 = VLANID.vlanId((short) 11);
26 + protected static final VLANID VLAN2 = VLANID.vlanId((short) 22);
27 + protected static final IPAddress IP1 = IPAddress.valueOf("10.0.0.1");
28 + protected static final IPAddress IP2 = IPAddress.valueOf("10.0.0.2");
29 + protected static final IPAddress IP3 = IPAddress.valueOf("10.0.0.3");
30 +
31 + protected static final PortNumber P1 = PortNumber.portNumber(100);
32 + protected static final PortNumber P2 = PortNumber.portNumber(200);
33 + protected static final HostId HID1 = HostId.hostId(MAC1, VLAN1);
34 + protected static final HostId HID2 = HostId.hostId(MAC2, VLAN2);
35 + protected static final HostLocation LOC1 = new HostLocation(DID1, P1, 123L);
36 + protected static final HostLocation LOC2 = new HostLocation(DID2, P2, 123L);
37 + protected static final Set<IPAddress> IPSET1 = Sets.newHashSet(IP1, IP2);
38 + protected static final Set<IPAddress> IPSET2 = Sets.newHashSet(IP1, IP3);
39 +
40 +}
...@@ -11,7 +11,7 @@ import org.projectfloodlight.openflow.protocol.match.MatchField; ...@@ -11,7 +11,7 @@ import org.projectfloodlight.openflow.protocol.match.MatchField;
11 import org.projectfloodlight.openflow.types.OFBufferId; 11 import org.projectfloodlight.openflow.types.OFBufferId;
12 import org.projectfloodlight.openflow.types.OFPort; 12 import org.projectfloodlight.openflow.types.OFPort;
13 13
14 -public final class DefaultPacketContext implements PacketContext { 14 +public final class DefaultOpenFlowPacketContext implements OpenFlowPacketContext {
15 15
16 private boolean free = true; 16 private boolean free = true;
17 private boolean isBuilt = false; 17 private boolean isBuilt = false;
...@@ -19,7 +19,7 @@ public final class DefaultPacketContext implements PacketContext { ...@@ -19,7 +19,7 @@ public final class DefaultPacketContext implements PacketContext {
19 private final OFPacketIn pktin; 19 private final OFPacketIn pktin;
20 private OFPacketOut pktout = null; 20 private OFPacketOut pktout = null;
21 21
22 - private DefaultPacketContext(OpenFlowSwitch s, OFPacketIn pkt) { 22 + private DefaultOpenFlowPacketContext(OpenFlowSwitch s, OFPacketIn pkt) {
23 this.sw = s; 23 this.sw = s;
24 this.pktin = pkt; 24 this.pktin = pkt;
25 } 25 }
...@@ -78,8 +78,8 @@ public final class DefaultPacketContext implements PacketContext { ...@@ -78,8 +78,8 @@ public final class DefaultPacketContext implements PacketContext {
78 return new Dpid(sw.getId()); 78 return new Dpid(sw.getId());
79 } 79 }
80 80
81 - public static PacketContext packetContextFromPacketIn(OpenFlowSwitch s, OFPacketIn pkt) { 81 + public static OpenFlowPacketContext packetContextFromPacketIn(OpenFlowSwitch s, OFPacketIn pkt) {
82 - return new DefaultPacketContext(s, pkt); 82 + return new DefaultOpenFlowPacketContext(s, pkt);
83 } 83 }
84 84
85 @Override 85 @Override
......
...@@ -8,7 +8,7 @@ import org.projectfloodlight.openflow.types.OFPort; ...@@ -8,7 +8,7 @@ import org.projectfloodlight.openflow.types.OFPort;
8 * to view the packet in event but may block the response to the 8 * to view the packet in event but may block the response to the
9 * event if blocked has been called. 9 * event if blocked has been called.
10 */ 10 */
11 -public interface PacketContext { 11 +public interface OpenFlowPacketContext {
12 12
13 //TODO: may want to support sending packet out other switches than 13 //TODO: may want to support sending packet out other switches than
14 // the one it came in on. 14 // the one it came in on.
......
...@@ -10,5 +10,5 @@ public interface PacketListener { ...@@ -10,5 +10,5 @@ public interface PacketListener {
10 * 10 *
11 * @param pktCtx the packet context 11 * @param pktCtx the packet context
12 */ 12 */
13 - public void handlePacket(PacketContext pktCtx); 13 + public void handlePacket(OpenFlowPacketContext pktCtx);
14 } 14 }
......
...@@ -12,7 +12,7 @@ import org.apache.felix.scr.annotations.Activate; ...@@ -12,7 +12,7 @@ import org.apache.felix.scr.annotations.Activate;
12 import org.apache.felix.scr.annotations.Component; 12 import org.apache.felix.scr.annotations.Component;
13 import org.apache.felix.scr.annotations.Deactivate; 13 import org.apache.felix.scr.annotations.Deactivate;
14 import org.apache.felix.scr.annotations.Service; 14 import org.apache.felix.scr.annotations.Service;
15 -import org.onlab.onos.of.controller.DefaultPacketContext; 15 +import org.onlab.onos.of.controller.DefaultOpenFlowPacketContext;
16 import org.onlab.onos.of.controller.Dpid; 16 import org.onlab.onos.of.controller.Dpid;
17 import org.onlab.onos.of.controller.OpenFlowController; 17 import org.onlab.onos.of.controller.OpenFlowController;
18 import org.onlab.onos.of.controller.OpenFlowSwitch; 18 import org.onlab.onos.of.controller.OpenFlowSwitch;
...@@ -124,7 +124,7 @@ public class OpenFlowControllerImpl implements OpenFlowController { ...@@ -124,7 +124,7 @@ public class OpenFlowControllerImpl implements OpenFlowController {
124 break; 124 break;
125 case PACKET_IN: 125 case PACKET_IN:
126 for (PacketListener p : ofPacketListener) { 126 for (PacketListener p : ofPacketListener) {
127 - p.handlePacket(DefaultPacketContext 127 + p.handlePacket(DefaultOpenFlowPacketContext
128 .packetContextFromPacketIn(this.getSwitch(dpid), 128 .packetContextFromPacketIn(this.getSwitch(dpid),
129 (OFPacketIn) msg)); 129 (OFPacketIn) msg));
130 } 130 }
......
...@@ -15,7 +15,7 @@ import org.onlab.onos.of.controller.Dpid; ...@@ -15,7 +15,7 @@ import org.onlab.onos.of.controller.Dpid;
15 import org.onlab.onos.of.controller.OpenFlowController; 15 import org.onlab.onos.of.controller.OpenFlowController;
16 import org.onlab.onos.of.controller.OpenFlowSwitch; 16 import org.onlab.onos.of.controller.OpenFlowSwitch;
17 import org.onlab.onos.of.controller.OpenFlowSwitchListener; 17 import org.onlab.onos.of.controller.OpenFlowSwitchListener;
18 -import org.onlab.onos.of.controller.PacketContext; 18 +import org.onlab.onos.of.controller.OpenFlowPacketContext;
19 import org.onlab.onos.of.controller.PacketListener; 19 import org.onlab.onos.of.controller.PacketListener;
20 import org.projectfloodlight.openflow.protocol.OFPortConfig; 20 import org.projectfloodlight.openflow.protocol.OFPortConfig;
21 import org.projectfloodlight.openflow.protocol.OFPortDesc; 21 import org.projectfloodlight.openflow.protocol.OFPortDesc;
...@@ -87,7 +87,7 @@ public class OpenFlowLinkProvider extends AbstractProvider implements LinkProvid ...@@ -87,7 +87,7 @@ public class OpenFlowLinkProvider extends AbstractProvider implements LinkProvid
87 87
88 88
89 @Override 89 @Override
90 - public void handlePacket(PacketContext pktCtx) { 90 + public void handlePacket(OpenFlowPacketContext pktCtx) {
91 LinkDiscovery ld = discoverers.get(pktCtx.dpid()); 91 LinkDiscovery ld = discoverers.get(pktCtx.dpid());
92 if (ld == null) { 92 if (ld == null) {
93 return; 93 return;
......
...@@ -57,7 +57,7 @@ public class IPAddress { ...@@ -57,7 +57,7 @@ public class IPAddress {
57 * @return an IP address 57 * @return an IP address
58 */ 58 */
59 public static IPAddress valueOf(String address) { 59 public static IPAddress valueOf(String address) {
60 - final String [] parts = address.split("."); 60 + final String [] parts = address.split("\\.");
61 if (parts.length != INET_LEN) { 61 if (parts.length != INET_LEN) {
62 throw new IllegalArgumentException("Malformed IP address string; " 62 throw new IllegalArgumentException("Malformed IP address string; "
63 + "Addres must have four decimal values separated by dots (.)"); 63 + "Addres must have four decimal values separated by dots (.)");
...@@ -119,7 +119,9 @@ public class IPAddress { ...@@ -119,7 +119,9 @@ public class IPAddress {
119 return true; 119 return true;
120 } 120 }
121 if (obj instanceof IPAddress) { 121 if (obj instanceof IPAddress) {
122 +
122 IPAddress other = (IPAddress) obj; 123 IPAddress other = (IPAddress) obj;
124 +
123 if (!(this.version.equals(other.version))) { 125 if (!(this.version.equals(other.version))) {
124 return false; 126 return false;
125 } 127 }
......
...@@ -37,13 +37,13 @@ public class VLANID { ...@@ -37,13 +37,13 @@ public class VLANID {
37 } 37 }
38 38
39 if (obj instanceof VLANID) { 39 if (obj instanceof VLANID) {
40 - return true;
41 - }
42 40
43 VLANID other = (VLANID) obj; 41 VLANID other = (VLANID) obj;
42 +
44 if (this.value == other.value) { 43 if (this.value == other.value) {
45 return true; 44 return true;
46 } 45 }
46 + }
47 47
48 return false; 48 return false;
49 } 49 }
......