dae/component/control/bpf_utils.go
2023-01-28 02:35:18 +08:00

53 lines
1.1 KiB
Go

/*
* SPDX-License-Identifier: AGPL-3.0-only
* Copyright (c) since 2022, mzz2017 <mzz@tuta.io>
*/
package control
import (
"github.com/cilium/ebpf"
"github.com/v2rayA/dae/common"
"net/netip"
)
type bpfLpmKey struct {
PrefixLen uint32
Data [4]uint32
}
func (o *bpfObjects) newLpmMap(keys []bpfLpmKey, values []uint32) (m *ebpf.Map, err error) {
m, err = ebpf.NewMap(&ebpf.MapSpec{
Type: ebpf.LPMTrie,
Flags: o.UnusedLpmType.Flags(),
MaxEntries: o.UnusedLpmType.MaxEntries(),
KeySize: o.UnusedLpmType.KeySize(),
ValueSize: o.UnusedLpmType.ValueSize(),
})
if err != nil {
return nil, err
}
if _, err = m.BatchUpdate(keys, values, &ebpf.BatchOptions{
ElemFlags: uint64(ebpf.UpdateAny),
}); err != nil {
return nil, err
}
return m, nil
}
func swap16(a uint16) uint16 {
return (a >> 8) + ((a & 0xFF) << 8)
}
func cidrToBpfLpmKey(prefix netip.Prefix) bpfLpmKey {
bits := prefix.Bits()
if prefix.Addr().Is4() {
bits += 96
}
ip := prefix.Addr().As16()
return bpfLpmKey{
PrefixLen: uint32(bits),
Data: common.Ipv6ByteSliceToUint32Array(ip[:]),
}
}