[VOL-3660] Add support for PPPoED message decoding and flow installation on OltPipeline.
Signed-off-by: Gustavo Silva <gsilva@furukawalatam.com>
Change-Id: I1a6f318d71b8c1f59fdf582edacd44e9c46cd061
(cherry picked from commit 2bcc805d09f59aa5389a921c8b442c93d805a2d0)
diff --git a/utils/misc/src/test/java/org/onlab/packet/PPPoEDTest.java b/utils/misc/src/test/java/org/onlab/packet/PPPoEDTest.java
new file mode 100644
index 0000000..c2ca05b
--- /dev/null
+++ b/utils/misc/src/test/java/org/onlab/packet/PPPoEDTest.java
@@ -0,0 +1,147 @@
+/*
+ * Copyright 2021-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.onlab.packet;
+
+import com.google.common.io.Resources;
+
+import java.nio.ByteBuffer;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Unit tests for PPPoED class.
+ */
+public class PPPoEDTest {
+
+ private static final byte VERSION = (byte) 1;
+ private static final byte TYPE = (byte) 1;
+ private static final short NO_SESSION = (short) 0;
+ private static final short SESSION = (short) 0x02e2;
+
+ private static final String AC_NAME = "pfSense.localdomain";
+ private static final long AC_COOKIE = 32098554083868671L;
+ private static final String SERVICE_NAME = "*";
+
+ private static final String PADI = "pppoed/padi.bin";
+ private static final String PADO = "pppoed/pado.bin";
+ private static final String PADR = "pppoed/padr.bin";
+ private static final String PADS = "pppoed/pads.bin";
+ private static final String PADT = "pppoed/padt.bin";
+
+ @Test
+ public void testDeserializeBadInput() throws Exception {
+ PacketTestUtils.testDeserializeBadInput(PPPoED.deserializer());
+ }
+
+ @Test
+ public void testTruncatedPacket() throws Exception {
+ byte[] byteHeader = ByteBuffer.allocate(6)
+ .put((byte) 0x11) // version/type
+ .put((byte) 0x09) // code
+ .putShort((short) 0x0000) // transaction id
+ .putShort((short) 0x0000) // payload length
+ .array();
+
+ PacketTestUtils.testDeserializeTruncated(PPPoED.deserializer(), byteHeader);
+ }
+
+ @Test
+ public void testDeserializePadi() throws Exception {
+ byte[] data = Resources.toByteArray(PPPoEDTest.class.getResource(PADI));
+ Ethernet eth = Ethernet.deserializer().deserialize(data, 0, data.length);
+ PPPoED pppoed = (PPPoED) eth.getPayload();
+ assertPPPoEDHeader(pppoed, PPPoED.PPPOED_CODE_PADI);
+ assertEquals(NO_SESSION, pppoed.getSessionId());
+ assertEquals(0, pppoed.getTags().size());
+ }
+
+ @Test
+ public void testDeserializePado() throws Exception {
+ byte[] data = Resources.toByteArray(PPPoEDTest.class.getResource(PADO));
+ Ethernet eth = Ethernet.deserializer().deserialize(data, 0, data.length);
+
+ PPPoED pppoed = (PPPoED) eth.getPayload();
+ assertPPPoEDHeader(pppoed, PPPoED.PPPOED_CODE_PADO);
+ assertEquals(NO_SESSION, pppoed.getSessionId());
+
+ assertEquals(3, pppoed.getTags().size());
+
+ PPPoEDTag acName = pppoed.getTag(PPPoEDTag.PPPOED_TAG_AC_NAME);
+ assertArrayEquals(AC_NAME.getBytes(), acName.value);
+
+ PPPoEDTag serviceName = pppoed.getTag(PPPoEDTag.PPPOED_TAG_SERVICE_NAME);
+ assertArrayEquals(SERVICE_NAME.getBytes(), serviceName.value);
+
+ PPPoEDTag acCookie = pppoed.getTag(PPPoEDTag.PPPOED_TAG_AC_COOKIE);
+ assertEquals(AC_COOKIE, ByteBuffer.wrap(acCookie.value).getLong());
+ }
+
+ @Test
+ public void testDeserializePadr() throws Exception {
+ byte[] data = Resources.toByteArray(PPPoEDTest.class.getResource(PADR));
+ Ethernet eth = Ethernet.deserializer().deserialize(data, 0, data.length);
+
+ PPPoED pppoed = (PPPoED) eth.getPayload();
+ assertPPPoEDHeader(pppoed, PPPoED.PPPOED_CODE_PADR);
+ assertEquals(NO_SESSION, pppoed.getSessionId());
+
+ assertEquals(1, pppoed.getTags().size());
+
+ PPPoEDTag acCookie = pppoed.getTag(PPPoEDTag.PPPOED_TAG_AC_COOKIE);
+ assertEquals(AC_COOKIE, ByteBuffer.wrap(acCookie.value).getLong());
+ }
+
+ @Test
+ public void testDeserializePads() throws Exception {
+ byte[] data = Resources.toByteArray(PPPoEDTest.class.getResource(PADS));
+ Ethernet eth = Ethernet.deserializer().deserialize(data, 0, data.length);
+
+ PPPoED pppoed = (PPPoED) eth.getPayload();
+ assertPPPoEDHeader(pppoed, PPPoED.PPPOED_CODE_PADS);
+ assertEquals(SESSION, pppoed.getSessionId());
+
+ assertEquals(2, pppoed.getTags().size());
+ PPPoEDTag acName = pppoed.getTag(PPPoEDTag.PPPOED_TAG_AC_NAME);
+ assertArrayEquals(AC_NAME.getBytes(), acName.value);
+
+ PPPoEDTag acCookie = pppoed.getTag(PPPoEDTag.PPPOED_TAG_AC_COOKIE);
+ assertEquals(AC_COOKIE, ByteBuffer.wrap(acCookie.value).getLong());
+ }
+
+ @Test
+ public void testDeserializePadt() throws Exception {
+ byte[] data = Resources.toByteArray(PPPoEDTest.class.getResource(PADT));
+ Ethernet eth = Ethernet.deserializer().deserialize(data, 0, data.length);
+
+ PPPoED pppoed = (PPPoED) eth.getPayload();
+ assertPPPoEDHeader(pppoed, PPPoED.PPPOED_CODE_PADT);
+ assertEquals(SESSION, pppoed.getSessionId());
+
+ assertEquals(1, pppoed.getTags().size());
+ PPPoEDTag acCookie = pppoed.getTag(PPPoEDTag.PPPOED_TAG_AC_COOKIE);
+ assertEquals(AC_COOKIE, ByteBuffer.wrap(acCookie.value).getLong());
+ }
+
+ private void assertPPPoEDHeader(PPPoED pppoed, byte code) {
+ assertNotNull(pppoed);
+ assertEquals(VERSION, pppoed.getVersion());
+ assertEquals(TYPE, pppoed.getType());
+ assertEquals(code, pppoed.getCode());
+ }
+
+}
diff --git a/utils/misc/src/test/resources/org/onlab/packet/pppoed/padi.bin b/utils/misc/src/test/resources/org/onlab/packet/pppoed/padi.bin
new file mode 100644
index 0000000..46daf26
--- /dev/null
+++ b/utils/misc/src/test/resources/org/onlab/packet/pppoed/padi.bin
Binary files differ
diff --git a/utils/misc/src/test/resources/org/onlab/packet/pppoed/pado.bin b/utils/misc/src/test/resources/org/onlab/packet/pppoed/pado.bin
new file mode 100644
index 0000000..c40ec46
--- /dev/null
+++ b/utils/misc/src/test/resources/org/onlab/packet/pppoed/pado.bin
Binary files differ
diff --git a/utils/misc/src/test/resources/org/onlab/packet/pppoed/padr.bin b/utils/misc/src/test/resources/org/onlab/packet/pppoed/padr.bin
new file mode 100644
index 0000000..7b742ce
--- /dev/null
+++ b/utils/misc/src/test/resources/org/onlab/packet/pppoed/padr.bin
Binary files differ
diff --git a/utils/misc/src/test/resources/org/onlab/packet/pppoed/pads.bin b/utils/misc/src/test/resources/org/onlab/packet/pppoed/pads.bin
new file mode 100644
index 0000000..0709d80
--- /dev/null
+++ b/utils/misc/src/test/resources/org/onlab/packet/pppoed/pads.bin
Binary files differ
diff --git a/utils/misc/src/test/resources/org/onlab/packet/pppoed/padt.bin b/utils/misc/src/test/resources/org/onlab/packet/pppoed/padt.bin
new file mode 100644
index 0000000..9ecf018
--- /dev/null
+++ b/utils/misc/src/test/resources/org/onlab/packet/pppoed/padt.bin
Binary files differ