blob: 55476d00c11f5300e85b8367080a4c04d42e236d [file] [log] [blame]
alshabib1d4cace2014-09-13 19:16:26 -07001package org.onlab.onos.provider.of.packet.impl;
2
3import static org.slf4j.LoggerFactory.getLogger;
4
alshabib63d5afe2014-09-15 09:40:24 -07005import java.util.List;
6
7import org.onlab.onos.net.PortNumber;
8import org.onlab.onos.net.flow.Instruction;
9import org.onlab.onos.net.flow.Instruction.Type;
alshabib1d4cace2014-09-13 19:16:26 -070010import org.onlab.onos.net.packet.DefaultPacketContext;
11import org.onlab.onos.net.packet.InboundPacket;
12import org.onlab.onos.net.packet.OutboundPacket;
13import org.onlab.onos.of.controller.OpenFlowPacketContext;
14import org.onlab.packet.Ethernet;
15import org.projectfloodlight.openflow.types.OFPort;
16import org.slf4j.Logger;
17
18public class OpenFlowCorePacketContext extends DefaultPacketContext {
19
20 private final Logger log = getLogger(getClass());
21
22 private final OpenFlowPacketContext ofPktCtx;
23
24 protected OpenFlowCorePacketContext(long time, InboundPacket inPkt,
25 OutboundPacket outPkt, boolean block, OpenFlowPacketContext ofPktCtx) {
26 super(time, inPkt, outPkt, block);
27 this.ofPktCtx = ofPktCtx;
28 }
29
30 @Override
31 public void send() {
alshabib63d5afe2014-09-15 09:40:24 -070032 if (!this.blocked()) {
alshabib1d4cace2014-09-13 19:16:26 -070033 if (outPacket() == null) {
alshabib63d5afe2014-09-15 09:40:24 -070034 sendBufferedPacket();
alshabib1d4cace2014-09-13 19:16:26 -070035 } else {
36 Ethernet eth = new Ethernet();
37 eth.deserialize(outPacket().data().array(), 0,
38 outPacket().data().array().length);
39 ofPktCtx.build(eth, OFPort.FLOOD);
40 }
alshabib63d5afe2014-09-15 09:40:24 -070041
alshabib1d4cace2014-09-13 19:16:26 -070042 }
43 }
44
alshabib63d5afe2014-09-15 09:40:24 -070045 @SuppressWarnings({ "rawtypes", "unchecked" })
46 private void sendBufferedPacket() {
47 List<Instruction> ins = treatmentBuilder().build().instructions();
48 OFPort p = null;
49 //TODO: support arbitrary list of treatments
50 for (Instruction i : ins) {
51 if (i.type() == Type.OUTPUT) {
52 p = buildPort(((Instruction<PortNumber>) i).instruction());
53 break; //for now...
54 }
55 }
56 ofPktCtx.build(p);
57 ofPktCtx.send();
58 }
59
60 private OFPort buildPort(PortNumber port) {
61 return OFPort.of((int) port.toLong());
62 }
63
alshabib1d4cace2014-09-13 19:16:26 -070064}