pkt glitch FIXED... ovs was not sending a bufferid
Change-Id: Id6fedf7c6ed8fbcfefb7308b0ee442e614e5e3af
diff --git a/apps/fwd/src/main/java/org/onlab/onos/fwd/ReactiveForwarding.java b/apps/fwd/src/main/java/org/onlab/onos/fwd/ReactiveForwarding.java
index 6856e1a..abbba99 100644
--- a/apps/fwd/src/main/java/org/onlab/onos/fwd/ReactiveForwarding.java
+++ b/apps/fwd/src/main/java/org/onlab/onos/fwd/ReactiveForwarding.java
@@ -1,5 +1,9 @@
package org.onlab.onos.fwd;
+import static org.slf4j.LoggerFactory.getLogger;
+
+import java.util.Set;
+
import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Deactivate;
@@ -27,10 +31,6 @@
import org.onlab.packet.Ethernet;
import org.slf4j.Logger;
-import java.util.Set;
-
-import static org.slf4j.LoggerFactory.getLogger;
-
/**
* Sample reactive forwarding application.
*/
@@ -101,8 +101,8 @@
// Otherwise, get a set of paths that lead from here to the
// destination edge switch.
Set<Path> paths = topologyService.getPaths(topologyService.currentTopology(),
- pkt.receivedFrom().deviceId(),
- dst.location().deviceId());
+ pkt.receivedFrom().deviceId(),
+ dst.location().deviceId());
if (paths.isEmpty()) {
// If there are no paths, flood and bail.
flood(context);
@@ -114,8 +114,8 @@
Path path = pickForwardPath(paths, pkt.receivedFrom().port());
if (path == null) {
log.warn("Doh... don't know where to go... {} -> {} received on {}",
- ethPkt.getSourceMAC(), ethPkt.getDestinationMAC(),
- pkt.receivedFrom().port());
+ ethPkt.getSourceMAC(), ethPkt.getDestinationMAC(),
+ pkt.receivedFrom());
flood(context);
return;
}
@@ -139,7 +139,7 @@
// Floods the specified packet if permissible.
private void flood(PacketContext context) {
if (topologyService.isBroadcastPoint(topologyService.currentTopology(),
- context.inPacket().receivedFrom())) {
+ context.inPacket().receivedFrom())) {
packetOut(context, PortNumber.FLOOD);
} else {
context.block();
@@ -161,15 +161,15 @@
Ethernet inPkt = context.inPacket().parsed();
TrafficSelector.Builder builder = new DefaultTrafficSelector.Builder();
builder.add(Criteria.matchEthType(inPkt.getEtherType()))
- .add(Criteria.matchEthSrc(inPkt.getSourceMAC()))
- .add(Criteria.matchEthDst(inPkt.getDestinationMAC()))
- .add(Criteria.matchInPort(context.inPacket().receivedFrom().port()));
+ .add(Criteria.matchEthSrc(inPkt.getSourceMAC()))
+ .add(Criteria.matchEthDst(inPkt.getDestinationMAC()))
+ .add(Criteria.matchInPort(context.inPacket().receivedFrom().port()));
TrafficTreatment.Builder treat = new DefaultTrafficTreatment.Builder();
treat.add(Instructions.createOutput(portNumber));
FlowRule f = new DefaultFlowRule(context.inPacket().receivedFrom().deviceId(),
- builder.build(), treat.build(), 0);
+ builder.build(), treat.build(), 0);
flowRuleService.applyFlowRules(f);
}
diff --git a/openflow/api/src/main/java/org/onlab/onos/openflow/controller/DefaultOpenFlowPacketContext.java b/openflow/api/src/main/java/org/onlab/onos/openflow/controller/DefaultOpenFlowPacketContext.java
index f419d24..4cd29c4 100644
--- a/openflow/api/src/main/java/org/onlab/onos/openflow/controller/DefaultOpenFlowPacketContext.java
+++ b/openflow/api/src/main/java/org/onlab/onos/openflow/controller/DefaultOpenFlowPacketContext.java
@@ -25,9 +25,12 @@
private final OFPacketIn pktin;
private OFPacketOut pktout = null;
+ private final boolean isBuffered;
+
private DefaultOpenFlowPacketContext(OpenFlowSwitch s, OFPacketIn pkt) {
this.sw = s;
this.pktin = pkt;
+ this.isBuffered = pktin.getBufferId() != OFBufferId.NO_BUFFER;
}
@Override
@@ -117,4 +120,9 @@
return !free.get();
}
+ @Override
+ public boolean isBuffered() {
+ return isBuffered;
+ }
+
}
diff --git a/openflow/api/src/main/java/org/onlab/onos/openflow/controller/OpenFlowPacketContext.java b/openflow/api/src/main/java/org/onlab/onos/openflow/controller/OpenFlowPacketContext.java
index 85ea70a..0a20794 100644
--- a/openflow/api/src/main/java/org/onlab/onos/openflow/controller/OpenFlowPacketContext.java
+++ b/openflow/api/src/main/java/org/onlab/onos/openflow/controller/OpenFlowPacketContext.java
@@ -67,4 +67,10 @@
* @return the port
*/
public Integer inPort();
+
+ /**
+ * Indicates that this packet is buffered at the switch.
+ * @return buffer indication
+ */
+ boolean isBuffered();
}
diff --git a/providers/openflow/host/src/test/java/org/onlab/onos/provider/of/host/impl/OpenFlowHostProviderTest.java b/providers/openflow/host/src/test/java/org/onlab/onos/provider/of/host/impl/OpenFlowHostProviderTest.java
index 78c2e41..cb37b1c 100644
--- a/providers/openflow/host/src/test/java/org/onlab/onos/provider/of/host/impl/OpenFlowHostProviderTest.java
+++ b/providers/openflow/host/src/test/java/org/onlab/onos/provider/of/host/impl/OpenFlowHostProviderTest.java
@@ -225,5 +225,10 @@
return false;
}
+ @Override
+ public boolean isBuffered() {
+ return false;
+ }
+
}
}
diff --git a/providers/openflow/packet/src/main/java/org/onlab/onos/provider/of/packet/impl/OpenFlowCorePacketContext.java b/providers/openflow/packet/src/main/java/org/onlab/onos/provider/of/packet/impl/OpenFlowCorePacketContext.java
index 248e17d..e7c4443 100644
--- a/providers/openflow/packet/src/main/java/org/onlab/onos/provider/of/packet/impl/OpenFlowCorePacketContext.java
+++ b/providers/openflow/packet/src/main/java/org/onlab/onos/provider/of/packet/impl/OpenFlowCorePacketContext.java
@@ -32,18 +32,19 @@
public void send() {
if (!this.block()) {
if (outPacket() == null) {
- sendBufferedPacket();
+ sendPacket(null);
} else {
Ethernet eth = new Ethernet();
eth.deserialize(outPacket().data().array(), 0,
outPacket().data().array().length);
- ofPktCtx.build(eth, OFPort.FLOOD);
+ sendPacket(eth);
+
}
}
}
- private void sendBufferedPacket() {
+ private void sendPacket(Ethernet eth) {
List<Instruction> ins = treatmentBuilder().build().instructions();
OFPort p = null;
//TODO: support arbitrary list of treatments must be supported in ofPacketContext
@@ -53,10 +54,13 @@
break; //for now...
}
}
- ofPktCtx.build(p);
+ if (eth == null) {
+ ofPktCtx.build(p);
+ } else {
+ ofPktCtx.build(eth, p);
+ }
ofPktCtx.send();
}
-
private OFPort buildPort(PortNumber port) {
return OFPort.of((int) port.toLong());
}
diff --git a/providers/openflow/packet/src/main/java/org/onlab/onos/provider/of/packet/impl/OpenFlowPacketProvider.java b/providers/openflow/packet/src/main/java/org/onlab/onos/provider/of/packet/impl/OpenFlowPacketProvider.java
index 8ce94b5..feedd88 100644
--- a/providers/openflow/packet/src/main/java/org/onlab/onos/provider/of/packet/impl/OpenFlowPacketProvider.java
+++ b/providers/openflow/packet/src/main/java/org/onlab/onos/provider/of/packet/impl/OpenFlowPacketProvider.java
@@ -1,5 +1,6 @@
package org.onlab.onos.provider.of.packet.impl;
+import static org.onlab.onos.openflow.controller.RoleState.SLAVE;
import static org.slf4j.LoggerFactory.getLogger;
import java.nio.ByteBuffer;
@@ -16,6 +17,7 @@
import org.onlab.onos.net.flow.instructions.Instruction;
import org.onlab.onos.net.flow.instructions.Instructions.OutputInstruction;
import org.onlab.onos.net.packet.DefaultInboundPacket;
+import org.onlab.onos.net.packet.DefaultOutboundPacket;
import org.onlab.onos.net.packet.OutboundPacket;
import org.onlab.onos.net.packet.PacketProvider;
import org.onlab.onos.net.packet.PacketProviderRegistry;
@@ -36,8 +38,6 @@
import org.projectfloodlight.openflow.types.OFPort;
import org.slf4j.Logger;
-import static org.onlab.onos.openflow.controller.RoleState.*;
-
/**
* Provider which uses an OpenFlow controller to detect network
@@ -152,9 +152,15 @@
new ConnectPoint(id, PortNumber.portNumber(pktCtx.inPort())),
pktCtx.parsed(), ByteBuffer.wrap(pktCtx.unparsed()));
+ DefaultOutboundPacket outPkt = null;
+ if (!pktCtx.isBuffered()) {
+ outPkt = new DefaultOutboundPacket(id, null,
+ ByteBuffer.wrap(pktCtx.unparsed()));
+ }
+
OpenFlowCorePacketContext corePktCtx =
new OpenFlowCorePacketContext(System.currentTimeMillis(),
- inPkt, null, pktCtx.isHandled(), pktCtx);
+ inPkt, outPkt, pktCtx.isHandled(), pktCtx);
providerService.processPacket(corePktCtx);
}