flowrules are pushed: we still have an intermittent hang though
Showing
11 changed files
with
172 additions
and
26 deletions
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 | + | ||
3 | import org.apache.felix.scr.annotations.Activate; | 7 | import org.apache.felix.scr.annotations.Activate; |
4 | import org.apache.felix.scr.annotations.Component; | 8 | import org.apache.felix.scr.annotations.Component; |
5 | import org.apache.felix.scr.annotations.Deactivate; | 9 | import org.apache.felix.scr.annotations.Deactivate; |
... | @@ -9,6 +13,14 @@ import org.onlab.onos.net.Host; | ... | @@ -9,6 +13,14 @@ import org.onlab.onos.net.Host; |
9 | import org.onlab.onos.net.HostId; | 13 | import org.onlab.onos.net.HostId; |
10 | import org.onlab.onos.net.Path; | 14 | import org.onlab.onos.net.Path; |
11 | import org.onlab.onos.net.PortNumber; | 15 | import org.onlab.onos.net.PortNumber; |
16 | +import org.onlab.onos.net.flow.DefaultFlowRule; | ||
17 | +import org.onlab.onos.net.flow.DefaultTrafficSelector; | ||
18 | +import org.onlab.onos.net.flow.DefaultTrafficTreatment; | ||
19 | +import org.onlab.onos.net.flow.FlowRule; | ||
20 | +import org.onlab.onos.net.flow.FlowRuleService; | ||
21 | +import org.onlab.onos.net.flow.TrafficSelector; | ||
22 | +import org.onlab.onos.net.flow.TrafficTreatment; | ||
23 | +import org.onlab.onos.net.flow.criteria.Criteria; | ||
12 | import org.onlab.onos.net.flow.instructions.Instructions; | 24 | import org.onlab.onos.net.flow.instructions.Instructions; |
13 | import org.onlab.onos.net.host.HostService; | 25 | import org.onlab.onos.net.host.HostService; |
14 | import org.onlab.onos.net.packet.InboundPacket; | 26 | import org.onlab.onos.net.packet.InboundPacket; |
... | @@ -16,12 +28,9 @@ import org.onlab.onos.net.packet.PacketContext; | ... | @@ -16,12 +28,9 @@ import org.onlab.onos.net.packet.PacketContext; |
16 | import org.onlab.onos.net.packet.PacketProcessor; | 28 | import org.onlab.onos.net.packet.PacketProcessor; |
17 | import org.onlab.onos.net.packet.PacketService; | 29 | import org.onlab.onos.net.packet.PacketService; |
18 | import org.onlab.onos.net.topology.TopologyService; | 30 | import org.onlab.onos.net.topology.TopologyService; |
31 | +import org.onlab.packet.Ethernet; | ||
19 | import org.slf4j.Logger; | 32 | import org.slf4j.Logger; |
20 | 33 | ||
21 | -import java.util.Set; | ||
22 | - | ||
23 | -import static org.slf4j.LoggerFactory.getLogger; | ||
24 | - | ||
25 | /** | 34 | /** |
26 | * Sample reactive forwarding application. | 35 | * Sample reactive forwarding application. |
27 | */ | 36 | */ |
... | @@ -39,6 +48,9 @@ public class ReactiveForwarding { | ... | @@ -39,6 +48,9 @@ public class ReactiveForwarding { |
39 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 48 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
40 | protected HostService hostService; | 49 | protected HostService hostService; |
41 | 50 | ||
51 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
52 | + protected FlowRuleService flowRuleService; | ||
53 | + | ||
42 | private ReactivePacketProcessor processor = new ReactivePacketProcessor(); | 54 | private ReactivePacketProcessor processor = new ReactivePacketProcessor(); |
43 | 55 | ||
44 | @Activate | 56 | @Activate |
... | @@ -62,6 +74,9 @@ public class ReactiveForwarding { | ... | @@ -62,6 +74,9 @@ public class ReactiveForwarding { |
62 | 74 | ||
63 | @Override | 75 | @Override |
64 | public void process(PacketContext context) { | 76 | public void process(PacketContext context) { |
77 | + if (context.isHandled()) { | ||
78 | + return; | ||
79 | + } | ||
65 | InboundPacket pkt = context.inPacket(); | 80 | InboundPacket pkt = context.inPacket(); |
66 | HostId id = HostId.hostId(pkt.parsed().getDestinationMAC()); | 81 | HostId id = HostId.hostId(pkt.parsed().getDestinationMAC()); |
67 | 82 | ||
... | @@ -75,12 +90,13 @@ public class ReactiveForwarding { | ... | @@ -75,12 +90,13 @@ public class ReactiveForwarding { |
75 | // Are we on an edge switch that our destination is on? If so, | 90 | // Are we on an edge switch that our destination is on? If so, |
76 | // simply forward out to the destination and bail. | 91 | // simply forward out to the destination and bail. |
77 | if (pkt.receivedFrom().deviceId().equals(dst.location().deviceId())) { | 92 | if (pkt.receivedFrom().deviceId().equals(dst.location().deviceId())) { |
78 | - forward(context, dst.location().port()); | 93 | + installRule(context, dst.location().port()); |
79 | return; | 94 | return; |
80 | } | 95 | } |
81 | 96 | ||
82 | // Otherwise, get a set of paths that lead from here to the | 97 | // Otherwise, get a set of paths that lead from here to the |
83 | // destination edge switch. | 98 | // destination edge switch. |
99 | + | ||
84 | Set<Path> paths = topologyService.getPaths(topologyService.currentTopology(), | 100 | Set<Path> paths = topologyService.getPaths(topologyService.currentTopology(), |
85 | context.inPacket().receivedFrom().deviceId(), | 101 | context.inPacket().receivedFrom().deviceId(), |
86 | dst.location().deviceId()); | 102 | dst.location().deviceId()); |
... | @@ -100,7 +116,7 @@ public class ReactiveForwarding { | ... | @@ -100,7 +116,7 @@ public class ReactiveForwarding { |
100 | } | 116 | } |
101 | 117 | ||
102 | // Otherwise forward and be done with it. | 118 | // Otherwise forward and be done with it. |
103 | - forward(context, path.src().port()); | 119 | + installRule(context, path.src().port()); |
104 | } | 120 | } |
105 | } | 121 | } |
106 | 122 | ||
... | @@ -120,16 +136,41 @@ public class ReactiveForwarding { | ... | @@ -120,16 +136,41 @@ public class ReactiveForwarding { |
120 | boolean canBcast = topologyService.isBroadcastPoint(topologyService.currentTopology(), | 136 | boolean canBcast = topologyService.isBroadcastPoint(topologyService.currentTopology(), |
121 | context.inPacket().receivedFrom()); | 137 | context.inPacket().receivedFrom()); |
122 | if (canBcast) { | 138 | if (canBcast) { |
123 | - forward(context, PortNumber.FLOOD); | 139 | + packetOutFlood(context); |
124 | } else { | 140 | } else { |
125 | context.block(); | 141 | context.block(); |
126 | } | 142 | } |
127 | } | 143 | } |
128 | 144 | ||
129 | - // Forwards the packet to the specified port. | 145 | + //Floods a packet out |
130 | - private void forward(PacketContext context, PortNumber portNumber) { | 146 | + private void packetOutFlood(PacketContext context) { |
147 | + context.treatmentBuilder().add(Instructions.createOutput(PortNumber.FLOOD)); | ||
148 | + context.send(); | ||
149 | + } | ||
150 | + | ||
151 | + // Install a rule forwarding the packet to the specified port. | ||
152 | + private void installRule(PacketContext context, PortNumber portNumber) { | ||
153 | + // we don't yet support bufferids in the flowservice so packet out and | ||
154 | + // then install a flowmod. | ||
131 | context.treatmentBuilder().add(Instructions.createOutput(portNumber)); | 155 | context.treatmentBuilder().add(Instructions.createOutput(portNumber)); |
132 | context.send(); | 156 | context.send(); |
157 | + | ||
158 | + | ||
159 | + Ethernet inPkt = context.inPacket().parsed(); | ||
160 | + TrafficSelector.Builder builder = new DefaultTrafficSelector.Builder(); | ||
161 | + builder.add(Criteria.matchEthType(inPkt.getEtherType())) | ||
162 | + .add(Criteria.matchEthSrc(inPkt.getSourceMAC())) | ||
163 | + .add(Criteria.matchEthDst(inPkt.getDestinationMAC())) | ||
164 | + .add(Criteria.matchInPort(context.inPacket().receivedFrom().port())); | ||
165 | + | ||
166 | + TrafficTreatment.Builder treat = new DefaultTrafficTreatment.Builder(); | ||
167 | + treat.add(Instructions.createOutput(portNumber)); | ||
168 | + | ||
169 | + FlowRule f = new DefaultFlowRule(context.inPacket().receivedFrom().deviceId(), | ||
170 | + builder.build(), treat.build()); | ||
171 | + | ||
172 | + flowRuleService.applyFlowRules(f); | ||
173 | + | ||
133 | } | 174 | } |
134 | 175 | ||
135 | } | 176 | } | ... | ... |
1 | +package org.onlab.onos.net.flow; | ||
2 | + | ||
3 | +import org.onlab.onos.net.DeviceId; | ||
4 | + | ||
5 | +public class DefaultFlowRule implements FlowRule { | ||
6 | + | ||
7 | + private final TrafficSelector selector; | ||
8 | + private final TrafficTreatment treatment; | ||
9 | + private final DeviceId deviceId; | ||
10 | + | ||
11 | + public DefaultFlowRule(DeviceId deviceId, | ||
12 | + TrafficSelector selector, TrafficTreatment treatment) { | ||
13 | + this.treatment = treatment; | ||
14 | + this.selector = selector; | ||
15 | + this.deviceId = deviceId; | ||
16 | + } | ||
17 | + | ||
18 | + @Override | ||
19 | + public int priority() { | ||
20 | + return 0; | ||
21 | + } | ||
22 | + | ||
23 | + @Override | ||
24 | + public DeviceId deviceId() { | ||
25 | + return deviceId; | ||
26 | + } | ||
27 | + | ||
28 | + @Override | ||
29 | + public TrafficSelector selector() { | ||
30 | + return selector; | ||
31 | + } | ||
32 | + | ||
33 | + @Override | ||
34 | + public TrafficTreatment treatment() { | ||
35 | + return treatment; | ||
36 | + } | ||
37 | + | ||
38 | +} |
1 | +package org.onlab.onos.net.flow; | ||
2 | + | ||
3 | +import static org.slf4j.LoggerFactory.getLogger; | ||
4 | + | ||
5 | +import java.util.Collections; | ||
6 | +import java.util.LinkedList; | ||
7 | +import java.util.List; | ||
8 | + | ||
9 | +import org.onlab.onos.net.flow.criteria.Criterion; | ||
10 | +import org.slf4j.Logger; | ||
11 | + | ||
12 | +public final class DefaultTrafficSelector implements TrafficSelector { | ||
13 | + | ||
14 | + private final List<Criterion> selector; | ||
15 | + | ||
16 | + private DefaultTrafficSelector(List<Criterion> selector) { | ||
17 | + this.selector = Collections.unmodifiableList(selector); | ||
18 | + } | ||
19 | + | ||
20 | + @Override | ||
21 | + public List<Criterion> criteria() { | ||
22 | + return selector; | ||
23 | + } | ||
24 | + | ||
25 | + public static class Builder implements TrafficSelector.Builder { | ||
26 | + | ||
27 | + private final Logger log = getLogger(getClass()); | ||
28 | + | ||
29 | + private final List<Criterion> selector = new LinkedList<>(); | ||
30 | + | ||
31 | + @Override | ||
32 | + public TrafficSelector.Builder add(Criterion criterion) { | ||
33 | + selector.add(criterion); | ||
34 | + return this; | ||
35 | + } | ||
36 | + | ||
37 | + @Override | ||
38 | + public TrafficSelector build() { | ||
39 | + return new DefaultTrafficSelector(selector); | ||
40 | + } | ||
41 | + | ||
42 | + } | ||
43 | + | ||
44 | +} |
... | @@ -9,12 +9,11 @@ import java.util.List; | ... | @@ -9,12 +9,11 @@ import java.util.List; |
9 | import org.onlab.onos.net.flow.instructions.Instruction; | 9 | import org.onlab.onos.net.flow.instructions.Instruction; |
10 | import org.slf4j.Logger; | 10 | import org.slf4j.Logger; |
11 | 11 | ||
12 | -@SuppressWarnings("rawtypes") | 12 | +public final class DefaultTrafficTreatment implements TrafficTreatment { |
13 | -public class DefaultTrafficTreatment implements TrafficTreatment { | ||
14 | 13 | ||
15 | private final List<Instruction> instructions; | 14 | private final List<Instruction> instructions; |
16 | 15 | ||
17 | - public DefaultTrafficTreatment(List<Instruction> instructions) { | 16 | + private DefaultTrafficTreatment(List<Instruction> instructions) { |
18 | this.instructions = Collections.unmodifiableList(instructions); | 17 | this.instructions = Collections.unmodifiableList(instructions); |
19 | } | 18 | } |
20 | 19 | ... | ... |
... | @@ -69,6 +69,7 @@ | ... | @@ -69,6 +69,7 @@ |
69 | <bundle>mvn:org.onlab.onos/onos-of-provider-link/1.0.0-SNAPSHOT</bundle> | 69 | <bundle>mvn:org.onlab.onos/onos-of-provider-link/1.0.0-SNAPSHOT</bundle> |
70 | <bundle>mvn:org.onlab.onos/onos-of-provider-host/1.0.0-SNAPSHOT</bundle> | 70 | <bundle>mvn:org.onlab.onos/onos-of-provider-host/1.0.0-SNAPSHOT</bundle> |
71 | <bundle>mvn:org.onlab.onos/onos-of-provider-packet/1.0.0-SNAPSHOT</bundle> | 71 | <bundle>mvn:org.onlab.onos/onos-of-provider-packet/1.0.0-SNAPSHOT</bundle> |
72 | + <bundle>mvn:org.onlab.onos/onos-of-provider-flow/1.0.0-SNAPSHOT</bundle> | ||
72 | 73 | ||
73 | </feature> | 74 | </feature> |
74 | 75 | ... | ... |
... | @@ -32,7 +32,7 @@ public final class DefaultOpenFlowPacketContext implements OpenFlowPacketContext | ... | @@ -32,7 +32,7 @@ public final class DefaultOpenFlowPacketContext implements OpenFlowPacketContext |
32 | 32 | ||
33 | @Override | 33 | @Override |
34 | public void send() { | 34 | public void send() { |
35 | - if (blocked() && isBuilt) { | 35 | + if (block() && isBuilt) { |
36 | sw.sendMsg(pktout); | 36 | sw.sendMsg(pktout); |
37 | } | 37 | } |
38 | } | 38 | } |
... | @@ -109,8 +109,13 @@ public final class DefaultOpenFlowPacketContext implements OpenFlowPacketContext | ... | @@ -109,8 +109,13 @@ public final class DefaultOpenFlowPacketContext implements OpenFlowPacketContext |
109 | } | 109 | } |
110 | 110 | ||
111 | @Override | 111 | @Override |
112 | - public boolean blocked() { | 112 | + public boolean block() { |
113 | return free.getAndSet(false); | 113 | return free.getAndSet(false); |
114 | } | 114 | } |
115 | 115 | ||
116 | + @Override | ||
117 | + public boolean isHandled() { | ||
118 | + return !free.get(); | ||
119 | + } | ||
120 | + | ||
116 | } | 121 | } | ... | ... |
... | @@ -16,7 +16,13 @@ public interface OpenFlowPacketContext { | ... | @@ -16,7 +16,13 @@ public interface OpenFlowPacketContext { |
16 | * Blocks further responses (ie. send() calls) on this | 16 | * Blocks further responses (ie. send() calls) on this |
17 | * packet in event. | 17 | * packet in event. |
18 | */ | 18 | */ |
19 | - public boolean blocked(); | 19 | + public boolean block(); |
20 | + | ||
21 | + /** | ||
22 | + * Checks whether the packet has been handled. | ||
23 | + * @return true if handled, false otherwise. | ||
24 | + */ | ||
25 | + public boolean isHandled(); | ||
20 | 26 | ||
21 | /** | 27 | /** |
22 | * Provided build has been called send the packet | 28 | * Provided build has been called send the packet | ... | ... |
... | @@ -26,6 +26,7 @@ import org.onlab.onos.net.flow.criteria.Criteria.VlanIdCriterion; | ... | @@ -26,6 +26,7 @@ import org.onlab.onos.net.flow.criteria.Criteria.VlanIdCriterion; |
26 | import org.onlab.onos.net.flow.criteria.Criteria.VlanPcpCriterion; | 26 | import org.onlab.onos.net.flow.criteria.Criteria.VlanPcpCriterion; |
27 | import org.onlab.onos.net.flow.criteria.Criterion; | 27 | import org.onlab.onos.net.flow.criteria.Criterion; |
28 | import org.onlab.onos.net.flow.instructions.Instruction; | 28 | import org.onlab.onos.net.flow.instructions.Instruction; |
29 | +import org.onlab.onos.net.flow.instructions.Instructions.OutputInstruction; | ||
29 | import org.onlab.onos.net.flow.instructions.L2ModificationInstruction; | 30 | import org.onlab.onos.net.flow.instructions.L2ModificationInstruction; |
30 | import org.onlab.onos.net.flow.instructions.L2ModificationInstruction.ModEtherInstruction; | 31 | import org.onlab.onos.net.flow.instructions.L2ModificationInstruction.ModEtherInstruction; |
31 | import org.onlab.onos.net.flow.instructions.L2ModificationInstruction.ModVlanIdInstruction; | 32 | import org.onlab.onos.net.flow.instructions.L2ModificationInstruction.ModVlanIdInstruction; |
... | @@ -136,6 +137,9 @@ public class OpenFlowRuleProvider extends AbstractProvider implements FlowRulePr | ... | @@ -136,6 +137,9 @@ public class OpenFlowRuleProvider extends AbstractProvider implements FlowRulePr |
136 | case L3MODIFICATION: | 137 | case L3MODIFICATION: |
137 | acts.add(buildL3Modification(i, factory)); | 138 | acts.add(buildL3Modification(i, factory)); |
138 | case OUTPUT: | 139 | case OUTPUT: |
140 | + OutputInstruction out = (OutputInstruction) i; | ||
141 | + acts.add(factory.actions().buildOutput().setPort( | ||
142 | + OFPort.of((int) out.port().toLong())).build()); | ||
139 | break; | 143 | break; |
140 | case GROUP: | 144 | case GROUP: |
141 | default: | 145 | default: |
... | @@ -207,6 +211,7 @@ public class OpenFlowRuleProvider extends AbstractProvider implements FlowRulePr | ... | @@ -207,6 +211,7 @@ public class OpenFlowRuleProvider extends AbstractProvider implements FlowRulePr |
207 | case ETH_TYPE: | 211 | case ETH_TYPE: |
208 | EthTypeCriterion ethType = (EthTypeCriterion) c; | 212 | EthTypeCriterion ethType = (EthTypeCriterion) c; |
209 | mBuilder.setExact(MatchField.ETH_TYPE, EthType.of(ethType.ethType())); | 213 | mBuilder.setExact(MatchField.ETH_TYPE, EthType.of(ethType.ethType())); |
214 | + break; | ||
210 | case IPV4_DST: | 215 | case IPV4_DST: |
211 | ip = (IPCriterion) c; | 216 | ip = (IPCriterion) c; |
212 | mBuilder.setExact(MatchField.IPV4_DST, IPv4Address.of(ip.ip().toInt())); | 217 | mBuilder.setExact(MatchField.IPV4_DST, IPv4Address.of(ip.ip().toInt())); | ... | ... |
1 | package org.onlab.onos.provider.of.host.impl; | 1 | package org.onlab.onos.provider.of.host.impl; |
2 | 2 | ||
3 | +import static org.junit.Assert.assertEquals; | ||
4 | +import static org.junit.Assert.assertNotNull; | ||
5 | +import static org.junit.Assert.assertNull; | ||
6 | + | ||
7 | +import java.util.Set; | ||
8 | + | ||
3 | import org.junit.After; | 9 | import org.junit.After; |
4 | import org.junit.Before; | 10 | import org.junit.Before; |
5 | import org.junit.Test; | 11 | import org.junit.Test; |
... | @@ -24,10 +30,6 @@ import org.onlab.packet.VlanId; | ... | @@ -24,10 +30,6 @@ import org.onlab.packet.VlanId; |
24 | import org.projectfloodlight.openflow.protocol.OFMessage; | 30 | import org.projectfloodlight.openflow.protocol.OFMessage; |
25 | import org.projectfloodlight.openflow.types.OFPort; | 31 | import org.projectfloodlight.openflow.types.OFPort; |
26 | 32 | ||
27 | -import java.util.Set; | ||
28 | - | ||
29 | -import static org.junit.Assert.*; | ||
30 | - | ||
31 | public class OpenFlowHostProviderTest { | 33 | public class OpenFlowHostProviderTest { |
32 | 34 | ||
33 | private static final Integer INPORT = 10; | 35 | private static final Integer INPORT = 10; |
... | @@ -40,10 +42,10 @@ public class OpenFlowHostProviderTest { | ... | @@ -40,10 +42,10 @@ public class OpenFlowHostProviderTest { |
40 | private static final MacAddress BCMAC = MacAddress.valueOf("ff:ff:ff:ff:ff:ff"); | 42 | private static final MacAddress BCMAC = MacAddress.valueOf("ff:ff:ff:ff:ff:ff"); |
41 | private static final byte[] IP = new byte[]{10, 0, 0, 1}; | 43 | private static final byte[] IP = new byte[]{10, 0, 0, 1}; |
42 | 44 | ||
43 | - private OpenFlowHostProvider provider = new OpenFlowHostProvider(); | 45 | + private final OpenFlowHostProvider provider = new OpenFlowHostProvider(); |
44 | - private TestHostRegistry hostService = new TestHostRegistry(); | 46 | + private final TestHostRegistry hostService = new TestHostRegistry(); |
45 | - private TestController controller = new TestController(); | 47 | + private final TestController controller = new TestController(); |
46 | - private TestTopologyService topoService = new TestTopologyService(); | 48 | + private final TestTopologyService topoService = new TestTopologyService(); |
47 | private TestHostProviderService providerService; | 49 | private TestHostProviderService providerService; |
48 | 50 | ||
49 | @Before | 51 | @Before |
... | @@ -168,7 +170,7 @@ public class OpenFlowHostProviderTest { | ... | @@ -168,7 +170,7 @@ public class OpenFlowHostProviderTest { |
168 | } | 170 | } |
169 | 171 | ||
170 | @Override | 172 | @Override |
171 | - public boolean blocked() { | 173 | + public boolean block() { |
172 | return false; | 174 | return false; |
173 | } | 175 | } |
174 | 176 | ||
... | @@ -218,5 +220,10 @@ public class OpenFlowHostProviderTest { | ... | @@ -218,5 +220,10 @@ public class OpenFlowHostProviderTest { |
218 | return INPORT; | 220 | return INPORT; |
219 | } | 221 | } |
220 | 222 | ||
223 | + @Override | ||
224 | + public boolean isHandled() { | ||
225 | + return false; | ||
226 | + } | ||
227 | + | ||
221 | } | 228 | } |
222 | } | 229 | } | ... | ... |
... | @@ -93,7 +93,7 @@ public class OpenFlowLinkProvider extends AbstractProvider implements LinkProvid | ... | @@ -93,7 +93,7 @@ public class OpenFlowLinkProvider extends AbstractProvider implements LinkProvid |
93 | return; | 93 | return; |
94 | } | 94 | } |
95 | if (ld.handleLLDP(pktCtx.unparsed(), pktCtx.inPort())) { | 95 | if (ld.handleLLDP(pktCtx.unparsed(), pktCtx.inPort())) { |
96 | - pktCtx.blocked(); | 96 | + pktCtx.block(); |
97 | } | 97 | } |
98 | 98 | ||
99 | } | 99 | } | ... | ... |
providers/of/packet/src/main/java/org/onlab/onos/provider/of/packet/impl/OpenFlowPacketProvider.java
... | @@ -87,7 +87,7 @@ public class OpenFlowPacketProvider extends AbstractProvider implements PacketPr | ... | @@ -87,7 +87,7 @@ public class OpenFlowPacketProvider extends AbstractProvider implements PacketPr |
87 | pktCtx.parsed(), ByteBuffer.wrap(pktCtx.unparsed())); | 87 | pktCtx.parsed(), ByteBuffer.wrap(pktCtx.unparsed())); |
88 | 88 | ||
89 | OpenFlowCorePacketContext corePktCtx = | 89 | OpenFlowCorePacketContext corePktCtx = |
90 | - new OpenFlowCorePacketContext(0, inPkt, null, false, pktCtx); | 90 | + new OpenFlowCorePacketContext(0, inPkt, null, pktCtx.isHandled(), pktCtx); |
91 | providerService.processPacket(corePktCtx); | 91 | providerService.processPacket(corePktCtx); |
92 | } | 92 | } |
93 | 93 | ... | ... |
-
Please register or login to post a comment