mirror of
https://github.com/slackhq/nebula.git
synced 2025-11-22 16:34:25 +01:00
83 lines
1.7 KiB
Go
83 lines
1.7 KiB
Go
//go:build linux && (amd64 || arm64 || ppc64 || ppc64le || mips64 || mips64le || s390x || riscv64 || loong64) && !android && !e2e_testing
|
|
// +build linux
|
|
// +build amd64 arm64 ppc64 ppc64le mips64 mips64le s390x riscv64 loong64
|
|
// +build !android
|
|
// +build !e2e_testing
|
|
|
|
package udp
|
|
|
|
import (
|
|
"github.com/slackhq/nebula/packet"
|
|
"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
|
|
}
|
|
|
|
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 getRawMessageControlLen(msg *rawMessage) int {
|
|
return int(msg.Hdr.Controllen)
|
|
}
|
|
|
|
func setCmsgLen(h *unix.Cmsghdr, l int) {
|
|
h.Len = uint64(l)
|
|
}
|
|
|
|
func (u *StdConn) PrepareRawMessages(n int, isV4 bool) ([]rawMessage, []*packet.Packet) {
|
|
msgs := make([]rawMessage, n)
|
|
packets := make([]*packet.Packet, n)
|
|
|
|
for i := range msgs {
|
|
packets[i] = packet.New(isV4)
|
|
|
|
vs := []iovec{
|
|
{Base: &packets[i].Payload[0], Len: uint64(packet.Size)},
|
|
}
|
|
|
|
msgs[i].Hdr.Iov = &vs[0]
|
|
msgs[i].Hdr.Iovlen = uint64(len(vs))
|
|
|
|
msgs[i].Hdr.Name = &packets[i].Name[0]
|
|
msgs[i].Hdr.Namelen = uint32(len(packets[i].Name))
|
|
|
|
if u.enableGRO {
|
|
msgs[i].Hdr.Control = &packets[i].Control[0]
|
|
msgs[i].Hdr.Controllen = uint64(len(packets[i].Control))
|
|
} else {
|
|
msgs[i].Hdr.Control = nil
|
|
msgs[i].Hdr.Controllen = 0
|
|
}
|
|
}
|
|
|
|
return msgs, packets
|
|
}
|