124 lines
2.6 KiB
Java
124 lines
2.6 KiB
Java
package nachos.network;
|
|
|
|
import nachos.machine.*;
|
|
import nachos.threads.*;
|
|
import nachos.userprog.*;
|
|
import nachos.vm.*;
|
|
import nachos.network.*;
|
|
|
|
/**
|
|
* A kernel with network support.
|
|
*/
|
|
public class NetKernel extends VMKernel {
|
|
/**
|
|
* Allocate a new networking kernel.
|
|
*/
|
|
public NetKernel() {
|
|
super();
|
|
}
|
|
|
|
/**
|
|
* Initialize this kernel.
|
|
*/
|
|
public void initialize(String[] args) {
|
|
super.initialize(args);
|
|
|
|
postOffice = new PostOffice();
|
|
}
|
|
|
|
/**
|
|
* Test the network. Create a server thread that listens for pings on port
|
|
* 1 and sends replies. Then ping one or two hosts. Note that this test
|
|
* assumes that the network is reliable (i.e. that the network's
|
|
* reliability is 1.0).
|
|
*/
|
|
public void selfTest() {
|
|
super.selfTest();
|
|
|
|
KThread serverThread = new KThread(new Runnable() {
|
|
public void run() { pingServer(); }
|
|
});
|
|
|
|
serverThread.fork();
|
|
|
|
System.out.println("Press any key to start the network test...");
|
|
console.readByte(true);
|
|
|
|
int local = Machine.networkLink().getLinkAddress();
|
|
|
|
// ping this machine first
|
|
ping(local);
|
|
|
|
// if we're 0 or 1, ping the opposite
|
|
if (local <= 1)
|
|
ping(1-local);
|
|
}
|
|
|
|
private void ping(int dstLink) {
|
|
int srcLink = Machine.networkLink().getLinkAddress();
|
|
|
|
System.out.println("PING " + dstLink + " from " + srcLink);
|
|
|
|
long startTime = Machine.timer().getTime();
|
|
|
|
MailMessage ping;
|
|
|
|
try {
|
|
ping = new MailMessage(dstLink, 1,
|
|
Machine.networkLink().getLinkAddress(), 0,
|
|
new byte[0]);
|
|
}
|
|
catch (MalformedPacketException e) {
|
|
Lib.assertNotReached();
|
|
return;
|
|
}
|
|
|
|
postOffice.send(ping);
|
|
|
|
MailMessage ack = postOffice.receive(0);
|
|
|
|
long endTime = Machine.timer().getTime();
|
|
|
|
System.out.println("time=" + (endTime-startTime) + " ticks");
|
|
}
|
|
|
|
private void pingServer() {
|
|
while (true) {
|
|
MailMessage ping = postOffice.receive(1);
|
|
|
|
MailMessage ack;
|
|
|
|
try {
|
|
ack = new MailMessage(ping.packet.srcLink, ping.srcPort,
|
|
ping.packet.dstLink, ping.dstPort,
|
|
ping.contents);
|
|
}
|
|
catch (MalformedPacketException e) {
|
|
// should never happen...
|
|
continue;
|
|
}
|
|
|
|
postOffice.send(ack);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Start running user programs.
|
|
*/
|
|
public void run() {
|
|
super.run();
|
|
}
|
|
|
|
/**
|
|
* Terminate this kernel. Never returns.
|
|
*/
|
|
public void terminate() {
|
|
super.terminate();
|
|
}
|
|
|
|
private PostOffice postOffice;
|
|
|
|
// dummy variables to make javac smarter
|
|
private static NetProcess dummy1 = null;
|
|
}
|