Merge branch 'master' of github.com:floodlight/loxigen
diff --git a/.abat-automerge b/.abat-automerge
index 1c2b4cb..36e8739 100755
--- a/.abat-automerge
+++ b/.abat-automerge
@@ -2,4 +2,5 @@
 ROOTDIR=$(dirname $(readlink -f $0))
 cd "$ROOTDIR"
 
-make all check check-c check-py
+ln -sf ../../.hooks/pre-commit .git/hooks/pre-commit
+make all check-all
diff --git a/java_gen/java_model.py b/java_gen/java_model.py
index 68c2316..8498dab 100644
--- a/java_gen/java_model.py
+++ b/java_gen/java_model.py
@@ -156,7 +156,13 @@
     # registry of MaskedEnumGroups (see above).
     # map: ${java_enum_name}: tuple(MaskedEnumGroup)
     masked_enum_groups = defaultdict(lambda: (),
-            OFPortState= (MaskedEnumGroup("stp_flags", mask="STP_MASK", members=set(("STP_LISTEN", "STP_LEARN", "STP_FORWARD", "STP_BLOCK"))), )
+            OFPortState = (MaskedEnumGroup("stp_flags", mask="STP_MASK", members=set(("STP_LISTEN", "STP_LEARN", "STP_FORWARD", "STP_BLOCK"))), ),
+            OFConfigFlags = (
+                MaskedEnumGroup("frag_flags", mask="FRAG_MASK", members=set(("FRAG_NORMAL", "FRAG_DROP", "FRAG_REASM"))),
+            ),
+            OFTableConfig = (
+                MaskedEnumGroup("table_miss_flags", mask="TABLE_MISS_MASK", members=set(("TABLE_MISS_CONTROLLER", "TABLE_MISS_CONTINUE", "TABLE_MISS_DROP"))),
+            ),
     )
 
     # represents a metadata property associated with an EnumClass
diff --git a/java_gen/pre-written/pom.xml b/java_gen/pre-written/pom.xml
index dbd04a5..ea9a43f 100644
--- a/java_gen/pre-written/pom.xml
+++ b/java_gen/pre-written/pom.xml
@@ -10,7 +10,7 @@
 
     <groupId>org.projectfloodlight</groupId>
     <artifactId>openflowj</artifactId>
-    <version>0.1.0-SNAPSHOT</version>
+    <version>0.2.0-SNAPSHOT</version>
     <packaging>jar</packaging>
 
     <name>OpenFlowJ-Loxi</name>
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/match/Prerequisite.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/match/Prerequisite.java
index 4e667e7..03d5e79 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/match/Prerequisite.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/match/Prerequisite.java
@@ -10,6 +10,7 @@
     private final Set<OFValueType<T>> values;
     private boolean any;
 
