Showing
3 changed files
with
49 additions
and
14 deletions
| ... | @@ -16,4 +16,11 @@ | ... | @@ -16,4 +16,11 @@ |
| 16 | 16 | ||
| 17 | <description>ONOS simple reactive forwarding app</description> | 17 | <description>ONOS simple reactive forwarding app</description> |
| 18 | 18 | ||
| 19 | + <dependencies> | ||
| 20 | + <dependency> | ||
| 21 | + <groupId>org.osgi</groupId> | ||
| 22 | + <artifactId>org.osgi.compendium</artifactId> | ||
| 23 | + </dependency> | ||
| 24 | + </dependencies> | ||
| 25 | + | ||
| 19 | </project> | 26 | </project> | ... | ... |
| 1 | package org.onlab.onos.fwd; | 1 | package org.onlab.onos.fwd; |
| 2 | 2 | ||
| 3 | -import static org.slf4j.LoggerFactory.getLogger; | ||
| 4 | - | ||
| 5 | -import java.util.Set; | ||
| 6 | - | ||
| 7 | import org.apache.felix.scr.annotations.Activate; | 3 | import org.apache.felix.scr.annotations.Activate; |
| 8 | import org.apache.felix.scr.annotations.Component; | 4 | import org.apache.felix.scr.annotations.Component; |
| 9 | import org.apache.felix.scr.annotations.Deactivate; | 5 | import org.apache.felix.scr.annotations.Deactivate; |
| 6 | +import org.apache.felix.scr.annotations.Modified; | ||
| 7 | +import org.apache.felix.scr.annotations.Property; | ||
| 10 | import org.apache.felix.scr.annotations.Reference; | 8 | import org.apache.felix.scr.annotations.Reference; |
| 11 | import org.apache.felix.scr.annotations.ReferenceCardinality; | 9 | import org.apache.felix.scr.annotations.ReferenceCardinality; |
| 12 | import org.onlab.onos.ApplicationId; | 10 | import org.onlab.onos.ApplicationId; |
| ... | @@ -29,8 +27,14 @@ import org.onlab.onos.net.packet.PacketProcessor; | ... | @@ -29,8 +27,14 @@ import org.onlab.onos.net.packet.PacketProcessor; |
| 29 | import org.onlab.onos.net.packet.PacketService; | 27 | import org.onlab.onos.net.packet.PacketService; |
| 30 | import org.onlab.onos.net.topology.TopologyService; | 28 | import org.onlab.onos.net.topology.TopologyService; |
| 31 | import org.onlab.packet.Ethernet; | 29 | import org.onlab.packet.Ethernet; |
| 30 | +import org.osgi.service.component.ComponentContext; | ||
| 32 | import org.slf4j.Logger; | 31 | import org.slf4j.Logger; |
| 33 | 32 | ||
| 33 | +import java.util.Dictionary; | ||
| 34 | +import java.util.Set; | ||
| 35 | + | ||
| 36 | +import static org.slf4j.LoggerFactory.getLogger; | ||
| 37 | + | ||
| 34 | /** | 38 | /** |
| 35 | * Sample reactive forwarding application. | 39 | * Sample reactive forwarding application. |
| 36 | */ | 40 | */ |
| ... | @@ -61,6 +65,9 @@ public class ReactiveForwarding { | ... | @@ -61,6 +65,9 @@ public class ReactiveForwarding { |
| 61 | 65 | ||
| 62 | private ApplicationId appId; | 66 | private ApplicationId appId; |
| 63 | 67 | ||
| 68 | + @Property(name = "enabled", boolValue = true, label = "Forwarding enabled") | ||
| 69 | + private boolean isEnabled = true; | ||
| 70 | + | ||
| 64 | @Activate | 71 | @Activate |
| 65 | public void activate() { | 72 | public void activate() { |
| 66 | appId = coreService.registerApplication("org.onlab.onos.fwd"); | 73 | appId = coreService.registerApplication("org.onlab.onos.fwd"); |
| ... | @@ -76,6 +83,21 @@ public class ReactiveForwarding { | ... | @@ -76,6 +83,21 @@ public class ReactiveForwarding { |
| 76 | log.info("Stopped"); | 83 | log.info("Stopped"); |
| 77 | } | 84 | } |
| 78 | 85 | ||
| 86 | + @Modified | ||
| 87 | + public void modified(ComponentContext context) { | ||
| 88 | + Dictionary properties = context.getProperties(); | ||
| 89 | + String flag = (String) properties.get("enabled"); | ||
| 90 | + if (flag != null) { | ||
| 91 | + boolean enabled = flag.equals("true"); | ||
| 92 | + if (isEnabled != enabled) { | ||
| 93 | + isEnabled = enabled; | ||
| 94 | + if (!isEnabled) { | ||
| 95 | + flowRuleService.removeFlowRulesById(appId); | ||
| 96 | + } | ||
| 97 | + log.info("Reconfigured enabled = {}", isEnabled); | ||
| 98 | + } | ||
| 99 | + } | ||
| 100 | + } | ||
| 79 | 101 | ||
| 80 | /** | 102 | /** |
| 81 | * Packet processor responsible for forwarding packets along their paths. | 103 | * Packet processor responsible for forwarding packets along their paths. |
| ... | @@ -86,7 +108,7 @@ public class ReactiveForwarding { | ... | @@ -86,7 +108,7 @@ public class ReactiveForwarding { |
| 86 | public void process(PacketContext context) { | 108 | public void process(PacketContext context) { |
| 87 | // Stop processing if the packet has been handled, since we | 109 | // Stop processing if the packet has been handled, since we |
| 88 | // can't do any more to it. | 110 | // can't do any more to it. |
| 89 | - if (context.isHandled()) { | 111 | + if (!isEnabled || context.isHandled()) { |
| 90 | return; | 112 | return; |
| 91 | } | 113 | } |
| 92 | 114 | ||
| ... | @@ -114,8 +136,8 @@ public class ReactiveForwarding { | ... | @@ -114,8 +136,8 @@ public class ReactiveForwarding { |
| 114 | // Otherwise, get a set of paths that lead from here to the | 136 | // Otherwise, get a set of paths that lead from here to the |
| 115 | // destination edge switch. | 137 | // destination edge switch. |
| 116 | Set<Path> paths = topologyService.getPaths(topologyService.currentTopology(), | 138 | Set<Path> paths = topologyService.getPaths(topologyService.currentTopology(), |
| 117 | - pkt.receivedFrom().deviceId(), | 139 | + pkt.receivedFrom().deviceId(), |
| 118 | - dst.location().deviceId()); | 140 | + dst.location().deviceId()); |
| 119 | if (paths.isEmpty()) { | 141 | if (paths.isEmpty()) { |
| 120 | // If there are no paths, flood and bail. | 142 | // If there are no paths, flood and bail. |
| 121 | flood(context); | 143 | flood(context); |
| ... | @@ -127,8 +149,8 @@ public class ReactiveForwarding { | ... | @@ -127,8 +149,8 @@ public class ReactiveForwarding { |
| 127 | Path path = pickForwardPath(paths, pkt.receivedFrom().port()); | 149 | Path path = pickForwardPath(paths, pkt.receivedFrom().port()); |
| 128 | if (path == null) { | 150 | if (path == null) { |
| 129 | log.warn("Doh... don't know where to go... {} -> {} received on {}", | 151 | log.warn("Doh... don't know where to go... {} -> {} received on {}", |
| 130 | - ethPkt.getSourceMAC(), ethPkt.getDestinationMAC(), | 152 | + ethPkt.getSourceMAC(), ethPkt.getDestinationMAC(), |
| 131 | - pkt.receivedFrom()); | 153 | + pkt.receivedFrom()); |
| 132 | flood(context); | 154 | flood(context); |
| 133 | return; | 155 | return; |
| 134 | } | 156 | } |
| ... | @@ -152,7 +174,7 @@ public class ReactiveForwarding { | ... | @@ -152,7 +174,7 @@ public class ReactiveForwarding { |
| 152 | // Floods the specified packet if permissible. | 174 | // Floods the specified packet if permissible. |
| 153 | private void flood(PacketContext context) { | 175 | private void flood(PacketContext context) { |
| 154 | if (topologyService.isBroadcastPoint(topologyService.currentTopology(), | 176 | if (topologyService.isBroadcastPoint(topologyService.currentTopology(), |
| 155 | - context.inPacket().receivedFrom())) { | 177 | + context.inPacket().receivedFrom())) { |
| 156 | packetOut(context, PortNumber.FLOOD); | 178 | packetOut(context, PortNumber.FLOOD); |
| 157 | } else { | 179 | } else { |
| 158 | context.block(); | 180 | context.block(); |
| ... | @@ -174,15 +196,15 @@ public class ReactiveForwarding { | ... | @@ -174,15 +196,15 @@ public class ReactiveForwarding { |
| 174 | Ethernet inPkt = context.inPacket().parsed(); | 196 | Ethernet inPkt = context.inPacket().parsed(); |
| 175 | TrafficSelector.Builder builder = DefaultTrafficSelector.builder(); | 197 | TrafficSelector.Builder builder = DefaultTrafficSelector.builder(); |
| 176 | builder.matchEthType(inPkt.getEtherType()) | 198 | builder.matchEthType(inPkt.getEtherType()) |
| 177 | - .matchEthSrc(inPkt.getSourceMAC()) | 199 | + .matchEthSrc(inPkt.getSourceMAC()) |
| 178 | - .matchEthDst(inPkt.getDestinationMAC()) | 200 | + .matchEthDst(inPkt.getDestinationMAC()) |
| 179 | - .matchInport(context.inPacket().receivedFrom().port()); | 201 | + .matchInport(context.inPacket().receivedFrom().port()); |
| 180 | 202 | ||
| 181 | TrafficTreatment.Builder treat = DefaultTrafficTreatment.builder(); | 203 | TrafficTreatment.Builder treat = DefaultTrafficTreatment.builder(); |
| 182 | treat.setOutput(portNumber); | 204 | treat.setOutput(portNumber); |
| 183 | 205 | ||
| 184 | FlowRule f = new DefaultFlowRule(context.inPacket().receivedFrom().deviceId(), | 206 | FlowRule f = new DefaultFlowRule(context.inPacket().receivedFrom().deviceId(), |
| 185 | - builder.build(), treat.build(), PRIORITY, appId, TIMEOUT); | 207 | + builder.build(), treat.build(), PRIORITY, appId, TIMEOUT); |
| 186 | 208 | ||
| 187 | flowRuleService.applyFlowRules(f); | 209 | flowRuleService.applyFlowRules(f); |
| 188 | 210 | ... | ... |
| ... | @@ -164,6 +164,12 @@ | ... | @@ -164,6 +164,12 @@ |
| 164 | <scope>provided</scope> | 164 | <scope>provided</scope> |
| 165 | </dependency> | 165 | </dependency> |
| 166 | <dependency> | 166 | <dependency> |
| 167 | + <groupId>org.osgi</groupId> | ||
| 168 | + <artifactId>org.osgi.compendium</artifactId> | ||
| 169 | + <version>4.3.1</version> | ||
| 170 | + <scope>provided</scope> | ||
| 171 | + </dependency> | ||
| 172 | + <dependency> | ||
| 167 | <groupId>org.apache.felix</groupId> | 173 | <groupId>org.apache.felix</groupId> |
| 168 | <artifactId>org.apache.felix.scr.annotations</artifactId> | 174 | <artifactId>org.apache.felix.scr.annotations</artifactId> |
| 169 | <version>1.9.8</version> | 175 | <version>1.9.8</version> | ... | ... |
-
Please register or login to post a comment