blob: 9f9f12302e050f161491c601909b31aafdaf4244 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2014 Ericsson
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License 2.0 which
* accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Vincent Perot - Initial API and implementation
*******************************************************************************/
package org.eclipse.tracecompass.internal.pcap.core.protocol;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* Enumeration used for describing the different known protocols.
*
* @author Vincent Perot
*/
public enum PcapProtocol {
// Layer 0
/**
* The Pcap Protocol is not a real protocol but is used as an helper to
* generate Pcap packets.
*/
PCAP("Packet Capture", "pcap", Layer.LAYER_0, false), //$NON-NLS-1$ //$NON-NLS-2$
// Layer 1
// Should always be empty.
// Layer 2
/**
* The description of the Ethernet II Protocol.
*/
ETHERNET_II("Ethernet II", "eth", Layer.LAYER_2, true), //$NON-NLS-1$ //$NON-NLS-2$
// Layer 3
/**
* The description of the Internet Protocol Version 4.
*/
IPV4("Internet Protocol Version 4", "ipv4", Layer.LAYER_3, true), //$NON-NLS-1$ //$NON-NLS-2$
// Layer 4
/**
* The description of the Transmission Control Protocol.
*/
TCP("Transmission Control Protocol", "tcp", Layer.LAYER_4, true), //$NON-NLS-1$ //$NON-NLS-2$
/**
* The description of the User Datagram Protocol.
*/
UDP("User Datagram Protocol", "udp", Layer.LAYER_4, true), //$NON-NLS-1$ //$NON-NLS-2$
// Layer 5
// Layer 6
// Layer 7
/**
* This protocol is used as an helper if the protocol of a packet is not
* recognized. Since all its data goes into payload, it can also be seen as
* a "payload packet". This is considered to be on layer 7 since its always
* the most encapsulated packet if present.
*/
UNKNOWN("Payload", "???", Layer.LAYER_7, false); //$NON-NLS-1$ //$NON-NLS-2$
/**
* Enum that lists constants related to protocols/layers.
*
* See http://en.wikipedia.org/wiki/OSI_model#Description_of_OSI_layers.
*
* @author Vincent Perot
*/
public static enum Layer {
/**
* Layer 0. This layer is not an OSI layer but is used as an helper to store
* the pseudo-protocol PCAP.
*/
LAYER_0,
/** Layer 1 of the OSI model */
LAYER_1,
/** Layer 2 of the OSI model */
LAYER_2,
/** Layer 3 of the OSI model */
LAYER_3,
/** Layer 4 of the OSI model */
LAYER_4,
/** Layer 5 of the OSI model */
LAYER_5,
/** Layer 6 of the OSI model */
LAYER_6,
/** Layer 7 of the OSI model */
LAYER_7;
}
// Fields
private final String fName;
private final String fShortName;
private final Layer fLayer;
private final boolean fSupportsStream;
private PcapProtocol(String name, String shortName, Layer layer, boolean supportsStream) {
fName = name;
fShortName = shortName;
fLayer = layer;
fSupportsStream = supportsStream;
}
/**
* Getter method for the long name of the protocol.
*
* @return The long name of the protocol, as a string.
*/
public String getName() {
return fName;
}
/**
* Getter method for the short name of the protocol.
*
* @return The short name of the protocol, as a string.
*/
public String getShortName() {
return fShortName;
}
/**
* Getter method for the OSI layer of the protocol.
*
* @return The layer of the protocol.
*/
public Layer getLayer() {
return fLayer;
}
/**
* Getter method that indicates if the protocol supports streams.
*
* @return Whether the protocol supports streams or not.
*/
public boolean supportsStream() {
return fSupportsStream;
}
// TODO make an immutable list that holds this data instead of computing it
// everytime.
/**
* Method that returns a list of all the protocols included in a certain OSI
* layer.
*
* @param layer
* The layer of the protocols.
* @return The protocols on that layer.
*/
public static Collection<PcapProtocol> getProtocolsOnLayer(Layer layer) {
List<PcapProtocol> protocolsOnLayer = new ArrayList<>();
for (PcapProtocol p : PcapProtocol.values()) {
if (p.getLayer() == layer) {
protocolsOnLayer.add(p);
}
}
return protocolsOnLayer;
}
}