docs/fix: README; fix BatchUpdate version requirement

This commit is contained in:
mzz2017
2023-02-04 18:27:13 +08:00
parent 69f897b7e9
commit dcf8021500
2 changed files with 44 additions and 29 deletions

View File

@ -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. ...

View File

@ -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{}) {