mosers
/
eaas-vde-proxy
Archiviert
1
0
Fork 0
Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
Dieses Repo ist archiviert. Du kannst Dateien sehen und es klonen, kannst aber nicht pushen oder Issues/Pull-Requests öffnen.

63 Zeilen
1.7 KiB
Go

package main
import (
"encoding/binary"
"fmt"
"github.com/google/gopacket"
"github.com/google/gopacket/layers"
_ "github.com/google/gopacket/layers"
"io"
"os"
"proxy/cmd"
)
// Start the two plugs and run two concurrent forward methods
func main() {
c1 := cmd.New("vde_plug", "/run/vde/sw_main.sock")
c2 := cmd.New("vde_plug", "/run/vde/sw_proxy.sock")
c1.Execute()
c2.Execute()
go pipeForward(c1.OutReader, c2.InWriter, cmd.In)
go pipeForward(c2.OutReader, c1.InWriter, cmd.Out)
c1.WaitH()
c2.WaitH()
}
// Reads from an input and writes to and output,
// do things to the content in between.
// For now only output the frames information
// Is meant to be run concurrently with "go pipeForward(...)"
func pipeForward(reader io.Reader, writer io.Writer, prefix string) {
for {
// Read frame length and print it
frameLength := make([]byte, 2)
_, err := reader.Read(frameLength)
if err == io.EOF {
break
}
frameLengthInt := int(binary.BigEndian.Uint16(frameLength))
os.Stdout.WriteString(fmt.Sprintf("%s Frame length: %d\n", prefix, frameLengthInt))
// Read actual frame
frameBytes := make([]byte, frameLengthInt)
_, err = reader.Read(frameBytes)
if err == io.EOF {
break
}
packet := gopacket.NewPacket(frameBytes, layers.LayerTypeEthernet, gopacket.Default)
frame := packet.Layer(layers.LayerTypeEthernet).(*layers.Ethernet)
fmt.Printf("src: %s\ndst: %s\ntyp: %s\n", frame.SrcMAC, frame.DstMAC, frame.EthernetType)
switch frame.EthernetType {
case layers.EthernetTypeARP:
arpPacket := packet.Layer(layers.LayerTypeARP).(*layers.ARP)
fmt.Printf("%#v", arpPacket)
}
// Forward original frame to other plug
writer.Write(frameLength)
writer.Write(frameBytes)
}
}