+    @SafeVarargs
     public Prerequisite(MatchField<T> field, OFValueType<T>... values) {
         this.values = new HashSet<OFValueType<T>>();
         this.field = field;
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IPAddress.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IPAddress.java
new file mode 100644
index 0000000..7c50aed
--- /dev/null
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IPAddress.java
@@ -0,0 +1,16 @@
+package org.projectfloodlight.openflow.types;
+
+public abstract class IPAddress<F extends IPAddress<F>> implements OFValueType<F> {
+
+    public abstract IPVersion getIpVersion();
+
+    public static IPAddress<?> of(String ip) {
+        if (ip.indexOf('.') != -1)
+            return IPv4Address.of(ip);
+        else if (ip.indexOf(':') != -1)
+            return IPv6Address.of(ip);
+        else
+            throw new IllegalArgumentException("IP Address not well formed: " + ip);
+    }
+
+}
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IPAddressWithMask.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IPAddressWithMask.java
new file mode 100644
index 0000000..11ef103
--- /dev/null
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IPAddressWithMask.java
@@ -0,0 +1,21 @@
+package org.projectfloodlight.openflow.types;
+
+
+public abstract class IPAddressWithMask<F extends IPAddress<F>> extends Masked<F> {
+
+    protected IPAddressWithMask(F value, F mask) {
+        super(value, mask);
+    }
+
+    public abstract IPVersion getIpVersion();
+
+    public static IPAddressWithMask<?> of(String ip) {
+        if (ip.indexOf('.') != -1)
+            return IPv4AddressWithMask.of(ip);
+        else if (ip.indexOf(':') != -1)
+            return IPv6AddressWithMask.of(ip);
+        else
+            throw new IllegalArgumentException("IP Address not well formed: " + ip);
+    }
+
+}
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IPVersion.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IPVersion.java
new file mode 100644
index 0000000..5bfc6d8
--- /dev/null
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IPVersion.java
@@ -0,0 +1,6 @@
+package org.projectfloodlight.openflow.types;
+
+public enum IPVersion {
+    IPv4,
+    IPv6
+}
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IPv4Address.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IPv4Address.java
index 5ef301b..3b07c17 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IPv4Address.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IPv4Address.java
@@ -9,7 +9,7 @@
  *
  * @author Andreas Wundsam <andreas.wundsam@bigswitch.com>
  */
-public class IPv4Address implements OFValueType<IPv4Address> {
+public class IPv4Address extends IPAddress<IPv4Address> {
     static final int LENGTH = 4;
     private final int rawValue;
 
@@ -23,10 +23,15 @@
         this.rawValue = rawValue;
     }
 
+    @Override
+    public IPVersion getIpVersion() {
+        return IPVersion.IPv4;
+    }
+
     public static IPv4Address of(final byte[] address) {
         if (address.length != LENGTH) {
             throw new IllegalArgumentException(
-                    "Invalid byte array length for IPv4Address address: " + address);
+                    "Invalid byte array length for IPv4Address address: " + address.length);
         }
 
         int raw =
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IPv4AddressWithMask.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IPv4AddressWithMask.java
index 45f10d1..67bbce4 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IPv4AddressWithMask.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IPv4AddressWithMask.java
@@ -1,6 +1,7 @@
 package org.projectfloodlight.openflow.types;
 
-public class IPv4AddressWithMask extends Masked<IPv4Address> {
+
+public class IPv4AddressWithMask extends IPAddressWithMask<IPv4Address> {
     public final static IPv4AddressWithMask NONE = of(IPv4Address.NONE, IPv4Address.NONE);
 
     private IPv4AddressWithMask(int rawValue, int rawMask) {
@@ -11,6 +12,11 @@
         super(value, mask);
     }
 
+    @Override
+    public IPVersion getIpVersion() {
+        return IPVersion.IPv4;
+    }
+
     public static IPv4AddressWithMask of(int rawValue, int rawMask) {
         return new IPv4AddressWithMask(rawValue, rawMask);
     }
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IPv6Address.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IPv6Address.java
index ea71c65..eb52f67 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IPv6Address.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IPv6Address.java
@@ -11,7 +11,7 @@
  *
  * @author Andreas Wundsam <andreas.wundsam@teleteach.de>
  */
-public class IPv6Address implements OFValueType<IPv6Address> {
+public class IPv6Address extends IPAddress<IPv6Address> {
     static final int LENGTH = 16;
     private final long raw1;
     private final long raw2;
@@ -28,10 +28,15 @@
         this.raw2 = raw2;
     }
 
+    @Override
+    public IPVersion getIpVersion() {
+        return IPVersion.IPv6;
+    }
+
     public static IPv6Address of(final byte[] address) {
         if (address.length != LENGTH) {
             throw new IllegalArgumentException(
-                    "Invalid byte array length for IPv6 address: " + address);
+                    "Invalid byte array length for IPv6 address: " + address.length);
         }
 
         long raw1 =
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IPv6AddressWithMask.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IPv6AddressWithMask.java
index dcaa0b6..727daf6 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IPv6AddressWithMask.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/IPv6AddressWithMask.java
@@ -3,13 +3,18 @@
 import java.math.BigInteger;
 import java.util.Arrays;
 
-public class IPv6AddressWithMask extends Masked<IPv6Address> {
+public class IPv6AddressWithMask extends IPAddressWithMask<IPv6Address> {
     public final static IPv6AddressWithMask NONE = of(IPv6Address.NONE, IPv6Address.NONE);
 
     private IPv6AddressWithMask(IPv6Address value, IPv6Address mask) {
         super(value, mask);
     }
 
+    @Override
+    public IPVersion getIpVersion() {
+        return IPVersion.IPv6;
+    }
+
     public static IPv6AddressWithMask of(IPv6Address value, IPv6Address mask) {
         return new IPv6AddressWithMask(value, mask);
     }
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFFlowModCmd.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFFlowModCmd.java
deleted file mode 100644
index 7173bde..0000000
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OFFlowModCmd.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package org.projectfloodlight.openflow.types;
-
-/**
- * Version agnostic view of commands to an OFFlowMod
- *
- * @author capveg
- */
-
-public enum OFFlowModCmd {
-    ADD, MODIFY, MODIFY_STRICT, DELETE, DELETE_STRICT
-}
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/util/HexString.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/util/HexString.java
index d812236..ddf0f25 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/util/HexString.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/util/HexString.java
@@ -50,12 +50,12 @@
         int i = 0;
         for (; i < (padTo * 2 - arr.length); i++) {
             ret += "0";
-            if ((i % 2) == 1)
+            if ((i % 2) != 0)
                 ret += ":";
         }
         for (int j = 0; j < arr.length; j++) {
             ret += arr[j];
-            if ((((i + j) % 2) == 1) && (j < (arr.length - 1)))
+            if ((((i + j) % 2) != 0) && (j < (arr.length - 1)))
                 ret += ":";
         }
         return ret;
diff --git a/java_gen/templates/custom/OFMatchV1Ver10.java b/java_gen/templates/custom/OFMatchV1Ver10.java
index 7b1f110..eaaacb0 100644
--- a/java_gen/templates/custom/OFMatchV1Ver10.java
+++ b/java_gen/templates/custom/OFMatchV1Ver10.java
@@ -119,7 +119,6 @@
                 result = IPv4AddressWithMask.of(ipv4Src, IPv4Address.of(srcBitMask));
                 break;
             case IPV4_DST:
-                int dstMaskedBits = Math.min(32, (wildcards & OFPFW_NW_DST_MASK) >> OFPFW_NW_DST_SHIFT);
                 int dstBitMask = (-1) << (32 - getIpv4DstCidrMaskLen());
 
                 result = IPv4AddressWithMask.of(ipv4Dst, IPv4Address.of(dstBitMask));