blob: 7573ae896d530bbc11428c8f640f43ba9e394e58 [file] [log] [blame]
/*
* 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, org.onlab.packet.ARP.deserializer()),
RARP(0x8035, "rarp", null, org.onlab.packet.ARP.deserializer()),
IPV4(0x800, "ipv4", IPv4.class, org.onlab.packet.IPv4.deserializer()),
IPV6(0x86dd, "ipv6", IPv6.class, org.onlab.packet.IPv6.deserializer()),
LLDP(0x88cc, "lldp", LLDP.class, org.onlab.packet.LLDP.deserializer()),
VLAN(0x8100, "vlan", null, null),
BDDP(0x8942, "bddp", LLDP.class, org.onlab.packet.LLDP.deserializer()),
MPLS_UNICAST(0x8847, "mpls_unicast", null, org.onlab.packet.MPLS.deserializer()),
MPLS_MULTICAST(0x8848, "mpls_unicast", null, org.onlab.packet.MPLS.deserializer());
private final Class clazz;
private EthType ethType;
private String type;
private Deserializer<?> deserializer;
EtherType(int ethType, String type, Class clazz, Deserializer deserializer) {
this.ethType = new EthType(ethType);
this.type = type;
this.clazz = clazz;
this.deserializer = deserializer;
}
public EthType ethType() {
return ethType;
}
@Override
public String toString() {
return type;
}
public Class clazz() {
return clazz;
}
public Deserializer<?> deserializer() {
return deserializer;
}
}
}