bpf_struct.go 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  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_P_GOIDCACHE // runtime.p.goidcache
  125. OFFSET_IDX_P_RUNNEXT // runtime.p.runnext
  126. OFFSET_IDX_MAX
  127. )
  128. type EbpfTraceConf struct {
  129. SocketID uint64 // 会话标识
  130. CoroutineTraceID uint64 // 同一协程的数据转发关联
  131. ThreadTraceID uint64 // 同一进程/线程的数据转发关联,用于多事务流转场景
  132. DataLimitMax uint64 // Maximum number of data transfers
  133. GoTracingTimeout uint64
  134. IOEventCollectMode uint64
  135. IOEventMinimalDuartion uint64
  136. TotalCpus uint64
  137. HostID HashByte
  138. APPID HashByte
  139. }
  140. /*
  141. struct ebpf_proc_info {
  142. __u32 version;
  143. __u16 offsets[OFFSET_IDX_MAX];
  144. // In golang, itab represents type, and in interface, struct is represented
  145. // by the address of itab. We use itab to judge the structure type, and
  146. // find the fd representing the connection after multiple jumps. These
  147. // types are not available in Go ELF files without a symbol table.
  148. // Go 用 itab 表示类型, 在 interface 中通过 itab 确定具体的 struct, 并根据
  149. // struct 找到表示连接的 fd.
  150. __u64 net_TCPConn_itab;
  151. __u64 crypto_tls_Conn_itab; // TLS_HTTP1,TLS_HTTP2
  152. __u64 credentials_syscallConn_itab; // gRPC
  153. __u64 start_addr;
  154. __u64 end_addr;
  155. unsigned char instance_id[APM_INSTANCE_ID_SIZE];
  156. __u64 method_ptr_pos;
  157. __u64 url_ptr_pos;
  158. __u64 path_ptr_pos;
  159. __u64 status_code_pos;
  160. __u64 request_host_pos;
  161. __u64 request_proto_pos;
  162. __u64 ctx_ptr_pos;
  163. __u64 headers_ptr_pos;
  164. __u64 buckets_ptr_pos;
  165. __u64 use_swiss_map;
  166. //gRPC
  167. __u64 httpclient_nextid_pos;
  168. __u64 stream_method_ptr_pos;
  169. __u64 stream_ctx_pos;
  170. __u8 is_new_frame_pos;
  171. } __attribute__((packed));
  172. */
  173. type EbpfProcInfo struct {
  174. Version uint32
  175. Offsets [OFFSET_IDX_MAX]uint16
  176. NetTCPConnItab uint64
  177. CryptoTLSConnItab uint64 // TLS_HTTP1,TLS_HTTP2
  178. CredentialsSyscallConnItab uint64 // gRPC
  179. StartAddr uint64
  180. EndAddr uint64
  181. InstanceId HashByte
  182. AppId HashByte
  183. CodeType uint16
  184. // go http
  185. MethodPtrPos uint64
  186. UrlPtrPos uint64
  187. PathPtrPos uint64
  188. StatusCodePos uint64
  189. RequestHostPos uint64
  190. ProtoPos uint64
  191. CtxPtrPos uint64
  192. HeadersPtrPos uint64
  193. BucketsPtrPos uint64
  194. UseSwissMap uint64
  195. // gRPC
  196. HttpClientNextidPos uint64
  197. StreamMethodPtrPos uint64
  198. StreamCtxPos uint64
  199. IsNewFramePos uint8
  200. // io writer
  201. IoWriterBufPtrPos uint64
  202. IoWriterNPos uint64
  203. // Kafka
  204. KafkaMessageKeyPos uint64
  205. KafkaMessageTopicPos uint64
  206. KafkaMessageHeadersPos uint64
  207. KafkaMessageTimePos uint64
  208. KafkaMessagePartitionPos uint64 // Message.Partition field offset
  209. KafkaMessageOffsetPos uint64 // Message.Offset field offset
  210. KafkaMessageValuePos uint64 // Message.Value field offset
  211. KafkaWriterTopicPos uint64
  212. KafkaWriterAddrPos uint64 // Writer.Brokers field offset
  213. KafkaReaderConfigPos uint64 // Reader.Config field offset
  214. KafkaReaderConfigGroupIDPos uint64 // Reader.Config.GroupID field offset
  215. KafkaReaderConfigTopicsPos uint64 // Reader.Config.Topics field offset
  216. // net.TCPAddr offsets
  217. TcpAddrIPOffset uint64 // net.TCPAddr.IP field offset
  218. TcpAddrPortOffset uint64 // net.TCPAddr.Port field offset
  219. }
  220. type allowPortBitmap struct {
  221. Bitmap [65536 / 8]uint8
  222. }
  223. /*
  224. struct connection_id {
  225. __u64 fd;
  226. __u32 pid;
  227. };
  228. */
  229. type ConnectionId struct {
  230. FD uint64
  231. PID uint32
  232. _ uint32
  233. }
  234. /*
  235. struct connection {
  236. __u64 timestamp;
  237. __u64 bytes_sent;
  238. __u64 bytes_received;
  239. __u64 first_read_time;
  240. __u64 first_write_time;
  241. __u64 new_read_time;
  242. __u16 sport;
  243. __u16 dport;
  244. __u8 saddr[16];
  245. __u8 daddr[16];
  246. } __attribute__((packed));
  247. */
  248. /* 保持与c符号对齐 */
  249. type Connection struct {
  250. Timestamp uint64 // __u64
  251. BytesSent uint64 // __u64
  252. BytesReceived uint64 // __u64
  253. FirstReadTime uint64 // __u64
  254. FirstWriteTime uint64 // __u64
  255. NewReadTime uint64 // __u64
  256. Sport uint16 // __u16
  257. Dport uint16 // __u16
  258. Saddr [16]uint8 // __u8[16]
  259. Daddr [16]uint8 // __u8[16]
  260. }
  261. /* 保持与c符号对齐 */