OpenFlow message processing for new loxi

Depends-On: Id69c8597eb4564653c56cdc90f2dcec50afbdd25

Change-Id: Ib14fbadd3debf98ce1d56343179f8e7929f8ade8
diff --git a/core/api/src/main/java/org/onosproject/net/flow/FlowRule.java b/core/api/src/main/java/org/onosproject/net/flow/FlowRule.java
index 6d6b318..c758c48 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/FlowRule.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/FlowRule.java
@@ -34,9 +34,19 @@
      * Used to check reason parameter in flows.
      */
     enum FlowRemoveReason {
-        NO_REASON,
         IDLE_TIMEOUT,
-        HARD_TIMEOUT;
+        HARD_TIMEOUT,
+        DELETE,
+        GROUP_DELETE,
+        METER_DELETE,
+        EVICTION,
+        NO_REASON;
+
+        /**
+         * Covert short to enum.
+         * @return reason in enum
+         * @param reason remove reason in integer
+         */
         public static FlowRemoveReason parseShort(short reason) {
             switch (reason) {
                 case -1 :
@@ -45,6 +55,14 @@
                     return IDLE_TIMEOUT;
                 case 1:
                     return HARD_TIMEOUT;
+                case 2 :
+                    return DELETE;
+                case 3:
+                    return GROUP_DELETE;
+                case 4:
+                    return METER_DELETE;
+                case 5:
+                    return EVICTION;
                 default :
                     return NO_REASON;
             }
diff --git a/core/store/serializers/src/main/java/org/onosproject/store/serializers/KryoNamespaces.java b/core/store/serializers/src/main/java/org/onosproject/store/serializers/KryoNamespaces.java
index d59b859..7d1a9d1 100644
--- a/core/store/serializers/src/main/java/org/onosproject/store/serializers/KryoNamespaces.java
+++ b/core/store/serializers/src/main/java/org/onosproject/store/serializers/KryoNamespaces.java
@@ -249,7 +249,8 @@
             .register(new ImmutableListSerializer(),
                       ImmutableList.class,
                       ImmutableList.of(1).getClass(),
-                      ImmutableList.of(1, 2).getClass())
+                      ImmutableList.of(1, 2).getClass(),
+                      ImmutableList.of(1, 2, 3).subList(1, 3).getClass())
             .register(new ImmutableSetSerializer(),
                       ImmutableSet.class,
                       ImmutableSet.of().getClass(),
diff --git a/drivers/default/features.xml b/drivers/default/features.xml
index 52741e7..4f2efc5 100644
--- a/drivers/default/features.xml
+++ b/drivers/default/features.xml
@@ -20,7 +20,7 @@
         <feature>onos-api</feature>
         <bundle>mvn:${project.groupId}/${project.artifactId}/${project.version}</bundle>
 
-        <bundle>mvn:org.onosproject/openflowj/0.9.7.onos</bundle>
+        <bundle>mvn:org.onosproject/openflowj/3.2.0.onos</bundle>
         <bundle>mvn:${project.groupId}/onos-of-api/${project.version}</bundle>
 
     </feature>
diff --git a/drivers/flowspec/pom.xml b/drivers/flowspec/pom.xml
index 187a651..93554a6 100644
--- a/drivers/flowspec/pom.xml
+++ b/drivers/flowspec/pom.xml
@@ -61,7 +61,6 @@
         <dependency>
             <groupId>com.google.guava</groupId>
             <artifactId>guava</artifactId>
-            <version>19.0</version>
         </dependency>
         <dependency>
             <groupId>org.onosproject</groupId>
diff --git a/drivers/optical/src/main/java/org/onosproject/driver/optical/handshaker/OplinkHandshakerUtil.java b/drivers/optical/src/main/java/org/onosproject/driver/optical/handshaker/OplinkHandshakerUtil.java
index d5b18b4..5ea98c8 100644
--- a/drivers/optical/src/main/java/org/onosproject/driver/optical/handshaker/OplinkHandshakerUtil.java
+++ b/drivers/optical/src/main/java/org/onosproject/driver/optical/handshaker/OplinkHandshakerUtil.java
@@ -20,8 +20,8 @@
 import java.util.List;
 import java.util.Set;
 
-import org.jboss.netty.buffer.ChannelBuffer;
-import org.jboss.netty.buffer.ChannelBuffers;
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
 import org.onosproject.drivers.optical.OpticalAdjacencyLinkService;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.Annotations;
@@ -203,7 +203,7 @@
                 // |---------------------------------------------------------------------------|
                 // | Header (2 bytes) | ID (4 BITS) | MAC (6 bytes) | Port (4 bytes) | Unused  |
                 // |---------------------------------------------------------------------------|
-                ChannelBuffer buffer = ChannelBuffers.buffer(OPSPEC_BYTES);
+                ByteBuf buffer = Unpooled.buffer(OPSPEC_BYTES);
                 otn.getOpspec().write32Bytes(buffer);
                 long mac = buffer.getLong(OPSPEC_MAC_POS) << OPSPEC_ID_BITS >>> OPSPEC_MAC_BIT_OFF;
                 int port = (int) (buffer.getLong(OPSPEC_PORT_POS) << OPSPEC_ID_BITS >>> OPSPEC_PORT_BIT_OFF);
diff --git a/features/features.xml b/features/features.xml
index 2dfb2f2..7403b25 100644
--- a/features/features.xml
+++ b/features/features.xml
@@ -23,7 +23,7 @@
         <bundle>mvn:commons-lang/commons-lang/2.6</bundle>
         <bundle>mvn:org.apache.commons/commons-lang3/3.5</bundle>
         <bundle>mvn:commons-configuration/commons-configuration/1.10</bundle>
-        <bundle>mvn:com.google.guava/guava/19.0</bundle>
+        <bundle>mvn:com.google.guava/guava/20.0</bundle>
         <bundle>mvn:io.netty/netty/3.10.5.Final</bundle>
         <bundle>mvn:io.netty/netty-common/4.1.5.Final</bundle>
         <bundle>mvn:io.netty/netty-buffer/4.1.5.Final</bundle>
diff --git a/lib/BUCK b/lib/BUCK
index 6295c8c..6867754 100644
--- a/lib/BUCK
+++ b/lib/BUCK
@@ -1,4 +1,4 @@
-# ***** This file was auto-generated at Mon, 15 May 2017 21:06:23 GMT. Do not edit this file manually. *****
+# ***** This file was auto-generated at Thu, 18 May 2017 21:45:37 GMT. Do not edit this file manually. *****
 # ***** Use onos-lib-gen *****
 
 pass_thru_pom(
@@ -23,6 +23,7 @@
     ':objenesis',
     ':guava',
     ':netty',
+    ':netty-buffer',
     ':netty-common',
     ':minimal-json',
     ':kryo',
@@ -311,19 +312,19 @@
 
 remote_jar (
   name = 'guava',
-  out = 'guava-19.0.jar',
-  url = 'mvn:com.google.guava:guava:jar:19.0',
-  sha1 = '6ce200f6b23222af3d8abb6b6459e6c44f4bb0e9',
-  maven_coords = 'com.google.guava:guava:19.0',
+  out = 'guava-20.0.jar',
+  url = 'mvn:com.google.guava:guava:jar:20.0',
+  sha1 = '89507701249388e1ed5ddcf8c41f4ce1be7831ef',
+  maven_coords = 'com.google.guava:guava:20.0',
   visibility = [ 'PUBLIC' ],
 )
 
 remote_jar (
   name = 'guava-testlib',
-  out = 'guava-testlib-19.0.jar',
-  url = 'mvn:com.google.guava:guava-testlib:jar:19.0',
-  sha1 = 'ce5b880b206de3f76d364988a6308c68c726f74a',
-  maven_coords = 'com.google.guava:guava-testlib:jar:NON-OSGI:19.0',
+  out = 'guava-testlib-20.0.jar',
+  url = 'mvn:com.google.guava:guava-testlib:jar:20.0',
+  sha1 = 'e3666edd0d7b10ddfa5242b998efd831e4b264ff',
+  maven_coords = 'com.google.guava:guava-testlib:jar:NON-OSGI:20.0',
   visibility = [ 'PUBLIC' ],
 )
 
@@ -860,10 +861,10 @@
 
 remote_jar (
   name = 'openflowj',
-  out = 'openflowj-0.9.8.onos.jar',
-  url = 'mvn:org.onosproject:openflowj:jar:0.9.8.onos',
-  sha1 = '4dc85deb24584eee18ef103d10a01c20d2f657bc',
-  maven_coords = 'org.onosproject:openflowj:0.9.8.onos',
+  out = 'openflowj-3.2.0.onos.jar',
+  url = 'mvn:org.onosproject:openflowj:jar:3.2.0.onos',
+  sha1 = 'b890ecb2901912b9c7ededd1d1028fea73aa5db4',
+  maven_coords = 'org.onosproject:openflowj:3.2.0.onos',
   visibility = [ 'PUBLIC' ],
 )
 
@@ -1278,4 +1279,3 @@
   maven_coords = 'org.apache.sshd:sshd-core:1.4.0',
   visibility = [ 'PUBLIC' ],
 )
-
diff --git a/lib/deps.json b/lib/deps.json
index e6074f2..d4efb01 100644
--- a/lib/deps.json
+++ b/lib/deps.json
@@ -12,6 +12,7 @@
       "objenesis",
       "guava",
       "netty",
+      "netty-buffer",
       "netty-common",
       "minimal-json",
       "kryo",
@@ -111,8 +112,8 @@
     "ganymed-ssh2": "mvn:ch.ethz.ganymed:ganymed-ssh2:262",
     "gmetric4j": "mvn:info.ganglia.gmetric4j:gmetric4j:1.0.10",
     "gson": "mvn:com.google.code.gson:gson:jar:2.6.2",
-    "guava": "mvn:com.google.guava:guava:19.0",
-    "guava-testlib": "mvn:com.google.guava:guava-testlib:19.0",
+    "guava": "mvn:com.google.guava:guava:20.0",
+    "guava-testlib": "mvn:com.google.guava:guava-testlib:20.0",
     "hamcrest-all": "mvn:org.hamcrest:hamcrest-all:1.3",
     "hk2-api": "mvn:org.glassfish.hk2:hk2-api:2.5.0-b32",
     "hk2-locator": "mvn:org.glassfish.hk2:hk2-locator:2.5.0-b32",
@@ -172,7 +173,7 @@
     "catalyst-netty": "mvn:io.atomix.catalyst:catalyst-netty:1.2.1",
     "catalyst-transport": "mvn:io.atomix.catalyst:catalyst-transport:1.2.1",
     "objenesis": "mvn:org.objenesis:objenesis:2.2",
-    "openflowj": "mvn:org.onosproject:openflowj:0.9.8.onos",
+    "openflowj": "mvn:org.onosproject:openflowj:3.2.0.onos",
     "org.apache.felix.scr": "mvn:org.apache.felix:org.apache.felix.scr:1.8.2",
     "org.apache.felix.scr.annotations": "mvn:org.apache.felix:org.apache.felix.scr.annotations:1.9.12",
     "org.apache.karaf.features.core": "mvn:org.apache.karaf.features:org.apache.karaf.features.core:3.0.8",
diff --git a/lib/pom.xml b/lib/pom.xml
index e76a082..c7616bc 100644
--- a/lib/pom.xml
+++ b/lib/pom.xml
@@ -38,7 +38,7 @@
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <onos-build-conf.version>1.11.0-SNAPSHOT</onos-build-conf.version>
         <netty4.version>4.1.5.Final</netty4.version>
-        <openflowj.version>0.9.8.onos</openflowj.version>
+        <openflowj.version>3.2.0.onos-SNAPSHOT</openflowj.version>
         <onos-maven-plugin.version>1.10</onos-maven-plugin.version>
         <osgi.version>5.0.0</osgi.version>
         <karaf.version>3.0.8</karaf.version>
@@ -46,7 +46,7 @@
         <jetty.version>9.2.21.v20170120</jetty.version>
         <jackson.version>2.8.6</jackson.version>
         <slf4j.version>1.7.21</slf4j.version>
-        <guava.version>19.0</guava.version>
+        <guava.version>20.0</guava.version>
         <commons.io.version>2.4</commons.io.version>
         <!-- TODO argLine was originally added maven-surfire-plugin configuration
                   to fix locale errors for non-US developers. However, it breaks
diff --git a/protocols/openflow/api/src/main/java/org/onosproject/openflow/controller/ThirdPartyMessage.java b/protocols/openflow/api/src/main/java/org/onosproject/openflow/controller/ThirdPartyMessage.java
index afe2701..7cc5b5d 100644
--- a/protocols/openflow/api/src/main/java/org/onosproject/openflow/controller/ThirdPartyMessage.java
+++ b/protocols/openflow/api/src/main/java/org/onosproject/openflow/controller/ThirdPartyMessage.java
@@ -15,12 +15,15 @@
  */
 package org.onosproject.openflow.controller;
 
-import org.jboss.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
 import org.projectfloodlight.openflow.protocol.OFMessage;
 import org.projectfloodlight.openflow.protocol.OFType;
 import org.projectfloodlight.openflow.protocol.OFVersion;
 
 import com.google.common.hash.PrimitiveSink;
+
+import java.util.Arrays;
+
 /**
  * Used to support for the third party privacy flow rule.
  * it implements OFMessage interface to use exist adapter API.
@@ -61,11 +64,21 @@
     }
 
     @Override
-    public void writeTo(ChannelBuffer channelBuffer) {
+    public void writeTo(ByteBuf byteBuf) {
      // Do nothing here for now.
     }
 
     @Override
+    public boolean equalsIgnoreXid(Object obj) {
+        return Arrays.equals(payLoad, ((ThirdPartyMessage) obj).payLoad());
+    }
+
+    @Override
+    public int hashCodeIgnoreXid() {
+        return payLoad.hashCode();
+    }
+
+    @Override
     public Builder createBuilder() {
      // Do nothing here for now.
         return null;
diff --git a/protocols/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/OFMessageDecoder.java b/protocols/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/OFMessageDecoder.java
index 26f7221..c5cb9f7 100644
--- a/protocols/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/OFMessageDecoder.java
+++ b/protocols/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/OFMessageDecoder.java
@@ -17,6 +17,8 @@
 package org.onosproject.openflow.controller.impl;
 
 
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.jboss.netty.channel.Channel;
 import org.jboss.netty.channel.ChannelHandlerContext;
@@ -47,7 +49,15 @@
         // a list of the parsed messages to the controller.
         // The performance *may or may not* not be as good as before.
         OFMessageReader<OFMessage> reader = OFFactories.getGenericReader();
-        OFMessage message = reader.readFrom(buffer);
+
+        //toByteBuffer is optimized to avoid copying.
+        ByteBuf byteBuf = Unpooled.wrappedBuffer(buffer.toByteBuffer());
+        OFMessage message = reader.readFrom(byteBuf);
+
+        if (message != null) {
+            //set buffer's read index, as it has not been changed.
+            buffer.readerIndex(buffer.readerIndex() + byteBuf.readerIndex());
+        }
 
         return message;
     }
diff --git a/protocols/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/OFMessageEncoder.java b/protocols/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/OFMessageEncoder.java
index abb63f1..727301f 100644
--- a/protocols/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/OFMessageEncoder.java
+++ b/protocols/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/OFMessageEncoder.java
@@ -18,6 +18,8 @@
 
 import java.util.List;
 
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.jboss.netty.buffer.ChannelBuffers;
 import org.jboss.netty.channel.Channel;
@@ -46,13 +48,16 @@
             size += ofm.getLengthU();
         }*/
 
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        ByteBuf bb = Unpooled.buffer();
 
         for (OFMessage ofm : msglist) {
             if (ofm != null) {
-                ofm.writeTo(buf);
+                ofm.writeTo(bb);
             }
         }
+
+        ChannelBuffer buf = ChannelBuffers.wrappedBuffer(bb.nioBuffer());
+
         return buf;
     }
 
diff --git a/protocols/openflow/ctl/src/test/java/org/onosproject/openflow/OFDescStatsReplyAdapter.java b/protocols/openflow/ctl/src/test/java/org/onosproject/openflow/OFDescStatsReplyAdapter.java
index 564ca7b..c49acbb 100644
--- a/protocols/openflow/ctl/src/test/java/org/onosproject/openflow/OFDescStatsReplyAdapter.java
+++ b/protocols/openflow/ctl/src/test/java/org/onosproject/openflow/OFDescStatsReplyAdapter.java
@@ -17,7 +17,7 @@
 
 import java.util.Set;
 
-import org.jboss.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
 import org.projectfloodlight.openflow.protocol.OFDescStatsReply;
 import org.projectfloodlight.openflow.protocol.OFStatsReplyFlags;
 import org.projectfloodlight.openflow.protocol.OFStatsType;
@@ -81,11 +81,23 @@
     }
 
     @Override
