pkt glitch FIXED... ovs was not sending a bufferid
Change-Id: Id6fedf7c6ed8fbcfefb7308b0ee442e614e5e3af
Showing
6 changed files
with
50 additions
and
21 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; |
| ... | @@ -27,10 +31,6 @@ import org.onlab.onos.net.topology.TopologyService; | ... | @@ -27,10 +31,6 @@ import org.onlab.onos.net.topology.TopologyService; |
| 27 | import org.onlab.packet.Ethernet; | 31 | import org.onlab.packet.Ethernet; |
| 28 | import org.slf4j.Logger; | 32 | import org.slf4j.Logger; |
| 29 | 33 | ||
| 30 | -import java.util.Set; | ||
| 31 | - | ||
| 32 | -import static org.slf4j.LoggerFactory.getLogger; | ||
| 33 | - | ||
| 34 | /** | 34 | /** |
| 35 | * Sample reactive forwarding application. | 35 | * Sample reactive forwarding application. |
| 36 | */ | 36 | */ |
| ... | @@ -101,8 +101,8 @@ public class ReactiveForwarding { | ... | @@ -101,8 +101,8 @@ public class ReactiveForwarding { |
| 101 | // Otherwise, get a set of paths that lead from here to the | 101 | // Otherwise, get a set of paths that lead from here to the |
| 102 | // destination edge switch. | 102 | // destination edge switch. |
| 103 | Set<Path> paths = topologyService.getPaths(topologyService.currentTopology(), | 103 | Set<Path> paths = topologyService.getPaths(topologyService.currentTopology(), |
| 104 | - pkt.receivedFrom().deviceId(), | 104 | + pkt.receivedFrom().deviceId(), |
| 105 | - dst.location().deviceId()); | 105 | + dst.location().deviceId()); |
| 106 | if (paths.isEmpty()) { | 106 | if (paths.isEmpty()) { |
| 107 | // If there are no paths, flood and bail. | 107 | // If there are no paths, flood and bail. |
| 108 | flood(context); | 108 | flood(context); |
| ... | @@ -114,8 +114,8 @@ public class ReactiveForwarding { | ... | @@ -114,8 +114,8 @@ public class ReactiveForwarding { |
| 114 | Path path = pickForwardPath(paths, pkt.receivedFrom().port()); | 114 | Path path = pickForwardPath(paths, pkt.receivedFrom().port()); |
| 115 | if (path == null) { | 115 | if (path == null) { |
| 116 | log.warn("Doh... don't know where to go... {} -> {} received on {}", | 116 | log.warn("Doh... don't know where to go... {} -> {} received on {}", |
| 117 | - ethPkt.getSourceMAC(), ethPkt.getDestinationMAC(), | 117 | + ethPkt.getSourceMAC(), ethPkt.getDestinationMAC(), |
| 118 | - pkt.receivedFrom().port()); | 118 | + pkt.receivedFrom()); |
| 119 | flood(context); | 119 | flood(context); |
| 120 | return; | 120 | return; |
| 121 | } | 121 | } |
| ... | @@ -139,7 +139,7 @@ public class ReactiveForwarding { | ... | @@ -139,7 +139,7 @@ public class ReactiveForwarding { |
| 139 | // Floods the specified packet if permissible. | 139 | // Floods the specified packet if permissible. |
| 140 | private void flood(PacketContext context) { | 140 | private void flood(PacketContext context) { |
| 141 | if (topologyService.isBroadcastPoint(topologyService.currentTopology(), | 141 | if (topologyService.isBroadcastPoint(topologyService.currentTopology(), |
| 142 | - context.inPacket().receivedFrom())) { | 142 | + context.inPacket().receivedFrom())) { |
| 143 | packetOut(context, PortNumber.FLOOD); | 143 | packetOut(context, PortNumber.FLOOD); |
| 144 | } else { | 144 | } else { |
| 145 | context.block(); | 145 | context.block(); |
| ... | @@ -161,15 +161,15 @@ public class ReactiveForwarding { | ... | @@ -161,15 +161,15 @@ public class ReactiveForwarding { |
| 161 | Ethernet inPkt = context.inPacket().parsed(); | 161 | Ethernet inPkt = context.inPacket().parsed(); |
| 162 | TrafficSelector.Builder builder = new DefaultTrafficSelector.Builder(); | 162 | TrafficSelector.Builder builder = new DefaultTrafficSelector.Builder(); |
| 163 | builder.add(Criteria.matchEthType(inPkt.getEtherType())) | 163 | builder.add(Criteria.matchEthType(inPkt.getEtherType())) |
| 164 | - .add(Criteria.matchEthSrc(inPkt.getSourceMAC())) | 164 | + .add(Criteria.matchEthSrc(inPkt.getSourceMAC())) |
| 165 | - .add(Criteria.matchEthDst(inPkt.getDestinationMAC())) | 165 | + .add(Criteria.matchEthDst(inPkt.getDestinationMAC())) |
| 166 | - .add(Criteria.matchInPort(context.inPacket().receivedFrom().port())); | 166 | + .add(Criteria.matchInPort(context.inPacket().receivedFrom().port())); |
| 167 | 167 | ||
| 168 | TrafficTreatment.Builder treat = new DefaultTrafficTreatment.Builder(); | 168 | TrafficTreatment.Builder treat = new DefaultTrafficTreatment.Builder(); |
| 169 | treat.add(Instructions.createOutput(portNumber)); | 169 | treat.add(Instructions.createOutput(portNumber)); |
| 170 | 170 | ||
| 171 | FlowRule f = new DefaultFlowRule(context.inPacket().receivedFrom().deviceId(), | 171 | FlowRule f = new DefaultFlowRule(context.inPacket().receivedFrom().deviceId(), |
| 172 | - builder.build(), treat.build(), 0); | 172 | + builder.build(), treat.build(), 0); |
| 173 | 173 | ||
| 174 | flowRuleService.applyFlowRules(f); | 174 | flowRuleService.applyFlowRules(f); |
| 175 | } | 175 | } | ... | ... |
| ... | @@ -25,9 +25,12 @@ public final class DefaultOpenFlowPacketContext implements OpenFlowPacketContext | ... | @@ -25,9 +25,12 @@ public final class DefaultOpenFlowPacketContext implements OpenFlowPacketContext |
| 25 | private final OFPacketIn pktin; | 25 | private final OFPacketIn pktin; |
| 26 | private OFPacketOut pktout = null; | 26 | private OFPacketOut pktout = null; |
| 27 | 27 | ||
| 28 | + private final boolean isBuffered; | ||
| 29 | + | ||
| 28 | private DefaultOpenFlowPacketContext(OpenFlowSwitch s, OFPacketIn pkt) { | 30 | private DefaultOpenFlowPacketContext(OpenFlowSwitch s, OFPacketIn pkt) { |
| 29 | this.sw = s; | 31 | this.sw = s; |
| 30 | this.pktin = pkt; | 32 | this.pktin = pkt; |
| 33 | + this.isBuffered = pktin.getBufferId() != OFBufferId.NO_BUFFER; | ||
| 31 | } | 34 | } |
| 32 | 35 | ||
| 33 | @Override | 36 | @Override |
| ... | @@ -117,4 +120,9 @@ public final class DefaultOpenFlowPacketContext implements OpenFlowPacketContext | ... | @@ -117,4 +120,9 @@ public final class DefaultOpenFlowPacketContext implements OpenFlowPacketContext |
| 117 | return !free.get(); | 120 | return !free.get(); |
| 118 | } | 121 | } |
| 119 | 122 | ||
| 123 | + @Override | ||
| 124 | + public boolean isBuffered() { | ||
| 125 | + return isBuffered; | ||
| 126 | + } | ||
| 127 | + | ||
| 120 | } | 128 | } | ... | ... |
| ... | @@ -67,4 +67,10 @@ public interface OpenFlowPacketContext { | ... | @@ -67,4 +67,10 @@ public interface OpenFlowPacketContext { |
| 67 | * @return the port | 67 | * @return the port |
| 68 | */ | 68 | */ |
| 69 | public Integer inPort(); | 69 | public Integer inPort(); |
| 70 | + | ||
| 71 | + /** | ||
| 72 | + * Indicates that this packet is buffered at the switch. | ||
| 73 | + * @return buffer indication | ||
| 74 | + */ | ||
| 75 | + boolean isBuffered(); | ||
| 70 | } | 76 | } | ... | ... |
| ... | @@ -225,5 +225,10 @@ public class OpenFlowHostProviderTest { | ... | @@ -225,5 +225,10 @@ public class OpenFlowHostProviderTest { |
| 225 | return false; | 225 | return false; |
| 226 | } | 226 | } |
| 227 | 227 | ||
| 228 | + @Override | ||
| 229 | + public boolean isBuffered() { | ||
| 230 | + return false; | ||
| 231 | + } | ||
| 232 | + | ||
| 228 | } | 233 | } |
| 229 | } | 234 | } | ... | ... |
| ... | @@ -32,18 +32,19 @@ public class OpenFlowCorePacketContext extends DefaultPacketContext { | ... | @@ -32,18 +32,19 @@ public class OpenFlowCorePacketContext extends DefaultPacketContext { |
| 32 | public void send() { | 32 | public void send() { |
| 33 | if (!this.block()) { | 33 | if (!this.block()) { |
| 34 | if (outPacket() == null) { | 34 | if (outPacket() == null) { |
| 35 | - sendBufferedPacket(); | 35 | + sendPacket(null); |
| 36 | } else { | 36 | } else { |
| 37 | Ethernet eth = new Ethernet(); | 37 | Ethernet eth = new Ethernet(); |
| 38 | eth.deserialize(outPacket().data().array(), 0, | 38 | eth.deserialize(outPacket().data().array(), 0, |
| 39 | outPacket().data().array().length); | 39 | outPacket().data().array().length); |
| 40 | - ofPktCtx.build(eth, OFPort.FLOOD); | 40 | + sendPacket(eth); |
| 41 | + | ||
| 41 | } | 42 | } |
| 42 | 43 | ||
| 43 | } | 44 | } |
| 44 | } | 45 | } |
| 45 | 46 | ||
| 46 | - private void sendBufferedPacket() { | 47 | + private void sendPacket(Ethernet eth) { |
| 47 | List<Instruction> ins = treatmentBuilder().build().instructions(); | 48 | List<Instruction> ins = treatmentBuilder().build().instructions(); |
| 48 | OFPort p = null; | 49 | OFPort p = null; |
| 49 | //TODO: support arbitrary list of treatments must be supported in ofPacketContext | 50 | //TODO: support arbitrary list of treatments must be supported in ofPacketContext |
| ... | @@ -53,10 +54,13 @@ public class OpenFlowCorePacketContext extends DefaultPacketContext { | ... | @@ -53,10 +54,13 @@ public class OpenFlowCorePacketContext extends DefaultPacketContext { |
| 53 | break; //for now... | 54 | break; //for now... |
| 54 | } | 55 | } |
| 55 | } | 56 | } |
| 56 | - ofPktCtx.build(p); | 57 | + if (eth == null) { |
| 58 | + ofPktCtx.build(p); | ||
| 59 | + } else { | ||
| 60 | + ofPktCtx.build(eth, p); | ||
| 61 | + } | ||
| 57 | ofPktCtx.send(); | 62 | ofPktCtx.send(); |
| 58 | } | 63 | } |
| 59 | - | ||
| 60 | private OFPort buildPort(PortNumber port) { | 64 | private OFPort buildPort(PortNumber port) { |
| 61 | return OFPort.of((int) port.toLong()); | 65 | return OFPort.of((int) port.toLong()); |
| 62 | } | 66 | } | ... | ... |
| 1 | package org.onlab.onos.provider.of.packet.impl; | 1 | package org.onlab.onos.provider.of.packet.impl; |
| 2 | 2 | ||
| 3 | +import static org.onlab.onos.openflow.controller.RoleState.SLAVE; | ||
| 3 | import static org.slf4j.LoggerFactory.getLogger; | 4 | import static org.slf4j.LoggerFactory.getLogger; |
| 4 | 5 | ||
| 5 | import java.nio.ByteBuffer; | 6 | import java.nio.ByteBuffer; |
| ... | @@ -16,6 +17,7 @@ import org.onlab.onos.net.PortNumber; | ... | @@ -16,6 +17,7 @@ import org.onlab.onos.net.PortNumber; |
| 16 | import org.onlab.onos.net.flow.instructions.Instruction; | 17 | import org.onlab.onos.net.flow.instructions.Instruction; |
| 17 | import org.onlab.onos.net.flow.instructions.Instructions.OutputInstruction; | 18 | import org.onlab.onos.net.flow.instructions.Instructions.OutputInstruction; |
| 18 | import org.onlab.onos.net.packet.DefaultInboundPacket; | 19 | import org.onlab.onos.net.packet.DefaultInboundPacket; |
| 20 | +import org.onlab.onos.net.packet.DefaultOutboundPacket; | ||
| 19 | import org.onlab.onos.net.packet.OutboundPacket; | 21 | import org.onlab.onos.net.packet.OutboundPacket; |
| 20 | import org.onlab.onos.net.packet.PacketProvider; | 22 | import org.onlab.onos.net.packet.PacketProvider; |
| 21 | import org.onlab.onos.net.packet.PacketProviderRegistry; | 23 | import org.onlab.onos.net.packet.PacketProviderRegistry; |
| ... | @@ -36,8 +38,6 @@ import org.projectfloodlight.openflow.types.OFBufferId; | ... | @@ -36,8 +38,6 @@ import org.projectfloodlight.openflow.types.OFBufferId; |
| 36 | import org.projectfloodlight.openflow.types.OFPort; | 38 | import org.projectfloodlight.openflow.types.OFPort; |
| 37 | import org.slf4j.Logger; | 39 | import org.slf4j.Logger; |
| 38 | 40 | ||
| 39 | -import static org.onlab.onos.openflow.controller.RoleState.*; | ||
| 40 | - | ||
| 41 | 41 | ||
| 42 | /** | 42 | /** |
| 43 | * Provider which uses an OpenFlow controller to detect network | 43 | * Provider which uses an OpenFlow controller to detect network |
| ... | @@ -152,9 +152,15 @@ public class OpenFlowPacketProvider extends AbstractProvider implements PacketPr | ... | @@ -152,9 +152,15 @@ public class OpenFlowPacketProvider extends AbstractProvider implements PacketPr |
| 152 | new ConnectPoint(id, PortNumber.portNumber(pktCtx.inPort())), | 152 | new ConnectPoint(id, PortNumber.portNumber(pktCtx.inPort())), |
| 153 | pktCtx.parsed(), ByteBuffer.wrap(pktCtx.unparsed())); | 153 | pktCtx.parsed(), ByteBuffer.wrap(pktCtx.unparsed())); |
| 154 | 154 | ||
| 155 | + DefaultOutboundPacket outPkt = null; | ||
| 156 | + if (!pktCtx.isBuffered()) { | ||
| 157 | + outPkt = new DefaultOutboundPacket(id, null, | ||
| 158 | + ByteBuffer.wrap(pktCtx.unparsed())); | ||
| 159 | + } | ||
| 160 | + | ||
| 155 | OpenFlowCorePacketContext corePktCtx = | 161 | OpenFlowCorePacketContext corePktCtx = |
| 156 | new OpenFlowCorePacketContext(System.currentTimeMillis(), | 162 | new OpenFlowCorePacketContext(System.currentTimeMillis(), |
| 157 | - inPkt, null, pktCtx.isHandled(), pktCtx); | 163 | + inPkt, outPkt, pktCtx.isHandled(), pktCtx); |
| 158 | providerService.processPacket(corePktCtx); | 164 | providerService.processPacket(corePktCtx); |
| 159 | } | 165 | } |
| 160 | 166 | ... | ... |
-
Please register or login to post a comment