@@ -643,7 +643,7 @@ func createGenericKprobeSensor(
643
643
}
644
644
dups [sym ] = instance
645
645
646
- id , err := addKprobe (sym , instance , & kprobes [i ], & in )
646
+ id , err := addKprobe (sym , instance , & kprobes [i ], & in , has )
647
647
if err != nil {
648
648
return nil , err
649
649
}
@@ -703,7 +703,7 @@ func initEventConfig() *api.EventConfig {
703
703
// addKprobe will, amongst other things, create a generic kprobe entry and add
704
704
// it to the genericKprobeTable. The caller should make sure that this entry is
705
705
// properly removed on kprobe removal.
706
- func addKprobe (funcName string , instance int , f * v1alpha1.KProbeSpec , in * addKprobeIn ) (id idtable.EntryID , err error ) {
706
+ func addKprobe (funcName string , instance int , f * v1alpha1.KProbeSpec , in * addKprobeIn , has hasMaps ) (id idtable.EntryID , err error ) {
707
707
var argSigPrinters []argPrinter
708
708
var argReturnPrinters []argPrinter
709
709
var setRetprobe bool
@@ -920,7 +920,8 @@ func addKprobe(funcName string, instance int, f *v1alpha1.KProbeSpec, in *addKpr
920
920
eventConfig .FuncId = uint32 (kprobeEntry .tableId .ID )
921
921
922
922
logger .GetLogger ().
923
- Info ("Added kprobe" , "return" , setRetprobe , "function" , kprobeEntry .funcName , "override" , kprobeEntry .hasOverride )
923
+ Info ("Added kprobe" , "return" , setRetprobe , "function" , kprobeEntry .funcName ,
924
+ "override" , kprobeEntry .hasOverride , "enforcer" , has .enforcer )
924
925
925
926
return kprobeEntry .tableId , nil
926
927
}
@@ -931,20 +932,48 @@ func createKprobeSensorFromEntry(polInfo *policyInfo, kprobeEntry *genericKprobe
931
932
loadProgName , loadProgRetName := config .GenericKprobeObjs (false )
932
933
isSecurityFunc := strings .HasPrefix (kprobeEntry .funcName , "security_" )
933
934
935
+ useFentry := false
936
+
934
937
pinProg := kprobeEntry .funcName
935
938
if kprobeEntry .instance != 0 {
936
939
pinProg = fmt .Sprintf ("%s:%d" , kprobeEntry .funcName , kprobeEntry .instance )
937
940
}
938
941
939
- load := program .Builder (
940
- path .Join (option .Config .HubbleLib , loadProgName ),
941
- kprobeEntry .funcName ,
942
- "kprobe/generic_kprobe" ,
943
- pinProg ,
944
- "generic_kprobe" ).
945
- SetLoaderData (kprobeEntry .tableId ).
946
- SetPolicy (kprobeEntry .policyName )
942
+ var load * program.Program
943
+
944
+ if useFentry {
945
+ data := & program.TracingAttachData {
946
+ AttachTo : kprobeEntry .funcName ,
947
+ }
948
+
949
+ loadProgName , loadProgRetName = config .GenericTracingObjs ()
950
+
951
+ load = program .Builder (
952
+ path .Join (option .Config .HubbleLib , loadProgName ),
953
+ kprobeEntry .funcName ,
954
+ "fentry/generic_fentry" ,
955
+ pinProg ,
956
+ "generic_kprobe" ).
957
+ SetAttachData (data )
958
+
959
+ tailCalls := program .MapBuilderProgram ("fentry_calls" , load )
960
+ maps = append (maps , tailCalls )
961
+ } else {
962
+ load = program .Builder (
963
+ path .Join (option .Config .HubbleLib , loadProgName ),
964
+ kprobeEntry .funcName ,
965
+ "kprobe/generic_kprobe" ,
966
+ pinProg ,
967
+ "generic_kprobe" )
968
+
969
+ tailCalls := program .MapBuilderProgram ("kprobe_calls" , load )
970
+ maps = append (maps , tailCalls )
971
+ }
972
+
973
+ load .SetPolicy (kprobeEntry .policyName )
974
+ load .SetLoaderData (kprobeEntry .tableId )
947
975
load .Override = kprobeEntry .hasOverride
976
+
948
977
if load .Override {
949
978
load .OverrideFmodRet = isSecurityFunc && bpf .HasModifyReturn ()
950
979
}
@@ -959,9 +988,6 @@ func createKprobeSensorFromEntry(polInfo *policyInfo, kprobeEntry *genericKprobe
959
988
configMap := program .MapBuilderProgram ("config_map" , load )
960
989
maps = append (maps , configMap )
961
990
962
- tailCalls := program .MapBuilderProgram ("kprobe_calls" , load )
963
- maps = append (maps , tailCalls )
964
-
965
991
filterMap := program .MapBuilderProgram ("filter_map" , load )
966
992
maps = append (maps , filterMap )
967
993
@@ -1032,15 +1058,40 @@ func createKprobeSensorFromEntry(polInfo *policyInfo, kprobeEntry *genericKprobe
1032
1058
if kprobeEntry .instance != 0 {
1033
1059
pinRetProg = sensors .PathJoin (fmt .Sprintf ("%s_return:%d" , kprobeEntry .funcName , kprobeEntry .instance ))
1034
1060
}
1035
- loadret := program .Builder (
1036
- path .Join (option .Config .HubbleLib , loadProgRetName ),
1037
- kprobeEntry .funcName ,
1038
- "kprobe/generic_retkprobe" ,
1039
- pinRetProg ,
1040
- "generic_kprobe" ).
1041
- SetRetProbe (true ).
1042
- SetLoaderData (kprobeEntry .tableId ).
1043
- SetPolicy (kprobeEntry .policyName )
1061
+
1062
+ var loadret * program.Program
1063
+
1064
+ if useFentry {
1065
+ data := & program.TracingAttachData {
1066
+ AttachTo : kprobeEntry .funcName ,
1067
+ }
1068
+
1069
+ loadret = program .Builder (
1070
+ path .Join (option .Config .HubbleLib , loadProgRetName ),
1071
+ kprobeEntry .funcName ,
1072
+ "fexit/generic_fexit" ,
1073
+ pinRetProg ,
1074
+ "generic_kprobe" ).
1075
+ SetAttachData (data )
1076
+
1077
+ tailCalls := program .MapBuilderProgram ("fexit_calls" , loadret )
1078
+ maps = append (maps , tailCalls )
1079
+ } else {
1080
+ loadret = program .Builder (
1081
+ path .Join (option .Config .HubbleLib , loadProgRetName ),
1082
+ kprobeEntry .funcName ,
1083
+ "kprobe/generic_retkprobe" ,
1084
+ pinRetProg ,
1085
+ "generic_kprobe" )
1086
+
1087
+ tailCalls := program .MapBuilderProgram ("retkprobe_calls" , loadret )
1088
+ maps = append (maps , tailCalls )
1089
+ }
1090
+
1091
+ loadret .SetRetProbe (true )
1092
+ loadret .SetLoaderData (kprobeEntry .tableId )
1093
+ loadret .SetPolicy (kprobeEntry .policyName )
1094
+
1044
1095
progs = append (progs , loadret )
1045
1096
1046
1097
retProbe := program .MapBuilderSensor ("retprobe_map" , loadret )
@@ -1049,9 +1100,6 @@ func createKprobeSensorFromEntry(polInfo *policyInfo, kprobeEntry *genericKprobe
1049
1100
retConfigMap := program .MapBuilderProgram ("config_map" , loadret )
1050
1101
maps = append (maps , retConfigMap )
1051
1102
1052
- tailCalls := program .MapBuilderProgram ("retkprobe_calls" , loadret )
1053
- maps = append (maps , tailCalls )
1054
-
1055
1103
filterMap := program .MapBuilderProgram ("filter_map" , loadret )
1056
1104
maps = append (maps , filterMap )
1057
1105
@@ -1125,10 +1173,14 @@ func loadSingleKprobeSensor(id idtable.EntryID, bpfDir string, load *program.Pro
1125
1173
}
1126
1174
load .MapLoad = append (load .MapLoad , config )
1127
1175
1128
- if err := program .LoadKprobeProgram (bpfDir , load , maps , verbose ); err == nil {
1129
- logger .GetLogger ().Info (fmt .Sprintf ("Loaded generic kprobe program: %s -> %s" , load .Name , load .Attach ))
1176
+ if load .Label == "fentry/generic_fentry" || load .Label == "fexit/generic_fexit" {
1177
+ if err = program .LoadTracingProgram (bpfDir , load , maps , verbose ); err == nil {
1178
+ logger .GetLogger ().Info (fmt .Sprintf ("Loaded generic fentry program: %s -> %s" , load .Name , load .Attach ))
1179
+ }
1130
1180
} else {
1131
- return err
1181
+ if err = program .LoadKprobeProgram (bpfDir , load , maps , verbose ); err == nil {
1182
+ logger .GetLogger ().Info (fmt .Sprintf ("Loaded generic kprobe program: %s -> %s" , load .Name , load .Attach ))
1183
+ }
1132
1184
}
1133
1185
1134
1186
return err
0 commit comments