Fixed message header length in conn_linux
This commit is contained in:
		
							parent
							
								
									fd6f2e1f55
								
							
						
					
					
						commit
						0485c34c8e
					
				@ -45,15 +45,20 @@ func UpdateUDPListener(device *Device) error {
 | 
			
		||||
	// close existing sockets
 | 
			
		||||
 | 
			
		||||
	if netc.bind != nil {
 | 
			
		||||
		println("close bind")
 | 
			
		||||
		if err := netc.bind.Close(); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		netc.bind = nil
 | 
			
		||||
		println("closed")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// open new sockets
 | 
			
		||||
 | 
			
		||||
	if device.tun.isUp.Get() {
 | 
			
		||||
 | 
			
		||||
		println("creat")
 | 
			
		||||
 | 
			
		||||
		// bind to new port
 | 
			
		||||
 | 
			
		||||
		var err error
 | 
			
		||||
@ -69,6 +74,8 @@ func UpdateUDPListener(device *Device) error {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		println("okay")
 | 
			
		||||
 | 
			
		||||
		// clear cached source addresses
 | 
			
		||||
 | 
			
		||||
		for _, peer := range device.peers {
 | 
			
		||||
 | 
			
		||||
@ -50,10 +50,12 @@ func CreateUDPBind(port uint16) (UDPBind, uint16, error) {
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		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(
 | 
			
		||||
		bind.sock6,
 | 
			
		||||
		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)
 | 
			
		||||
	err2 := unix.Close(bind.sock4)
 | 
			
		||||
	if err1 != nil {
 | 
			
		||||
@ -82,7 +84,7 @@ func (bind *NativeBind) Close() error {
 | 
			
		||||
	return err2
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (bind *NativeBind) ReceiveIPv6(buff []byte, end *Endpoint) (int, error) {
 | 
			
		||||
func (bind NativeBind) ReceiveIPv6(buff []byte, end *Endpoint) (int, error) {
 | 
			
		||||
	return receive6(
 | 
			
		||||
		bind.sock6,
 | 
			
		||||
		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(
 | 
			
		||||
		bind.sock4,
 | 
			
		||||
		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 {
 | 
			
		||||
	case unix.AF_INET6:
 | 
			
		||||
		return send6(bind.sock6, end, buff)
 | 
			
		||||
@ -236,7 +238,7 @@ func create6(port uint16) (int, uint16, error) {
 | 
			
		||||
	// create socket
 | 
			
		||||
 | 
			
		||||
	fd, err := unix.Socket(
 | 
			
		||||
		unix.AF_INET,
 | 
			
		||||
		unix.AF_INET6,
 | 
			
		||||
		unix.SOCK_DGRAM,
 | 
			
		||||
		0,
 | 
			
		||||
	)
 | 
			
		||||
@ -342,7 +344,7 @@ func send6(sock int, end *Endpoint, buff []byte) error {
 | 
			
		||||
		unix.Cmsghdr{
 | 
			
		||||
			Level: unix.IPPROTO_IPV6,
 | 
			
		||||
			Type:  unix.IPV6_PKTINFO,
 | 
			
		||||
			Len:   unix.SizeofInet6Pktinfo,
 | 
			
		||||
			Len:   unix.SizeofInet6Pktinfo + unix.SizeofCmsghdr,
 | 
			
		||||
		},
 | 
			
		||||
		unix.Inet6Pktinfo{
 | 
			
		||||
			Addr:    end.src.Addr,
 | 
			
		||||
@ -368,15 +370,31 @@ func send6(sock int, end *Endpoint, buff []byte) error {
 | 
			
		||||
		uintptr(unsafe.Pointer(&msghdr)),
 | 
			
		||||
		0,
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	if errno == 0 {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// clear src and retry
 | 
			
		||||
 | 
			
		||||
	if errno == unix.EINVAL {
 | 
			
		||||
		end.ClearSrc()
 | 
			
		||||
		cmsg.pktinfo = unix.Inet6Pktinfo{}
 | 
			
		||||
		_, _, errno = unix.Syscall(
 | 
			
		||||
			unix.SYS_SENDMSG,
 | 
			
		||||
			uintptr(sock),
 | 
			
		||||
			uintptr(unsafe.Pointer(&msghdr)),
 | 
			
		||||
			0,
 | 
			
		||||
		)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return errno
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func send4(sock int, end *Endpoint, buff []byte) error {
 | 
			
		||||
	println("send 4")
 | 
			
		||||
	println(end.DstToString())
 | 
			
		||||
	println(sock)
 | 
			
		||||
 | 
			
		||||
	// construct message header
 | 
			
		||||
 | 
			
		||||
@ -393,7 +411,7 @@ func send4(sock int, end *Endpoint, buff []byte) error {
 | 
			
		||||
		unix.Cmsghdr{
 | 
			
		||||
			Level: unix.IPPROTO_IP,
 | 
			
		||||
			Type:  unix.IP_PKTINFO,
 | 
			
		||||
			Len:   unix.SizeofInet4Pktinfo,
 | 
			
		||||
			Len:   unix.SizeofInet4Pktinfo + unix.SizeofCmsghdr,
 | 
			
		||||
		},
 | 
			
		||||
		unix.Inet4Pktinfo{
 | 
			
		||||
			Spec_dst: src4.src.Addr,
 | 
			
		||||
@ -419,10 +437,11 @@ func send4(sock int, end *Endpoint, buff []byte) error {
 | 
			
		||||
		0,
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	println(sock)
 | 
			
		||||
	fmt.Println(errno)
 | 
			
		||||
	if errno == 0 {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// clear source cache and try again
 | 
			
		||||
	// clear source and try again
 | 
			
		||||
 | 
			
		||||
	if errno == unix.EINVAL {
 | 
			
		||||
		end.ClearSrc()
 | 
			
		||||
 | 
			
		||||
@ -84,7 +84,10 @@ func main() {
 | 
			
		||||
 | 
			
		||||
	logInfo := device.log.Info
 | 
			
		||||
	logError := device.log.Error
 | 
			
		||||
	logInfo.Println("Starting device")
 | 
			
		||||
	logDebug := device.log.Debug
 | 
			
		||||
 | 
			
		||||
	logInfo.Println("Device started")
 | 
			
		||||
	logDebug.Println("Debug log enabled")
 | 
			
		||||
 | 
			
		||||
	// start configuration lister
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										11
									
								
								src/peer.go
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								src/peer.go
									
									
									
									
									
								
							@ -138,6 +138,17 @@ func (device *Device) NewPeer(pk NoisePublicKey) (*Peer, error) {
 | 
			
		||||
	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
 | 
			
		||||
 */
 | 
			
		||||
func (peer *Peer) String() string {
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										12
									
								
								src/send.go
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								src/send.go
									
									
									
									
									
								
							@ -2,7 +2,6 @@ package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/binary"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"golang.org/x/crypto/chacha20poly1305"
 | 
			
		||||
	"golang.org/x/net/ipv4"
 | 
			
		||||
	"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
 | 
			
		||||
 * into nonce queue for peer
 | 
			
		||||
 *
 | 
			
		||||
 | 
			
		||||
@ -135,7 +135,7 @@ func ipcSetOperation(device *Device, socket *bufio.ReadWriter) *IPCError {
 | 
			
		||||
			case "listen_port":
 | 
			
		||||
				port, err := strconv.ParseUint(value, 10, 16)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					logError.Println("Failed to set listen_port:", err)
 | 
			
		||||
					logError.Println("Failed to parse listen_port:", err)
 | 
			
		||||
					return &IPCError{Code: ipcErrorInvalid}
 | 
			
		||||
				}
 | 
			
		||||
				device.net.port = uint16(port)
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user