diff --git a/proxy/go.mod b/proxy/go.mod index 9f91603..9779483 100644 --- a/proxy/go.mod +++ b/proxy/go.mod @@ -1,3 +1,5 @@ module proxy go 1.13 + +require github.com/mdlayher/ethernet v0.0.0-20190606142754-0394541c37b7 // indirect diff --git a/proxy/go.sum b/proxy/go.sum new file mode 100644 index 0000000..5f05dfe --- /dev/null +++ b/proxy/go.sum @@ -0,0 +1,12 @@ +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/mdlayher/ethernet v0.0.0-20190606142754-0394541c37b7 h1:lez6TS6aAau+8wXUP3G9I3TGlmPFEq2CTxBaRqY6AGE= +github.com/mdlayher/ethernet v0.0.0-20190606142754-0394541c37b7/go.mod h1:U6ZQobyTjI/tJyq2HG+i/dfSoFUt8/aZCM+GKtmFk/Y= +github.com/mdlayher/raw v0.0.0-20190606142536-fef19f00fc18/go.mod h1:7EpbotpCmVZcu+KCX4g9WaRNuu11uyhiW7+Le1dKawg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/net v0.0.0-20190419010253-1f3472d942ba/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190418153312-f0ce4c0180be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606122018-79a91cf218c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/proxy/main.go b/proxy/main.go index 1d30b39..1424764 100644 --- a/proxy/main.go +++ b/proxy/main.go @@ -1,11 +1,13 @@ package main import ( + "encoding/binary" "fmt" + "github.com/mdlayher/ethernet" "io" + "log" "os" "proxy/cmd" - "unicode" ) // Start the two plugs and run two concurrent forward methods @@ -22,27 +24,43 @@ func main() { // Reads from an input and writes to and output, // do things to the content in between. -// For now only output it in xxd format. +// 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) { - i := 0 for { - bytes := make([]byte, 16) - bytesReadable := make([]byte, 16) - _, err := reader.Read(bytes) + // Read frame length and print it + frameLength := make([]byte, 2) + _, err := reader.Read(frameLength) if err == io.EOF { break } - for i, ch := range bytes { - if ch > unicode.MaxASCII || ch < '\u0020' { - bytesReadable[i] = '\u002E' - } else { - bytesReadable[i] = ch - } + 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 } - xxdString := fmt.Sprintf("%s%08x: %04x %04x %04x %04x %04x %04x %04x %04x %s\n", prefix, i, bytes[0:1], bytes[2:3], bytes[4:5], bytes[6:7], bytes[8:9], bytes[10:11], bytes[12:13], bytes[14:15], bytesReadable) - os.Stdout.WriteString(xxdString) - writer.Write(bytes) - i += 16 + + // Marshal frame from binary + var frame ethernet.Frame + if e := (&frame).UnmarshalBinary(frameBytes); e != nil { + log.Printf("failed to unmarshal frame: %#v\n", e) + } + + // Print frame information + fmt.Printf( + "src: %s\ndst: %s\ntyp: %s\npayload\n%x\n", + frame.Source, + frame.Destination, + frame.EtherType, + frame.Payload, + ) + + // Forward original frame to other plug + writer.Write(frameLength) + writer.Write(frameBytes) } } \ No newline at end of file diff --git a/proxy/proxy b/proxy/proxy deleted file mode 100644 index 358b180..0000000 Binary files a/proxy/proxy and /dev/null differ