package org.opendaylight.openflowplugin.openflow.md.core.session;
+import java.math.BigInteger;
+import java.util.Collection;
+import java.util.Collections;
import java.util.concurrent.Future;
+ import org.opendaylight.controller.sal.common.util.Rpcs;
import org.opendaylight.openflowjava.protocol.api.connection.ConnectionAdapter;
import org.opendaylight.openflowplugin.openflow.md.core.ConnectionConductor;
import org.opendaylight.openflowplugin.openflow.md.core.SwitchConnectionDistinguisher;
+
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev131103.TransactionId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.UpdateGroupOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.UpdateGroupOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeterOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeterOutputBuilder;
+
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetConfigInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetQueueConfigInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetQueueConfigOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GroupModInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GroupModInputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortModInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.RoleRequestInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.SetAsyncInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.SetConfigInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.TableModInput;
+import org.opendaylight.yangtools.yang.common.RpcError;
import org.opendaylight.yangtools.yang.common.RpcResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import com.google.common.util.concurrent.Futures;
+
/**
* message dispatch service to send the message to switch.
*
}
@Override
- public Future<RpcResult<Void>> flowMod(FlowModInput input, SwitchConnectionDistinguisher cookie) {
- return getConnectionAdapter(cookie).flowMod(input);
+ public Future<RpcResult<UpdateFlowOutput>> flowMod(FlowModInput input, SwitchConnectionDistinguisher cookie) {
+
+ // Set Xid before invoking RPC on OFLibrary
+ // TODO : Cleaner approach is to use a copy constructor once it is implemented
+ Long Xid = session.getNextXid();
+ FlowModInputBuilder mdInput = new FlowModInputBuilder();
+ mdInput.setXid(Xid);
+ mdInput.setBufferId(input.getBufferId());
+ mdInput.setCommand(input.getCommand());
+ mdInput.setCookie(input.getCookie());
+ mdInput.setCookieMask(input.getCookieMask());
+ mdInput.setFlags(input.getFlags());
+ mdInput.setHardTimeout(input.getHardTimeout());
+ mdInput.setIdleTimeout(input.getHardTimeout());
+ mdInput.setMatch(input.getMatch());
+ mdInput.setOutGroup(input.getOutGroup());
+ mdInput.setOutPort(input.getOutPort());
+ mdInput.setPriority(input.getPriority());
+ mdInput.setTableId(input.getTableId());
+ mdInput.setVersion(input.getVersion());
+ LOG.debug("Calling OFLibrary flowMod");
+ Future<RpcResult<Void>> response = getConnectionAdapter(cookie).flowMod(mdInput.build());
+
+ // Send the same Xid back to caller - MessageDrivenSwitch
+ UpdateFlowOutputBuilder flowModOutput = new UpdateFlowOutputBuilder();
+ String stringXid =Xid.toString();
+ BigInteger bigIntXid = new BigInteger( stringXid );
+ flowModOutput.setTransactionId(new TransactionId(bigIntXid));
+
+ UpdateFlowOutput result = flowModOutput.build();
+ Collection<RpcError> errors = Collections.emptyList();
+ RpcResult<UpdateFlowOutput> rpcResult = Rpcs.getRpcResult(true, result, errors);
+
+ // solution 1: sending directly and hooking listener to get error
+ // hookup listener to catch the possible error with no reference to returned future-object
+ LOG.debug("Returning to ModelDrivenSwitch for flowMod RPC");
+ return Futures.immediateFuture(rpcResult);
+
}
@Override
}
@Override
- public Future<RpcResult<Void>> groupMod(GroupModInput input, SwitchConnectionDistinguisher cookie) {
- return getConnectionAdapter(cookie).groupMod(input);
+ public Future<RpcResult<UpdateGroupOutput>> groupMod(GroupModInput input, SwitchConnectionDistinguisher cookie) {
+
+ // Set Xid before invoking RPC on OFLibrary
+ // TODO : Cleaner approach is to use a copy constructor once it is implemented
+ Long Xid = session.getNextXid();
+ GroupModInputBuilder mdInput = new GroupModInputBuilder();
+ mdInput.setXid(Xid);
+ mdInput.setBucketsList(input.getBucketsList());
+ mdInput.setCommand(input.getCommand());
+ mdInput.setGroupId(input.getGroupId());
+ mdInput.setType(input.getType());
+ mdInput.setVersion(input.getVersion());
+ LOG.debug("Calling OFLibrary groupMod");
+ Future<RpcResult<Void>> response = getConnectionAdapter(cookie).groupMod(mdInput.build());
+
+ // Send the same Xid back to caller - MessageDrivenSwitch
+ UpdateGroupOutputBuilder groupModOutput = new UpdateGroupOutputBuilder();
+ String stringXid =Xid.toString();
+ BigInteger bigIntXid = new BigInteger( stringXid );
+ groupModOutput.setTransactionId(new TransactionId(bigIntXid));
+ UpdateGroupOutput result = groupModOutput.build();
+ Collection<RpcError> errors = Collections.emptyList();
+ RpcResult<UpdateGroupOutput> rpcResult = Rpcs.getRpcResult(true, result, errors);
+
+ // solution 1: sending directly and hooking listener to get error
+ // hookup listener to catch the possible error with no reference to returned future-object
+ LOG.debug("Returning to ModelDrivenSwitch for groupMod RPC");
+ return Futures.immediateFuture(rpcResult);
+
}
@Override
- public Future<RpcResult<Void>> meterMod(MeterModInput input, SwitchConnectionDistinguisher cookie) {
- return getConnectionAdapter(cookie).meterMod(input);
+ public Future<RpcResult<UpdateMeterOutput>> meterMod(MeterModInput input, SwitchConnectionDistinguisher cookie) {
+
+ // Set Xid before invoking RPC on OFLibrary
+ // TODO : Cleaner approach is to use a copy constructor once it is implemented
+ Long Xid = session.getNextXid();
+ MeterModInputBuilder mdInput = new MeterModInputBuilder();
+ mdInput.setXid(Xid);
+ mdInput.setBands(input.getBands());
+ mdInput.setCommand(input.getCommand());
+ mdInput.setFlags(input.getFlags());
+ mdInput.setMeterId(input.getMeterId());
+ mdInput.setVersion(input.getVersion());
+ mdInput.setVersion(input.getVersion());
+ LOG.debug("Calling OFLibrary meterMod");
+ Future<RpcResult<Void>> response = getConnectionAdapter(cookie).meterMod(mdInput.build());
+
+ // Send the same Xid back to caller - MessageDrivenSwitch
+ UpdateMeterOutputBuilder meterModOutput = new UpdateMeterOutputBuilder();
+ String stringXid =Xid.toString();
+ BigInteger bigIntXid = new BigInteger( stringXid );
+ meterModOutput.setTransactionId(new TransactionId(bigIntXid));
+ UpdateMeterOutput result = meterModOutput.build();
+ Collection<RpcError> errors = Collections.emptyList();
+ RpcResult<UpdateMeterOutput> rpcResult = Rpcs.getRpcResult(true, result, errors);
+
+ // solution 1: sending directly and hooking listener to get error
+ // hookup listener to catch the possible error with no reference to returned future-object
+ LOG.debug("Returning to ModelDrivenSwitch for meterMod RPC");
+ return Futures.immediateFuture(rpcResult);
+
}
@Override