mirror of
https://github.com/slackhq/nebula.git
synced 2025-11-22 08:24:25 +01:00
86 lines
1.7 KiB
Go
86 lines
1.7 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/binary"
|
|
"fmt"
|
|
"net/netip"
|
|
"unsafe"
|
|
|
|
"golang.org/x/sys/unix"
|
|
)
|
|
|
|
type iovec struct {
|
|
Base *byte
|
|
Len uint64
|
|
}
|
|
|
|
type msghdr struct {
|
|
Name *byte
|
|
Namelen uint32
|
|
Pad0 [4]byte
|
|
Iov *iovec
|
|
Iovlen uint64
|
|
Control *byte
|
|
Controllen uint64
|
|
Flags int32
|
|
Pad1 [4]byte
|
|
}
|
|
|
|
type rawMessage struct {
|
|
Hdr msghdr
|
|
Len uint32
|
|
Pad0 [4]byte
|
|
}
|
|
|
|
type BatchPacket struct {
|
|
Payload []byte
|
|
Addr netip.AddrPort
|
|
}
|
|
|
|
func encodeSockaddr(dst []byte, addr netip.AddrPort) (uint32, error) {
|
|
if addr.Addr().Is4() {
|
|
if !addr.Addr().Is4() {
|
|
return 0, fmt.Errorf("Listener is IPv4, but writing to IPv6 remote")
|
|
}
|
|
var sa unix.RawSockaddrInet4
|
|
sa.Family = unix.AF_INET
|
|
sa.Addr = addr.Addr().As4()
|
|
binary.BigEndian.PutUint16((*[2]byte)(unsafe.Pointer(&sa.Port))[:], addr.Port())
|
|
size := unix.SizeofSockaddrInet4
|
|
copy(dst[:size], (*(*[unix.SizeofSockaddrInet4]byte)(unsafe.Pointer(&sa)))[:])
|
|
return uint32(size), nil
|
|
}
|
|
|
|
var sa unix.RawSockaddrInet6
|
|
sa.Family = unix.AF_INET6
|
|
sa.Addr = addr.Addr().As16()
|
|
binary.BigEndian.PutUint16((*[2]byte)(unsafe.Pointer(&sa.Port))[:], addr.Port())
|
|
size := unix.SizeofSockaddrInet6
|
|
copy(dst[:size], (*(*[unix.SizeofSockaddrInet6]byte)(unsafe.Pointer(&sa)))[:])
|
|
return uint32(size), nil
|
|
}
|
|
|
|
func setRawMessageControl(msg *rawMessage, buf []byte) {
|
|
if len(buf) == 0 {
|
|
msg.Hdr.Control = nil
|
|
msg.Hdr.Controllen = 0
|
|
return
|
|
}
|
|
msg.Hdr.Control = &buf[0]
|
|
msg.Hdr.Controllen = uint64(len(buf))
|
|
}
|
|
|
|
func setCmsgLen(h *unix.Cmsghdr, l int) {
|
|
h.Len = uint64(l)
|
|
}
|
|
|
|
func setIovecSlice(iov *iovec, b []byte) {
|
|
if len(b) == 0 {
|
|
iov.Base = nil
|
|
iov.Len = 0
|
|
return
|
|
}
|
|
iov.Base = &b[0]
|
|
iov.Len = uint64(len(b))
|
|
}
|