mirror of
https://github.com/daeuniverse/dae.git
synced 2025-07-11 00:09:18 +07:00
docs/fix: README; fix BatchUpdate version requirement
This commit is contained in:
@ -51,8 +51,9 @@ Note that if you bind dae to WAN only, dae only provide network service for loca
|
|||||||
|
|
||||||
1. Check dns upstream and source loop (whether upstream is also a client of us) and remind the user to add sip rule.
|
1. Check dns upstream and source loop (whether upstream is also a client of us) and remind the user to add sip rule.
|
||||||
1. Domain routing performance optimization.
|
1. Domain routing performance optimization.
|
||||||
1. Handle the case that nodes do not support UDP.
|
1. Handle the case that nodes do not support UDP by adding `filter: l4proto_out(tcp, udp)`, and filter out those nodes support both TCP and UDP. Thus we can use routing to handle it.
|
||||||
1. Handle the case that nodes do not support IPv6.
|
1. Handle the case that nodes do not support IPv6 by adding `filter: ipversion_out(4, 6)`, and filter out those nodes support both IPv4 and IPv6. Thus we can use routing to handle it.
|
||||||
1. L4Checksum problem.
|
1. L4Checksum problem. Maybe it is hard to solve.
|
||||||
1. MACv2 extension extraction.
|
1. MACv2 extension extraction.
|
||||||
|
1. Log to userspace.
|
||||||
1. ...
|
1. ...
|
||||||
|
@ -71,43 +71,57 @@ func cidrToBpfLpmKey(prefix netip.Prefix) _bpfLpmKey {
|
|||||||
var (
|
var (
|
||||||
CheckBatchUpdateFeatureOnce sync.Once
|
CheckBatchUpdateFeatureOnce sync.Once
|
||||||
SimulateBatchUpdate bool
|
SimulateBatchUpdate bool
|
||||||
|
SimulateBatchUpdateLpmTrie bool
|
||||||
)
|
)
|
||||||
|
|
||||||
func BatchUpdate(m *ebpf.Map, keys interface{}, values interface{}, opts *ebpf.BatchOptions) (n int, err error) {
|
func BatchUpdate(m *ebpf.Map, keys interface{}, values interface{}, opts *ebpf.BatchOptions) (n int, err error) {
|
||||||
CheckBatchUpdateFeatureOnce.Do(func() {
|
CheckBatchUpdateFeatureOnce.Do(func() {
|
||||||
version, e := internal.KernelVersion()
|
version, e := internal.KernelVersion()
|
||||||
if e != nil || version.Less(consts.UserspaceBatchUpdateFeatureVersion) {
|
if e != nil {
|
||||||
|
SimulateBatchUpdate = true
|
||||||
|
SimulateBatchUpdateLpmTrie = true
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if version.Less(consts.UserspaceBatchUpdateFeatureVersion) {
|
||||||
SimulateBatchUpdate = true
|
SimulateBatchUpdate = true
|
||||||
}
|
}
|
||||||
if m.Type() == ebpf.LPMTrie && version.Less(consts.UserspaceBatchUpdateLpmTrieFeatureVersion) {
|
if version.Less(consts.UserspaceBatchUpdateLpmTrieFeatureVersion) {
|
||||||
SimulateBatchUpdate = true
|
SimulateBatchUpdateLpmTrie = true
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
if !SimulateBatchUpdate {
|
|
||||||
return m.BatchUpdate(keys, values, opts)
|
|
||||||
} else {
|
|
||||||
vKeys := reflect.ValueOf(keys)
|
|
||||||
if vKeys.Kind() != reflect.Slice {
|
|
||||||
return 0, fmt.Errorf("keys must be slice")
|
|
||||||
}
|
|
||||||
vVals := reflect.ValueOf(values)
|
|
||||||
if vVals.Kind() != reflect.Slice {
|
|
||||||
return 0, fmt.Errorf("values must be slice")
|
|
||||||
}
|
|
||||||
length := vKeys.Len()
|
|
||||||
if vVals.Len() != length {
|
|
||||||
return 0, fmt.Errorf("keys and values must have same length")
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < length; i++ {
|
simulate := SimulateBatchUpdate
|
||||||
vKey := vKeys.Index(i)
|
if m.Type() == ebpf.LPMTrie {
|
||||||
vVal := vVals.Index(i)
|
simulate = SimulateBatchUpdateLpmTrie
|
||||||
if err = m.Update(vKey.Interface(), vVal.Interface(), ebpf.MapUpdateFlags(opts.ElemFlags)); err != nil {
|
|
||||||
return i, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return vKeys.Len(), nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !simulate {
|
||||||
|
// Genuine BatchUpdate
|
||||||
|
return m.BatchUpdate(keys, values, opts)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Simulate
|
||||||
|
vKeys := reflect.ValueOf(keys)
|
||||||
|
if vKeys.Kind() != reflect.Slice {
|
||||||
|
return 0, fmt.Errorf("keys must be slice")
|
||||||
|
}
|
||||||
|
vVals := reflect.ValueOf(values)
|
||||||
|
if vVals.Kind() != reflect.Slice {
|
||||||
|
return 0, fmt.Errorf("values must be slice")
|
||||||
|
}
|
||||||
|
length := vKeys.Len()
|
||||||
|
if vVals.Len() != length {
|
||||||
|
return 0, fmt.Errorf("keys and values must have same length")
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := 0; i < length; i++ {
|
||||||
|
vKey := vKeys.Index(i)
|
||||||
|
vVal := vVals.Index(i)
|
||||||
|
if err = m.Update(vKey.Interface(), vVal.Interface(), ebpf.MapUpdateFlags(opts.ElemFlags)); err != nil {
|
||||||
|
return i, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return vKeys.Len(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func AssignBpfObjects(to *bpfObjects, from interface{}) {
|
func AssignBpfObjects(to *bpfObjects, from interface{}) {
|
||||||
|
Reference in New Issue
Block a user