updates
This commit is contained in:
72
Downloads/GoNetDev-master/Protocols/SendRecv/Syscall.go
Normal file
72
Downloads/GoNetDev-master/Protocols/SendRecv/Syscall.go
Normal file
@@ -0,0 +1,72 @@
|
||||
package SendRecv
|
||||
|
||||
import (
|
||||
"github.com/sabouaram/GoNetDev/Protocols"
|
||||
"github.com/sabouaram/GoNetDev/Protocols/Utils"
|
||||
"github.com/sabouaram/GoNetDev/Protocols/Utils/GLogger"
|
||||
"net"
|
||||
"syscall"
|
||||
)
|
||||
|
||||
func SyscallRawEth() (fd int) {
|
||||
fd, error := syscall.Socket(syscall.AF_PACKET, syscall.SOCK_RAW, 0x0300)
|
||||
|
||||
if error != nil {
|
||||
syscall.Close(fd)
|
||||
panic(error)
|
||||
}
|
||||
return fd
|
||||
}
|
||||
|
||||
func ReceiveFrame(interface_name string, byte_size int, chn chan Protocols.Frame) error {
|
||||
fd := SyscallRawEth()
|
||||
err := syscall.BindToDevice(fd, interface_name)
|
||||
if err != nil {
|
||||
syscall.Close(fd)
|
||||
panic(err)
|
||||
}
|
||||
|
||||
buffer := make([]byte, byte_size)
|
||||
logger := GLogger.GetInstance()
|
||||
logger.Printf("RX:%s", interface_name)
|
||||
Frames_received_metric := Utils.NewPromCounter("frames_received", "frames received per interface", []string{"interface_name"})
|
||||
Utils.Register(Frames_received_metric)
|
||||
for true {
|
||||
syscall.Recvfrom(fd, buffer, 0)
|
||||
Frame := Protocols.Parse(buffer)
|
||||
chn <- Frame
|
||||
Frames_received_metric.With(Utils.NewLabel("interface_name", interface_name)).Inc()
|
||||
logger.Printf("RX:%s", interface_name)
|
||||
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func SendFrame(interface_name string, frame []byte) (count_bytes int, err error) {
|
||||
fd := SyscallRawEth()
|
||||
interface_info, err := net.InterfaceByName(interface_name)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
var haddr [8]byte
|
||||
copy(haddr[0:7], interface_info.HardwareAddr[0:7])
|
||||
addr := syscall.SockaddrLinklayer{
|
||||
Protocol: syscall.ETH_P_IP,
|
||||
Ifindex: interface_info.Index,
|
||||
Halen: uint8(len(interface_info.HardwareAddr)),
|
||||
Addr: haddr,
|
||||
}
|
||||
err = syscall.Bind(fd, &addr)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
err = syscall.SetLsfPromisc(interface_name, true)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
n, err := syscall.Write(fd, frame)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return n, err
|
||||
}
|
||||
Reference in New Issue
Block a user