-    public void writeTo(ChannelBuffer channelBuffer) {
+    public void writeTo(ByteBuf byteBuf) {
 
     }
 
     @Override
+    public boolean equalsIgnoreXid(Object obj) {
+     // Do nothing here for now
+        return true;
+    }
+
+    @Override
+    public int hashCodeIgnoreXid() {
+     // Do nothing here for now
+        return 0;
+    }
+
+    @Override
     public Builder createBuilder() {
         return null;
     }
diff --git a/protocols/openflow/ctl/src/test/java/org/onosproject/openflow/OfMessageAdapter.java b/protocols/openflow/ctl/src/test/java/org/onosproject/openflow/OfMessageAdapter.java
index 6c9ddde..f0737e5 100644
--- a/protocols/openflow/ctl/src/test/java/org/onosproject/openflow/OfMessageAdapter.java
+++ b/protocols/openflow/ctl/src/test/java/org/onosproject/openflow/OfMessageAdapter.java
@@ -15,7 +15,7 @@
  */
 package org.onosproject.openflow;
 
-import org.jboss.netty.buffer.ChannelBuffer;
+import io.netty.buffer.ByteBuf;
 import org.projectfloodlight.openflow.protocol.OFMessage;
 import org.projectfloodlight.openflow.protocol.OFType;
 import org.projectfloodlight.openflow.protocol.OFVersion;
@@ -50,7 +50,19 @@
     }
 
     @Override
