/*
* Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
package org.sndplatform.adaptors.controllerservice;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
import org.opendaylight.controller.sal.core.Node;
import org.opendaylight.controller.sal.core.NodeConnector;
import org.opendaylight.controller.sal.core.NodeConnector.NodeConnectorIDType;
import org.opendaylight.controller.sal.packet.IListenDataPacket;
import org.opendaylight.controller.sal.packet.PacketResult;
import org.opendaylight.controller.sal.packet.RawPacket;
import org.openflow.protocol.OFMessage;
import org.openflow.protocol.OFPacketIn;
import org.openflow.protocol.OFPort;
import org.openflow.protocol.OFType;
import org.openflow.protocol.factory.BasicFactory;
import org.sdnplatform.core.IControllerService;
import org.sdnplatform.core.IHAListener;
import org.sdnplatform.core.IInfoProvider;
import org.sdnplatform.core.IOFMessageListener;
import org.sdnplatform.core.IOFSwitch;
import org.sdnplatform.core.IOFSwitchDriver;
import org.sdnplatform.core.IOFSwitchListener;
import org.sdnplatform.core.ListenerContext;
import org.sdnplatform.core.RoleInfo;
import org.sdnplatform.packet.Ethernet;
public class ControllerServiceAdaptor implements IControllerService, IListenDataPacket {
private Set<IOFMessageListener> packetInListeners = new CopyOnWriteArraySet<IOFMessageListener>();
public PacketResult receiveDataPacket(RawPacket inPkt) {
PacketResult result = PacketResult.IGNORED;
// Let's only do this for OF nodeTypes... IOFMessageListener only understand OF
if(packetInListeners.size() > 0 &&
inPkt.getIncomingNodeConnector().getNode().getType() == Node.NodeIDType.OPENFLOW) {
/*
* Looked in org.sdnplatform.devicemanager.internal.DeviceManagerImpl.processPacketInMessage()
* and it appears to only need the OFPacketIn.data and OFPacketIn.inport
* additionally it seems to only need IOFSwitch.getID() and IOFSwitch.getStringID()
*/
// Create a new OFPacketIn
OFPacketIn in = new OFPacketIn();
// Set its data
in.setPacketData(inPkt.getPacketData());
// Set its inport
in.setInPort(toOFPort(inPkt.getIncomingNodeConnector()));
// Create a new Ethernet and deserialize the packet data into it
Ethernet eth = new Ethernet();
eth.deserialize(in.getPacketData(), 0,
in.getPacketData().length);
// Add the Ethernet to the ListenerContext
ListenerContext ctx = new ListenerContext();
ctx.getStorage().put(IControllerService.CONTEXT_PI_PAYLOAD, eth);
// Create a new OFSwitchAdaptor and set its id
OFSwitchAdaptor sw = new OFSwitchAdaptor();
sw.setId((Long) inPkt.getIncomingNodeConnector().getNode().getID());
// Send OFPacketIn to all IOFMessageListeners
for(IOFMessageListener packetInListener: this.packetInListeners) {
packetInListener.receive(sw, in, ctx);
}
result = PacketResult.KEEP_PROCESSING;
}
return result;
}
private static short toOFPort(NodeConnector salPort) {
if (salPort.getType().equals(NodeConnectorIDType.SWSTACK)) {
return OFPort.OFPP_LOCAL.getValue();
} else if (salPort.getType().equals(NodeConnectorIDType.HWPATH)) {
return OFPort.OFPP_NORMAL.getValue();
} else if (salPort.getType().equals(NodeConnectorIDType.CONTROLLER)) {
return OFPort.OFPP_CONTROLLER.getValue();
}
return (Short) salPort.getID();
}
public void addOFMessageListener(OFType type, IOFMessageListener listener) {
// TODO Finish Implementing this method
if(type == OFType.PACKET_IN) {
packetInListeners.add(listener);
} else {
throw new UnsupportedOperationException("Not implemented yet.");
}
}
public void removeOFMessageListener(OFType type, IOFMessageListener listener) {
// TODO Finish Implementing this method
if(type == OFType.PACKET_IN) {
packetInListeners.remove(listener);
} else {
throw new UnsupportedOperationException("Not implemented yet.");
}
}
public void addHAListener(IHAListener arg0) {
// TODO Finish Implementing this method
throw new UnsupportedOperationException("Not implemented yet.");
}
public void addInfoProvider(String arg0, IInfoProvider arg1) {
// TODO Finish Implementing this method
throw new UnsupportedOperationException("Not implemented yet.");
}
public void addOFSwitchDriver(String arg0, IOFSwitchDriver arg1) {
// TODO Finish Implementing this method
throw new UnsupportedOperationException("Not implemented yet.");
}
public void addOFSwitchListener(IOFSwitchListener arg0) {
// TODO Finish Implementing this method
throw new UnsupportedOperationException("Not implemented yet.");
}
public Map<String, Object> getControllerInfo(String arg0) {
// TODO Finish Implementing this method
throw new UnsupportedOperationException("Not implemented yet.");
}
public Map<String, String> getControllerNodeIPs() {
// TODO Finish Implementing this method
throw new UnsupportedOperationException("Not implemented yet.");
}
public Map<OFType, List<IOFMessageListener>> getListeners() {
// TODO Finish Implementing this method
throw new UnsupportedOperationException("Not implemented yet.");
}
public Map<String, Long> getMemory() {
// TODO Finish Implementing this method
throw new UnsupportedOperationException("Not implemented yet.");
}
public BasicFactory getOFMessageFactory() {
// TODO Finish Implementing this method
throw new UnsupportedOperationException("Not implemented yet.");
}
public Role getRole() {
// TODO Finish Implementing this method
throw new UnsupportedOperationException("Not implemented yet.");
}
public RoleInfo getRoleInfo() {
// TODO Finish Implementing this method
throw new UnsupportedOperationException("Not implemented yet.");
}
public Map<Long, IOFSwitch> getSwitches() {
// TODO Finish Implementing this method
throw new UnsupportedOperationException("Not implemented yet.");
}
public long getSystemStartTime() {
// TODO Finish Implementing this method
throw new UnsupportedOperationException("Not implemented yet.");
}
public Long getUptime() {
// TODO Finish Implementing this method
throw new UnsupportedOperationException("Not implemented yet.");
}
public void handleOutgoingMessage(IOFSwitch arg0, OFMessage arg1,
ListenerContext arg2) {
// TODO Finish Implementing this method
throw new UnsupportedOperationException("Not implemented yet.");
}
public boolean injectOfMessage(IOFSwitch arg0, OFMessage arg1) {
// TODO Finish Implementing this method
throw new UnsupportedOperationException("Not implemented yet.");
}
public boolean injectOfMessage(IOFSwitch arg0, OFMessage arg1,
ListenerContext arg2) {
// TODO Finish Implementing this method
throw new UnsupportedOperationException("Not implemented yet.");
}
public void removeHAListener(IHAListener arg0) {
// TODO Finish Implementing this method
throw new UnsupportedOperationException("Not implemented yet.");
}
public void removeInfoProvider(String arg0, IInfoProvider arg1) {
// TODO Finish Implementing this method
throw new UnsupportedOperationException("Not implemented yet.");
}
public void removeOFSwitchListener(IOFSwitchListener arg0) {
// TODO Finish Implementing this method
throw new UnsupportedOperationException("Not implemented yet.");
}
public void run() {
// TODO Finish Implementing this method
throw new UnsupportedOperationException("Not implemented yet.");
}
public void setAlwaysClearFlowsOnSwAdd(boolean arg0) {
// TODO Finish Implementing this method
throw new UnsupportedOperationException("Not implemented yet.");
}
public void setRole(Role arg0, String arg1) {
// TODO Finish Implementing this method
throw new UnsupportedOperationException("Not implemented yet.");
}
public void terminate() {
// TODO Finish Implementing this method
throw new UnsupportedOperationException("Not implemented yet.");
}
}