+ getMessageSpy().spyMessage(input.getImplementedInterface(), MessageSpy.STATISTIC_GROUP.TO_SWITCH_ENTERED);
+
+ return handleServiceCall(new Function<RequestContext<Void>, ListenableFuture<RpcResult<Void>>>() {
+ @Override
+ public ListenableFuture<RpcResult<Void>> apply(final RequestContext<Void> requestContext) {
+ final Xid xid = requestContext.getXid();
+ final PacketOutInput message = PacketOutConvertor.toPacketOutInput(input, getVersion(), xid.getValue(),
+ getDatapathId());
+
+ final OutboundQueue outboundQueue = getDeviceContext().getPrimaryConnectionContext().getOutboundQueueProvider();
+
+ final SettableFuture<RpcResult<Void>> settableFuture = SettableFuture.create();
+
+ outboundQueue.commitEntry(xid.getValue(), message, new FutureCallback<OfHeader>() {
+ @Override
+ public void onSuccess(final OfHeader ofHeader) {
+ if (ofHeader instanceof RpcResult) {
+ RpcResult rpcResult = (RpcResult) ofHeader;
+ if (!rpcResult.isSuccessful()) {
+ settableFuture.set(rpcResult);
+ } else {
+ settableFuture.cancel(true);
+ }
+ }
+ }
+
+ @Override
+ public void onFailure(final Throwable throwable) {
+ settableFuture.cancel(true);
+ }
+ });
+ return settableFuture;
+ }
+ });
+