/**
* Copyright 2007-2015, Kaazing Corporation. All rights reserved.
*
* 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.kaazing.k3po.pcap.converter.internal.packet;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
/**
* Packet class that encapsulates all the necessary info needed to identify filtered packets for the rupert script, and
* has the properties needed to generate the rupert script
*
*/
public class Packet {
// geninfo
private int packetNumber;
private int packetSize;
private Date timestamp;
private double timeInSecondsFromEpoch;
// private
private String SrcIpAddr = null;
private String destIpAddr = null;
// false until proven true
private boolean isTcp = false;
private boolean isUdp = false;
private boolean isIp = false;
private boolean isHttp = false;
private boolean isFragmented = false;
// tcp
private int tcpSrcPort;
private int tcpDestPort;
private int tcpStream;
private int tcpLen;
private int tcpRelativeSeqNum;
private int tcpNextRelativeSeqNum;
private int tcpPayloadStart;
private int tcpPayloadSize;
private byte[] tcpPayload;
private int tcpFlags;
// Convenience flags (can get all of them if useful)
private boolean tcpFlagsAck;
private boolean tcpFlagsSyn;
private boolean tcpFlagsReset;
private boolean tcpFlagsFin;
private long tcpSequenceNumber;
private long tcpAcknowledgementNumber;
public Packet() {
}
/* Getters and Setters */
public boolean isIp() {
return isIp;
}
public void setIp(boolean isIp) {
this.isIp = isIp;
}
public String getSrcIpAddr() {
return SrcIpAddr;
}
public void setSrcIpAddr(String ip) {
SrcIpAddr = ip;
}
public String getDestIpAddr() {
return destIpAddr;
}
public void setDestIpAddr(String destIp) {
this.destIpAddr = destIp;
}
public int getPacketSize() {
return packetSize;
}
public void setPacketSize(int packetSize) {
this.packetSize = packetSize;
}
public boolean isTcp() {
return isTcp;
}
public void setTcp(boolean isTcp) {
this.isTcp = isTcp;
}
public boolean isUdp() {
return isUdp;
}
public void setUdp(boolean isUdp) {
this.isUdp = isUdp;
}
public int getTcpSrcPort() {
return tcpSrcPort;
}
public void setTcpSrcPort(int tcpSrcPort) {
this.tcpSrcPort = tcpSrcPort;
}
public int getTcpDestPort() {
return tcpDestPort;
}
public void setTcpDestPort(int tcpDestPort) {
this.tcpDestPort = tcpDestPort;
}
public int getTcpStream() {
return tcpStream;
}
public void setTcpStream(int tcpStream) {
this.tcpStream = tcpStream;
}
public int getTcpLen() {
return tcpLen;
}
public void setTcpLen(int tcpLen) {
this.tcpLen = tcpLen;
}
public int getTcpPayloadStart() {
return tcpPayloadStart;
}
public void setTcpPayloadStart(int tcpPayloadStart) {
this.tcpPayloadStart = tcpPayloadStart;
}
public int getTcpPayloadSize() {
return tcpPayloadSize;
}
public void setTcpPayloadLength(int tcpPayloadSize) {
this.tcpPayloadSize = tcpPayloadSize;
}
public boolean isTcpFlagsAck() {
return tcpFlagsAck;
}
public void setTcpFlagsAck(boolean tcpFlagsAck) {
this.tcpFlagsAck = tcpFlagsAck;
}
public boolean isTcpFlagsSyn() {
return tcpFlagsSyn;
}
public void setTcpFlagsSyn(boolean tcpFlagsSyn) {
this.tcpFlagsSyn = tcpFlagsSyn;
}
public boolean isTcpFlagsFin() {
return tcpFlagsFin;
}
public void setTcpFlagsFin(boolean tcoFlagsFin) {
this.tcpFlagsFin = tcoFlagsFin;
}
public byte[] getTcpPayload() {
return tcpPayload;
}
public void setTcpPayload(byte[] bs) {
this.tcpPayload = bs;
}
public void setTimeStamp(Date date) {
this.timestamp = date;
}
public Date getTimeStamp() {
return timestamp;
}
public int getRelativeTcpSeqNum() {
return tcpRelativeSeqNum;
}
public void setRelativeTcpSeqNum(int tcpSeq) {
this.tcpRelativeSeqNum = tcpSeq;
}
public int getTcpFlags() {
return tcpFlags;
}
public void setTcpFlags(int tcpFlags) {
this.tcpFlags = tcpFlags;
}
public boolean isTcpFlagsReset() {
return tcpFlagsReset;
}
public void setTcpFlagsReset(boolean tcpFlagsReset) {
this.tcpFlagsReset = tcpFlagsReset;
}
public int getTcpNextRelativeSeqNum() {
return tcpNextRelativeSeqNum;
}
public void setTcpNextRelativeSeqNum(int tcpNextSeq) {
this.tcpNextRelativeSeqNum = tcpNextSeq;
}
public int getDestPort() {
if(isTcp())
return getTcpDestPort();
throw new PacketFailureException("Asking for packet dest port when that has not been decoded, (ONLY TCP HAS BEEN IMPLEMENTED so far )");
}
public int getSrcPort() {
if(isTcp())
return getTcpSrcPort();
throw new PacketFailureException("Asking for packet src port when that has not been decoded, (ONLY TCP HAS BEEN IMPLEMENTED so far)");
}
public double getTimeInMicroSecondsFromEpoch() {
return timeInSecondsFromEpoch;
}
public void setTimeInSecondsFromEpoch(double timeInSecondsFromEpoch) {
this.timeInSecondsFromEpoch = timeInSecondsFromEpoch;
}
public long getTcpSequenceNumber() {
return tcpSequenceNumber;
}
public void setTcpSequenceNumber(long sequenceNumber) {
this.tcpSequenceNumber = sequenceNumber;
}
public void setTcpSequenceNumber(String hexNumber) {
this.tcpSequenceNumber = Long.parseLong(hexNumber, 16);
}
public long getTcpAcknowledgementNumber() {
return tcpAcknowledgementNumber;
}
public void setTcpAcknowledgementNumber(long acknowledgementNumber) {
this.tcpAcknowledgementNumber = acknowledgementNumber;
}
public void setTcpAcknowledgementNumber(String hexNumber) {
this.tcpAcknowledgementNumber = Long.parseLong(hexNumber, 16);
}
public int getPacketNumber() {
return packetNumber;
}
public void setPacketNumber(int packetNumber) {
this.packetNumber = packetNumber;
}
//HTTP
private RequestType requestType;
private LinkedList<HttpField> listOfHttpFields = new LinkedList<>();
private String requestURI;
public RequestType getHttpRequestType() {
return requestType;
}
public void setHttpRequestType(RequestType requestType) {
this.requestType = requestType;
}
public LinkedList<HttpField> getListOfHttpFields() {
return listOfHttpFields;
}
public void setListOfFields(LinkedList<HttpField> listOfFields) {
this.listOfHttpFields = listOfFields;
}
public void addHttpField(String name, String value, int pos, int size){
listOfHttpFields.add(new HttpField(name, value, pos, size));
}
public String getHttpRequestURI() {
return requestURI;
}
public void setHttpRequestURI(String requestURI) {
this.requestURI = requestURI;
}
public boolean isHttp() {
return isHttp;
}
public void setHttp(boolean isHttp) {
this.isHttp = isHttp;
}
public boolean isFragmented() {
return isFragmented;
}
public void setFragmented(boolean isFragmented) {
this.isFragmented = isFragmented;
}
public enum RequestType {
GET, POST, HEAD, OPTIONS, PUT, DELETE, TRACE, CONNECT
}
public class HttpField{
int pos;
int size;
String value;
String name;
public HttpField(String name, String value, int pos, int size) {
super();
this.pos = pos;
this.size = size;
this.value = value;
this.name = name;
}
public int getPos() {
return pos;
}
public void setPos(int pos) {
this.pos = pos;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public Map<Integer, Integer> getHttpFieldPositionsAndSize(){
Map<Integer, Integer> posAndSize = new HashMap<>();
for(HttpField iter: listOfHttpFields){
if(!posAndSize.containsKey(iter.getPos())){
posAndSize.put(iter.getPos(), iter.getSize());
}
}
return posAndSize;
}
}