Merge "Replace odl-dlux-core with odl-dluxapps-topology"
[openflowplugin.git] / openflowplugin-impl / src / main / java / org / opendaylight / openflowplugin / impl / protocol / deserialization / match / Ipv6SourceEntryDeserializer.java
1 /*
2  * Copyright (c) 2016 Pantheon Technologies s.r.o. 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
9 package org.opendaylight.openflowplugin.impl.protocol.deserialization.match;
10
11 import java.util.Objects;
12
13 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
14 import org.opendaylight.openflowjava.protocol.impl.deserialization.match.OxmDeserializerHelper;
15 import org.opendaylight.openflowjava.util.ByteBufUtils;
16 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.IpConversionUtil;
17 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Address;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6Match;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchArbitraryBitMask;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchArbitraryBitMaskBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchBuilder;
23
24 import io.netty.buffer.ByteBuf;
25
26 public class Ipv6SourceEntryDeserializer extends AbstractMatchEntryDeserializer {
27
28     @Override
29     public void deserializeEntry(ByteBuf message, MatchBuilder builder) {
30         final boolean hasMask = processHeader(message);
31         final Ipv6Address address = ByteBufUtils.readIetfIpv6Address(message);
32
33         if (hasMask) {
34             final byte[] mask = OxmDeserializerHelper.convertMask(message, EncodeConstants.SIZE_OF_IPV6_ADDRESS_IN_BYTES);
35
36             if (IpConversionUtil.isIpv6ArbitraryBitMask(mask)) {
37                 setArbitraryMatch(builder, address, mask);
38             } else {
39                 setPrefixMatch(builder, address, mask);
40             }
41         } else {
42             setPrefixMatch(builder, address, null);
43         }
44     }
45
46     private static void setPrefixMatch(final MatchBuilder builder, final Ipv6Address address, final byte[] mask) {
47         if (Objects.isNull(builder.getLayer3Match())) {
48             builder.setLayer3Match(new Ipv6MatchBuilder()
49                 .setIpv6Source(IpConversionUtil.createPrefix(address, mask))
50                 .build());
51         } else if (Ipv6Match.class.isInstance(builder.getLayer3Match())
52             && Objects.isNull(Ipv6Match.class.cast(builder.getLayer3Match()).getIpv6Source())) {
53             builder.setLayer3Match(new Ipv6MatchBuilder(Ipv6Match.class.cast(builder.getLayer3Match()))
54                 .setIpv6Source(IpConversionUtil.createPrefix(address, mask))
55                 .build());
56         } else {
57             throwErrorOnMalformed(builder, "layer3Match", "ipv6Source");
58         }
59     }
60
61     private static void setArbitraryMatch(final MatchBuilder builder, final Ipv6Address address,
62             final byte[] mask) {
63         if (Objects.isNull(builder.getLayer3Match())) {
64             builder.setLayer3Match(new Ipv6MatchArbitraryBitMaskBuilder()
65                     .setIpv6SourceAddressNoMask(address)
66                     .setIpv6SourceArbitraryBitmask(IpConversionUtil.createIpv6ArbitraryBitMask(mask))
67                     .build());
68         } else if (Ipv6MatchArbitraryBitMask.class.isInstance(builder.getLayer3Match())
69             && Objects.isNull(Ipv6MatchArbitraryBitMask.class.cast(builder.getLayer3Match()).getIpv6SourceAddressNoMask())) {
70             final Ipv6MatchArbitraryBitMask match = Ipv6MatchArbitraryBitMask.class.cast(builder.getLayer3Match());
71             builder.setLayer3Match(new Ipv6MatchArbitraryBitMaskBuilder(match)
72                     .setIpv6SourceAddressNoMask(address)
73                     .setIpv6SourceArbitraryBitmask(IpConversionUtil.createIpv6ArbitraryBitMask(mask))
74                     .build());
75         } else {
76             throwErrorOnMalformed(builder, "layer3Match", "ipv6SourceAddressNoMask");
77         }
78     }
79
80 }