package com.netifera.platform.net.packets.link;
import com.netifera.platform.net.packets.AbstractPacket;
import com.netifera.platform.util.addresses.MACAddress;
public class Ethernet extends AbstractPacket {
private MACAddress destinationAddress;
private MACAddress sourceAddress;
private int type;
/**
* 0 1 2 3 4 5 6 7 8 9 A B C D
* +---+---+---+---+---+---+---+---+---+---+---+---+---+---+
* | destination address | source address | type |
* +---+---+---+---+---+---+---+---+---+---+---+---+---+---+
*/
@Override
protected void packHeader() {
packBytes(destinationAddress.toBytes());
packBytes(sourceAddress.toBytes());
pack16(type);
}
@Override
protected void unpackHeader() {
destinationAddress = new MACAddress(unpackBytes(6));
sourceAddress = new MACAddress(unpackBytes(6));
type = unpack16();
}
private static final MACAddress nullAddress
= new MACAddress(new byte[] { 0, 0, 0, 0, 0, 0 });
public Ethernet() {}
public Ethernet(EthernetEncapsulable payload) {
super(payload);
sourceAddress = nullAddress;
destinationAddress = nullAddress;
type = payload.protocolOverEthernet();
}
@Override
public int nextProtocol() {
return type;
}
@Override
public int minimumHeaderLength() {
return 14; /* 2 * sizeof(MACAddress) + 2 */
}
@Override
public String toString() {
return "Ethernet " + sourceAddress + " -> " + destinationAddress;
}
}