blob: d2dfec0f78a916a8850e9340d7ffc699110fffdf [file] [log] [blame]
/*
* Copyright 2015-present 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;
/**
* Representation of an Ethertype.
*/
public class EthType {
/**
* A list of known ethertypes. Adding a fully defined enum here will
* associated the ethertype with a textual representation and a parsing
* class.
*/
public enum EtherType {
ARP(0x806, "arp", org.onlab.packet.ARP.deserializer()),
RARP(0x8035, "rarp", org.onlab.packet.ARP.deserializer()),
IPV4(0x800, "ipv4", org.onlab.packet.IPv4.deserializer()),
IPV6(0x86dd, "ipv6", org.onlab.packet.IPv6.deserializer()),
LLDP(0x88cc, "lldp", org.onlab.packet.LLDP.deserializer()),
VLAN(0x8100, "vlan", null),
QINQ(0x88a8, "qinq", null),
BDDP(0x8942, "bddp", org.onlab.packet.LLDP.deserializer()),
MPLS_UNICAST(0x8847, "mpls_unicast", org.onlab.packet.MPLS.deserializer()),
MPLS_MULTICAST(0x8848, "mpls_unicast", org.onlab.packet.MPLS.deserializer()),
EAPOL(0x888e, "eapol", org.onlab.packet.EAPOL.deserializer()),
UNKNOWN(0, "unknown", null);
private final EthType etherType;
private final String type;
private final Deserializer<?> deserializer;
/**
* Constructs a new ethertype.
*
* @param ethType The actual ethertype
* @param type it's textual representation
* @param deserializer a parser for this ethertype
*/
EtherType(int ethType, String type, Deserializer<?> deserializer) {
this.etherType = new EthType(ethType);
this.type = type;
this.deserializer = deserializer;
}
public EthType ethType() {
return etherType;
}
@Override
public String toString() {
return type;
}
public Deserializer<?> deserializer() {
return deserializer;
}
public static EtherType lookup(short etherType) {
for (EtherType ethType : EtherType.values()) {
if (ethType.ethType().toShort() == etherType) {
return ethType;
}
}
return UNKNOWN;
}
}
private final short etherType;
/**
* Builds the EthType.
*
* @param etherType an integer representing an ethtype
*/
public EthType(int etherType) {
this.etherType = (short) (etherType & 0xFFFF);
}
/**
* Builds the EthType.
*
* @param etherType a short representing the ethtype
*/
public EthType(short etherType) {
this.etherType = etherType;
}
/**
* Returns the short value for this ethtype.
*
* @return a short value
*/
public short toShort() {
return etherType;
}
/**
* Looks up the ethertype by it's numerical representation
* and returns it's textual format.
*
* @param etherType the short value of the ethertype
* @return a textual representation
*/
public EtherType lookup(short etherType) {
for (EtherType ethType : EtherType.values()) {
if (ethType.ethType().toShort() == etherType) {
return ethType;
}
}
return null;
}
@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 ? String.format("0x%04x", etherType) :
ethType.toString());
}
}