package Ġkit to ku . mvc . unit . e thernet Ċ Ċ import Ġkit to ku . mvc . debug . assert Always Ċ import Ġkit to ku . mvc . unit . Data Unit Ċ import Ġkit to ku . mvc . unit . arp . AR PP acket Ċ import Ġkit to ku . mvc . unit . arp . ARP _ HARD WARE _ TYPE _ ETHER NET Ċ import Ġkit to ku . mvc . unit . ip . IPv 4 Packet Ċ import Ġjava . nio . ByteBuffer ĊĊ Ċ internal Ġclass ĠEthernet Frame Ġ: ĠData Unit Ġ{ ĊĠĠĠ Ġinternal Ġval Ġdst Mac Ġ= ĠByteArray ( ETHER NET _ MAC _ ADDRESS _ SIZE ) ĊĠĠĠ Ġinternal Ġval Ġsrc Mac Ġ= ĠByteArray ( ETHER NET _ MAC _ ADDRESS _ SIZE ) ĊĠĠĠ Ġinternal Ġvar Ġether Type : ĠShort Ġ= Ġ 0 ĊĊĠĠĠ Ġinternal Ġvar Ġpayload AR PP acket : ĠAR PP acket ? Ġ= Ġnull ĊĠĠĠ Ġinternal Ġvar Ġpayload IPv 4 Packet : ĠIPv 4 Packet ? Ġ= Ġnull ĊĠĠĠ Ġinternal Ġvar Ġpayload Unknown : ĠByteArray ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġvalid Payload Length : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpayload AR PP acket Ġ!= Ġnull Ġ-> Ġpayload AR PP acket !!. length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpayload IPv 4 Packet Ġ!= Ġnull Ġ-> Ġpayload IPv 4 Packet !!. length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpayload Unknown Ġ!= Ġnull Ġ-> Ġpayload Unknown !!. size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġlength : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠE THER NET _ HEADER _ SIZE Ġ+ Ġvalid Payload Length ĊĊĠĠĠ Ġoverride Ġfun Ġwrite ( buffer : ĠByteBuffer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbuffer . put ( dst Mac ) ĊĠĠĠĠĠĠĠ Ġbuffer . put ( src Mac ) ĊĠĠĠĠĠĠĠ Ġbuffer . put Short ( ether Type ) ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpayload AR PP acket Ġ!= Ġnull Ġ-> Ġpayload AR PP acket !!. write ( buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpayload IPv 4 Packet Ġ!= Ġnull Ġ-> Ġpayload IPv 4 Packet !!. write ( buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpayload Unknown Ġ!= Ġnull Ġ-> Ġbuffer . put ( payload Unknown !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġread ( buffer : ĠByteBuffer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpayload Length Ġ= Ġbuffer . int Ġ- ĠE THER NET _ HEADER _ SIZE ĊĠĠĠĠĠĠĠ Ġassert Always ( payload Length Ġ> Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġbuffer . get ( dst Mac ) ĊĠĠĠĠĠĠĠ Ġbuffer . get ( src Mac ) ĊĠĠĠĠĠĠĠ Ġether Type Ġ= Ġbuffer . short ĊĊĠĠĠĠĠĠĠ Ġif Ġ( payload Length Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( ether Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE THER _ TYPE _ ARP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Ar p Ġ= Ġbuffer . position () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Ethernet Ġ= Ġbuffer . short Ġ== ĠAR P _ HARD WARE _ TYPE _ ETHER NET ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis IPv 4 Ġ= Ġbuffer . short Ġ== ĠE THER _ TYPE _ IPv 4 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Ethernet Ġ&& Ġis IPv 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . position ( start Ar p ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpayload AR PP acket Ġ= ĠAR PP acket (). also Ġ{ Ġit . read ( buffer ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . position ( start Ar p ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpayload Unknown Ġ= ĠByteArray ( payload Length ). also Ġ{ Ġbuffer . get ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE THER _ TYPE _ IPv 4 Ġ-> Ġpayload IPv 4 Packet Ġ= ĠIPv 4 Packet (). also Ġ{ Ġit . read ( buffer ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġpayload Unknown Ġ= ĠByteArray ( payload Length ). also Ġ{ Ġbuffer . get ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