From 40e0a0c90d9a3b8ea36ef2ecd0fc8763e0b3d482 Mon Sep 17 00:00:00 2001 From: Yi Tseng Date: Mon, 8 Jun 2020 17:10:56 +0800 Subject: [PATCH] [AETHER-239] Add RAW_DEVICE_CONFIG extension Change-Id: I0acc1039800c7e69b87e3195f4f7ee732df241c0 --- .../onosproject/net/pi/model/PiPipeconf.java | 7 +++- .../barefoot/TofinoPipelineProgrammable.java | 32 +++++++++++++++---- 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/core/api/src/main/java/org/onosproject/net/pi/model/PiPipeconf.java b/core/api/src/main/java/org/onosproject/net/pi/model/PiPipeconf.java index 098bef7456..9ebd70f24c 100644 --- a/core/api/src/main/java/org/onosproject/net/pi/model/PiPipeconf.java +++ b/core/api/src/main/java/org/onosproject/net/pi/model/PiPipeconf.java @@ -125,6 +125,11 @@ public interface PiPipeconf { // TODO: consider a better way to get the CPU port in the interpreter // (see FabricInterpreter.java mapLogicalPortNumber). Perhaps using // pipeconf annotations? - CPU_PORT_TXT + CPU_PORT_TXT, + + /** + * Raw device config. + */ + RAW_DEVICE_CONFIG } } diff --git a/drivers/barefoot/src/main/java/org/onosproject/drivers/barefoot/TofinoPipelineProgrammable.java b/drivers/barefoot/src/main/java/org/onosproject/drivers/barefoot/TofinoPipelineProgrammable.java index 114b2af302..7b50377aae 100644 --- a/drivers/barefoot/src/main/java/org/onosproject/drivers/barefoot/TofinoPipelineProgrammable.java +++ b/drivers/barefoot/src/main/java/org/onosproject/drivers/barefoot/TofinoPipelineProgrammable.java @@ -31,6 +31,7 @@ import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Optional; +import static org.onosproject.net.pi.model.PiPipeconf.ExtensionType.RAW_DEVICE_CONFIG; import static org.onosproject.net.pi.model.PiPipeconf.ExtensionType.TOFINO_BIN; import static org.onosproject.net.pi.model.PiPipeconf.ExtensionType.TOFINO_CONTEXT_JSON; @@ -48,14 +49,18 @@ public class TofinoPipelineProgrammable @Override public ByteBuffer createDeviceDataBuffer(PiPipeconf pipeconf) { - List buffers = Lists.newLinkedList(); - try { - buffers.add(nameBuffer(pipeconf)); - buffers.add(extensionBuffer(pipeconf, TOFINO_BIN)); - buffers.add(extensionBuffer(pipeconf, TOFINO_CONTEXT_JSON)); - } catch (ExtensionException e) { - return null; + + if (pipeconf.extension(RAW_DEVICE_CONFIG).isPresent()) { + buffers.add(rawDeviceConfig(pipeconf)); + } else { + try { + buffers.add(nameBuffer(pipeconf)); + buffers.add(extensionBuffer(pipeconf, TOFINO_BIN)); + buffers.add(extensionBuffer(pipeconf, TOFINO_CONTEXT_JSON)); + } catch (ExtensionException e) { + return null; + } } // Concatenate buffers (flip so they can be read). @@ -95,6 +100,19 @@ public class TofinoPipelineProgrammable } } + private ByteBuffer rawDeviceConfig(PiPipeconf pipeconf) { + try { + byte[] bytes = IOUtils.toByteArray(pipeconf.extension(RAW_DEVICE_CONFIG).get()); + return ByteBuffer.allocate(bytes.length) + .order(ByteOrder.LITTLE_ENDIAN) + .put(bytes); + } catch (IOException ex) { + log.warn("Unable to read raw device config from pipeconf {}: {}", + pipeconf.id(), ex.getMessage()); + throw new ExtensionException(); + } + } + private static class ExtensionException extends IllegalArgumentException { } }