public void onReceive(Object msg) throws Exception {
if (msg instanceof Received) {
switch (this.state) {
case STARTED:
ByteString in = ((Received) msg).data();
provider = factory.getMessageProvider(in.toArray());
builder = new org.flowforwarding.warp.protocol.ofp.avro.OFMessage.OFMessageBuilder(in.toArray());
OFMessage inMsg = builder.value(in.toArray()).build();
if ((provider != null) && (inMsg != null)) {
if (inMsg.type().equals("OFPT_HELLO")) {
log.info ("IN: Hello");
swRef.setVersion(builder.version());
// getSender().tell(TcpMessage.write(ByteString.fromArray(builder.type("ofp_hello").set("header.xid", "0xabba").build().binary())), getSelf());
OFMessage helloMsg = builder.type("ofp_hello").build();
byte[] v = {127,127,127,127};
helloMsg.get("header").get("xid").set(v);
//getSender().tell(TcpMessage.write(ByteString.fromArray(builder.type("ofp_hello").build().binary())), getSelf());
getSender().tell(TcpMessage.write(ByteString.fromArray(helloMsg.binary())), getSelf());
this.state = State.CONNECTED;
log.info ("STATE: Connected to OF Switch version "+ builder.version());
// getSender().tell(TcpMessage.write(ByteString.fromArray(builder.type("ofp_switch_features_request").set("xid", "0xabba").build().binary())), getSelf());
getSender().tell(TcpMessage.write(ByteString.fromArray(builder.type("ofp_switch_features_request").build().binary())), getSelf());
// TODO REMOVE THIS:
provider.init();
tcpChannel = getSender();
}
}
break;
case CONNECTED:
in = ((Received) msg).data();
inMsg = builder.value(in.toArray()).build();
if (inMsg.type().equals("OFPT_FEATURES_REPLY")) {
log.info("IN: Features Reply");
byte[] DPID = inMsg.field("datapath_id");
swRef.setDpid(Convert.toLong(DPID));
log.info("INFO: Switch DPID is " + Long.toHexString(Convert.toLong(DPID)).toUpperCase());
state = State.HANDSHAKED;
ofSessionHandler.tell(new OFEventHandshaked(swRef), getSelf());
getSender().tell(TcpMessage.write(ByteString.fromArray(builder.type("ofp_get_config_request").build().binary())), getSelf());
}
break;
case HANDSHAKED:
in = ((Received) msg).data();
inMsg = builder.value(in.toArray()).build();
if (inMsg.type().equals("OFPT_GET_CONFIG_REPLY")) {
log.info("IN: Config Reply from Switch " + Long.toHexString(swRef.getDpid().longValue()));
OFMessage flowMod = builder.type("ofp_flow_mod").build();
/* OFItemRef matchInPort = itemBuilder.type("oxm_tlv_ingress_port").build();
matchInPort.set("tlv", "4");
OFItemRef tlv = itemBuilder.type("oxm_tlv").build();
tlv.add("match", matchInPort);
OFMessageRef tlv_fields = builder.type("oxm_tlv_fields").build();
//tlv_fields.add("oxm_tlvs", tlv);
tlv_fields.get("oxm_tlvs").add(tlv);
tlv_fields.binary();*/
}
if (provider.isConfig(in.toArray())) {
ofSessionHandler.tell(new OFEventSwitchConfig(swRef, provider.parseSwitchConfig(in.toArray())), getSelf());
} else if (provider.isPacketIn(in.toArray())) {
System.out.println("[OF-INFO] DPID: " + Long.toHexString(swRef.getDpid().longValue()) +" Packet-In is received from the Switch");
ofSessionHandler.tell(new OFEventPacketIn(swRef, provider.parsePacketIn(in.toArray())), getSelf());
} else if (provider.isError(in.toArray())) {
System.out.println("[OF-INFO] DPID: " + Long.toHexString(swRef.getDpid().longValue()) + " Error is received from the Switch ");
ofSessionHandler.tell(new OFEventError(swRef, provider.parseError(in.toArray())), getSelf());
} else if (provider.isEchoRequest(in.toArray())) {
System.out.println("[OF-INFO] DPID: " + Long.toHexString(swRef.getDpid().longValue()) + " Echo request is received from the Switch ");
getSender().tell(TcpMessage.write(ByteString.fromArray(provider.encodeEchoReply())), getSelf());
}
//ofSessionHandler.tell(new OFEventIncoming(swRef), getSelf());