9b545295fca6b695b4b2a82718a155f55173c94a
[bgpcep.git] / bgp / parser-impl / src / main / java / org / opendaylight / protocol / bgp / parser / impl / message / update / Ipv4NlriParser.java
1 /*
2  * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.protocol.bgp.parser.impl.message.update;
9
10 import com.google.common.base.Preconditions;
11 import io.netty.buffer.ByteBuf;
12 import java.util.ArrayList;
13 import java.util.List;
14 import org.opendaylight.protocol.bgp.parser.BgpTableTypeImpl;
15 import org.opendaylight.protocol.bgp.parser.spi.MultiPathSupportUtil;
16 import org.opendaylight.protocol.bgp.parser.spi.NlriParser;
17 import org.opendaylight.protocol.bgp.parser.spi.NlriSerializer;
18 import org.opendaylight.protocol.bgp.parser.spi.PathIdUtil;
19 import org.opendaylight.protocol.bgp.parser.spi.PeerSpecificParserConstraint;
20 import org.opendaylight.protocol.util.ByteBufWriteUtil;
21 import org.opendaylight.protocol.util.Ipv4Util;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.ipv4.prefixes.DestinationIpv4;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.ipv4.prefixes.DestinationIpv4Builder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.ipv4.prefixes.destination.ipv4.Ipv4Prefixes;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.ipv4.prefixes.destination.ipv4.Ipv4PrefixesBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.update.attributes.mp.reach.nlri.advertized.routes.destination.type.DestinationIpv4CaseBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.update.message.Nlri;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpReachNlriBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpUnreachNlriBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.mp.reach.nlri.AdvertizedRoutesBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.mp.unreach.nlri.WithdrawnRoutesBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.AddressFamily;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.SubsequentAddressFamily;
35 import org.opendaylight.yangtools.yang.binding.DataObject;
36
37 public final class Ipv4NlriParser implements NlriParser, NlriSerializer {
38
39     @Override
40     public void serializeAttribute(final DataObject attribute, final ByteBuf byteAggregator) {
41         Preconditions.checkArgument(attribute instanceof Nlri, "Attribute parameter is not a Nlri object.");
42         final Nlri nlri = (Nlri) attribute;
43         for (final Ipv4Prefix ipv4Prefix : nlri.getNlri()) {
44             ByteBufWriteUtil.writeMinimalPrefix(ipv4Prefix, byteAggregator);
45         }
46     }
47
48     private static DestinationIpv4 prefixes(final ByteBuf nlri, final PeerSpecificParserConstraint constraints,
49             final Class<? extends AddressFamily> afi, final Class<? extends SubsequentAddressFamily> safi) {
50         final List<Ipv4Prefixes> prefixes = new ArrayList<>();
51         while (nlri.isReadable()) {
52             final Ipv4PrefixesBuilder prefixesBuilder = new Ipv4PrefixesBuilder();
53             if (MultiPathSupportUtil.isTableTypeSupported(constraints, new BgpTableTypeImpl(afi, safi))) {
54                 prefixesBuilder.setPathId(PathIdUtil.readPathId(nlri));
55             }
56             prefixesBuilder.setPrefix(Ipv4Util.prefixForByteBuf(nlri));
57             prefixes.add(prefixesBuilder.build());
58         }
59         return new DestinationIpv4Builder().setIpv4Prefixes(prefixes).build();
60     }
61
62     @Override
63     public void parseNlri(final ByteBuf nlri, final MpUnreachNlriBuilder builder) {
64         parseNlri(nlri, builder, null);
65     }
66
67     @Override
68     public void parseNlri(final ByteBuf nlri, final MpReachNlriBuilder builder) {
69         parseNlri(nlri, builder, null);
70     }
71
72     @Override
73     public void parseNlri(final ByteBuf nlri, final MpReachNlriBuilder builder, final PeerSpecificParserConstraint constraint) {
74         builder.setAdvertizedRoutes(new AdvertizedRoutesBuilder().setDestinationType(
75                 new DestinationIpv4CaseBuilder().setDestinationIpv4(prefixes(nlri, constraint, builder.getAfi(), builder.getSafi())).build()).build());
76     }
77
78     @Override
79     public void parseNlri(final ByteBuf nlri, final MpUnreachNlriBuilder builder, final PeerSpecificParserConstraint constraint) {
80         builder.setWithdrawnRoutes(new WithdrawnRoutesBuilder().setDestinationType(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.update.attributes.mp.unreach.nlri.withdrawn.routes.destination.type.DestinationIpv4CaseBuilder().setDestinationIpv4(
81                 prefixes(nlri, constraint, builder.getAfi(), builder.getSafi())).build()).build());
82     }
83 }