alshabib

added enhanced reactive forwarding

...@@ -5,6 +5,7 @@ import org.apache.felix.scr.annotations.Component; ...@@ -5,6 +5,7 @@ import org.apache.felix.scr.annotations.Component;
5 import org.apache.felix.scr.annotations.Deactivate; 5 import org.apache.felix.scr.annotations.Deactivate;
6 import org.apache.felix.scr.annotations.Reference; 6 import org.apache.felix.scr.annotations.Reference;
7 import org.apache.felix.scr.annotations.ReferenceCardinality; 7 import org.apache.felix.scr.annotations.ReferenceCardinality;
8 +import org.onlab.onos.net.host.HostService;
8 import org.onlab.onos.net.packet.PacketProcessor; 9 import org.onlab.onos.net.packet.PacketProcessor;
9 import org.onlab.onos.net.packet.PacketService; 10 import org.onlab.onos.net.packet.PacketService;
10 import org.onlab.onos.net.topology.TopologyService; 11 import org.onlab.onos.net.topology.TopologyService;
...@@ -18,11 +19,14 @@ public class ReactiveForwarding { ...@@ -18,11 +19,14 @@ public class ReactiveForwarding {
18 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) 19 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
19 protected PacketService packetService; 20 protected PacketService packetService;
20 21
22 + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
23 + protected HostService hostService;
24 +
21 private ReactivePacketProcessor processor; 25 private ReactivePacketProcessor processor;
22 26
23 @Activate 27 @Activate
24 public void activate() { 28 public void activate() {
25 - processor = new ReactivePacketProcessor(topologyService); 29 + processor = new ReactivePacketProcessor(topologyService, hostService);
26 packetService.addProcessor(processor, PacketProcessor.ADVISOR_MAX + 1); 30 packetService.addProcessor(processor, PacketProcessor.ADVISOR_MAX + 1);
27 } 31 }
28 32
......
...@@ -2,36 +2,73 @@ package org.onlab.onos.fwd; ...@@ -2,36 +2,73 @@ package org.onlab.onos.fwd;
2 2
3 import static org.slf4j.LoggerFactory.getLogger; 3 import static org.slf4j.LoggerFactory.getLogger;
4 4
5 +import java.util.Set;
6 +
7 +import org.onlab.onos.net.Host;
8 +import org.onlab.onos.net.HostId;
9 +import org.onlab.onos.net.Path;
5 import org.onlab.onos.net.PortNumber; 10 import org.onlab.onos.net.PortNumber;
6 import org.onlab.onos.net.flow.Instructions; 11 import org.onlab.onos.net.flow.Instructions;
12 +import org.onlab.onos.net.host.HostService;
13 +import org.onlab.onos.net.packet.InboundPacket;
7 import org.onlab.onos.net.packet.PacketContext; 14 import org.onlab.onos.net.packet.PacketContext;
8 import org.onlab.onos.net.packet.PacketProcessor; 15 import org.onlab.onos.net.packet.PacketProcessor;
9 import org.onlab.onos.net.topology.TopologyService; 16 import org.onlab.onos.net.topology.TopologyService;
17 +import org.onlab.packet.VLANID;
10 import org.slf4j.Logger; 18 import org.slf4j.Logger;
11 19
12 public class ReactivePacketProcessor implements PacketProcessor { 20 public class ReactivePacketProcessor implements PacketProcessor {
13 21
14 private final Logger log = getLogger(getClass()); 22 private final Logger log = getLogger(getClass());
15 private final TopologyService topologyService; 23 private final TopologyService topologyService;
24 + private final HostService hostService;
16 25
17 26
18 - public ReactivePacketProcessor(TopologyService topologyService) { 27 + public ReactivePacketProcessor(TopologyService topologyService, HostService hostService) {
19 this.topologyService = topologyService; 28 this.topologyService = topologyService;
29 + this.hostService = hostService;
20 } 30 }
21 31
22 32
23 @Override 33 @Override
24 public void process(PacketContext context) { 34 public void process(PacketContext context) {
35 + InboundPacket pkt = context.inPacket();
36 + HostId id = HostId.hostId(pkt.parsed().getDestinationMAC(), VLANID.vlanId((short) -1));
37 + Host dst = hostService.getHost(id);
38 + if (dst == null) {
39 + flood(context);
40 + return;
41 + }
42 +
43 + Set<Path> p = null;
44 + if (pkt.receivedFrom().deviceId().equals(dst.location().deviceId())) {
45 + context.treatmentBuilder().add(Instructions.createOutput(dst.location().port()));
46 + context.send();
47 + return;
48 + } else {
49 + p = topologyService.getPaths(topologyService.currentTopology(),
50 + context.inPacket().receivedFrom().deviceId(), dst.location().deviceId());
51 + }
52 +
53 + if (p.isEmpty()) {
54 + flood(context);
55 + } else {
56 + Path p1 = p.iterator().next();
57 + context.treatmentBuilder().add(Instructions.createOutput(p1.src().port()));
58 + context.send();
59 + }
60 +
61 + }
62 +
63 + private void flood(PacketContext context) {
25 boolean canBcast = topologyService.isBroadcastPoint(topologyService.currentTopology(), 64 boolean canBcast = topologyService.isBroadcastPoint(topologyService.currentTopology(),
26 context.inPacket().receivedFrom()); 65 context.inPacket().receivedFrom());
27 -
28 if (canBcast) { 66 if (canBcast) {
29 context.treatmentBuilder().add(Instructions.createOutput(PortNumber.FLOOD)); 67 context.treatmentBuilder().add(Instructions.createOutput(PortNumber.FLOOD));
30 context.send(); 68 context.send();
31 } else { 69 } else {
32 context.block(); 70 context.block();
33 } 71 }
34 -
35 } 72 }
36 73
37 } 74 }
......
...@@ -84,6 +84,7 @@ ...@@ -84,6 +84,7 @@
84 com.sun.jersey.server.impl.container.servlet, 84 com.sun.jersey.server.impl.container.servlet,
85 com.fasterxml.jackson.databind, 85 com.fasterxml.jackson.databind,
86 com.fasterxml.jackson.databind.node, 86 com.fasterxml.jackson.databind.node,
87 + org.onlab.packet.*,
87 org.onlab.rest.*, 88 org.onlab.rest.*,
88 org.onlab.onos.* 89 org.onlab.onos.*
89 </Import-Package> 90 </Import-Package>
......
1 package org.onlab.onos.provider.of.host.impl; 1 package org.onlab.onos.provider.of.host.impl;
2 2
3 +import static com.google.common.collect.Sets.newHashSet;
4 +import static org.onlab.onos.net.DeviceId.deviceId;
5 +import static org.onlab.onos.net.PortNumber.portNumber;
6 +import static org.slf4j.LoggerFactory.getLogger;
7 +
8 +import java.util.Set;
9 +
3 import org.apache.felix.scr.annotations.Activate; 10 import org.apache.felix.scr.annotations.Activate;
4 import org.apache.felix.scr.annotations.Component; 11 import org.apache.felix.scr.annotations.Component;
5 import org.apache.felix.scr.annotations.Deactivate; 12 import org.apache.felix.scr.annotations.Deactivate;
...@@ -28,13 +35,6 @@ import org.onlab.packet.IPAddress; ...@@ -28,13 +35,6 @@ import org.onlab.packet.IPAddress;
28 import org.onlab.packet.VLANID; 35 import org.onlab.packet.VLANID;
29 import org.slf4j.Logger; 36 import org.slf4j.Logger;
30 37
31 -import java.util.Set;
32 -
33 -import static com.google.common.collect.Sets.newHashSet;
34 -import static org.onlab.onos.net.DeviceId.deviceId;
35 -import static org.onlab.onos.net.PortNumber.portNumber;
36 -import static org.slf4j.LoggerFactory.getLogger;
37 -
38 /** 38 /**
39 * Provider which uses an OpenFlow controller to detect network 39 * Provider which uses an OpenFlow controller to detect network
40 * end-station hosts. 40 * end-station hosts.
...@@ -96,7 +96,7 @@ public class OpenFlowHostProvider extends AbstractProvider implements HostProvid ...@@ -96,7 +96,7 @@ public class OpenFlowHostProvider extends AbstractProvider implements HostProvid
96 if (eth.getEtherType() == Ethernet.TYPE_ARP) { 96 if (eth.getEtherType() == Ethernet.TYPE_ARP) {
97 VLANID vlan = VLANID.vlanId(eth.getVlanID()); 97 VLANID vlan = VLANID.vlanId(eth.getVlanID());
98 ConnectPoint heardOn = new ConnectPoint(deviceId(Dpid.uri(pktCtx.dpid())), 98 ConnectPoint heardOn = new ConnectPoint(deviceId(Dpid.uri(pktCtx.dpid())),
99 - portNumber(pktCtx.inPort())); 99 + portNumber(pktCtx.inPort()));
100 100
101 // If this is not an edge port, bail out. 101 // If this is not an edge port, bail out.
102 Topology topology = topologyService.currentTopology(); 102 Topology topology = topologyService.currentTopology();
...@@ -105,8 +105,8 @@ public class OpenFlowHostProvider extends AbstractProvider implements HostProvid ...@@ -105,8 +105,8 @@ public class OpenFlowHostProvider extends AbstractProvider implements HostProvid
105 } 105 }
106 106
107 HostLocation hloc = new HostLocation(deviceId(Dpid.uri(pktCtx.dpid())), 107 HostLocation hloc = new HostLocation(deviceId(Dpid.uri(pktCtx.dpid())),
108 - portNumber(pktCtx.inPort()), 108 + portNumber(pktCtx.inPort()),
109 - System.currentTimeMillis()); 109 + System.currentTimeMillis());
110 110
111 HostId hid = HostId.hostId(eth.getSourceMAC(), vlan); 111 HostId hid = HostId.hostId(eth.getSourceMAC(), vlan);
112 ARP arp = (ARP) eth.getPayload(); 112 ARP arp = (ARP) eth.getPayload();
......
...@@ -54,7 +54,7 @@ public class OpenFlowPacketProvider extends AbstractProvider implements PacketPr ...@@ -54,7 +54,7 @@ public class OpenFlowPacketProvider extends AbstractProvider implements PacketPr
54 @Activate 54 @Activate
55 public void activate() { 55 public void activate() {
56 providerService = providerRegistry.register(this); 56 providerService = providerRegistry.register(this);
57 - controller.addPacketListener(1, listener); 57 + controller.addPacketListener(20, listener);
58 log.info("Started"); 58 log.info("Started");
59 } 59 }
60 60
......