BUG-4826: Evpn ESI Handlers 57/37257/8
authorClaudio D. Gasparini <cgaspari@cisco.com>
Tue, 5 Apr 2016 09:21:16 +0000 (11:21 +0200)
committerMilos Fabian <milfabia@cisco.com>
Tue, 12 Apr 2016 16:52:41 +0000 (16:52 +0000)
Evpn ESI Handlers
https://tools.ietf.org/html/rfc7432#section-5

Change-Id: I10fce0720ed60e7f37f416e7af741c61950afa85
Signed-off-by: Claudio D. Gasparini <cgaspari@cisco.com>
bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/esi/types/ASGenParser.java [new file with mode: 0644]
bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/esi/types/AbstractEsiType.java [new file with mode: 0644]
bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/esi/types/ArbitraryParser.java [new file with mode: 0644]
bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/esi/types/EsiModelUtil.java [new file with mode: 0644]
bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/esi/types/LacpParser.java [new file with mode: 0644]
bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/esi/types/LanParser.java [new file with mode: 0644]
bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/esi/types/MacParser.java [new file with mode: 0644]
bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/esi/types/RouterIdParser.java [new file with mode: 0644]
bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/spi/EsiParser.java [new file with mode: 0644]
bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/spi/EsiSerializer.java [new file with mode: 0644]

