p1/network/MailMessage.java

106 lines
3.4 KiB
Java

package nachos.network;
import nachos.machine.*;
/**
* A mail message. Includes a packet header, a mail header, and the actual
* payload.
*
* @see nachos.machine.Packet
*/
public class MailMessage {
/**
* Allocate a new mail message to be sent, using the specified parameters.
*
* @param dstLink the destination link address.
* @param dstPort the destination port.
* @param srcLink the source link address.
* @param srcPort the source port.
* @param contents the contents of the packet.
*/
public MailMessage(int dstLink, int dstPort, int srcLink, int srcPort,
byte[] contents) throws MalformedPacketException {
// make sure the paramters are valid
if (dstPort < 0 || dstPort >= portLimit ||
srcPort < 0 || srcPort >= portLimit ||
contents.length > maxContentsLength)
throw new MalformedPacketException();
this.dstPort = (byte) dstPort;
this.srcPort = (byte) srcPort;
this.contents = contents;
byte[] packetContents = new byte[headerLength + contents.length];
packetContents[0] = (byte) dstPort;
packetContents[1] = (byte) srcPort;
System.arraycopy(contents, 0, packetContents, headerLength,
contents.length);
packet = new Packet(dstLink, srcLink, packetContents);
}
/**
* Allocate a new mail message using the specified packet from the network.
*
* @param packet the packet containg the mail message.
*/
public MailMessage(Packet packet) throws MalformedPacketException {
this.packet = packet;
// make sure we have a valid header
if (packet.contents.length < headerLength ||
packet.contents[0] < 0 || packet.contents[0] >= portLimit ||
packet.contents[1] < 0 || packet.contents[1] >= portLimit)
throw new MalformedPacketException();
dstPort = packet.contents[0];
srcPort = packet.contents[1];
contents = new byte[packet.contents.length - headerLength];
System.arraycopy(packet.contents, headerLength, contents, 0,
contents.length);
}
/**
* Return a string representation of the message headers.
*/
public String toString() {
return "from (" + packet.srcLink + ":" + srcPort +
") to (" + packet.dstLink + ":" + dstPort +
"), " + contents.length + " bytes";
}
/** This message, as a packet that can be sent through a network link. */
public Packet packet;
/** The port used by this message on the destination machine. */
public int dstPort;
/** The port used by this message on the source machine. */
public int srcPort;
/** The contents of this message, excluding the mail message header. */
public byte[] contents;
/**
* The number of bytes in a mail header. The header is formatted as
* follows:
*
* <table>
* <tr><td>offset</td><td>size</td><td>value</td></tr>
* <tr><td>0</td><td>1</td><td>destination port</td></tr>
* <tr><td>1</td><td>1</td><td>source port</td></tr>
* </table>
*/
public static final int headerLength = 2;
/** Maximum payload (real data) that can be included in a single mesage. */
public static final int maxContentsLength =
Packet.maxContentsLength - headerLength;
/**
* The upper limit on mail ports. All ports fall between <tt>0</tt> and
* <tt>portLimit - 1</tt>.
*/
public static final int portLimit = 128;
}