c83f9d904a68464140ce792377f4ba7004edcbeb
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / serialization / match / AbstractOxmIpv6AddressSerializer.java
1 /*\r
2  * Copyright (c) 2013 Pantheon Technologies s.r.o. and others.  All rights reserved.\r
3  *\r
4  * This program and the accompanying materials are made available under the\r
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
6  * and is available at http://www.eclipse.org/legal/epl-v10.html\r
7  */\r
8 package org.opendaylight.openflowjava.protocol.impl.serialization.match;\r
9 \r
10 import io.netty.buffer.ByteBuf;\r
11 \r
12 import java.util.ArrayList;\r
13 import java.util.Arrays;\r
14 import java.util.List;\r
15 \r
16 import org.opendaylight.openflowjava.util.ByteBufUtils;\r
17 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;\r
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Ipv6AddressMatchEntry;\r
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries;\r
20 \r
21 import com.google.common.collect.Lists;\r
22 \r
23 /**\r
24  * Parent for Ipv6 address based match entry serializers\r
25  * @author michal.polkorab\r
26  */\r
27 public abstract class AbstractOxmIpv6AddressSerializer extends AbstractOxmMatchEntrySerializer {\r
28 \r
29     @Override\r
30     public void serialize(final MatchEntries entry, final ByteBuf outBuffer) {\r
31         super.serialize(entry, outBuffer);\r
32         String textAddress = entry.getAugmentation(Ipv6AddressMatchEntry.class).getIpv6Address().getValue();\r
33         List<String> address;\r
34         if (textAddress.equals("::")) {\r
35             String[] tmp = new String[EncodeConstants.GROUPS_IN_IPV6_ADDRESS];\r
36             Arrays.fill(tmp, "0");\r
37             address = Arrays.asList(tmp);\r
38         } else {\r
39             address = parseIpv6Address(Lists.newArrayList(ByteBufUtils.COLON_SPLITTER.split(textAddress)));\r
40         }\r
41         for (String group : address) {\r
42             outBuffer.writeShort(Integer.parseInt(group, 16));\r
43         }\r
44         writeMask(entry, outBuffer, getValueLength());\r
45     }\r
46 \r
47     private static List<String> parseIpv6Address(final List<String> addressGroups) {\r
48         int countEmpty = 0;\r
49         for (String group : addressGroups) {\r
50             if (group.equals("")) {\r
51                 countEmpty++;\r
52             }\r
53         }\r
54         List<String> ready = new ArrayList<>(EncodeConstants.GROUPS_IN_IPV6_ADDRESS);\r
55         switch (countEmpty) {\r
56         case 0:\r
57             ready = addressGroups;\r
58             break;\r
59         case 1:\r
60             int zerosToBePushed = EncodeConstants.GROUPS_IN_IPV6_ADDRESS - addressGroups.size() + 1;\r
61             for (String group : addressGroups) {\r
62                 if (group.equals("")) {\r
63                     for (int j = 0; j < zerosToBePushed; j++) {\r
64                         ready.add("0");\r
65                     }\r
66                 } else {\r
67                     ready.add(group);\r
68                 }\r
69             }\r
70             break;\r
71         case 2:\r
72             String[] tmp = new String[EncodeConstants.GROUPS_IN_IPV6_ADDRESS];\r
73             Arrays.fill(tmp, "0");\r
74             tmp[EncodeConstants.GROUPS_IN_IPV6_ADDRESS - 1] =\r
75                     addressGroups.get(addressGroups.size() - 1);\r
76             ready = Arrays.asList(tmp);\r
77             break;\r
78         default:\r
79             throw new IllegalStateException("Incorrect ipv6 address");\r
80         }\r
81         return ready;\r
82     }\r
83 }\r