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
|
// 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 {
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
11
src/peer.go
11
src/peer.go
|
@ -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 {
|
||||||
|
|
12
src/send.go
12
src/send.go
|
@ -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
|
||||||
*
|
*
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue