Showing
5 changed files
with
54 additions
and
12 deletions
... | @@ -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. | ... | ... |
providers/of/packet/src/main/java/org/onlab/onos/provider/of/packet/impl/OpenFlowPacketProvider.java
... | @@ -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 | ... | ... |
-
Please register or login to post a comment