53 lines
1.6 KiB
Go
53 lines
1.6 KiB
Go
|
package Protocols
|
||
|
|
||
|
import (
|
||
|
"encoding/binary"
|
||
|
"github.com/sabouaram/GoNetDev/Protocols/Const_Fields"
|
||
|
"github.com/sabouaram/GoNetDev/Protocols/Utils/GLogger"
|
||
|
)
|
||
|
|
||
|
func Parse(byte_slice []byte) Frame {
|
||
|
logger := GLogger.GetInstance()
|
||
|
EthHeader := NewEthHeader()
|
||
|
IPHeader := NewIpv4Header()
|
||
|
ARPHeader := NewArpHeader()
|
||
|
ICMPHeader := NewICMPHeader()
|
||
|
padding := 0
|
||
|
Tag1q := binary.BigEndian.Uint16(byte_slice[12:14])
|
||
|
logger.Println(Tag1q)
|
||
|
//In case of a Trunk link
|
||
|
if Tag1q == 33024 {
|
||
|
padding = 4
|
||
|
EthHeader.ParseEthernet(byte_slice, true)
|
||
|
} else {
|
||
|
EthHeader.ParseEthernet(byte_slice, false)
|
||
|
}
|
||
|
logger.Printf("=>ETHERNET: SRC_MAC_ADDRESS:%x, DST_MAC_ADDRESS:%x \n", EthHeader.SourceMacAddress, EthHeader.DestMacAddress)
|
||
|
switch binary.BigEndian.Uint16(EthHeader.Type) {
|
||
|
|
||
|
case Const_Fields.Type_IPV4:
|
||
|
{
|
||
|
IPHeader.ParseIPV4(byte_slice[padding+14:])
|
||
|
logger.Printf(" =>IPV4: SRC_IP_ADDRESS:%x, DST_IP_ADDRESS:%x \n", IPHeader.Src_address, IPHeader.Dst_address)
|
||
|
switch uint8(IPHeader.Protocol[0]) {
|
||
|
case Const_Fields.Type_ICMP:
|
||
|
ICMPHeader.ParseICMP(byte_slice[padding+34:])
|
||
|
logger.Println(" =>ICMP")
|
||
|
case Const_Fields.Type_TCP:
|
||
|
logger.Println(" =>TCP")
|
||
|
case Const_Fields.Type_UDP:
|
||
|
logger.Println(" =>UDP")
|
||
|
}
|
||
|
}
|
||
|
case 0x0806:
|
||
|
{
|
||
|
ARPHeader.ParseARP(byte_slice[padding+14:])
|
||
|
logger.Printf(" =>ARP: SRC_MAC_ADDRESS:%x, SRC_IP_ADDRESS:%x , TARGET_MAC_ADDRESS:%x, TARGET_IP_ADDRESS:%x, Operation: %x \n", ARPHeader.SenderMACaddress, ARPHeader.SenderIPaddress, ARPHeader.TargetMACaddress, ARPHeader.TargetIPaddress, ARPHeader.Operation)
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return Frame{EthHeader, ARPHeader, IPHeader, ICMPHeader}
|
||
|
|
||
|
}
|