--- /dev/null
+/*
+ * 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();
+ }
+}
--- /dev/null
+/*
+ * 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();
+}
--- /dev/null
+/*
+ * 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();
+ }
+}
--- /dev/null
+/*
+ * 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();
+ }
+
+}
--- /dev/null
+/*
+ * 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();
+ }
+}
--- /dev/null
+/*
+ * 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();
+ }
+}
--- /dev/null
+/*
+ * 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();
+ }
+}
--- /dev/null
+/*
+ * 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();
+ }
+}
--- /dev/null
+/*
+ * 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);
+}
--- /dev/null
+/*
+ * 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);
+}