www.pudn.com > ejip.zip > Net.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.
*
*/
package ejip;
/**
* Net.java: starts device driver threads and polls for packets.
*
* Author: Martin Schoeberl (martin.schoeberl@chello.at)
*
* Changelog:
* 2002-03-15 ARP works!
* 2002-10-21 use Packet buffer, 4 bytes in one word
* 2002-11-11 runs in its own thread
*
*/
import util.*;
/**
* Start device driver threads and poll for packets.
*/
public class Net extends Thread {
private static int[] eth; // own ethernet address
private static int ip; // own ip address
/**
* The one and only reference to this object.
*/
private static Net single;
/**
* private because it's a singleton Thread.
*/
private Net() {
}
/**
* Allocate buffer and start driver thread(s).
*/
public static void init() {
if (single != null) return; // allready called init()
eth = new int[6];
eth[0] = 0x00;
eth[1] = 0xe0;
eth[2] = 0x98;
eth[3] = 0x33;
eth[4] = 0xb0;
eth[5] = 0xf7; // this is eth card for chello
eth[5] = 0xf8;
ip = (192<<24) + (168<<16) + (0<<8) + 4;
TcpIp.init();
//
// start device driver threads
//
// don't use CS8900 when simulating on PC
// CS8900.init(eth, ip);
// don't use PPP on my web server
// Ppp.init();
Slip.init();
//
// start my own thread
//
single = new Net();
single.start();
}
/**
* Look for received packets and call TcpIp.
* Mark them to be sent if returned with len!=0 from TcpIp layer.
*/
public void run() {
Packet p;
for (;;) {
// is a received packet in the pool?
p = Packet.getPacket(Packet.RCV, Packet.ALLOC);
if (p!=null) { // got one received Packet from pool
yield();
TcpIp.receive(p);
yield();
if (p.len!=0) {
// a VERY dummy arp/routing!
// should this be in the cs8900 ?
p.llh[0] = p.llh[3];
p.llh[1] = p.llh[4];
p.llh[2] = p.llh[5];
p.llh[6] = 0x0800;
p.setStatus(Packet.SND); // mark packet ready to send
} else {
p.setStatus(Packet.FREE); // mark packet free
}
}
// give a chance to Main thread for WD
try {
Thread.sleep(1);
} catch (Exception e) {};
}
}
}