2 * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.protocol.bgp.linkstate.spi;
10 import static com.google.common.base.Preconditions.checkArgument;
12 import com.google.common.annotations.VisibleForTesting;
13 import io.netty.buffer.ByteBuf;
14 import org.opendaylight.protocol.util.Ipv4Util;
15 import org.opendaylight.protocol.util.Ipv6Util;
16 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4AddressNoZone;
17 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6AddressNoZone;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.linkstate.ObjectType;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.linkstate.destination.CLinkstateDestination;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.linkstate.object.type.TeLspCase;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.linkstate.object.type.TeLspCaseBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.linkstate.object.type.te.lsp._case.AddressFamily;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.linkstate.object.type.te.lsp._case.address.family.Ipv4Case;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.linkstate.object.type.te.lsp._case.address.family.Ipv4CaseBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.linkstate.object.type.te.lsp._case.address.family.Ipv6Case;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.linkstate.object.type.te.lsp._case.address.family.Ipv6CaseBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.LspId;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.TunnelId;
29 import org.opendaylight.yangtools.yang.common.QName;
30 import org.opendaylight.yangtools.yang.common.Uint16;
31 import org.opendaylight.yangtools.yang.common.Uint32;
32 import org.opendaylight.yangtools.yang.common.netty.ByteBufUtils;
33 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
34 import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode;
36 public abstract class AbstractTeLspNlriCodec extends AbstractNlriTypeCodec {
39 public static final NodeIdentifier LSP_ID = NodeIdentifier.create(
40 QName.create(CLinkstateDestination.QNAME, "lsp-id").intern());
42 public static final NodeIdentifier TUNNEL_ID = NodeIdentifier.create(
43 QName.create(CLinkstateDestination.QNAME, "tunnel-id").intern());
45 public static final NodeIdentifier IPV4_TUNNEL_SENDER_ADDRESS = NodeIdentifier.create(
46 QName.create(CLinkstateDestination.QNAME, "ipv4-tunnel-sender-address").intern());
48 public static final NodeIdentifier IPV4_TUNNEL_ENDPOINT_ADDRESS = NodeIdentifier.create(
49 QName.create(CLinkstateDestination.QNAME, "ipv4-tunnel-endpoint-address").intern());
51 private static final NodeIdentifier IPV6_TUNNEL_SENDER_ADDRESS = NodeIdentifier.create(
52 QName.create(CLinkstateDestination.QNAME, "ipv6-tunnel-sender-address").intern());
54 private static final NodeIdentifier IPV6_TUNNEL_ENDPOINT_ADDRESS = NodeIdentifier.create(
55 QName.create(CLinkstateDestination.QNAME, "ipv6-tunnel-endpoint-address").intern());
58 public static final NodeIdentifier ADDRESS_FAMILY = NodeIdentifier.create(AddressFamily.QNAME);
60 public static boolean isTeLsp(final ChoiceNode objectType) {
61 return objectType.getChild(ADDRESS_FAMILY).isPresent();
64 public static TeLspCase serializeTeLsp(final ChoiceNode objectType) {
65 final ChoiceNode addressFamily = (ChoiceNode) objectType.getChild(ADDRESS_FAMILY).get();
66 return new TeLspCaseBuilder()
67 .setLspId(new LspId((Uint32) objectType.getChild(LSP_ID).get().getValue()))
68 .setTunnelId(new TunnelId((Uint16) objectType.getChild(TUNNEL_ID).get().getValue()))
69 .setAddressFamily(serializeAddressFamily(addressFamily,
70 addressFamily.getChild(IPV4_TUNNEL_SENDER_ADDRESS).isPresent()))
74 private static AddressFamily serializeAddressFamily(final ChoiceNode addressFamily, final boolean ipv4Case) {
76 return new Ipv4CaseBuilder()
77 .setIpv4TunnelSenderAddress(new Ipv4AddressNoZone(
78 (String) addressFamily.getChild(IPV4_TUNNEL_SENDER_ADDRESS).get().getValue()))
79 .setIpv4TunnelEndpointAddress(new Ipv4AddressNoZone(
80 (String) addressFamily.getChild(IPV4_TUNNEL_ENDPOINT_ADDRESS).get().getValue()))
84 return new Ipv6CaseBuilder()
85 .setIpv6TunnelSenderAddress(
86 new Ipv6AddressNoZone((String) addressFamily.getChild(IPV6_TUNNEL_SENDER_ADDRESS).get().getValue()))
87 .setIpv6TunnelEndpointAddress(
88 new Ipv6AddressNoZone((String) addressFamily.getChild(IPV6_TUNNEL_ENDPOINT_ADDRESS).get().getValue()))
93 protected final void serializeObjectType(final ObjectType objectType, final ByteBuf buffer) {
94 checkArgument(objectType instanceof TeLspCase);
95 final TeLspCase teLSP = (TeLspCase) objectType;
96 final AddressFamily addressFamily = teLSP.getAddressFamily();
97 if (addressFamily instanceof Ipv4Case) {
98 serializeIpv4Case(teLSP, (Ipv4Case) addressFamily, buffer);
100 serializeIpv6Case(teLSP, (Ipv6Case) addressFamily, buffer);
104 private static void serializeIpv4Case(final TeLspCase teLSP, final Ipv4Case ipv4Case, final ByteBuf buffer) {
105 Ipv4Util.writeIpv4Address(ipv4Case.getIpv4TunnelSenderAddress(), buffer);
106 serializeTunnelIdAndLspId(buffer, teLSP);
107 Ipv4Util.writeIpv4Address(ipv4Case.getIpv4TunnelEndpointAddress(), buffer);
110 private static void serializeIpv6Case(final TeLspCase teLSP, final Ipv6Case ipv6Case, final ByteBuf buffer) {
111 Ipv6Util.writeIpv6Address(ipv6Case.getIpv6TunnelSenderAddress(), buffer);
112 serializeTunnelIdAndLspId(buffer, teLSP);
113 Ipv6Util.writeIpv6Address(ipv6Case.getIpv6TunnelEndpointAddress(), buffer);
116 private static void serializeTunnelIdAndLspId(final ByteBuf buffer, final TeLspCase teLSP) {
117 ByteBufUtils.write(buffer, teLSP.getTunnelId().getValue());
118 buffer.writeShort(teLSP.getLspId().getValue().intValue());