-    public void writeTo(ChannelBuffer channelBuffer) { }
+    public void writeTo(ByteBuf byteBuf) { }
+
+    @Override
+    public boolean equalsIgnoreXid(Object obj) {
+     // Do nothing here for now
+        return true;
+    }
+
+    @Override
+    public int hashCodeIgnoreXid() {
+     // Do nothing here for now
+        return 0;
+    }
 
     @Override
     public Builder createBuilder() {
diff --git a/protocols/openflow/ctl/src/test/java/org/onosproject/openflow/controller/impl/OFMessageEncoderTest.java b/protocols/openflow/ctl/src/test/java/org/onosproject/openflow/controller/impl/OFMessageEncoderTest.java
index 43b5f3d..e62345c 100644
--- a/protocols/openflow/ctl/src/test/java/org/onosproject/openflow/controller/impl/OFMessageEncoderTest.java
+++ b/protocols/openflow/ctl/src/test/java/org/onosproject/openflow/controller/impl/OFMessageEncoderTest.java
@@ -18,6 +18,7 @@
 import java.nio.charset.StandardCharsets;
 import java.util.List;
 
+import io.netty.buffer.ByteBuf;
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.junit.Test;
 import org.onosproject.openflow.OfMessageAdapter;
@@ -45,9 +46,9 @@
         }
 
         @Override
