www.pudn.com > ejip.zip > Packet.java


/* 
 * Copyright (c) Martin Schoeberl, martin@jopdesign.com 
 * All rights reserved. 
 * 
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions 
 * are met: 
 * 1. Redistributions of source code must retain the above copyright 
 *    notice, this list of conditions and the following disclaimer. 
 * 2. Redistributions in binary form must reproduce the above copyright 
 *    notice, this list of conditions and the following disclaimer in the 
 *    documentation and/or other materials provided with the distribution. 
 * 3. All advertising materials mentioning features or use of this software 
 *    must display the following acknowledgement: 
 *	This product includes software developed by Martin Schoeberl 
 * 
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
 * SUCH DAMAGE. 
 * 
 */ 
 
/* 
*   Changelog: 
*		2002-11-11	use LinkLayer info to mix Slip and Ethernet packets 
*/ 
 
package ejip; 
 
import util.*; 
 
/** 
*	Packet buffer handling for a minimalistic TCP/IP stack. 
* 
*/ 
public class Packet { 
 
	public final static int MAX = 1500;		// maximum Packet length in bytes 
	public final static int MAXW = 1500/4;	// maximum Packet length in word 
	public final static int MAXLLH = 7;		// 7 16 bit words for ethernet 
	private final static int CNT = 8;		// size of packet pool 
 
	/** place for link layer data */ 
	public int[] llh; 
	/** ip datagram */ 
	public int[] buf; 
	/** length in bytes */ 
	public int len; 
	/** usage of packet */ 
	private int status; 
	public final static int FREE = 0; 
	public final static int ALLOC = 1; 
	public final static int SND = 2; 
	public final static int RCV = 3; 
	/** interface source */ 
	private LinkLayer src; 
 
	//	no direct construction 
	private Packet() { 
		llh = new int[MAXLLH]; 
		buf = new int[MAXW]; 
		len = 0; 
		status = FREE; 
		src = null; 
	} 
 
	private static boolean initOk; 
	private static Packet[] packets; 
 
	public static void init() { 
 
		if (initOk) return; 
		initOk = true; 
		packets = new Packet[CNT]; 
		for (int i=0; i