mirror of
https://github.com/daeuniverse/dae.git
synced 2025-02-12 03:49:05 +07:00
53 lines
1.1 KiB
Go
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[:]),
|
|
}
|
|
}
|