From 03ea4419333d8bb173868d83a3850a8ab22593d5 Mon Sep 17 00:00:00 2001 From: David Scott Date: Thu, 21 Apr 2016 16:52:31 +0100 Subject: [PATCH] proxy: implement the UDP marshalling/unmarshalling Signed-off-by: David Scott --- .../proxy/libproxy/udp_encapsulation.go | 72 ++++++++++++++++--- 1 file changed, 63 insertions(+), 9 deletions(-) diff --git a/alpine/packages/proxy/libproxy/udp_encapsulation.go b/alpine/packages/proxy/libproxy/udp_encapsulation.go index 8f9fa1277..1891aa234 100644 --- a/alpine/packages/proxy/libproxy/udp_encapsulation.go +++ b/alpine/packages/proxy/libproxy/udp_encapsulation.go @@ -1,12 +1,11 @@ package libproxy import ( - //"encoding/binary" - "errors" + "bytes" + "encoding/binary" + "io" "net" - //"strings" "sync" - //"syscall" "github.com/Sirupsen/logrus" ) @@ -52,7 +51,7 @@ func (u *udpEncapsulator) ReadFromUDP(b []byte) (int, *net.UDPAddr, error) { if err != nil { return 0, nil, err } - return len(datagram.payload), &net.UDPAddr{IP: *datagram.IP, Port: datagram.Port, Zone: datagram.Zone}, nil + return len(datagram.payload), &net.UDPAddr{IP: *datagram.IP, Port: int(datagram.Port), Zone: datagram.Zone}, nil } func (u *udpEncapsulator) WriteToUDP(b []byte, addr *net.UDPAddr) (int, error) { @@ -62,7 +61,7 @@ func (u *udpEncapsulator) WriteToUDP(b []byte, addr *net.UDPAddr) (int, error) { } u.w.Lock() defer u.w.Unlock() - datagram := &udpDatagram{payload: b, IP: &addr.IP, Port: addr.Port, Zone: addr.Zone} + datagram := &udpDatagram{payload: b, IP: &addr.IP, Port: uint16(addr.Port), Zone: addr.Zone} return len(b), datagram.Marshal(conn) } @@ -87,14 +86,69 @@ func NewUDPListener(listener net.Listener) udpListener { type udpDatagram struct { payload []byte IP *net.IP - Port int + Port uint16 Zone string } func (u *udpDatagram) Marshal(conn net.Conn) error { - return errors.New("Marshal unimplemented") + var length uint16 + length = uint16(len(*u.IP)) + if err := binary.Write(conn, binary.LittleEndian, &length); err != nil { + return err + } + if err := binary.Write(conn, binary.LittleEndian, &u.IP); err != nil { + return err + } + if err := binary.Write(conn, binary.LittleEndian, &u.Port); err != nil { + return err + } + length = uint16(len(u.Zone)) + if err := binary.Write(conn, binary.LittleEndian, &length); err != nil { + return err + } + if err := binary.Write(conn, binary.LittleEndian, &u.Zone); err != nil { + return nil + } + length = uint16(len(u.payload)) + if err := binary.Write(conn, binary.LittleEndian, &length); err != nil { + return nil + } + payload := bytes.NewBuffer(u.payload) + _, err := io.Copy(conn, payload) + if err != nil { + return err + } + return nil } func (u *udpDatagram) Unmarshal(conn net.Conn) error { - return errors.New("Unmarshal unimplemented") + var length uint16 + if err := binary.Read(conn, binary.LittleEndian, &length); err != nil { + return err + } + var IP net.IP + IP = make([]byte, length) + if err := binary.Read(conn, binary.LittleEndian, &IP); err != nil { + return err + } + u.IP = &IP + if err := binary.Read(conn, binary.LittleEndian, &u.Port); err != nil { + return err + } + if err := binary.Read(conn, binary.LittleEndian, &length); err != nil { + return err + } + Zone := make([]byte, length) + if err := binary.Read(conn, binary.LittleEndian, &Zone); err != nil { + return err + } + u.Zone = string(Zone) + if err := binary.Read(conn, binary.LittleEndian, &length); err != nil { + return err + } + u.payload = make([]byte, length) + if err := binary.Read(conn, binary.LittleEndian, &u.payload); err != nil { + return err + } + return nil }