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