/* JPC: An x86 PC Hardware Emulator for a pure Java Virtual Machine Release Version 2.4 A project from the Physics Dept, The University of Oxford Copyright (C) 2007-2010 The University of Oxford This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Details (including contact information) can be found at: jpc.sourceforge.net or the developer website sourceforge.net/projects/jpc/ Conceived and Developed by: Rhys Newman, Ian Preston, Chris Dennis End of licence header */ package org.jpc.support; import org.jpc.emulator.pci.peripheral.EthernetCard; /** * * @author Ian Preston <ianopolous@gmail.com> */ public class EthernetProxy extends EthernetOutput { EthernetCard card; public void sendPacket(byte[] input, int offset, int length) { byte[] packet = new byte[length]; System.arraycopy(input, offset, packet, 0, length); long targetMACaddr = 0L | (packet[0] << 40) | (packet [1] << 32) | (packet [2] << 24) | (packet[3] << 16) | (packet[4] << 8) | packet[5]; long sourceMACaddr = 0L | (packet[6] << 40) | (packet [7] << 32) | (packet [8] << 24) | (packet[9] << 16) | (packet[10] << 8) | packet[11]; //check it is an IP packet if ((packet[12] != (byte)0x8) || (packet[13] != (byte) 0)) { System.out.println("Asked to send a non IP packet"); printPacket(packet); return; } //Check it is IPV4 if ((packet[14] & (byte) 0xF0) != (byte) 0x40) { System.out.println("Asked to send a non IPV4 packet"); printPacket(packet); return; } int ipHeaderlength = (packet[14] & 0xF)*32; int totalLength = (packet[16] << 8) | packet[17]; int identification = (packet[18] << 8) | packet[19]; //flags boolean dontFragment = (packet[20] & 0x40) == 0x40; boolean moreFragments = (packet[20] & 0x20) == 0x20; int fragmentOffset = ((packet[20] & 0x1F) << 8) | packet[21]; int hopsToLive = packet[22]; int protocol = packet[23]; //6 = TCP, 0x11 = UDP int checksum = (packet[24] << 8) | packet[25]; int sourceIPaddr = (packet[26] << 24) | (packet[27] << 16) | (packet[28] << 8) | packet[28]; int targetIPaddr = (packet[29] << 24) | (packet[30] << 16) | (packet[31] << 8) | packet[32]; if (protocol == 6) { //TCP Protocol int port = 0; // try { // Socket sock = new Socket(new Inet4Address(), port); // } catch (IOException e) { // e.printStackTrace(); // return; // } System.out.println("Sent TCP packet"); printPacket(packet); } else if (protocol == 17) { //UDP System.out.println("Sent UDP packet"); printPacket(packet); } else { System.out.println("Eth0 packet requesting unrecognised protocol: " + protocol); printPacket(packet); return; } } public static String toHex(byte[] ar, int offset, int length) { String rep = ""; for (int i = offset; i < length + offset; i++) { rep += Integer.toHexString(ar[i]); } return rep; } public static void printPacket(byte[] packet) { System.out.println("**********************Begin eth0 packet dump"); long targetMACaddr = 0L | (packet[0] << 40) | (packet [1] << 32) | (packet [2] << 24) | (packet[3] << 16) | (packet[4] << 8) | packet[5]; long sourceMACaddr = 0L | (packet[6] << 40) | (packet [7] << 32) | (packet [8] << 24) | (packet[9] << 16) | (packet[10] << 8) | packet[11]; System.out.println("Target MAC: " + Long.toHexString(targetMACaddr)); System.out.println("Source MAC: " + toHex(packet, 6, 6)); //check it is an IP packet int type = (packet[12] << 8) | packet[13]; System.out.println("Ether Type " + Integer.toHexString(type)); //Check it is IPV4 int ipVersion = (packet[14] & (byte) 0xF0); System.out.println("IP Version: 0x" + Integer.toHexString(ipVersion)); int ipHeaderlength = (packet[14] & 0xF)*32; System.out.println("Header Length " + ipHeaderlength); int totalLength = (packet[16] << 8) | packet[17]; System.out.println("Total Length " + totalLength); int identification = (packet[18] << 8) | packet[19]; System.out.println("Identification " + identification); //flags boolean dontFragment = (packet[20] & 0x40) == 0x40; System.out.println("Flag - don't fragment " + dontFragment); boolean moreFragments = (packet[20] & 0x20) == 0x20; System.out.println("Flag - more fragments " + moreFragments); int fragmentOffset = ((packet[20] & 0x1F) << 8) | packet[21]; System.out.println("Fragment Offset: " + Integer.toHexString(fragmentOffset)); int hopsToLive = packet[22]; System.out.println("Hops to live: " + hopsToLive); int protocol = packet[23]; //6 = TCP, 0x11 = UDP System.out.println("Protocol: " + protocol); int checksum = (packet[24] << 8) | packet[25]; System.out.println("Header Checksum " + Integer.toHexString(checksum)); int sourceIPaddr = (packet[26] << 24) | (packet[27] << 16) | (packet[28] << 8) | packet[28]; System.out.println("Source IP Pointer: " + Integer.toHexString(sourceIPaddr)); int targetIPaddr = (packet[29] << 24) | (packet[30] << 16) | (packet[31] << 8) | packet[32]; System.out.println("Target IP address: " + Integer.toHexString(targetIPaddr)); } public byte[] getPacket() { return null; } }