P4Runtime Mellanox driver for fabric.p4
Change-Id: I321eba750b30d2aab1a792933dbbc3d1d9740f03
diff --git a/drivers/mellanox/BUCK b/drivers/mellanox/BUCK
new file mode 100644
index 0000000..bb9bfbc
--- /dev/null
+++ b/drivers/mellanox/BUCK
@@ -0,0 +1,25 @@
+COMPILE_DEPS = [
+ '//lib:CORE_DEPS',
+ '//drivers/p4runtime:onos-drivers-p4runtime',
+]
+
+BUNDLES = [
+ ':onos-drivers-mellanox',
+]
+
+osgi_jar(
+ deps = COMPILE_DEPS,
+)
+
+onos_app(
+ app_name = 'org.onosproject.drivers.mellanox',
+ title = 'Mellanox Drivers',
+ category = 'Drivers',
+ url = 'https://wiki.onosproject.org/x/aAZkAQ',
+ description = 'Adds support for Mellanox Spectrum-based devices using P4Runtime',
+ included_bundles = BUNDLES,
+ required_apps = [
+ 'org.onosproject.drivers.p4runtime',
+ 'org.onosproject.pipelines.fabric',
+ ],
+)
diff --git a/drivers/mellanox/src/main/java/org/onosproject/drivers/mellanox/MellanoxDriversLoader.java b/drivers/mellanox/src/main/java/org/onosproject/drivers/mellanox/MellanoxDriversLoader.java
new file mode 100644
index 0000000..2b6ee26
--- /dev/null
+++ b/drivers/mellanox/src/main/java/org/onosproject/drivers/mellanox/MellanoxDriversLoader.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.drivers.mellanox;
+
+import org.apache.felix.scr.annotations.Component;
+import org.onosproject.net.driver.AbstractDriverLoader;
+
+/**
+ * Loader for the Mellanox device drivers.
+ */
+@Component(immediate = true)
+public class MellanoxDriversLoader extends AbstractDriverLoader {
+
+ public MellanoxDriversLoader() {
+ super("/mellanox-drivers.xml");
+ }
+}
diff --git a/drivers/mellanox/src/main/java/org/onosproject/drivers/mellanox/SpectrumPipelineProgrammable.java b/drivers/mellanox/src/main/java/org/onosproject/drivers/mellanox/SpectrumPipelineProgrammable.java
new file mode 100644
index 0000000..c13ab77
--- /dev/null
+++ b/drivers/mellanox/src/main/java/org/onosproject/drivers/mellanox/SpectrumPipelineProgrammable.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.drivers.mellanox;
+
+import org.onosproject.drivers.p4runtime.AbstractP4RuntimePipelineProgrammable;
+import org.onosproject.net.behaviour.PiPipelineProgrammable;
+import org.onosproject.net.pi.model.PiPipeconf;
+import org.onosproject.net.pi.model.PiPipeconfId;
+import org.onosproject.net.pi.service.PiPipeconfService;
+
+import java.nio.ByteBuffer;
+import java.util.Optional;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static java.lang.String.format;
+
+/**
+ * Implementation of the PiPipelineProgrammable behaviour for a Spectrum-based
+ * switch with P4Runtime support.
+ */
+public class SpectrumPipelineProgrammable
+ extends AbstractP4RuntimePipelineProgrammable
+ implements PiPipelineProgrammable {
+
+ private static final PiPipeconfId FABRIC_PIPECONF_ID =
+ new PiPipeconfId("org.onosproject.pipelines.fabric");
+
+ @Override
+ public ByteBuffer createDeviceDataBuffer(PiPipeconf pipeconf) {
+ checkArgument(pipeconf.id().equals(FABRIC_PIPECONF_ID),
+ format("Cannot program Spectrum device with a pipeconf " +
+ "other than '%s' (found '%s')",
+ FABRIC_PIPECONF_ID, pipeconf.id()));
+ // Dummy value.
+ // We assume switch to be already configured with fabric.p4 profile.
+ return ByteBuffer.allocate(1).put((byte) 1);
+ }
+
+ @Override
+ public Optional<PiPipeconf> getDefaultPipeconf() {
+ return handler().get(PiPipeconfService.class)
+ .getPipeconf(FABRIC_PIPECONF_ID);
+ }
+}
diff --git a/drivers/mellanox/src/main/java/org/onosproject/drivers/mellanox/package-info.java b/drivers/mellanox/src/main/java/org/onosproject/drivers/mellanox/package-info.java
new file mode 100644
index 0000000..4b1f03f
--- /dev/null
+++ b/drivers/mellanox/src/main/java/org/onosproject/drivers/mellanox/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Package for Mellanox device drivers.
+ */
+package org.onosproject.drivers.mellanox;
diff --git a/drivers/mellanox/src/main/resources/mellanox-drivers.xml b/drivers/mellanox/src/main/resources/mellanox-drivers.xml
new file mode 100644
index 0000000..35fa93d
--- /dev/null
+++ b/drivers/mellanox/src/main/resources/mellanox-drivers.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright 2018-present Open Networking Foundation
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<drivers>
+ <driver name="mellanox" manufacturer="Mellanox" hwVersion="1.0" swVersion="1.0" extends="p4runtime">
+ <behaviour api="org.onosproject.net.behaviour.PiPipelineProgrammable"
+ impl="org.onosproject.drivers.mellanox.SpectrumPipelineProgrammable"/>
+ <property name="noHashedTable">true</property>
+ </driver>
+</drivers>
+
diff --git a/modules.defs b/modules.defs
index 13f485a..f574d9d 100644
--- a/modules.defs
+++ b/modules.defs
@@ -110,6 +110,7 @@
'//drivers/oplink:onos-drivers-oplink-oar',
'//drivers/bmv2:onos-drivers-bmv2-oar',
'//drivers/barefoot:onos-drivers-barefoot-oar',
+ '//drivers/mellanox:onos-drivers-mellanox-oar',
'//drivers/hp:onos-drivers-hp-oar',
'//drivers/p4runtime:onos-drivers-p4runtime-oar',
'//drivers/gnmi:onos-drivers-gnmi-oar',