blob: 7ad2fec800a880e2724a4be09bb8fbfeebe71255 [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;
9import org.projectfloodlight.openflow.types.OFBufferId;
alshabibc4901cd2014-09-05 16:50:40 -070010import org.projectfloodlight.openflow.types.OFPort;
11
alshabib638dc712014-09-05 18:03:45 -070012public final class DefaultPacketContext implements PacketContext {
alshabibc4901cd2014-09-05 16:50:40 -070013
14 private boolean free = true;
15 private boolean isBuilt = false;
16 private final OpenFlowSwitch sw;
17 private final OFPacketIn pktin;
alshabib289652c2014-09-07 19:09:28 -070018 private OFPacketOut pktout = null;
alshabibc4901cd2014-09-05 16:50:40 -070019
20 private DefaultPacketContext(OpenFlowSwitch s, OFPacketIn pkt) {
21 this.sw = s;
22 this.pktin = pkt;
23 }
24
25 @Override
26 public void block() {
27 free = false;
28 }
29
30 @Override
31 public void send() {
32 if (free && isBuilt) {
33 sw.sendMsg(pktout);
34 }
35
36 }
37
38 @Override
39 public void build(OFPort outPort) {
40 isBuilt = true;
41
42 }
43
44 @Override
45 public void build(Ethernet ethFrame, OFPort outPort) {
alshabib289652c2014-09-07 19:09:28 -070046 if (isBuilt) {
47 return;
48 }
49 OFPacketOut.Builder builder = sw.factory().buildPacketOut();
50 OFAction act = sw.factory().actions()
51 .buildOutput()
52 .setPort(OFPort.of(outPort.getPortNumber()))
53 .build();
54 pktout = builder.setXid(pktin.getXid())
55 .setBufferId(OFBufferId.NO_BUFFER)
56 .setActions(Collections.singletonList(act))
57 .setData(ethFrame.serialize())
58 .build();
59 isBuilt = true;
alshabibc4901cd2014-09-05 16:50:40 -070060 }
61
62 @Override
63 public Ethernet parsed() {
alshabib289652c2014-09-07 19:09:28 -070064 Ethernet eth = new Ethernet();
65 eth.deserialize(pktin.getData(), 0, pktin.getTotalLen());
66 return eth;
alshabibc4901cd2014-09-05 16:50:40 -070067 }
68
69 @Override
70 public Dpid dpid() {
alshabib289652c2014-09-07 19:09:28 -070071 return new Dpid(sw.getId());
alshabibc4901cd2014-09-05 16:50:40 -070072 }
73
alshabib638dc712014-09-05 18:03:45 -070074 public static PacketContext packetContextFromPacketIn(OpenFlowSwitch s, OFPacketIn pkt) {
alshabibc4901cd2014-09-05 16:50:40 -070075 return new DefaultPacketContext(s, pkt);
76 }
77
alshabibdf652ad2014-09-09 11:53:19 -070078 @Override
79 public Integer inPort() {
80 return pktin.getInPort().getPortNumber();
81 }
82
alshabibc4901cd2014-09-05 16:50:40 -070083}