All Downloads are FREE. Search and download functionalities are using the official Maven repository.

src.com.ibm.as400.util.commtrace.TCPHeader Maven / Gradle / Ivy

There is a newer version: 11.1
Show newest version
///////////////////////////////////////////////////////////////////////////////
//                                                                             
// JTOpen (IBM Toolbox for Java - OSS version)                                 
//                                                                             
// Filename: TCPHeader.java
//                                                                             
// The source code contained herein is licensed under the IBM Public License   
// Version 1.0, which has been approved by the Open Source Initiative.         
// Copyright (C) 2002 International Business Machines Corporation and     
// others. All rights reserved.                                                
//                                                                             
///////////////////////////////////////////////////////////////////////////////

package com.ibm.as400.util.commtrace;

import java.util.Properties;
import com.ibm.as400.access.Trace;

/**
 * A TCP Header.
* Extends Header's methods to parse, print, and allow easy access to the TCP Header. */ public class TCPHeader extends Header { private Field sourceport= new Dec(rawheader.slice(0, 16)); private Field destport= new Dec(rawheader.slice(16, 16)); private Field sequence= new Dec(rawheader.slice(32, 32)); private Field sequencehex= new Hex(rawheader.slice(32, 32)); private Field acknum= new Dec(rawheader.slice(64, 32)); private Field acknumhex= new Hex(rawheader.slice(64, 32)); private Field dataoffset= new Dec(rawheader.slice(96, 4)); private Field cwr= new Flag(rawheader.slice(104, 1), CWR, ""); private Field ece= new Flag(rawheader.slice(105, 1), ECE, ""); private Field urg= new Flag(rawheader.slice(106, 1), URG, ""); private Field ack= new Flag(rawheader.slice(107, 1), ACK, ""); private Field psh= new Flag(rawheader.slice(108, 1), PSH, ""); private Field rst= new Flag(rawheader.slice(109, 1), RST, ""); private Field syn= new Flag(rawheader.slice(110, 1), SYN, ""); private Field fin= new Flag(rawheader.slice(111, 1), FIN, ""); private Field window= new Dec(rawheader.slice(112, 16)); private Field checksum= new Hex(rawheader.slice(128, 16)); private Field urgentptr= new Dec(rawheader.slice(144, 16)); private Field options= new Hex( rawheader.slice(160, ((Integer.parseInt(dataoffset.toString()) * 8) - 40))); private Field option= new Dec(rawheader.slice(160, 8)); private Field msssize= new Dec(rawheader.slice(168, 8)); private Field segmentsize= new Dec(rawheader.slice(176, ((Integer.parseInt(msssize.toString()) * 8) / 2))); private final static String CLASS="TCPHeader"; private final static String CWR= "CWR "; private final static String ECE= "ECE "; private final static String URG= "URG "; private final static String ACK= "ACK "; private final static String PSH= "PSH "; private final static String RST= "RST "; private final static String SYN= "SYN "; private final static String FIN= "FIN "; private final static String UNASSIGNED= "Unassigned"; private final static String MSS= "MSS="; private final static String NOOP= "NO OP"; private final static String ENDOP= "END OP"; private final static String BADOP= "BAD OP"; private final static String NONE= "NONE"; private final static String TCPSTR= "TCP"; private final static String SRC= "SrcPort"; private final static String DST= "DstPort"; private final static String SEQ= "SeqNum"; private final static String ACKNUM= "AckNum"; private final static String FLAGS= "Flags"; private final static String DATAOFF= "DataOffset"; private final static String CHKSUM= "Checksum"; private final static String WINSIZE= "Window Size"; private final static String TCPOPT= "TCP Options"; /** * Creates and parses the data of this header * @param data The raw data of this header */ TCPHeader(BitBuf data) { super(data); type= TCP; } /** * Returns the length of this header. * @return The length of this header. */ public int getHeaderLen() { return rawheader.slice(96, 4).toInt() * 32; } /** * Returns a printable representation of this header. * @param filter FormatProperties object for filtering this header. * @return Returns a string representation of this header. */ public String toString(FormatProperties filter) { String portname= (String) Port.get(this.sourceport.toString()); String portname2= (String) Port.get(this.destport.toString()); // Make sure we have enough data to parse a full header if (rawheader.getBitSize() < getHeaderLen()) { return (new Data(rawheader)).toString(); } // Check for Port filtering if (filter!=null) { // If filter is enabled boolean print= false; String port= filter.getPort(); if (port == null) { print= true; // The filtering doesn't apply to this header } else if ( port.equals(sourceport.toString()) || port.equals(destport.toString())) { print= true; } if (!print) { // Don't print the packet if (Trace.isTraceOn() && Trace.isTraceInformationOn()) { Trace.log(Trace.INFORMATION,CLASS + ".toString()" + "Not printing record"); } return ""; // Return empty record because it didn't pass the filter } } // If we couldn't find the port name, set it to Unassigned if (portname == null) { portname= UNASSIGNED; } if (portname2 == null) { portname2= UNASSIGNED; } String sourceport= this.sourceport.toString() + ", " + portname; String destport= this.destport.toString() + ", " + portname2; Object[] args= { sourceport, destport, acknum, acknumhex, sequence, sequencehex, dataoffset, cwr, ece, urg, ack, psh, rst, syn, fin, window, checksum, options, segmentsize }; if (Integer.parseInt(dataoffset.toString()) > 0x05) { switch (Integer.parseInt(option.toString())) { case 2 : args[17]= MSS; break; case 1 : args[18]= ""; args[17]= NOOP; break; case 0 : args[18]= ""; args[17]= ENDOP; break; default : args[18]= ""; args[17]= BADOP; break; } } else { args[18]= ""; args[17]= NONE; // 2 = MSS, 1 = NO OP, 0 = END OP } return Formatter.jsprintf( "\t " + TCPSTR + " . . . . : " + SRC + ": {0,18,L} " + DST + ": {1,18,L}\n" + "\t\t\t " + SEQ + ": {4,10,L} " + ACKNUM + ": {2,10,L} {3,10,L} {5,10,L} " + FLAGS + ": {7}{8}{9}{10}{11}{12}{13}{14}\n" + "\t\t\t " + DATAOFF + ": {7,2,L} " + CHKSUM + ": {16} " + WINSIZE + ": {15,5,L} " + TCPOPT + ": {17,5,L} {18,6,L}\n", args) + printHexHeader() + printnext(filter) + (new Data(rawpayload)).toString(); } /** * Returns the source port for this TCP header. * @return String containing a decimal representation of the source port. */ public String getSrcPort() { return sourceport.toString(); } /** * Returns the destination port for this TCP header. * @return String containing a decimal representation of the destination port. */ public String getDstPort() { return destport.toString(); } /** * Returns the sequence for this TCP header. * @return String containing a decimal representation of the sequence. */ public String getSequence() { return sequence.toString(); } /** * Returns the ack number for this TCP header. * @return String containing a decimal representation of the ack number. */ public String getAckNum() { return acknum.toString(); } /** * Returns the data offset for this TCP header. * @return String containing a decimal representation of the data offset. */ public String getDataOffset() { return dataoffset.toString(); } /** * Returns the cwr Flag for this TCP header. * @return String if the field is a 1 this string will contain "CWR " otherwise it will be an empty string. */ public String getCWRFlag() { return cwr.toString(); } /** * Returns the ece Flag for this TCP header. * @return String if the field is a 1 this string will contain "ECE " otherwise it will be an empty string. */ public String getECEFlag() { return ece.toString(); } /** * Returns the urg Flag for this TCP header. * @return String if the field is a 1 this string will contain "URG " otherwise it will be an empty string. */ public String getURGFlag() { return urg.toString(); } /** * Returns the ack Flag for this TCP header. * @return String if the field is a 1 this string will contain "ACK " otherwise it will be an empty string. */ public String getACKFlag() { return ack.toString(); } /** * Returns the psh Flag for this TCP header. * @return String if the field is a 1 this string will contain "PSH " otherwise it will be an empty string. */ public String getPSHFlag() { return psh.toString(); } /** * Returns the rst Flag for this TCP header. * @return String if the field is a 1 this string will contain "RST " otherwise it will be an empty string. */ public String getRSTFlag() { return rst.toString(); } /** * Returns the syn Flag for this TCP header. * @return String if the field is a 1 this string will contain "SYN " otherwise it will be an empty string. */ public String getSYNFlag() { return syn.toString(); } /** * Returns the fin Flag for this TCP header. * @return String if the field is a 1 this string will contain "FIN " otherwise it will be an empty string. */ public String getFINFlag() { return fin.toString(); } /** * Returns the window for this TCP header. * @return String containing a decimal representation of the window. */ public String getWindow() { return window.toString(); } /** * Returns the checksum for this TCP header. * @return String containing a decimal representation of the checksum. */ public String getCheckSum() { return (new Dec(checksum.getData())).toString(); } /** * Returns the urgent pointer for this TCP header. * @return String containing a decimal representation of the urgent pointer. */ public String getUrgentPointer() { return urgentptr.toString(); } /** * Returns the options for this TCP header. * @return String containing a decimal representation of the options. */ public String getOptions() { return (new Dec(options.getData())).toString(); } /** * Returns the first 8 bits of the options for this TCP header. * @return String containing a decimal representation of the options. */ public String getOption() { return options.toString(); } /** * Returns the Maximum Segment Size option for this TCP header. * @return String containing a decimal representation of the Maximum Segment Size option. */ public String getMaximumSegmentSize() { return msssize.toString(); } /** * Returns the Segment Size option for this TCP header. * @return String containing a decimal representation of the Segment Size option. */ public String getSegmentSize() { return segmentsize.toString(); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy