Dear all,
 I'd like to enhance the JICMP library in a manner that you can also set the 
packet size. 

 This is very important on MPLS network where the mtu size is fixed and can be 
tested using ping.
 
 Just taken a look at the code and it seems that actually we have a 56 byte 
fixed size packet.

  
 Here is the relevant code in ICMPEchoPacket


 /**
     * Unique named padding that is placed in front of the incremental padding.
     */
    private static final byte NAMED_PAD[] = { (byte) 'O', (byte) 'p', (byte) 
'e', (byte) 'n', (byte) 'N', (byte) 'M', (byte) 'S', (byte) '!' };

    /**
     * Timestamp when packet was sent
     */
    private long m_sent;

    /**
     * Timestamp of when packet was received.
     */
    private long m_recv;

    /**
     * The thread id of the sender. Effective key for the packet.
     */
    private long m_tid; // thread id

    /**
     * Padding used to make the packet conform to the defacto unix ping program
     * (56 bytes).
     */
    private byte[] m_pad;

  /**
     * The ping rtt (microseconds)
     */
    private long m_rtt;

    /**
     * This is the amount of padding required to make the ICMP echo request 56
     * bytes in length. This is just following the available code for ping ;)
     */
    private static final int PAD_SIZE = 16;




And when you construct the packet....


    /**
     * Creates a new discovery ping packet that can be sent to a remote protocol
     * stack. The ICMP type is set to an Echo Request. The next sequence in the
     * ICMPHeader base class is set and the sent time is set to the current
     * time.
     * 
     * @param tid
     *            The thread id for the packet.
     * 
     * @see java.lang.System#currentTimeMillis
     */
    public ICMPEchoPacket(long tid) {
        super(ICMPHeader.TYPE_ECHO_REQUEST, (byte) 0);
        setNextSequenceId();

        m_rtt = 0;
        m_sent = 0;
        m_recv = 0;
        m_tid = tid;

        m_pad = new byte[PAD_SIZE];
        for (int x = 0; x < NAMED_PAD.length && x < PAD_SIZE; x++)
            m_pad[x] = NAMED_PAD[x];
        for (int x = NAMED_PAD.length; x < PAD_SIZE; x++)
            m_pad[x] = (byte) x;

    }


Now if we add a new constructor we can also set the pad_size so that we can set 
the packet size:


    public ICMPEchoPacket(long tid, int pad_size) {
        super(ICMPHeader.TYPE_ECHO_REQUEST, (byte) 0);
        setNextSequenceId();

        m_rtt = 0;
        m_sent = 0;
        m_recv = 0;
        m_tid = tid;

        m_pad = new byte[pad_size];
        for (int x = 0; x < NAMED_PAD.length && x < pad_size; x++)
            m_pad[x] = NAMED_PAD[x];
        for (int x = NAMED_PAD.length; x < pad_size; x++)
            m_pad[x] = (byte) x;

    }


We can have packet of any size.

We can just add t MAX_PAD_SIZE to prevent creating arbitrary size ICMP row 
packets.

Any suggestion?

Antonio


------------------------------------------------------------------------------
Learn Windows Azure Live!  Tuesday, Dec 13, 2011
Microsoft is holding a special Learn Windows Azure training event for 
developers. It will provide a great way to learn Windows Azure and what it 
provides. You can attend the event by watching it streamed LIVE online.  
Learn more at http://p.sf.net/sfu/ms-windowsazure
_______________________________________________
Please read the OpenNMS Mailing List FAQ:
http://www.opennms.org/index.php/Mailing_List_FAQ

opennms-devel mailing list

To *unsubscribe* or change your subscription options, see the bottom of this 
page:
https://lists.sourceforge.net/lists/listinfo/opennms-devel

Reply via email to