adding EthType to secure handling ether types

this will also pretty print ethertypes in flow output

Change-Id: I9363070ad308f3c756735e29b3992c500e503636
diff --git a/utils/misc/src/main/java/org/onlab/packet/EthType.java b/utils/misc/src/main/java/org/onlab/packet/EthType.java
new file mode 100644
index 0000000..4f52b7d
--- /dev/null
+++ b/utils/misc/src/main/java/org/onlab/packet/EthType.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onlab.packet;
+
+import com.google.common.collect.Maps;
+
+import java.util.Map;
+
+/**
+ * Representation of an Ethertype.
+ */
+public class EthType {
+
+    public static final short ARP = EtherType.ARP.ethType.toShort();
+    public static final short RARP = EtherType.RARP.ethType.toShort();
+    public static final short VLAN = EtherType.VLAN.ethType.toShort();
+    public static final short IPV4 = EtherType.IPV4.ethType.toShort();
+    public static final short IPV6 = EtherType.IPV6.ethType.toShort();
+    public static final short LLDP = EtherType.LLDP.ethType.toShort();
+    public static final short BDDP = EtherType.BDDP.ethType.toShort();
+    public static final short MPLS_MULTICAST = EtherType.MPLS_UNICAST.ethType.toShort();
+    public static final short MPLS_UNICAST = EtherType.MPLS_UNICAST.ethType.toShort();
+
+    private short etherType;
+
+    /*
+     * Reverse-lookup map for getting a EtherType enum
+     */
+    private static final Map<Short, EtherType> LOOKUP = Maps.newHashMap();
+
+    static {
+        for (EtherType eth : EtherType.values()) {
+            LOOKUP.put(eth.ethType().toShort(), eth);
+        }
+    }
+
+    public EthType(int etherType) {
+        this.etherType = (short) (etherType & 0xFFFF);
+    }
+
+    public EthType(short etherType) {
+        this.etherType = etherType;
+    }
+
+    public short toShort() {
+        return etherType;
+    }
+
+    public static EtherType lookup(short etherType) {
+        return LOOKUP.get(etherType);
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+
+        EthType ethType = (EthType) o;
+
+        if (etherType != ethType.etherType) {
+            return false;
+        }
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        return (int) etherType;
+    }
+
+    public String toString() {
+        EtherType ethType = lookup(this.etherType);
+        return (ethType == null ? "unknown" : ethType.toString());
+    }
+
+    public static enum EtherType {
+
+        ARP(0x806, "arp", ARP.class),
+        RARP(0x8035, "rarp", null),
+        IPV4(0x800, "ipv4", IPv4.class),
+        IPV6(0x86dd, "ipv6", IPv6.class),
+        LLDP(0x88cc, "lldp", LLDP.class),
+        VLAN(0x8100, "vlan", null),
+        BDDP(0x8942, "bddp", LLDP.class),
+        MPLS_UNICAST(0x8847, "mpls_unicast", null),
+        MPLS_MULTICAST(0x8848, "mpls_unicast", null);
+
+
+        private final Class clazz;
+        private EthType ethType;
+        private String type;
+
+        EtherType(int ethType, String type, Class clazz) {
+            this.ethType = new EthType(ethType);
+            this.type = type;
+            this.clazz = clazz;
+        }
+
+        public EthType ethType() {
+            return ethType;
+        }
+
+        @Override
+        public String toString() {
+            return type;
+        }
+
+        public Class clazz() {
+            return clazz;
+        }
+
+
+    }
+}