package jos.system.net.jeps;
/*
* Generic Ethernet Interface
*/
class EthernetNetworkInterface extends NetworkInterface
{
private ARP arp;
private NetworkInterfaceCard driver;
HWAddr hwaddr;
EthernetNetworkInterface(NetworkInterfaceCard drvr)
{
super();
driver = drvr;
hasARP = true; // Ethernet uses ARP
blocking= true;
if (!init()) {System.out.println("Not inited!");}
hwaddr=driver.getHWAddr();
arp = new ARP(this,hwaddr);
addProtocol(arp);
}
public boolean init()
{
/* Inits the driver */
if (driver.init() != 0) {return false;}
else {return true;}
}
public Packet readPacket()
/*
* Read Ethernet frame and "unpack" it. Used by super.demux()
*/
{
EtherPacket ep = driver.read();
Packet p=ep.unpack(ep.HEADER_LEN);
return p;
}
void writePacket(Packet p,HWAddr src, HWAddr dest, int protocol)
{
if ((p==null) || (src==null) || (dest==null))
{ System.out.println("Null pointer?!?!?! in ENI.writePacket");
// return;
}
if (dest==null) {
System.out.println("Dest invalid");
}
if (src==null) {
System.out.println("Src invalid");
}
EtherPacket ep=new EtherPacket(p.pack(14));
ep.setSrcDestProt(src,dest,protocol);
/*----------- Test, parse your own packet. Close this comment to activate. *
try
{
EtherPacket eep= new EtherPacket(ep.data);
System.out.println(">>>"+eep.toString());
if (eep.protocol==0x800)
{
IPPacket ipp=new IPPacket(eep.unpack(eep.HEADER_LEN));
System.out.println(">>>"+ipp.toString());
if (ipp.protocol==0x1)
{
ICMPPacket icmpp=new ICMPPacket(ipp.unpack(ipp.HEADER_LEN));
System.out.println(">>>"+icmpp.toString());
}
else if (ipp.protocol==0x11)
{
UDPPacket udpp=new UDPPacket(ipp.unpack(ipp.HEADER_LEN));
System.out.println(">>>"+udpp.toString());
}
}
else if (eep.protocol==0x806)
{
ARPPacket arpp=new ARPPacket(eep.unpack(eep.HEADER_LEN).data);
System.out.println(">>>"+arpp.toString());
}
}
catch (MalformedPacketException e)
{
System.out.println("Packet was ****ed up.");
}
/*--------------- End of testing --------------------------------- */
driver.write(ep);
}
void writeIPPacket(IPAddr dest,IPPacket ipp)
{
System.out.println("+++"+ipp.toString());
HWAddr hwdest = arp.getHWAddr(dest);
if (hwdest!=null)
{
writePacket(ipp,hwaddr,arp.getHWAddr(dest),0x800);
return;
}
// Send ARP Request and drop packet. SHOULD NOT be done (RFC 1122)
// It's inefficient but accepted behaviour.
arp.request(dest);
}
}