From bb80147a127b5a33734fb649beb7fda253698666 Mon Sep 17 00:00:00 2001 From: "Claudio D. Gasparini" Date: Tue, 5 Apr 2016 11:21:16 +0200 Subject: [PATCH] BUG-4826: Evpn ESI Handlers Evpn ESI Handlers https://tools.ietf.org/html/rfc7432#section-5 Change-Id: I10fce0720ed60e7f37f416e7af741c61950afa85 Signed-off-by: Claudio D. Gasparini --- .../bgp/evpn/impl/esi/types/ASGenParser.java | 56 +++++++++++++ .../evpn/impl/esi/types/AbstractEsiType.java | 34 ++++++++ .../evpn/impl/esi/types/ArbitraryParser.java | 46 +++++++++++ .../bgp/evpn/impl/esi/types/EsiModelUtil.java | 79 +++++++++++++++++++ .../bgp/evpn/impl/esi/types/LacpParser.java | 60 ++++++++++++++ .../bgp/evpn/impl/esi/types/LanParser.java | 58 ++++++++++++++ .../bgp/evpn/impl/esi/types/MacParser.java | 59 ++++++++++++++ .../evpn/impl/esi/types/RouterIdParser.java | 56 +++++++++++++ .../protocol/bgp/evpn/spi/EsiParser.java | 22 ++++++ .../protocol/bgp/evpn/spi/EsiSerializer.java | 31 ++++++++ 10 files changed, 501 insertions(+) create mode 100644 bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/esi/types/ASGenParser.java create mode 100644 bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/esi/types/AbstractEsiType.java create mode 100644 bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/esi/types/ArbitraryParser.java create mode 100644 bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/esi/types/EsiModelUtil.java create mode 100644 bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/esi/types/LacpParser.java create mode 100644 bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/esi/types/LanParser.java create mode 100644 bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/esi/types/MacParser.java create mode 100644 bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/esi/types/RouterIdParser.java create mode 100644 bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/spi/EsiParser.java create mode 100644 bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/spi/EsiSerializer.java 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 index 0000000000..a5292a8b2c --- /dev/null +++ b/bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/esi/types/ASGenParser.java @@ -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 index 0000000000..b105dee8fb --- /dev/null +++ b/bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/esi/types/AbstractEsiType.java @@ -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 index 0000000000..b2c784c941 --- /dev/null +++ b/bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/esi/types/ArbitraryParser.java @@ -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 index 0000000000..59e841c9b3 --- /dev/null +++ b/bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/esi/types/EsiModelUtil.java @@ -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 index 0000000000..413c7531c0 --- /dev/null +++ b/bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/esi/types/LacpParser.java @@ -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 index 0000000000..3ae845e084 --- /dev/null +++ b/bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/esi/types/LanParser.java @@ -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 index 0000000000..71d3e72992 --- /dev/null +++ b/bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/esi/types/MacParser.java @@ -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 index 0000000000..4b89f8753c --- /dev/null +++ b/bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/impl/esi/types/RouterIdParser.java @@ -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 index 0000000000..c9bd000c42 --- /dev/null +++ b/bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/spi/EsiParser.java @@ -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 index 0000000000..8750174ba8 --- /dev/null +++ b/bgp/evpn/src/main/java/org/opendaylight/protocol/bgp/evpn/spi/EsiSerializer.java @@ -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); +} -- 2.36.6