OpenCores
URL https://opencores.org/ocsvn/fpga-cf/fpga-cf/trunk

Subversion Repositories fpga-cf

[/] [fpga-cf/] [trunk/] [java/] [src/] [edu/] [byu/] [cc/] [plieber/] [fpgaenet/] [fcp/] [FCPPacket.java] - Rev 2

Compare with Previous | Blame | View Log

/**
 * 
 */
package edu.byu.cc.plieber.fpgaenet.fcp;
 
import java.net.DatagramPacket;
import java.net.InetAddress;
 
/**
 * @author plieber
 * 
 */
public class FCPPacket {
	public InetAddress source;
	public InetAddress dest;
	public int srcPort;
	public int dstPort;
	public int version;
	public int command;
	public int port;
	public int seq;
	public int len;
	public byte[] data;
 
	/**
	 * Constructs an FCP packet from the data of a UDP datagram packet.
	 * @param packet The UDP datagram packet containing exactly one FCP packet.
	 */
	public FCPPacket(DatagramPacket packet) {
		source = packet.getAddress();
		srcPort = packet.getPort();
		version = (packet.getData()[0] & 0xf0) >> 4;
		command = packet.getData()[0] & 0x0f;
		port = packet.getData()[1] & 0xff;
		seq = ((packet.getData()[2] << 8) & 0xff00) + (packet.getData()[3] & 0xff);
		len = ((packet.getData()[4] << 8) & 0xff00) + (packet.getData()[5] & 0xff);
		data = new byte[len];
		for (int i = 0; i < len; i++) {
			data[i] = packet.getData()[6 + i];
		}
	}
 
	public FCPPacket() {
		// TODO Auto-generated constructor stub
	}
 
	@Override
	public String toString() {
		String ret = "FCP IcapPacket { version=" + version + ", command=" + command
				+ ", port=" + port + ", seq=" + seq + ", len=" + len;
		if (this.len > 0 && data != null) {
			ret += " <data: ";
			for (int i=0; i<(len-1); i++) {
				ret += String.format("%H", data[i] & 0xff) + ",";
			}
			ret += String.format("%H", data[len-1] & 0xff) + ">";
		}
		return ret + " }";
	}
 
	/**
	 * Wraps this FCP packet into a datagram packet for sending over a UDP socket.
	 * @param dest Destination internet address
	 * @param port remote port number
	 * @return
	 */
	public DatagramPacket wrapInDatagram(InetAddress dest, int port) {
		byte[] buf = new byte[6 + (this.command != 4 ? len: 0)];
 
		buf[0] = (byte) (((version << 4) & 0xf0) | (command & 0x0f));
		buf[1] = (byte) this.port;
		buf[2] = (byte) ((seq >> 8) & 0xff);
		buf[3] = (byte) (seq & 0xff);
		buf[4] = (byte) ((len >> 8) & 0xff);
		buf[5] = (byte) (len & 0xff);
		if (this.command != 4) {
			for (int i = 0; i < len; i++) {
				buf[6 + i] = data[i];
			}
		}
 
		DatagramPacket packet = new DatagramPacket(buf, buf.length);
		packet.setPort(port);
		packet.setAddress(dest);
		return packet;
	}
 
	/**
	 * Wraps this FCP packet into a datagram packet for sending over a UDP socket.
	 * @return
	 */
	public DatagramPacket wrapInDatagram() {
		byte[] buf = new byte[6 + (this.command != 4 ? len: 0)];
 
		buf[0] = (byte) (((version << 4) & 0xf0) | (command & 0x0f));
		buf[1] = (byte) this.port;
		buf[2] = (byte) ((seq >> 8) & 0xff);
		buf[3] = (byte) (seq & 0xff);
		buf[4] = (byte) ((len >> 8) & 0xff);
		buf[5] = (byte) (len & 0xff);
		if (this.command != 4) {
			for (int i = 0; i < len; i++) {
				buf[6 + i] = data[i];
			}
		}
 
		DatagramPacket packet = new DatagramPacket(buf, buf.length);
		packet.setPort(this.dstPort);
		packet.setAddress(this.dest);
		return packet;
	}
}
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.