forked from kmesh-net/kmesh
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpin.go
113 lines (96 loc) · 2.81 KB
/
pin.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
/*
* Copyright The Kmesh Authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package bpf
import (
"fmt"
"reflect"
"strings"
"github.com/cilium/ebpf"
)
func pinPrograms(value *reflect.Value, path string) error {
for i := 0; i < value.NumField(); i++ {
tp, ok := value.Field(i).Interface().(*ebpf.Program)
if tp == nil || !ok {
return fmt.Errorf("invalid pinPrograms ptr")
}
info, err := tp.Info()
if err != nil {
return fmt.Errorf("get prog info failed, %s", err)
}
if err := tp.Pin(path + info.Name); err != nil {
return fmt.Errorf("pin prog failed, %s", err)
}
}
return nil
}
func unpinPrograms(value *reflect.Value) error {
for i := 0; i < value.NumField(); i++ {
tp, ok := value.Field(i).Interface().(*ebpf.Program)
if !ok || tp == nil {
continue
}
if err := tp.Unpin(); err != nil {
return fmt.Errorf("unpin prog failed, %s", err)
}
}
return nil
}
// Due to the golint issue, comment unused functions temporaryly
// func pinMaps(value *reflect.Value, path string) error {
// for i := 0; i < value.NumField(); i++ {
// tp, ok := value.Field(i).Interface().(*ebpf.Map)
// if tp == nil || !ok {
// return fmt.Errorf("invalid pinMaps ptr")
// }
// info, err := tp.Info()
// if err != nil {
// return fmt.Errorf("get map info failed, %s", err)
// }
// if err := tp.Pin(path + info.Name); err != nil {
// return fmt.Errorf("pin map failed, %s", err)
// }
// }
// return nil
// }
func unpinMaps(value *reflect.Value) error {
for i := 0; i < value.NumField(); i++ {
tp, ok := value.Field(i).Interface().(*ebpf.Map)
if tp == nil || !ok {
continue
}
if err := tp.Unpin(); err != nil {
return fmt.Errorf("unpin prog failed, %s", err)
}
}
return nil
}
func setMapPinType(spec *ebpf.CollectionSpec, pinType ebpf.PinType) {
for key, v := range spec.Maps {
// tail_call map dont support pinning when shared by different bpf types
if strings.HasPrefix(key, ".rodata") || key == ".bss" || key == "kmesh_tail_call_prog" ||
key == "kmesh_tail_call_ctx" {
continue
}
v.Pinning = pinType
}
}
// Due to the golint issue, comment unused functions temporaryly
// func setProgBpfType(spec *ebpf.CollectionSpec, typ ebpf.ProgramType, atyp ebpf.AttachType) {
// for _, v := range spec.Programs {
// v.Type = typ
// v.AttachType = atyp
// }
// }