diff --git a/bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/esi/types/ASGenParser.java b/bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/esi/types/ASGenParser.java
new file mode 100644 (file)
index 0000000..a5292a8
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.protocol.bgp.evpn.impl.esi.types;
+
+import static org.opendaylight.protocol.bgp.evpn.impl.esi.types.EsiModelUtil.extractAS;
+import static org.opendaylight.protocol.bgp.evpn.impl.esi.types.EsiModelUtil.extractLD;
+import static org.opendaylight.protocol.util.ByteBufWriteUtil.writeUnsignedInt;
+
+import com.google.common.base.Preconditions;
+import io.netty.buffer.ByteBuf;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.EsiType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.esi.Esi;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.esi.esi.AsGeneratedCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.esi.esi.AsGeneratedCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.esi.esi.as.generated._case.AsGenerated;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.esi.esi.as.generated._case.AsGeneratedBuilder;
+import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
+
+final class ASGenParser extends AbstractEsiType {
+
+    @Override
+    public void serializeBody(final Esi esi, final ByteBuf body) {
+        Preconditions.checkArgument(esi instanceof AsGeneratedCase, "Unknown esi instance. Passed %s. Needed AsGeneratedCase.", esi.getClass());
+        final AsGenerated asGen = ((AsGeneratedCase) esi).getAsGenerated();
+        writeUnsignedInt(asGen.getAs().getValue(), body);
+        writeUnsignedInt(asGen.getLocalDiscriminator(), body);
+        body.writeZero(ZERO_BYTE);
+    }
+
+    @Override
+    protected EsiType getType() {
+        return EsiType.AsGenerated;
+    }
+
+    @Override
+    public Esi serializeEsi(final ContainerNode esi) {
+        final AsGeneratedBuilder builder = new AsGeneratedBuilder();
+        builder.setLocalDiscriminator(extractLD(esi));
+        builder.setAs(extractAS(esi));
+        return new AsGeneratedCaseBuilder().setAsGenerated(builder.build()).build();
+    }
+
+    @Override
+    public Esi parseEsi(final ByteBuf buffer) {
+        final AsGenerated asGen = new AsGeneratedBuilder().setAs(new AsNumber(buffer.readUnsignedInt()))
+            .setLocalDiscriminator(buffer.readUnsignedInt()).build();
+        return new AsGeneratedCaseBuilder().setAsGenerated(asGen).build();
+    }
+}
diff --git a/bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/esi/types/AbstractEsiType.java b/bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/esi/types/AbstractEsiType.java
new file mode 100644 (file)
index 0000000..b105dee
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.protocol.bgp.evpn.impl.esi.types;
+
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+import org.opendaylight.protocol.bgp.evpn.spi.EsiParser;
+import org.opendaylight.protocol.bgp.evpn.spi.EsiSerializer;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.EsiType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.esi.Esi;
+
+abstract class AbstractEsiType implements EsiParser, EsiSerializer {
+    static final int BODY_LENGTH = 9;
+    static final int ZERO_BYTE = 1;
+    static final int MAC_ADDRESS_LENGTH = 6;
+
+    @Override
+    public final void serializeEsi(final Esi esi, final ByteBuf buffer) {
+        final ByteBuf body = Unpooled.buffer(BODY_LENGTH);
+        serializeBody(esi, body);
+        buffer.writeByte(getType().getIntValue());
+        buffer.writeBytes(body);
+    }
+
+    protected abstract void serializeBody(final Esi esi, final ByteBuf buffer);
+
+    protected abstract EsiType getType();
+}
diff --git a/bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/esi/types/ArbitraryParser.java b/bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/esi/types/ArbitraryParser.java
new file mode 100644 (file)
index 0000000..b2c784c
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.protocol.bgp.evpn.impl.esi.types;
+
+import static org.opendaylight.protocol.bgp.evpn.impl.esi.types.EsiModelUtil.extractArbitrary;
+
+import com.google.common.base.Preconditions;
+import io.netty.buffer.ByteBuf;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.EsiType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.esi.Esi;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.esi.esi.ArbitraryCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.esi.esi.ArbitraryCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.esi.esi.arbitrary._case.ArbitraryBuilder;
+import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
+
+final class ArbitraryParser extends AbstractEsiType {
+    private static final int ARBITRARY_LENGTH = 9;
+
+    @Override
+    public void serializeBody(final Esi esiCase, final ByteBuf body) {
+        Preconditions.checkArgument(esiCase instanceof ArbitraryCase, "Unknown esi instance. Passed %s. Needed ArbitraryCase.", esiCase.getClass());
+        body.writeBytes(((ArbitraryCase) esiCase).getArbitrary().getArbitrary());
+    }
+
+    @Override
+    protected EsiType getType() {
+        return EsiType.Arbitrary;
+    }
+
+    @Override
+    public Esi serializeEsi(final ContainerNode esi) {
+        return new ArbitraryCaseBuilder().setArbitrary(extractArbitrary(esi)).build();
+    }
+
+
+    @Override
+    public Esi parseEsi(final ByteBuf buffer) {
+        return new ArbitraryCaseBuilder().setArbitrary(new ArbitraryBuilder().setArbitrary(buffer.readSlice(ARBITRARY_LENGTH).array()).build()).build();
+    }
+}
diff --git a/bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/esi/types/EsiModelUtil.java b/bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/esi/types/EsiModelUtil.java
new file mode 100644 (file)
index 0000000..59e841c
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.protocol.bgp.evpn.impl.esi.types;
+
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.Uint24;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.esi.esi.arbitrary._case.Arbitrary;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.esi.esi.arbitrary._case.ArbitraryBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.evpn.Evpn;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
+
+final class EsiModelUtil {
+    static final NodeIdentifier LD_NID = NodeIdentifier.create(QName.create(Evpn.QNAME, "local-discriminator").intern());
+    static final NodeIdentifier ARB_NID = NodeIdentifier.create(QName.create(Evpn.QNAME, "arbitrary").intern());
+    static final NodeIdentifier AS_NID = NodeIdentifier.create(QName.create(Evpn.QNAME, "as").intern());
+    static final NodeIdentifier LACP_MAC_NID = NodeIdentifier.create(QName.create(Evpn.QNAME, "ce-lacp-mac-address").intern());
+    static final NodeIdentifier PK_NID = NodeIdentifier.create(QName.create(Evpn.QNAME, "ce-lacp-port-key").intern());
+    static final NodeIdentifier BRIDGE_MAC_NID = NodeIdentifier.create(QName.create(Evpn.QNAME, "root-bridge-mac-address").intern());
+    static final NodeIdentifier RBP_NID = NodeIdentifier.create(QName.create(Evpn.QNAME, "root-bridge-priority").intern());
+    static final NodeIdentifier SYSTEM_MAC_NID = NodeIdentifier.create(QName.create(Evpn.QNAME, "system-mac-address").intern());
+    static final NodeIdentifier RD_NID = NodeIdentifier.create(QName.create(Evpn.QNAME, "router-id").intern());
+
+    private EsiModelUtil() {
+        throw new UnsupportedOperationException();
+    }
+
+    static final Long extractLD(final ContainerNode cont) {
+        return (Long) cont.getChild(LD_NID).get().getValue();
+    }
+
+
+    static Arbitrary extractArbitrary(final ContainerNode esi) {
+        return new ArbitraryBuilder().setArbitrary((byte[]) esi.getChild(ARB_NID).get().getValue()).build();
+    }
+
+
+    static AsNumber extractAS(final ContainerNode asGen) {
+        return new AsNumber((Long) asGen.getChild(AS_NID).get().getValue());
+    }
+
+
+    static Integer extractPK(final ContainerNode t1) {
+        return (Integer) t1.getChild(PK_NID).get().getValue();
+    }
+
+    static MacAddress extractLacpMac(final ContainerNode t1) {
+        return (MacAddress) t1.getChild(LACP_MAC_NID).get().getValue();
+    }
+
+    static MacAddress extractBrigeMac(final ContainerNode lan) {
+        return (MacAddress) lan.getChild(BRIDGE_MAC_NID).get().getValue();
+    }
+
+    static Integer extractBP(final ContainerNode lan) {
+        return (Integer) lan.getChild(RBP_NID).get().getValue();
+    }
+
+    static Uint24 extractUint24LD(final ContainerNode esiVal) {
+        return (Uint24) esiVal.getChild(LD_NID).get().getValue();
+    }
+
+    static MacAddress extractSystmeMac(final ContainerNode macGEn) {
+        return (MacAddress) macGEn.getChild(SYSTEM_MAC_NID).get().getValue();
+    }
+
+    static Ipv4Address extractRD(final ContainerNode t4) {
+        return (Ipv4Address) t4.getChild(RD_NID).get().getValue();
+    }
+
+}
diff --git a/bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/esi/types/LacpParser.java b/bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/esi/types/LacpParser.java
new file mode 100644 (file)
index 0000000..413c753
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.protocol.bgp.evpn.impl.esi.types;
+
+import static org.opendaylight.protocol.bgp.evpn.impl.esi.types.EsiModelUtil.extractLacpMac;
+import static org.opendaylight.protocol.bgp.evpn.impl.esi.types.EsiModelUtil.extractPK;
+
+import com.google.common.base.Preconditions;
+import io.netty.buffer.ByteBuf;
+import org.opendaylight.protocol.util.ByteArray;
+import org.opendaylight.protocol.util.ByteBufWriteUtil;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.IetfYangUtil;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.EsiType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.esi.Esi;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.esi.esi.LacpAutoGeneratedCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.esi.esi.LacpAutoGeneratedCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.esi.esi.lacp.auto.generated._case.LacpAutoGenerated;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.esi.esi.lacp.auto.generated._case.LacpAutoGeneratedBuilder;
+import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
+
+final class LacpParser extends AbstractEsiType {
+
+    @Override
+    public void serializeBody(final Esi esi, final ByteBuf body) {
+        Preconditions.checkArgument(esi instanceof LacpAutoGeneratedCase, "Unknown esi instance. Passed %s. Needed LacpAutoGeneratedCase.", esi.getClass());
+        final LacpAutoGenerated lacp = ((LacpAutoGeneratedCase) esi).getLacpAutoGenerated();
+        body.writeBytes(IetfYangUtil.INSTANCE.bytesFor(lacp.getCeLacpMacAddress()));
+        ByteBufWriteUtil.writeUnsignedShort(lacp.getCeLacpPortKey(), body);
+        body.writeZero(ZERO_BYTE);
+    }
+
+    @Override
+    protected EsiType getType() {
+        return EsiType.LacpAutoGenerated;
+    }
+
+    @Override
+    public Esi serializeEsi(final ContainerNode esi) {
+        final LacpAutoGeneratedBuilder builder = new LacpAutoGeneratedBuilder();
+        builder.setCeLacpMacAddress(extractLacpMac(esi));
+        builder.setCeLacpPortKey(extractPK(esi));
+        return new LacpAutoGeneratedCaseBuilder().setLacpAutoGenerated(builder.build()).build();
+
+    }
+
+    @Override
+    public Esi parseEsi(final ByteBuf buffer) {
+        final LacpAutoGenerated t1 = new LacpAutoGeneratedBuilder()
+            .setCeLacpMacAddress(IetfYangUtil.INSTANCE.macAddressFor(ByteArray.readBytes(buffer, MAC_ADDRESS_LENGTH)))
+            .setCeLacpPortKey(buffer.readUnsignedShort())
+            .build();
+        return new LacpAutoGeneratedCaseBuilder().setLacpAutoGenerated(t1).build();
+    }
+}
diff --git a/bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/esi/types/LanParser.java b/bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/esi/types/LanParser.java
new file mode 100644 (file)
index 0000000..3ae845e
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.protocol.bgp.evpn.impl.esi.types;
+
+import static org.opendaylight.protocol.bgp.evpn.impl.esi.types.EsiModelUtil.extractBP;
+import static org.opendaylight.protocol.bgp.evpn.impl.esi.types.EsiModelUtil.extractBrigeMac;
+
+import com.google.common.base.Preconditions;
+import io.netty.buffer.ByteBuf;
+import org.opendaylight.protocol.util.ByteArray;
+import org.opendaylight.protocol.util.ByteBufWriteUtil;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.IetfYangUtil;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.EsiType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.esi.Esi;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.esi.esi.LanAutoGeneratedCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.esi.esi.LanAutoGeneratedCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.esi.esi.lan.auto.generated._case.LanAutoGenerated;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.esi.esi.lan.auto.generated._case.LanAutoGeneratedBuilder;
+import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
+
+final class LanParser extends AbstractEsiType {
+
+    @Override
+    public void serializeBody(final Esi esi, final ByteBuf body) {
+        Preconditions.checkArgument(esi instanceof LanAutoGeneratedCase, "Unknown esi instance. Passed %s. Needed LanAutoGeneratedCase.", esi.getClass());
+        final LanAutoGenerated lan = ((LanAutoGeneratedCase) esi).getLanAutoGenerated();
+        body.writeBytes(IetfYangUtil.INSTANCE.bytesFor(lan.getRootBridgeMacAddress()));
+        ByteBufWriteUtil.writeUnsignedShort(lan.getRootBridgePriority(), body);
+        body.writeZero(ZERO_BYTE);
+    }
+
+    @Override
+    protected EsiType getType() {
+        return EsiType.LanAutoGenerated;
+    }
+
+    @Override
+    public Esi serializeEsi(final ContainerNode esi) {
+        final LanAutoGeneratedBuilder lanBuilder = new LanAutoGeneratedBuilder();
+        lanBuilder.setRootBridgeMacAddress(extractBrigeMac(esi));
+        lanBuilder.setRootBridgePriority(extractBP(esi));
+        return new LanAutoGeneratedCaseBuilder().setLanAutoGenerated(lanBuilder.build()).build();
+    }
+
+    @Override
+    public Esi parseEsi(final ByteBuf buffer) {
+        final LanAutoGenerated t2 = new LanAutoGeneratedBuilder()
+            .setRootBridgeMacAddress(IetfYangUtil.INSTANCE.macAddressFor(ByteArray.readBytes(buffer, MAC_ADDRESS_LENGTH)))
+            .setRootBridgePriority(buffer.readUnsignedShort()).build();
+        return new LanAutoGeneratedCaseBuilder().setLanAutoGenerated(t2).build();
+    }
+}
diff --git a/bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/esi/types/MacParser.java b/bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/esi/types/MacParser.java
new file mode 100644 (file)
index 0000000..71d3e72
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.protocol.bgp.evpn.impl.esi.types;
+
+import static org.opendaylight.protocol.bgp.evpn.impl.esi.types.EsiModelUtil.extractSystmeMac;
+import static org.opendaylight.protocol.bgp.evpn.impl.esi.types.EsiModelUtil.extractUint24LD;
+
+import com.google.common.base.Preconditions;
+import io.netty.buffer.ByteBuf;
+import org.opendaylight.protocol.util.ByteArray;
+import org.opendaylight.protocol.util.ByteBufWriteUtil;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.IetfYangUtil;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.EsiType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.Uint24;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.esi.Esi;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.esi.esi.MacAutoGeneratedCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.esi.esi.MacAutoGeneratedCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.esi.esi.mac.auto.generated._case.MacAutoGenerated;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.esi.esi.mac.auto.generated._case.MacAutoGeneratedBuilder;
+import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
+
+final class MacParser extends AbstractEsiType {
+
+    @Override
+    public void serializeBody(final Esi esi, final ByteBuf body) {
+        Preconditions.checkArgument(esi instanceof MacAutoGeneratedCase, "Unknown esi instance. Passed %s. Needed MacAutoGeneratedCase.", esi.getClass());
+        final MacAutoGenerated macAuto = ((MacAutoGeneratedCase) esi).getMacAutoGenerated();
+        body.writeBytes(IetfYangUtil.INSTANCE.bytesFor(macAuto.getSystemMacAddress()));
+        ByteBufWriteUtil.writeMedium(macAuto.getLocalDiscriminator().getValue().intValue(), body);
+    }
+
+    @Override
+    protected EsiType getType() {
+        return EsiType.MacAutoGenerated;
+    }
+
+    @Override
+    public Esi serializeEsi(final ContainerNode esi) {
+        final MacAutoGeneratedBuilder builder = new MacAutoGeneratedBuilder();
+        builder.setSystemMacAddress(extractSystmeMac(esi));
+        builder.setLocalDiscriminator(extractUint24LD(esi));
+        return new MacAutoGeneratedCaseBuilder().setMacAutoGenerated(builder.build()).build();
+    }
+
+
+    @Override
+    public Esi parseEsi(final ByteBuf buffer) {
+        final MacAutoGenerated t3 = new MacAutoGeneratedBuilder()
+            .setSystemMacAddress(IetfYangUtil.INSTANCE.macAddressFor(ByteArray.readBytes(buffer, MAC_ADDRESS_LENGTH)))
+            .setLocalDiscriminator(new Uint24(Long.valueOf(buffer.readUnsignedMedium()))).build();
+        return new MacAutoGeneratedCaseBuilder().setMacAutoGenerated(t3).build();
+    }
+}
diff --git a/bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/esi/types/RouterIdParser.java b/bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/esi/types/RouterIdParser.java
new file mode 100644 (file)
index 0000000..4b89f87
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.protocol.bgp.evpn.impl.esi.types;
+
+import static org.opendaylight.protocol.bgp.evpn.impl.esi.types.EsiModelUtil.extractLD;
+import static org.opendaylight.protocol.bgp.evpn.impl.esi.types.EsiModelUtil.extractRD;
+
+import com.google.common.base.Preconditions;
+import io.netty.buffer.ByteBuf;
+import org.opendaylight.protocol.util.ByteBufWriteUtil;
+import org.opendaylight.protocol.util.Ipv4Util;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.EsiType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.esi.Esi;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.esi.esi.RouterIdGeneratedCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.esi.esi.RouterIdGeneratedCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.esi.esi.router.id.generated._case.RouterIdGenerated;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.esi.esi.router.id.generated._case.RouterIdGeneratedBuilder;
+import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
+
+final class RouterIdParser extends AbstractEsiType {
+
+    @Override
+    public void serializeBody(final Esi esi, final ByteBuf body) {
+        Preconditions.checkArgument(esi instanceof RouterIdGeneratedCase, "Unknown esi instance. Passed %s. Needed RouterIdGeneratedCase.", esi.getClass());
+        final RouterIdGenerated routerID = ((RouterIdGeneratedCase) esi).getRouterIdGenerated();
+        ByteBufWriteUtil.writeIpv4Address(routerID.getRouterId(), body);
+        ByteBufWriteUtil.writeUnsignedInt(routerID.getLocalDiscriminator(), body);
+        body.writeZero(ZERO_BYTE);
+    }
+
+    @Override
+    protected EsiType getType() {
+        return EsiType.RouterIdGenerated;
+    }
+
+    @Override
+    public Esi serializeEsi(final ContainerNode esi) {
+        final RouterIdGeneratedBuilder builder = new RouterIdGeneratedBuilder();
+        builder.setLocalDiscriminator(extractLD(esi));
+        builder.setRouterId(extractRD(esi));
+        return new RouterIdGeneratedCaseBuilder().setRouterIdGenerated(builder.build()).build();
+    }
+
+    @Override
+    public Esi parseEsi(final ByteBuf buffer) {
+        final RouterIdGenerated routerID = new RouterIdGeneratedBuilder().setRouterId(Ipv4Util.addressForByteBuf(buffer))
+            .setLocalDiscriminator(buffer.readUnsignedInt()).build();
+        return new RouterIdGeneratedCaseBuilder().setRouterIdGenerated(routerID).build();
+    }
+}
diff --git a/bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/spi/EsiParser.java b/bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/spi/EsiParser.java
new file mode 100644 (file)
index 0000000..c9bd000
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+ * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.protocol.bgp.evpn.spi;
+
+import io.netty.buffer.ByteBuf;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.esi.Esi;
+
+public interface EsiParser {
+    /**
+     * Parse Ethernet Segment Identifier
+     *
+     * @param buffer encoded ESI body in Bytebuf
+     * @return Ethernet Segment Identifier
+     */
+    Esi parseEsi(ByteBuf buffer);
+}
diff --git a/bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/spi/EsiSerializer.java b/bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/spi/EsiSerializer.java
new file mode 100644 (file)
index 0000000..8750174
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.protocol.bgp.evpn.spi;
+
+import io.netty.buffer.ByteBuf;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.esi.Esi;
+import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
+
+public interface EsiSerializer {
+    /**
+     * Serialize Ethernet Segment Identifier
+     *
+     * @param esi Ethernet Segment Identifier
+     * @param buffer write in Bytebuf encoded ESI body
+     */
+    void serializeEsi(Esi esi, ByteBuf buffer);
+
+    /**
+     * Serialize Ethernet Segment Identifier Model
+     *
+     * @param esi Ethernet Segment Identifier Model
+     * @return Ethernet Segment Identifier
+     */
+    Esi serializeEsi(ContainerNode esi);
+}