-        public void writeTo(ChannelBuffer channelBuffer) {
+        public void writeTo(ByteBuf byteBuf) {
             String message = "message" + Integer.toString(id) + " ";
-            channelBuffer.writeBytes(message.getBytes(StandardCharsets.UTF_8));
+            byteBuf.writeBytes(message.getBytes(StandardCharsets.UTF_8));
         }
     }
 
diff --git a/providers/openflow/base/features.xml b/providers/openflow/base/features.xml
index f2af0c6..dc00bde 100644
--- a/providers/openflow/base/features.xml
+++ b/providers/openflow/base/features.xml
@@ -18,7 +18,7 @@
     <feature name="${project.artifactId}" version="${project.version}"
              description="${project.description}">
         <feature>onos-api</feature>
-        <bundle>mvn:org.onosproject/openflowj/0.9.7.onos</bundle>
+        <bundle>mvn:org.onosproject/openflowj/3.2.0.onos</bundle>
         <bundle>mvn:${project.groupId}/onos-of-api/${project.version}</bundle>
         <bundle>mvn:${project.groupId}/onos-of-ctl/${project.version}</bundle>
 
diff --git a/providers/openflow/device/src/main/java/org/onosproject/provider/of/device/impl/OpenFlowDeviceProvider.java b/providers/openflow/device/src/main/java/org/onosproject/provider/of/device/impl/OpenFlowDeviceProvider.java
index f9858a4..5e0fae4 100644
--- a/providers/openflow/device/src/main/java/org/onosproject/provider/of/device/impl/OpenFlowDeviceProvider.java
+++ b/providers/openflow/device/src/main/java/org/onosproject/provider/of/device/impl/OpenFlowDeviceProvider.java
@@ -110,6 +110,7 @@
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.Dictionary;
+import java.util.EnumSet;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -364,12 +365,14 @@
         OFPortMod.Builder pmb = sw.factory().buildPortMod();
         OFPort port = OFPort.of((int) portNumber.toLong());
         pmb.setPortNo(port);
-        if (enable) {
-            pmb.setConfig(0x0); // port_down bit 0
-        } else {
-            pmb.setConfig(0x1); // port_down bit 1
+        Set<OFPortConfig> portConfig = EnumSet.noneOf(OFPortConfig.class);
+        if (!enable) {
+            portConfig.add(OFPortConfig.PORT_DOWN);
         }
-        pmb.setMask(0x1);
+        pmb.setConfig(portConfig);
+        Set<OFPortConfig> portMask = EnumSet.noneOf(OFPortConfig.class);
+        portMask.add(OFPortConfig.PORT_DOWN);
+        pmb.setMask(portMask);
         pmb.setAdvertise(0x0);
         for (OFPortDesc pd : sw.getPorts()) {
             if (pd.getPortNo().equals(port)) {
diff --git a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/util/FlowEntryBuilder.java b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/util/FlowEntryBuilder.java
index 5c245a8..9fa03be 100644
--- a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/util/FlowEntryBuilder.java
+++ b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/util/FlowEntryBuilder.java
@@ -208,7 +208,7 @@
                             .withPriority(removed.getPriority())
                             .withIdleTimeout(removed.getIdleTimeout())
                             .withCookie(removed.getCookie().getValue())
-                            .withReason(FlowRule.FlowRemoveReason.parseShort(removed.getReason()));
+                            .withReason(FlowRule.FlowRemoveReason.parseShort((short) removed.getReason().ordinal()));
 
                     if (removed.getVersion() != OFVersion.OF_10) {
                         builder.forTable(removed.getTableId().getValue());
diff --git a/providers/openflow/meter/src/main/java/org/onosproject/provider/of/meter/impl/MeterModBuilder.java b/providers/openflow/meter/src/main/java/org/onosproject/provider/of/meter/impl/MeterModBuilder.java
index 406337b..a26e05a 100644
--- a/providers/openflow/meter/src/main/java/org/onosproject/provider/of/meter/impl/MeterModBuilder.java
+++ b/providers/openflow/meter/src/main/java/org/onosproject/provider/of/meter/impl/MeterModBuilder.java
@@ -28,8 +28,10 @@
 import org.slf4j.Logger;
 
 import java.util.Collection;
+import java.util.EnumSet;
 import java.util.List;
 import java.util.Objects;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 import static com.google.common.base.Preconditions.checkArgument;
@@ -82,37 +84,36 @@
     public OFMeterMod add() {
         validate();
         OFMeterMod.Builder builder = builderMeterMod();
-        builder.setCommand(OFMeterModCommand.ADD.ordinal());
+        builder.setCommand(OFMeterModCommand.ADD);
         return builder.build();
     }
 
     public OFMeterMod remove() {
         validate();
         OFMeterMod.Builder builder = builderMeterMod();
-        builder.setCommand(OFMeterModCommand.DELETE.ordinal());
+        builder.setCommand(OFMeterModCommand.DELETE);
         return builder.build();
     }
 
     public OFMeterMod modify() {
         validate();
         OFMeterMod.Builder builder = builderMeterMod();
-        builder.setCommand(OFMeterModCommand.MODIFY.ordinal());
+        builder.setCommand(OFMeterModCommand.MODIFY);
         return builder.build();
     }
 
     private OFMeterMod.Builder builderMeterMod() {
         OFMeterMod.Builder builder = factory.buildMeterMod();
-        int flags = 0;
+        Set<OFMeterFlags> flags = EnumSet.noneOf(OFMeterFlags.class);
         if (burst) {
-            // covering loxi short comings.
-            flags |= 1 << OFMeterFlags.BURST.ordinal();
+            flags.add(OFMeterFlags.BURST);
         }
         switch (unit) {
             case PKTS_PER_SEC:
-                flags |= 1 << OFMeterFlags.PKTPS.ordinal();
+                flags.add(OFMeterFlags.PKTPS);
                 break;
             case KB_PER_SEC:
-                flags |= 1 << OFMeterFlags.KBPS.ordinal();
+                flags.add(OFMeterFlags.KBPS);
                 break;
             default:
                 log.warn("Unknown unit type {}", unit);
diff --git a/tools/package/maven-plugin/pom.xml b/tools/package/maven-plugin/pom.xml
index 2d36c86..8d3758d 100644
--- a/tools/package/maven-plugin/pom.xml
+++ b/tools/package/maven-plugin/pom.xml
@@ -54,7 +54,7 @@
         <dependency>
             <groupId>com.google.guava</groupId>
             <artifactId>guava</artifactId>
-            <version>19.0</version>
+            <version>20.0</version>
         </dependency>
 
         <dependency>