Fixed message header length in conn_linux

This commit is contained in:
Mathias Hall-Andersen 2017-10-27 10:43:37 +02:00
parent fd6f2e1f55
commit 0485c34c8e
6 changed files with 54 additions and 26 deletions

View file

@ -45,15 +45,20 @@ func UpdateUDPListener(device *Device) error {
// close existing sockets // close existing sockets
if netc.bind != nil { if netc.bind != nil {
println("close bind")
if err := netc.bind.Close(); err != nil { if err := netc.bind.Close(); err != nil {
return err return err
} }
netc.bind = nil
println("closed")
} }
// open new sockets // open new sockets
if device.tun.isUp.Get() { if device.tun.isUp.Get() {
println("creat")
// bind to new port // bind to new port
var err error var err error
@ -69,6 +74,8 @@ func UpdateUDPListener(device *Device) error {
return err return err
} }
println("okay")
// clear cached source addresses // clear cached source addresses
for _, peer := range device.peers { for _, peer := range device.peers {

View file

@ -50,10 +50,12 @@ func CreateUDPBind(port uint16) (UDPBind, uint16, error) {
if err != nil { if err != nil {
unix.Close(bind.sock6) unix.Close(bind.sock6)
} }
return &bind, port, err println(bind.sock6)
println(bind.sock4)
return bind, port, err
} }
func (bind *NativeBind) SetMark(value uint32) error { func (bind NativeBind) SetMark(value uint32) error {
err := unix.SetsockoptInt( err := unix.SetsockoptInt(
bind.sock6, bind.sock6,
unix.SOL_SOCKET, unix.SOL_SOCKET,
@ -73,7 +75,7 @@ func (bind *NativeBind) SetMark(value uint32) error {
) )
} }
func (bind *NativeBind) Close() error { func (bind NativeBind) Close() error {
err1 := unix.Close(bind.sock6) err1 := unix.Close(bind.sock6)
err2 := unix.Close(bind.sock4) err2 := unix.Close(bind.sock4)
if err1 != nil { if err1 != nil {
@ -82,7 +84,7 @@ func (bind *NativeBind) Close() error {
return err2 return err2
} }
func (bind *NativeBind) ReceiveIPv6(buff []byte, end *Endpoint) (int, error) { func (bind NativeBind) ReceiveIPv6(buff []byte, end *Endpoint) (int, error) {
return receive6( return receive6(
bind.sock6, bind.sock6,
buff, buff,
@ -90,7 +92,7 @@ func (bind *NativeBind) ReceiveIPv6(buff []byte, end *Endpoint) (int, error) {
) )
} }
func (bind *NativeBind) ReceiveIPv4(buff []byte, end *Endpoint) (int, error) { func (bind NativeBind) ReceiveIPv4(buff []byte, end *Endpoint) (int, error) {
return receive4( return receive4(
bind.sock4, bind.sock4,
buff, buff,
@ -98,7 +100,7 @@ func (bind *NativeBind) ReceiveIPv4(buff []byte, end *Endpoint) (int, error) {
) )
} }
func (bind *NativeBind) Send(buff []byte, end *Endpoint) error { func (bind NativeBind) Send(buff []byte, end *Endpoint) error {
switch end.dst.Family { switch end.dst.Family {
case unix.AF_INET6: case unix.AF_INET6:
return send6(bind.sock6, end, buff) return send6(bind.sock6, end, buff)
@ -236,7 +238,7 @@ func create6(port uint16) (int, uint16, error) {
// create socket // create socket
fd, err := unix.Socket( fd, err := unix.Socket(
unix.AF_INET, unix.AF_INET6,
unix.SOCK_DGRAM, unix.SOCK_DGRAM,
0, 0,
) )
@ -342,7 +344,7 @@ func send6(sock int, end *Endpoint, buff []byte) error {
unix.Cmsghdr{ unix.Cmsghdr{
Level: unix.IPPROTO_IPV6, Level: unix.IPPROTO_IPV6,
Type: unix.IPV6_PKTINFO, Type: unix.IPV6_PKTINFO,
Len: unix.SizeofInet6Pktinfo, Len: unix.SizeofInet6Pktinfo + unix.SizeofCmsghdr,
}, },
unix.Inet6Pktinfo{ unix.Inet6Pktinfo{
Addr: end.src.Addr, Addr: end.src.Addr,
@ -368,15 +370,31 @@ func send6(sock int, end *Endpoint, buff []byte) error {
uintptr(unsafe.Pointer(&msghdr)), uintptr(unsafe.Pointer(&msghdr)),
0, 0,
) )
if errno == 0 {
return nil
}
// clear src and retry
if errno == unix.EINVAL { if errno == unix.EINVAL {
end.ClearSrc() end.ClearSrc()
cmsg.pktinfo = unix.Inet6Pktinfo{}
_, _, errno = unix.Syscall(
unix.SYS_SENDMSG,
uintptr(sock),
uintptr(unsafe.Pointer(&msghdr)),
0,
)
} }
return errno return errno
} }
func send4(sock int, end *Endpoint, buff []byte) error { func send4(sock int, end *Endpoint, buff []byte) error {
println("send 4") println("send 4")
println(end.DstToString()) println(end.DstToString())
println(sock)
// construct message header // construct message header
@ -393,7 +411,7 @@ func send4(sock int, end *Endpoint, buff []byte) error {
unix.Cmsghdr{ unix.Cmsghdr{
Level: unix.IPPROTO_IP, Level: unix.IPPROTO_IP,
Type: unix.IP_PKTINFO, Type: unix.IP_PKTINFO,
Len: unix.SizeofInet4Pktinfo, Len: unix.SizeofInet4Pktinfo + unix.SizeofCmsghdr,
}, },
unix.Inet4Pktinfo{ unix.Inet4Pktinfo{
Spec_dst: src4.src.Addr, Spec_dst: src4.src.Addr,
@ -419,10 +437,11 @@ func send4(sock int, end *Endpoint, buff []byte) error {
0, 0,
) )
println(sock) if errno == 0 {
fmt.Println(errno) return nil
}
// clear source cache and try again // clear source and try again
if errno == unix.EINVAL { if errno == unix.EINVAL {
end.ClearSrc() end.ClearSrc()

View file

@ -84,7 +84,10 @@ func main() {
logInfo := device.log.Info logInfo := device.log.Info
logError := device.log.Error logError := device.log.Error
logInfo.Println("Starting device") logDebug := device.log.Debug
logInfo.Println("Device started")
logDebug.Println("Debug log enabled")
// start configuration lister // start configuration lister

View file

@ -138,6 +138,17 @@ func (device *Device) NewPeer(pk NoisePublicKey) (*Peer, error) {
return peer, nil return peer, nil
} }
func (peer *Peer) SendBuffer(buffer []byte) error {
peer.device.net.mutex.RLock()
defer peer.device.net.mutex.RUnlock()
peer.mutex.RLock()
defer peer.mutex.RUnlock()
if !peer.endpoint.set {
return errors.New("No known endpoint for peer")
}
return peer.device.net.bind.Send(buffer, &peer.endpoint.value)
}
/* Returns a short string identification for logging /* Returns a short string identification for logging
*/ */
func (peer *Peer) String() string { func (peer *Peer) String() string {

View file

@ -2,7 +2,6 @@ package main
import ( import (
"encoding/binary" "encoding/binary"
"errors"
"golang.org/x/crypto/chacha20poly1305" "golang.org/x/crypto/chacha20poly1305"
"golang.org/x/net/ipv4" "golang.org/x/net/ipv4"
"golang.org/x/net/ipv6" "golang.org/x/net/ipv6"
@ -105,17 +104,6 @@ func addToEncryptionQueue(
} }
} }
func (peer *Peer) SendBuffer(buffer []byte) error {
peer.device.net.mutex.RLock()
defer peer.device.net.mutex.RUnlock()
peer.mutex.RLock()
defer peer.mutex.RUnlock()
if !peer.endpoint.set {
return errors.New("No known endpoint for peer")
}
return peer.device.net.bind.Send(buffer, &peer.endpoint.value)
}
/* Reads packets from the TUN and inserts /* Reads packets from the TUN and inserts
* into nonce queue for peer * into nonce queue for peer
* *

View file

@ -135,7 +135,7 @@ func ipcSetOperation(device *Device, socket *bufio.ReadWriter) *IPCError {
case "listen_port": case "listen_port":
port, err := strconv.ParseUint(value, 10, 16) port, err := strconv.ParseUint(value, 10, 16)
if err != nil { if err != nil {
logError.Println("Failed to set listen_port:", err) logError.Println("Failed to parse listen_port:", err)
return &IPCError{Code: ipcErrorInvalid} return &IPCError{Code: ipcErrorInvalid}
} }
device.net.port = uint16(port) device.net.port = uint16(port)