bpf_struct.go 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. package modelse
  2. const (
  3. ETR_OK = 0
  4. ETR_NOTEXIST = -4
  5. ETR_UPDATE_MAP_FAILD = -9 /* update map failed */
  6. ETR_NOTSUPP = -14
  7. ETR_MAP_DELETE_KEY_FAILD = -2 /* map delete key failed */
  8. )
  9. const (
  10. // eBPF Map Name
  11. MAP_MEMBERS_OFFSET_NAME = "__members_offset"
  12. MAP_SOCKET_INFO_NAME = "__socket_info_map"
  13. MAP_TRACE_NAME = "__trace_map"
  14. MAP_PERF_SOCKET_DATA_NAME = "__socket_data"
  15. MAP_TRACE_CONF_NAME = "__trace_conf_map"
  16. MAP_TRACE_STATS_NAME = "__trace_stats_map"
  17. MAP_PROTO_FILTER_NAME = "__protocol_filter"
  18. MAP_ALLOW_PORT_BITMAP_NAME = "__allow_port_bitmap"
  19. MAP_ADAPT_KERN_UID_NAME = "__adapt_kern_uid_map"
  20. //Program jmp tables
  21. MAP_PROGS_JMP_KP_NAME = "__progs_jmp_kp_map"
  22. MAP_PROGS_JMP_TP_NAME = "__progs_jmp_tp_map"
  23. MAP_PROGS_JMP_UP_NAME = "__progs_jmp_up_map"
  24. MAP_PROC_INFO_MAP_NAME = "proc_info_map"
  25. // This prog is designed to handle data transfer
  26. PROGUP = "bpf_prog_up__"
  27. PROGKP = "bpf_prog_kp__"
  28. PROGTP = "bpf_prog_tp__"
  29. PROG_DATA_SUBMIT_NAME_FOR_KP = PROGKP + "data_submit"
  30. PROG_DATA_SUBMIT_NAME_FOR_TP = PROGTP + "data_submit"
  31. PROG_OUTPUT_DATA_NAME_FOR_KP = PROGKP + "output_data"
  32. PROG_OUTPUT_DATA_NAME_FOR_TP = PROGTP + "output_data"
  33. PROG_IO_EVENT_NAME_FOR_TP = PROGTP + "io_event"
  34. PROG_SAVE_SC_DATA_FOR_UP = PROGUP + "java_save_sc"
  35. PROG_JAVA_UPDATE_HEADER_FOR_UP = PROGUP + "java_update_header"
  36. PROG_JAVA_FIND_HOST_FOR_UP = PROGUP + "java_find_host"
  37. PROG_JAVA_BUILD_HEADER_FOR_UP = PROGUP + "java_build_header"
  38. PROG_GO_UPDATE_HEADER_FOR_UP = PROGUP + "go_update_header"
  39. PROG_L7_HTTP_TRACE_ID_FOR_TP = PROGTP + "l7_http_trace_id"
  40. )
  41. const (
  42. PROG_DATA_SUBMIT_TP_IDX = iota
  43. PROG_OUTPUT_DATA_TP_IDX
  44. PROG_IO_EVENT_TP_IDX
  45. PROG_DATA_L7_HTTP_TRACE_ID_TP_IDX
  46. PROG_TP_NUM
  47. )
  48. const (
  49. PROG_DATA_SUBMIT_KP_IDX = iota
  50. PROG_OUTPUT_DATA_KP_IDX
  51. PROG_KP_NUM
  52. )
  53. const (
  54. PROG_DATA_SAVE_UP_IDX = iota
  55. PROG_DATA_JAVA_UPDATE_HEADER_UP_IDX
  56. PROG_DATA_JAVA_FIND_HOST_UP_IDX
  57. PROG_DATA_JAVA_BUILD_HEADER_UP_IDX
  58. PROG_DATA_GO_UPDATE_HEADER_UP_IDX
  59. PROG_UPROBE_NUM
  60. )
  61. // 数据协议
  62. const (
  63. PROTO_UNKNOWN = 0
  64. PROTO_ORTHER = 1
  65. PROTO_HTTP1 = 20
  66. PROTO_HTTP2 = 21
  67. PROTO_TLS_HTTP1 = 22
  68. PROTO_TLS_HTTP2 = 23
  69. PROTO_DUBBO = 40
  70. PROTO_SOFARPC = 43
  71. PROTO_MYSQL = 60
  72. PROTO_POSTGRESQL = 61
  73. PROTO_REDIS = 80
  74. PROTO_KAFKA = 100
  75. PROTO_MQTT = 101
  76. PROTO_DNS = 120
  77. PROTO_NUM = 130
  78. )
  79. const (
  80. HASH_SIZE = 8
  81. )
  82. var EbpfConfigProtocolFilter [PROTO_NUM]uint32
  83. type TestStruct struct {
  84. Test_id uint32
  85. }
  86. type BpfOffsetParam struct {
  87. Ready uint32 `json:"ready"`
  88. TaskFilesOffset uint32 `json:"task__files_offset"`
  89. SockFlagsOffset uint32 `json:"sock__flags_offset"`
  90. TcpSockCopiedSeqOffset uint32 `json:"tcp_sock__copied_seq_offset"`
  91. TcpSockWriteSeqOffset uint32 `json:"tcp_sock__write_seq_offset"`
  92. StructFilesStructFdtOffset uint32 `json:"struct_files_struct_fdt_offset"`
  93. StructFilesPrivateDataOffset uint32 `json:"struct_files_private_data_offset"`
  94. StructFileFInodeOffset uint32 `json:"struct_file_f_inode_offset"`
  95. StructInodeIModeOffset uint32 `json:"struct_inode_i_mode_offset"`
  96. StructFileDentryOffset uint32 `json:"struct_file_dentry_offset"`
  97. StructDentryNameOffset uint32 `json:"struct_dentry_name_offset"`
  98. StructSockFamilyOffset uint32 `json:"struct_sock_family_offset"`
  99. StructSockSaddrOffset uint32 `json:"struct_sock_saddr_offset"`
  100. StructSockDaddrOffset uint32 `json:"struct_sock_daddr_offset"`
  101. StructSockIp6saddrOffset uint32 `json:"struct_sock_ip6saddr_offset"`
  102. StructSockIp6daddrOffset uint32 `json:"struct_sock_ip6daddr_offset"`
  103. StructSockDportOffset uint32 `json:"struct_sock_dport_offset"`
  104. StructSockSportOffset uint32 `json:"struct_sock_sport_offset"`
  105. StructSockSkcStateOffset uint32 `json:"struct_sock_skc_state_offset"`
  106. StructSockCommonIpv6onlyOffset uint32 `json:"struct_sock_common_ipv6only_offset"`
  107. }
  108. const (
  109. OFFSET_IDX_GOID_RUNTIME_G = iota
  110. OFFSET_IDX_CONN_TLS_CONN
  111. OFFSET_IDX_SYSFD_POLL_FD
  112. OFFSET_IDX_CONN_HTTP2_SERVER_CONN
  113. OFFSET_IDX_TCONN_HTTP2_CLIENT_CONN
  114. OFFSET_IDX_CC_HTTP2_CLIENT_CONN_READ_LOOP
  115. OFFSET_IDX_CONN_GRPC_HTTP2_CLIENT
  116. OFFSET_IDX_CONN_GRPC_HTTP2_SERVER
  117. OFFSET_IDX_FRAMER_GRPC_TRANSPORT_LOOPY_WRITER
  118. OFFSET_IDX_WRITER_GRPC_TRANSPORT_FRAMER
  119. OFFSET_IDX_CONN_GRPC_TRANSPORT_BUFWRITER
  120. OFFSET_IDX_SIDE_GRPC_TRANSPORT_LOOPY_WRITER
  121. OFFSET_IDX_FIELDS_HTTP2_META_HEADERS_FRAME
  122. OFFSET_IDX_STREAM_HTTP2_CLIENT_CONN
  123. OFFSET_IDX_STREAM_ID_HTTP2_FRAME_HEADER
  124. OFFSET_IDX_MAX
  125. )
  126. type EbpfTraceConf struct {
  127. SocketID uint64 // 会话标识
  128. CoroutineTraceID uint64 // 同一协程的数据转发关联
  129. ThreadTraceID uint64 // 同一进程/线程的数据转发关联,用于多事务流转场景
  130. DataLimitMax uint64 // Maximum number of data transfers
  131. GoTracingTimeout uint64
  132. IOEventCollectMode uint64
  133. IOEventMinimalDuartion uint64
  134. TotalCpus uint64
  135. HostID HashByte
  136. APPID HashByte
  137. }
  138. /*
  139. struct ebpf_proc_info {
  140. __u32 version;
  141. __u16 offsets[OFFSET_IDX_MAX];
  142. // In golang, itab represents type, and in interface, struct is represented
  143. // by the address of itab. We use itab to judge the structure type, and
  144. // find the fd representing the connection after multiple jumps. These
  145. // types are not available in Go ELF files without a symbol table.
  146. // Go 用 itab 表示类型, 在 interface 中通过 itab 确定具体的 struct, 并根据
  147. // struct 找到表示连接的 fd.
  148. __u64 net_TCPConn_itab;
  149. __u64 crypto_tls_Conn_itab; // TLS_HTTP1,TLS_HTTP2
  150. __u64 credentials_syscallConn_itab; // gRPC
  151. __u64 start_addr;
  152. __u64 end_addr;
  153. unsigned char instance_id[APM_INSTANCE_ID_SIZE];
  154. __u64 method_ptr_pos;
  155. __u64 url_ptr_pos;
  156. __u64 path_ptr_pos;
  157. __u64 status_code_pos;
  158. __u64 request_host_pos;
  159. __u64 request_proto_pos;
  160. __u64 ctx_ptr_pos;
  161. __u64 headers_ptr_pos;
  162. __u64 buckets_ptr_pos;
  163. __u64 use_swiss_map;
  164. //gRPC
  165. __u64 httpclient_nextid_pos;
  166. __u64 stream_method_ptr_pos;
  167. __u64 stream_ctx_pos;
  168. __u8 is_new_frame_pos;
  169. } __attribute__((packed));
  170. */
  171. type EbpfProcInfo struct {
  172. Version uint32
  173. Offsets [OFFSET_IDX_MAX]uint16
  174. NetTCPConnItab uint64
  175. CryptoTLSConnItab uint64 // TLS_HTTP1,TLS_HTTP2
  176. CredentialsSyscallConnItab uint64 // gRPC
  177. StartAddr uint64
  178. EndAddr uint64
  179. InstanceId HashByte
  180. AppId HashByte
  181. CodeType uint16
  182. // go http
  183. MethodPtrPos uint64
  184. UrlPtrPos uint64
  185. PathPtrPos uint64
  186. StatusCodePos uint64
  187. RequestHostPos uint64
  188. ProtoPos uint64
  189. CtxPtrPos uint64
  190. HeadersPtrPos uint64
  191. BucketsPtrPos uint64
  192. UseSwissMap uint64
  193. // gRPC
  194. HttpClientNextidPos uint64
  195. StreamMethodPtrPos uint64
  196. StreamCtxPos uint64
  197. IsNewFramePos uint8
  198. }
  199. type allowPortBitmap struct {
  200. Bitmap [65536 / 8]uint8
  201. }
  202. /*
  203. struct connection_id {
  204. __u64 fd;
  205. __u32 pid;
  206. };
  207. */
  208. type ConnectionId struct {
  209. FD uint64
  210. PID uint32
  211. _ uint32
  212. }
  213. /*
  214. struct connection {
  215. __u64 timestamp;
  216. __u64 bytes_sent;
  217. __u64 bytes_received;
  218. __u64 first_read_time;
  219. __u64 first_write_time;
  220. __u64 new_read_time;
  221. __u16 sport;
  222. __u16 dport;
  223. __u8 saddr[16];
  224. __u8 daddr[16];
  225. } __attribute__((packed));
  226. */
  227. /* 保持与c符号对齐 */
  228. type Connection struct {
  229. Timestamp uint64 // __u64
  230. BytesSent uint64 // __u64
  231. BytesReceived uint64 // __u64
  232. FirstReadTime uint64 // __u64
  233. FirstWriteTime uint64 // __u64
  234. NewReadTime uint64 // __u64
  235. Sport uint16 // __u16
  236. Dport uint16 // __u16
  237. Saddr [16]uint8 // __u8[16]
  238. Daddr [16]uint8 // __u8[16]
  239. }
  240. /* 保持与c符号对齐 */