blob: 65434beccc635b732967618be6a61d3f92920404 [file] [log] [blame]
alshabibc4901cd2014-09-05 16:50:40 -07001package org.onlab.onos.of.controller;
2
alshabib289652c2014-09-07 19:09:28 -07003import java.util.Collections;
4
alshabibc4901cd2014-09-05 16:50:40 -07005import org.onlab.packet.Ethernet;
6import org.projectfloodlight.openflow.protocol.OFPacketIn;
7import org.projectfloodlight.openflow.protocol.OFPacketOut;
alshabib289652c2014-09-07 19:09:28 -07008import org.projectfloodlight.openflow.protocol.action.OFAction;
alshabibddf02db2014-09-09 14:57:15 -07009import org.projectfloodlight.openflow.protocol.action.OFActionOutput;
alshabib289652c2014-09-07 19:09:28 -070010import org.projectfloodlight.openflow.types.OFBufferId;
alshabibc4901cd2014-09-05 16:50:40 -070011import org.projectfloodlight.openflow.types.OFPort;
12
alshabib638dc712014-09-05 18:03:45 -070013public final class DefaultPacketContext implements PacketContext {
alshabibc4901cd2014-09-05 16:50:40 -070014
15 private boolean free = true;
16 private boolean isBuilt = false;
17 private final OpenFlowSwitch sw;
18 private final OFPacketIn pktin;
alshabib289652c2014-09-07 19:09:28 -070019 private OFPacketOut pktout = null;
alshabibc4901cd2014-09-05 16:50:40 -070020
21 private DefaultPacketContext(OpenFlowSwitch s, OFPacketIn pkt) {
22 this.sw = s;
23 this.pktin = pkt;
24 }
25
26 @Override
27 public void block() {
28 free = false;
29 }
30
31 @Override
32 public void send() {
33 if (free && isBuilt) {
34 sw.sendMsg(pktout);
35 }
36
37 }
38
39 @Override
alshabibddf02db2014-09-09 14:57:15 -070040 public synchronized void build(OFPort outPort) {
alshabib289652c2014-09-07 19:09:28 -070041 if (isBuilt) {
42 return;
43 }
44 OFPacketOut.Builder builder = sw.factory().buildPacketOut();
alshabibddf02db2014-09-09 14:57:15 -070045 OFAction act = buildOutput(outPort.getPortNumber());
46 pktout = builder.setXid(pktin.getXid())
47 .setBufferId(pktin.getBufferId())
48 .setActions(Collections.singletonList(act))
alshabib289652c2014-09-07 19:09:28 -070049 .build();
alshabibddf02db2014-09-09 14:57:15 -070050 isBuilt = true;
51 }
52
53 @Override
54 public synchronized void build(Ethernet ethFrame, OFPort outPort) {
55 if (isBuilt) {
56 return;
57 }
58 OFPacketOut.Builder builder = sw.factory().buildPacketOut();
59 OFAction act = buildOutput(outPort.getPortNumber());
alshabib289652c2014-09-07 19:09:28 -070060 pktout = builder.setXid(pktin.getXid())
61 .setBufferId(OFBufferId.NO_BUFFER)
62 .setActions(Collections.singletonList(act))
63 .setData(ethFrame.serialize())
64 .build();
65 isBuilt = true;
alshabibc4901cd2014-09-05 16:50:40 -070066 }
67
68 @Override
69 public Ethernet parsed() {
alshabib289652c2014-09-07 19:09:28 -070070 Ethernet eth = new Ethernet();
71 eth.deserialize(pktin.getData(), 0, pktin.getTotalLen());
72 return eth;
alshabibc4901cd2014-09-05 16:50:40 -070073 }
74
75 @Override
76 public Dpid dpid() {
alshabib289652c2014-09-07 19:09:28 -070077 return new Dpid(sw.getId());
alshabibc4901cd2014-09-05 16:50:40 -070078 }
79
alshabib638dc712014-09-05 18:03:45 -070080 public static PacketContext packetContextFromPacketIn(OpenFlowSwitch s, OFPacketIn pkt) {
alshabibc4901cd2014-09-05 16:50:40 -070081 return new DefaultPacketContext(s, pkt);
82 }
83
alshabibdf652ad2014-09-09 11:53:19 -070084 @Override
85 public Integer inPort() {
86 return pktin.getInPort().getPortNumber();
87 }
88
alshabib9ee68172014-09-09 14:45:14 -070089 @Override
90 public byte[] unparsed() {
91 return pktin.getData().clone();
92 }
93
alshabibddf02db2014-09-09 14:57:15 -070094 private OFActionOutput buildOutput(Integer port) {
95 OFActionOutput act = sw.factory().actions()
96 .buildOutput()
97 .setPort(OFPort.of(port))
98 .build();
99 return act;
100 }
101
alshabibc4901cd2014-09-05 16:50:40 -0700102}