137 lines
4.1 KiB
Markdown
137 lines
4.1 KiB
Markdown
# GoNetDev
|
|
|
|
GoNetDev is an Ethernet based Golang Dataplane Development module designed simple for Linux/Unix systems.
|
|
#
|
|
Developer: Salim BOU ARAM.
|
|
|
|
## Installation & Compiling
|
|
|
|
```bash
|
|
go get -u github.com/sabouaram/GoNetDev
|
|
cd $GOPATH/src/github.com/sabouaram/GoNetDev/ && go build
|
|
sudo ./main
|
|
```
|
|
|
|
|
|
## Usage
|
|
Ethernet Header
|
|
```go
|
|
package main
|
|
import ("github.com/sabouaram/GoNetDev/Protocols"
|
|
"github.com/sabouaram/GoNetDev/Protocols/Const_Fields"
|
|
"fmt")
|
|
func main() {
|
|
frame := Protocols.NewFrame()
|
|
// BuildHeader func args: DSTMAC, SRCMAC, Protocol type
|
|
frame.Eth.BuildHeader("ff:ff:ff:ff:ff:ff", "08:00:27:dd:c1:1f", Const_Fields.Type_IPV4 )
|
|
// Optional: For IEEE 802.1q Tagging
|
|
frame.Eth.TagDot1Q(102, 6) //args: VlanID and 802.1p value
|
|
frame_bytes := frame.FrameBytes()
|
|
fmt.Printf("%x",frame_bytes)
|
|
}
|
|
```
|
|
ARP Request/Reply
|
|
```go
|
|
package main
|
|
import ("github.com/sabouaram/GoNetDev/Protocols"
|
|
"github.com/sabouaram/GoNetDev/Protocols/Const_Fields"
|
|
"fmt")
|
|
func main(){
|
|
frame := Protocols.NewFrame()
|
|
frame.Eth.BuildHeader("ff:ff:ff:ff:ff:ff", "08:00:27:dd:c1:1f", Const_Fields.Type_ARP)
|
|
// ARP(Proto: IPV4 only supported) Func Args: srcIP, desIP, srcMAC, dstMAC, operation
|
|
// ARP REQUEST (for reply: last func arg: Const_Fields.ARP_Operation_reply)
|
|
frame.Arph.BuildARPHeader(Const_Fields.Hardware_type_Ethernet, Const_Fields.Type_IPV4, "192.168.1.14", "192.168.1.222", "08:00:27:dd:c1:1f", "00:00:00:00:00:00",Const_Fields.ARP_Operation_request)
|
|
frame_bytes := frame.FrameBytes()
|
|
fmt.Printf("%x", frame_bytes)
|
|
}
|
|
|
|
```
|
|
|
|
ICMPv4 Echo/Reply
|
|
|
|
```go
|
|
package main
|
|
import ("github.com/sabouaram/GoNetDev/Protocols"
|
|
"github.com/sabouaram/GoNetDev/Protocols/Const_Fields"
|
|
"fmt")
|
|
func main() {
|
|
frame := Protocols.NewFrame()
|
|
frame.Eth.BuildHeader("08:00:27:ff:23:22", "08:00:27:dd:c1:1f", Const_Fields.Type_IPV4)
|
|
frame.Iph.BuildIPV4Header("192.168.1.14", "192.168.1.11", Const_Fields.Type_ICMP)
|
|
// BuildICMPHeader func args: ICMP Message type
|
|
frame.Icmph.BuildICMPHeader(Const_Fields.ICMP_Type_Reply)
|
|
frame_bytes := frame.FrameBytes()
|
|
fmt.Printf("%x", frame_bytes)
|
|
}
|
|
```
|
|
|
|
IPv4 Fragmentation
|
|
|
|
```go
|
|
package main
|
|
import ("github.com/sabouaram/GoNetDev/Protocols"
|
|
"github.com/sabouaram/GoNetDev/Protocols/Const_Fields"
|
|
"fmt")
|
|
func main() {
|
|
Data := make([]byte, 8900) // 8900 bytes of Data
|
|
frame := Protocols.NewFrame()
|
|
frame.Eth.BuildHeader("ff:ff:ff:ff:ff:ff", "08:00:27:dd:c1:1f", Const_Fields.Type_IPV4)
|
|
// Fragment func args: Data byte slice, MTU, IP Higher Protocol, IPSRC, IPDST
|
|
packets := Protocols.Fragment(Data, 1500, Const_Fields.Type_TCP, "192.168.0.12", "8.8.8.8")
|
|
for _,v := range packets
|
|
{
|
|
frame.Iph = v
|
|
frame_bytes := frame.FrameBytes()
|
|
fmt.Printf("%x", frame_bytes)
|
|
}
|
|
}
|
|
```
|
|
|
|
## Basic Ingress/Egress Processing (working on QoS feature and queuing management )
|
|
```go
|
|
package main
|
|
import ("github.com/sabouaram/GoNetDev/Protocols/SendRecv")
|
|
func main() {
|
|
frame := Protocols.NewFrame()
|
|
frame.Eth.BuildHeader("08:00:27:ff:23:22", "08:00:27:dd:c1:1f", Const_Fields.Type_IPV4)
|
|
frame.Iph.BuildIPV4Header("192.168.1.14", "192.168.1.11", Const_Fields.Type_ICMP)
|
|
frame.Icmph.BuildICMPHeader(Const_Fields.ICMP_Type_Reply)
|
|
frame_bytes := frame.FrameBytes()
|
|
|
|
// Frames handling and data processing (example replying to an ICMP echo request)
|
|
chn := make(chan Protocols.Frame)
|
|
go func() {
|
|
err := SendRecv.ReceiveFrame("enp0s3", 1024, chn)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
}()
|
|
|
|
for s := range chn {
|
|
// Example Replying an ICMP Echo request
|
|
if s.Icmph != nil && s.Icmph.GetType() == Const_Fields.ICMP_Type_Echo {
|
|
s.Icmph.BuildICMPHeader(Const_Fields.ICMP_Type_Reply)
|
|
s.Iph.ReverseSrc()
|
|
_, err := SendRecv.SendFrame("enp0s3", s.FrameBytes())
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
```
|
|
## Adding a Protocol dynamically (working on it)
|
|
## Prometheus Metrics (working on it)
|
|
## also Tunneling / IPsec ...
|
|
|
|
|
|
## Contributing
|
|
Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.
|
|
|
|
Please make sure to update tests as appropriate.
|
|
|
|
## License
|
|
[MIT](https://choosealicense.com/licenses/mit/)
|