package com.opensoc.pcap;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.commons.lang.StringUtils;
import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;
/**
* The Class PcapUtils.
*/
public class PcapUtils {
/** The Constant SESSION_KEY_SEPERATOR. */
private static final char SESSION_KEY_SEPERATOR = '-';
/** The Constant protocolIdToNameMap. */
private static final BiMap<Integer, String> protocolIdToNameMap = HashBiMap
.create();
// private static final Map<Integer, String> protocolIdToNameMap = new
// HashMap();
static {
protocolIdToNameMap.put(0, "HOPOPT");
protocolIdToNameMap.put(1, "ICMP");
protocolIdToNameMap.put(2, "IGMP");
protocolIdToNameMap.put(3, "GGP");
protocolIdToNameMap.put(4, "IPV4");
protocolIdToNameMap.put(5, "ST");
protocolIdToNameMap.put(6, "TCP");
protocolIdToNameMap.put(7, "CBT");
protocolIdToNameMap.put(8, "EGP");
protocolIdToNameMap.put(9, "IGP");
protocolIdToNameMap.put(10, "BBN-RCC-MON");
protocolIdToNameMap.put(11, "NVP-II");
protocolIdToNameMap.put(12, "PUP");
protocolIdToNameMap.put(13, "ARGUS");
protocolIdToNameMap.put(14, "EMCON");
protocolIdToNameMap.put(15, "XNET");
protocolIdToNameMap.put(16, "CHAOS");
protocolIdToNameMap.put(17, "UDP");
protocolIdToNameMap.put(18, "MUX");
protocolIdToNameMap.put(19, "DCN-MEAS");
protocolIdToNameMap.put(20, "HMP");
protocolIdToNameMap.put(21, "PRM");
protocolIdToNameMap.put(22, "XNS-IDP");
protocolIdToNameMap.put(23, "TRUNK-1");
protocolIdToNameMap.put(24, "TRUNK-2");
protocolIdToNameMap.put(25, "LEAF-1");
protocolIdToNameMap.put(26, "LEAF-2");
protocolIdToNameMap.put(27, "RDP");
protocolIdToNameMap.put(28, "IRTP");
protocolIdToNameMap.put(29, "ISO-TP4");
protocolIdToNameMap.put(30, "NETBLT");
protocolIdToNameMap.put(31, "MFE-NSP");
protocolIdToNameMap.put(32, "MERIT-INP");
protocolIdToNameMap.put(33, "DCCP");
protocolIdToNameMap.put(34, "3PC");
protocolIdToNameMap.put(35, "IDPR");
protocolIdToNameMap.put(36, "XTP");
protocolIdToNameMap.put(37, "DDP");
protocolIdToNameMap.put(38, "IDPR-CMTP");
protocolIdToNameMap.put(39, "TP++");
protocolIdToNameMap.put(40, "IL");
protocolIdToNameMap.put(41, "IPV6");
protocolIdToNameMap.put(42, "SDRP");
protocolIdToNameMap.put(43, "IPV6-ROUTE");
protocolIdToNameMap.put(44, "IPV6-FRAG");
protocolIdToNameMap.put(45, "IDRP");
protocolIdToNameMap.put(46, "RSVP");
protocolIdToNameMap.put(47, "GRE");
protocolIdToNameMap.put(48, "DSR");
protocolIdToNameMap.put(49, "BNA");
protocolIdToNameMap.put(50, "ESP");
protocolIdToNameMap.put(51, "AH");
protocolIdToNameMap.put(52, "I-NLSP");
protocolIdToNameMap.put(53, "SWIPE");
protocolIdToNameMap.put(54, "NARP");
protocolIdToNameMap.put(55, "MOBILE");
protocolIdToNameMap.put(56, "TLSP");
protocolIdToNameMap.put(57, "SKIP");
protocolIdToNameMap.put(58, "IPV6-ICMP");
protocolIdToNameMap.put(59, "IPV6-NONXT");
protocolIdToNameMap.put(60, "IPV6-OPTS");
protocolIdToNameMap.put(62, "CFTP");
protocolIdToNameMap.put(64, "SAT-EXPAK");
protocolIdToNameMap.put(65, "KRYPTOLAN");
protocolIdToNameMap.put(66, "RVD");
protocolIdToNameMap.put(67, "IPPC");
protocolIdToNameMap.put(69, "SAT-MON");
protocolIdToNameMap.put(70, "VISA");
protocolIdToNameMap.put(71, "IPCV");
protocolIdToNameMap.put(72, "CPNX");
protocolIdToNameMap.put(73, "CPHB");
protocolIdToNameMap.put(74, "WSN");
protocolIdToNameMap.put(75, "PVP");
protocolIdToNameMap.put(76, "BR-SAT-MON");
protocolIdToNameMap.put(77, "SUN-ND");
protocolIdToNameMap.put(78, "WB-MON");
protocolIdToNameMap.put(79, "WB-EXPAK");
protocolIdToNameMap.put(80, "ISO-IP");
protocolIdToNameMap.put(81, "VMTP");
protocolIdToNameMap.put(82, "SECURE-VMTP");
protocolIdToNameMap.put(83, "VINES");
protocolIdToNameMap.put(84, "TTP");
protocolIdToNameMap.put(85, "NSFNET-IGP");
protocolIdToNameMap.put(86, "DGP");
protocolIdToNameMap.put(87, "TCF");
protocolIdToNameMap.put(88, "EIGRP");
protocolIdToNameMap.put(89, "OSPFIGP");
protocolIdToNameMap.put(90, "SPRITE-RPC");
protocolIdToNameMap.put(91, "LARP");
protocolIdToNameMap.put(92, "MTP");
protocolIdToNameMap.put(93, "AX.25");
protocolIdToNameMap.put(94, "IPIP");
protocolIdToNameMap.put(95, "MICP");
protocolIdToNameMap.put(96, "SCC-SP");
protocolIdToNameMap.put(97, "ETHERIP");
protocolIdToNameMap.put(98, "ENCAP");
protocolIdToNameMap.put(100, "GMTP");
protocolIdToNameMap.put(101, "IFMP");
protocolIdToNameMap.put(102, "PNNI");
protocolIdToNameMap.put(103, "PIM");
protocolIdToNameMap.put(104, "ARIS");
protocolIdToNameMap.put(105, "SCPS");
protocolIdToNameMap.put(106, "QNX");
protocolIdToNameMap.put(107, "A/N");
protocolIdToNameMap.put(108, "IPCOMP");
protocolIdToNameMap.put(109, "SNP");
protocolIdToNameMap.put(110, "COMPAQ-PEER");
protocolIdToNameMap.put(111, "IPX-IN-IP");
protocolIdToNameMap.put(112, "VRRP");
protocolIdToNameMap.put(113, "PGM");
protocolIdToNameMap.put(115, "L2TP");
protocolIdToNameMap.put(116, "DDX");
protocolIdToNameMap.put(117, "IATP");
protocolIdToNameMap.put(118, "STP");
protocolIdToNameMap.put(119, "SRP");
protocolIdToNameMap.put(120, "UTI");
protocolIdToNameMap.put(121, "SMP");
protocolIdToNameMap.put(122, "SM");
protocolIdToNameMap.put(123, "PTP");
protocolIdToNameMap.put(124, "ISIS OVER IPV4");
protocolIdToNameMap.put(125, "FIRE");
protocolIdToNameMap.put(126, "CRTP");
protocolIdToNameMap.put(127, "CRUDP");
protocolIdToNameMap.put(128, "SSCOPMCE");
protocolIdToNameMap.put(129, "IPLT");
protocolIdToNameMap.put(130, "SPS");
protocolIdToNameMap.put(131, "PIPE");
protocolIdToNameMap.put(132, "SCTP");
protocolIdToNameMap.put(133, "FC");
protocolIdToNameMap.put(134, "RSVP-E2E-IGNORE");
protocolIdToNameMap.put(135, "MOBILITY HEADER");
protocolIdToNameMap.put(136, "UDPLITE");
protocolIdToNameMap.put(137, "MPLS-IN-IP");
protocolIdToNameMap.put(138, "MANET");
protocolIdToNameMap.put(139, "HIP");
protocolIdToNameMap.put(140, "SHIM6");
protocolIdToNameMap.put(141, "WESP");
protocolIdToNameMap.put(142, "ROHC");
}
/** The Constant protocolNameToIdMap. */
private static final BiMap<String, Integer> protocolNameToIdMap = protocolIdToNameMap
.inverse();
// private static final Map<String, Integer> protocolNameToIdMap =
// invertMap(protocolIdToNameMap);
/**
* Convert ipv4 ip to hex.
*
* @param ipAddress
* the ip address
* @return the string
*/
public static String convertIpv4IpToHex(String ipAddress) {
StringBuffer hexIp = new StringBuffer(64);
String[] ipSegments = ipAddress.split("\\.");
for (String ipSegment : ipSegments) {
hexIp.append(convertIpSegmentToHex(ipSegment));
}
return hexIp.toString();
}
/**
* Gets the session key.
*
* @param srcIp
* the src ip
* @param dstIp
* the dst ip
* @param protocol
* the protocol
* @param srcPort
* the src port
* @param dstPort
* the dst port
* @return the session key
*/
public static String getSessionKey(String srcIp, String dstIp,
String protocol, String srcPort, String dstPort) {
return getSessionKey(srcIp, dstIp, protocol, srcPort, dstPort, null, null);
}
/**
* Gets the session key.
*
* @param srcIp
* the src ip
* @param dstIp
* the dst ip
* @param protocol
* the protocol
* @param srcPort
* the src port
* @param dstPort
* the dst port
* @param ipId
* the ip id
* @param fragmentOffset
* the fragment offset
* @return the session key
*/
public static String getSessionKey(String srcIp, String dstIp,
String protocol, String srcPort, String dstPort, String ipId,
String fragmentOffset) {
StringBuffer sb = new StringBuffer(40);
sb.append(convertIpv4IpToHex(srcIp)).append(SESSION_KEY_SEPERATOR)
.append(convertIpv4IpToHex(dstIp)).append(SESSION_KEY_SEPERATOR)
.append(protocol == null ? "0" : protocol)
.append(SESSION_KEY_SEPERATOR).append(srcPort == null ? "0" : srcPort)
.append(SESSION_KEY_SEPERATOR).append(dstPort == null ? "0" : dstPort)
.append(SESSION_KEY_SEPERATOR).append(ipId == null ? "0" : ipId)
.append(SESSION_KEY_SEPERATOR)
.append(fragmentOffset == null ? "0" : fragmentOffset);
return sb.toString();
}
/**
* Gets the session key.
*
* @param srcIp
* the src ip
* @param dstIp
* the dst ip
* @param protocol
* the protocol
* @param srcPort
* the src port
* @param dstPort
* the dst port
* @param ipId
* the ip id
* @param fragmentOffset
* the fragment offset
* @return the session key
*/
public static String getSessionKey(String srcIp, String dstIp, int protocol,
int srcPort, int dstPort, int ipId, int fragmentOffset) {
String keySeperator = "-";
StringBuffer sb = new StringBuffer(40);
sb.append(convertIpv4IpToHex(srcIp)).append(keySeperator)
.append(convertIpv4IpToHex(dstIp)).append(keySeperator)
.append(protocol).append(keySeperator).append(srcPort)
.append(keySeperator).append(dstPort).append(keySeperator).append(ipId)
.append(keySeperator).append(fragmentOffset);
return sb.toString();
}
/**
* Gets the short session key. (5-tuple only)
*
* @param srcIp
* the src ip
* @param dstIp
* the dst ip
* @param protocol
* the protocol
* @param srcPort
* the src port
* @param dstPort
* the dst port
* @return the session key
*/
public static String getShortSessionKey(String srcIp, String dstIp, int protocol,
int srcPort, int dstPort) {
String keySeperator = "-";
StringBuffer sb = new StringBuffer(40);
sb.append(convertIpv4IpToHex(srcIp)).append(keySeperator)
.append(convertIpv4IpToHex(dstIp)).append(keySeperator)
.append(protocol).append(keySeperator).append(srcPort)
.append(keySeperator).append(dstPort);
return sb.toString();
}
// public static String convertPortToHex(String portNumber) {
// return convertPortToHex(Integer.valueOf(portNumber));
//
// }
//
// public static String convertPortToHex(int portNumber) {
// return convertToHex(portNumber, 4);
//
// }
//
// public static String convertProtocolToHex(String protocol) {
// return convertProtocolToHex(Integer.valueOf(protocol));
//
// }
//
// public static String convertProtocolToHex(int protocol) {
// return convertToHex(protocol, 2);
// }
/**
* Convert ip segment to hex.
*
* @param ipSegment
* the ip segment
* @return the string
*/
public static String convertIpSegmentToHex(String ipSegment) {
return convertIpSegmentToHex(Integer.valueOf(ipSegment));
}
/**
* Convert ip segment to hex.
*
* @param ipSegment
* the ip segment
* @return the string
*/
public static String convertIpSegmentToHex(int ipSegment) {
return convertToHex(ipSegment, 2);
}
/**
* Convert to hex.
*
* @param number
* the number
* @param length
* the length
* @return the string
*/
public static String convertToHex(int number, int length) {
return StringUtils.leftPad(Integer.toHexString(number), length, '0');
}
/**
* Gets the protocol name.
*
* @param protocolNumber
* the protocol number
*
* @return the protocol name
*/
public static String getProtocolNameFromId(int protocolNumber) {
String protocolName = protocolIdToNameMap.get(protocolNumber);
if (protocolName == null) {
protocolName = String.valueOf(protocolNumber);
}
return protocolName;
}
/**
* Gets the protocol id from name.
*
* @param protocolName
* the protocol name
* @return the protocol id from name
*/
public static int getProtocolIdFromName(String protocolName) {
Integer protocolNumber = protocolNameToIdMap
.get(protocolName.toUpperCase());
if (protocolNumber == null) {
protocolNumber = -1;
}
return protocolNumber;
}
/**
* Invert map.
*
* @param <V>
* the value type
* @param <K>
* the key type
* @param map
* the map
* @return the map
*/
private static <V, K> Map<V, K> invertMap(Map<K, V> map) {
Map<V, K> inv = new HashMap<V, K>();
for (Entry<K, V> entry : map.entrySet())
inv.put(entry.getValue(), entry.getKey());
return inv;
}
}