Fixed ipv6 address deserialization in match
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / util / MatchDeserializer.java
index 668d6e414208845e65c76fd768390363be5e5aa1..097046f35a102be2b794417858258a9d56e82b65 100644 (file)
@@ -119,8 +119,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.MatchEntriesBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.match.grouping.Match;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.match.grouping.MatchBuilder;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Joiner;
 
@@ -131,8 +129,6 @@ import com.google.common.base.Joiner;
  */
 public abstract class MatchDeserializer {
 
-    private static final Logger LOGGER = LoggerFactory.getLogger(MatchDeserializer.class);
-    
     /**
      * Creates match
      * @param in input ByteBuf
@@ -162,7 +158,7 @@ public abstract class MatchDeserializer {
         }
         return null;
     }
-    
+
     /**
      * Deserializes single match entry (oxm_field)
      * @param in input ByteBuf
@@ -172,7 +168,7 @@ public abstract class MatchDeserializer {
     public static List<MatchEntries> createMatchEntry(ByteBuf in, int matchLength) {
         return createMatchEntriesInternal(in, matchLength, true);
     }
-    
+
     /**
      * @param in input ByteBuf
      * @param matchLength length of match entries
@@ -181,13 +177,13 @@ public abstract class MatchDeserializer {
     public static List<MatchEntries> createMatchEntries(ByteBuf in, int matchLength) {
         return createMatchEntriesInternal(in, matchLength, false);
     }
-    
+
     private static List<MatchEntries> createMatchEntriesInternal(ByteBuf in, int matchLength, boolean oneEntry) {
         List<MatchEntries> matchEntriesList = new ArrayList<>();
         int currLength = 0;
         while(currLength < matchLength) {
-            MatchEntriesBuilder matchEntriesBuilder = new MatchEntriesBuilder(); 
-            switch (in.readUnsignedShort()) { 
+            MatchEntriesBuilder matchEntriesBuilder = new MatchEntriesBuilder();
+            switch (in.readUnsignedShort()) {
             case 0x0000:
                         matchEntriesBuilder.setOxmClass(Nxm0Class.class);
                         break;
@@ -211,18 +207,18 @@ public abstract class MatchDeserializer {
             int matchEntryLength = in.readUnsignedByte();
             currLength += EncodeConstants.SIZE_OF_SHORT_IN_BYTES +
                     (2 * EncodeConstants.SIZE_OF_BYTE_IN_BYTES) + matchEntryLength;
-            
+
             switch(matchField) {
-            case 0: 
+            case 0:
                 matchEntriesBuilder.setOxmMatchField(InPort.class);
                 PortNumberMatchEntryBuilder port = new PortNumberMatchEntryBuilder();
-                port.setPortNumber(new PortNumber(in.readUnsignedInt())); 
+                port.setPortNumber(new PortNumber(in.readUnsignedInt()));
                 matchEntriesBuilder.addAugmentation(PortNumberMatchEntry.class, port.build());
                 break;
             case 1:
                 matchEntriesBuilder.setOxmMatchField(InPhyPort.class);
                 PortNumberMatchEntryBuilder phyPort = new PortNumberMatchEntryBuilder();
-                phyPort.setPortNumber(new PortNumber(in.readUnsignedInt())); 
+                phyPort.setPortNumber(new PortNumber(in.readUnsignedInt()));
                 matchEntriesBuilder.addAugmentation(PortNumberMatchEntry.class, phyPort.build());
                 break;
             case 2:
@@ -236,14 +232,14 @@ public abstract class MatchDeserializer {
                 matchEntriesBuilder.setOxmMatchField(EthDst.class);
                 addMacAddressAugmentation(matchEntriesBuilder, in);
                 if (hasMask) {
-                    addMaskAugmentation(matchEntriesBuilder, in, EncodeConstants.SIZE_OF_LONG_IN_BYTES);
+                    addMaskAugmentation(matchEntriesBuilder, in, EncodeConstants.MAC_ADDRESS_LENGTH);
                 }
                 break;
             case 4:
                 matchEntriesBuilder.setOxmMatchField(EthSrc.class);
                 addMacAddressAugmentation(matchEntriesBuilder, in);
                 if (hasMask) {
-                    addMaskAugmentation(matchEntriesBuilder, in, EncodeConstants.SIZE_OF_LONG_IN_BYTES);
+                    addMaskAugmentation(matchEntriesBuilder, in, EncodeConstants.MAC_ADDRESS_LENGTH);
                 }
                 break;
             case 5:
@@ -289,7 +285,6 @@ public abstract class MatchDeserializer {
                 break;
             case 11:
                 matchEntriesBuilder.setOxmMatchField(Ipv4Src.class);
-                LOGGER.warn("IPV4address(ipv4src): received but possible wrong deserialization");
                 addIpv4AddressAugmentation(matchEntriesBuilder, in);
                 if (hasMask) {
                     addMaskAugmentation(matchEntriesBuilder, in, EncodeConstants.SIZE_OF_INT_IN_BYTES);
@@ -297,7 +292,6 @@ public abstract class MatchDeserializer {
                 break;
             case 12:
                 matchEntriesBuilder.setOxmMatchField(Ipv4Dst.class);
-                LOGGER.warn("IPV4address(ipv4dst): received but possible wrong deserialization");
                 addIpv4AddressAugmentation(matchEntriesBuilder, in);
                 if (hasMask) {
                     addMaskAugmentation(matchEntriesBuilder, in, EncodeConstants.SIZE_OF_INT_IN_BYTES);
@@ -347,7 +341,6 @@ public abstract class MatchDeserializer {
                 break;
             case 22:
                 matchEntriesBuilder.setOxmMatchField(ArpSpa.class);
-                LOGGER.warn("IPV4address(arpspa): received but possible wrong deserialization");
                 addIpv4AddressAugmentation(matchEntriesBuilder, in);
                 if (hasMask) {
                     addMaskAugmentation(matchEntriesBuilder, in, EncodeConstants.SIZE_OF_INT_IN_BYTES);
@@ -355,7 +348,6 @@ public abstract class MatchDeserializer {
                 break;
             case 23:
                 matchEntriesBuilder.setOxmMatchField(ArpTpa.class);
-                LOGGER.warn("IPV4address(arptpa): received but possible wrong deserialization");
                 addIpv4AddressAugmentation(matchEntriesBuilder, in);
                 if (hasMask) {
                     addMaskAugmentation(matchEntriesBuilder, in, EncodeConstants.SIZE_OF_INT_IN_BYTES);
@@ -365,20 +357,18 @@ public abstract class MatchDeserializer {
                 matchEntriesBuilder.setOxmMatchField(ArpSha.class);
                 addMacAddressAugmentation(matchEntriesBuilder, in);
                 if (hasMask) {
-                    addMaskAugmentation(matchEntriesBuilder, in, EncodeConstants.SIZE_OF_LONG_IN_BYTES);
+                    addMaskAugmentation(matchEntriesBuilder, in, EncodeConstants.MAC_ADDRESS_LENGTH);
                 }
                 break;
             case 25:
                 matchEntriesBuilder.setOxmMatchField(ArpTha.class);
                 addMacAddressAugmentation(matchEntriesBuilder, in);
                 if (hasMask) {
-                    addMaskAugmentation(matchEntriesBuilder, in, EncodeConstants.SIZE_OF_LONG_IN_BYTES);
+                    addMaskAugmentation(matchEntriesBuilder, in, EncodeConstants.MAC_ADDRESS_LENGTH);
                 }
                 break;
             case 26:
                 matchEntriesBuilder.setOxmMatchField(Ipv6Src.class);
-                // TODO - ipv6address - check format with tests
-                LOGGER.warn("IPV6address(Ipv6Src): received but possible wrong deserialization");
                 addIpv6AddressAugmentation(matchEntriesBuilder, in);
                 if (hasMask) {
                     addMaskAugmentation(matchEntriesBuilder, in, EncodeConstants.SIZE_OF_IPV6_ADDRESS_IN_BYTES);
@@ -386,8 +376,6 @@ public abstract class MatchDeserializer {
                 break;
             case 27:
                 matchEntriesBuilder.setOxmMatchField(Ipv6Dst.class);
-                // TODO - ipv6address - check format with tests
-                LOGGER.warn("IPV6address(Ipv6Dst): received but possible wrong deserialization");
                 addIpv6AddressAugmentation(matchEntriesBuilder, in);
                 if (hasMask) {
                     addMaskAugmentation(matchEntriesBuilder, in, EncodeConstants.SIZE_OF_IPV6_ADDRESS_IN_BYTES);
@@ -416,8 +404,6 @@ public abstract class MatchDeserializer {
                 break;
             case 31:
                 matchEntriesBuilder.setOxmMatchField(Ipv6NdTarget.class);
-                // TODO - ipv6address - check format with tests
-                LOGGER.warn("IPV6address(Ipv6NdTarget): received but possible wrong deserialization");
                 addIpv6AddressAugmentation(matchEntriesBuilder, in);
                 break;
             case 32:
@@ -453,10 +439,11 @@ public abstract class MatchDeserializer {
             case 37:
                 matchEntriesBuilder.setOxmMatchField(PbbIsid.class);
                 IsidMatchEntryBuilder isidBuilder = new IsidMatchEntryBuilder();
-                isidBuilder.setIsid(in.readUnsignedInt());
+                Integer isid = in.readUnsignedMedium();
+                isidBuilder.setIsid(isid.longValue());
                 matchEntriesBuilder.addAugmentation(IsidMatchEntry.class, isidBuilder.build());
                 if (hasMask) {
-                    addMaskAugmentation(matchEntriesBuilder, in, EncodeConstants.SIZE_OF_INT_IN_BYTES);
+                    addMaskAugmentation(matchEntriesBuilder, in, EncodeConstants.SIZE_OF_3_BYTES);
                 }
                 break;
             case 38:
@@ -485,7 +472,7 @@ public abstract class MatchDeserializer {
                     addMaskAugmentation(matchEntriesBuilder, in, EncodeConstants.SIZE_OF_SHORT_IN_BYTES);
                 }
                 break;
-            default: 
+            default:
                 break;
             }
           matchEntriesList.add(matchEntriesBuilder.build());
@@ -511,18 +498,18 @@ public abstract class MatchDeserializer {
         Ipv6AddressMatchEntryBuilder ipv6AddressBuilder = new Ipv6AddressMatchEntryBuilder();
         List<String> groups = new ArrayList<>();
         for (int i = 0; i < EncodeConstants.GROUPS_IN_IPV6_ADDRESS; i++) {
-            groups.add(String.format("X", in.readUnsignedShort()));
+            groups.add(String.format("%04X", in.readUnsignedShort()));
         }
         Joiner joiner = Joiner.on(":");
         ipv6AddressBuilder.setIpv6Address(new Ipv6Address(joiner.join(groups)));
         builder.addAugmentation(Ipv6AddressMatchEntry.class, ipv6AddressBuilder.build());
     }
-    
+
     private static void addMetadataAugmentation(MatchEntriesBuilder builder, ByteBuf in) {
         MetadataMatchEntryBuilder metadata = new MetadataMatchEntryBuilder();
         byte[] metadataBytes = new byte[Long.SIZE/Byte.SIZE];
         in.readBytes(metadataBytes);
-        metadata.setMetadata(metadataBytes); 
+        metadata.setMetadata(metadataBytes);
         builder.addAugmentation(MetadataMatchEntry.class, metadata.build());
     }
 
@@ -544,7 +531,7 @@ public abstract class MatchDeserializer {
         macAddress.setMacAddress(new MacAddress(ByteBufUtils.macAddressToString(address)));
         builder.addAugmentation(MacAddressMatchEntry.class, macAddress.build());
     }
-    
+
     private static void addPortAugmentation(MatchEntriesBuilder builder, ByteBuf in) {
         PortMatchEntryBuilder portBuilder = new PortMatchEntryBuilder();
         portBuilder.setPort(new org.opendaylight.yang.gen.v1.urn.ietf.params.