package net.floodlightcontroller.core.internal;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Date;
import net.floodlightcontroller.core.IOFConnectionBackend;
import org.projectfloodlight.openflow.protocol.OFFactory;
import org.projectfloodlight.openflow.protocol.OFMessage;
import org.projectfloodlight.openflow.protocol.OFRequest;
import org.projectfloodlight.openflow.protocol.OFStatsReply;
import org.projectfloodlight.openflow.protocol.OFStatsRequest;
import org.projectfloodlight.openflow.types.DatapathId;
import org.projectfloodlight.openflow.types.OFAuxId;
import org.projectfloodlight.openflow.types.U64;
import com.google.common.collect.Iterables;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.SettableFuture;
public class MockOFConnection implements IOFConnectionBackend {
private final DatapathId id;
private final OFAuxId auxId;
private Date connectedSince;
private boolean connected;
private SocketAddress localInetAddress, remoteInetAddress;
private OFFactory factory;
private final List<OFMessage> messages;
private final Map<Long, RequestAndFuture<?>>requests;
private IOFConnectionListener listener;
public MockOFConnection(DatapathId id, OFAuxId auxId){
this.id = id;
this.auxId = auxId;
this.setDefaultAddresses();
this.messages = new ArrayList<>();
this.requests = new HashMap<>();
}
private void setDefaultAddresses() {
SocketAddress socketAddress = null;
try {
byte[] addressBytes = {1, 1, 1, (byte)(this.id.getLong()%255)};
InetAddress inetAddress = InetAddress.getByAddress(addressBytes);
socketAddress = new InetSocketAddress(inetAddress, 7847);
}
catch (Exception e) {
throw new RuntimeException(e);
}
this.remoteInetAddress = socketAddress;
socketAddress = null;
try {
byte[] addressBytes = {127, 0, 0, 1};
InetAddress inetAddress = InetAddress.getByAddress(addressBytes);
socketAddress = new InetSocketAddress(inetAddress, 7847);
}
catch (Exception e) {
throw new RuntimeException(e);
}
this.localInetAddress = socketAddress;
}
@Override
public boolean write(OFMessage m) {
messages.add(m);
return true;
}
@Override
public Collection<OFMessage> write(Iterable<OFMessage> msglist) {
Iterables.addAll(messages, msglist);
return Collections.emptyList();
}
static class RequestAndFuture<R extends OFMessage> {
final OFRequest<R> request;
final SettableFuture<R> replyFuture;
public RequestAndFuture(OFRequest<R> request) {
this.request = request;
this.replyFuture = SettableFuture.create();
}
public OFRequest<R> getRequest() {
return request;
}
public SettableFuture<R> getReplyFuture() {
return replyFuture;
}
}
@Override
public <R extends OFMessage> ListenableFuture<R>
writeRequest(OFRequest<R> request) {
RequestAndFuture<R> raf = new RequestAndFuture<>(request);
messages.add(request);
requests.put(request.getXid(), raf);
return raf.getReplyFuture();
}
@Override
public <REPLY extends OFStatsReply> ListenableFuture<List<REPLY>>
writeStatsRequest(OFStatsRequest<REPLY> request) {
return null;
}
public void setConnectedSince(Date connectedSince) {
this.connectedSince = connectedSince;
}
@Override
public Date getConnectedSince() {
return this.connectedSince;
}
@Override
public DatapathId getDatapathId() {
return this.id;
}
@Override
public OFAuxId getAuxId() {
return this.auxId;
}
public void setRemoteInetAddress(SocketAddress address){
this.remoteInetAddress = address;
}
@Override
public SocketAddress getRemoteInetAddress() {
return this.remoteInetAddress;
}
public void setLocalInetAddress(SocketAddress address){
this.localInetAddress = address;
}
@Override
public SocketAddress getLocalInetAddress() {
return this.localInetAddress;
}
public void setOFFactory(OFFactory factory) {
this.factory = factory;
}
@Override
public OFFactory getOFFactory() {
return this.factory;
}
@Override
public void disconnect() {
this.connected = false;
}
@Override
public void cancelAllPendingRequests() {
// no op
}
@Override
public boolean isWritable() {
return true;
}
@Override
public boolean isConnected() {
return this.connected;
}
public void setConnected(boolean conection) {
this.connected = true;
}
@Override
public void setListener(IOFConnectionListener listener) {
this.listener = listener;
}
// for interacting with the action
public List<OFMessage> getMessages() {
return messages;
}
public Map<Long, RequestAndFuture<?>> getRequests() {
return requests;
}
public IOFConnectionListener getListener() {
return listener;
}
public void clearMessages() {
this.messages.clear();
this.requests.clear();
}
public OFMessage retrieveMessage() {
return this.messages.remove(0);
}
@Override
public U64 getLatency() {
return U64.ZERO;
}
@Override
public void updateLatency(U64 latency) {
// TODO Auto-generated method stub
}
}