bpf_struct.go 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  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. MAP_L4_HEADER_CODE_TYPES_NAME = "l4_header_code_types"
  26. MAP_L4_CWOTHER_ENABLED_NAME = "l4_cwother_enabled"
  27. // This prog is designed to handle data transfer
  28. PROGUP = "bpf_prog_up__"
  29. PROGKP = "bpf_prog_kp__"
  30. PROGTP = "bpf_prog_tp__"
  31. PROG_DATA_SUBMIT_NAME_FOR_KP = PROGKP + "data_submit"
  32. PROG_DATA_SUBMIT_NAME_FOR_TP = PROGTP + "data_submit"
  33. PROG_OUTPUT_DATA_NAME_FOR_KP = PROGKP + "output_data"
  34. PROG_OUTPUT_DATA_NAME_FOR_TP = PROGTP + "output_data"
  35. PROG_IO_EVENT_NAME_FOR_TP = PROGTP + "io_event"
  36. PROG_SAVE_SC_DATA_FOR_UP = PROGUP + "java_save_sc"
  37. PROG_JAVA_UPDATE_HEADER_FOR_UP = PROGUP + "java_update_header"
  38. PROG_JAVA_FIND_HOST_FOR_UP = PROGUP + "java_find_host"
  39. PROG_JAVA_BUILD_HEADER_FOR_UP = PROGUP + "java_build_header"
  40. PROG_GO_UPDATE_HEADER_FOR_UP = PROGUP + "go_update_header"
  41. PROG_L7_HTTP_TRACE_ID_FOR_TP = PROGTP + "l7_http_trace_id"
  42. )
  43. const (
  44. PROG_DATA_SUBMIT_TP_IDX = iota
  45. PROG_OUTPUT_DATA_TP_IDX
  46. PROG_IO_EVENT_TP_IDX
  47. PROG_DATA_L7_HTTP_TRACE_ID_TP_IDX
  48. PROG_TP_NUM
  49. )
  50. const (
  51. PROG_DATA_SUBMIT_KP_IDX = iota
  52. PROG_OUTPUT_DATA_KP_IDX
  53. PROG_KP_NUM
  54. )
  55. const (
  56. PROG_DATA_SAVE_UP_IDX = iota
  57. PROG_DATA_JAVA_UPDATE_HEADER_UP_IDX
  58. PROG_DATA_JAVA_FIND_HOST_UP_IDX
  59. PROG_DATA_JAVA_BUILD_HEADER_UP_IDX
  60. PROG_DATA_GO_UPDATE_HEADER_UP_IDX
  61. PROG_UPROBE_NUM
  62. )
  63. // 数据协议
  64. const (
  65. PROTO_UNKNOWN = 0
  66. PROTO_ORTHER = 1
  67. PROTO_HTTP1 = 20
  68. PROTO_HTTP2 = 21
  69. PROTO_TLS_HTTP1 = 22
  70. PROTO_TLS_HTTP2 = 23
  71. PROTO_DUBBO = 40
  72. PROTO_SOFARPC = 43
  73. PROTO_MYSQL = 60
  74. PROTO_POSTGRESQL = 61
  75. PROTO_REDIS = 80
  76. PROTO_KAFKA = 100
  77. PROTO_MQTT = 101
  78. PROTO_DNS = 120
  79. PROTO_NUM = 130
  80. )
  81. const (
  82. HASH_SIZE = 8
  83. )
  84. var EbpfConfigProtocolFilter [PROTO_NUM]uint32
  85. type TestStruct struct {
  86. Test_id uint32
  87. }
  88. type BpfOffsetParam struct {
  89. Ready uint32 `json:"ready"`
  90. TaskFilesOffset uint32 `json:"task__files_offset"`
  91. SockFlagsOffset uint32 `json:"sock__flags_offset"`
  92. TcpSockCopiedSeqOffset uint32 `json:"tcp_sock__copied_seq_offset"`
  93. TcpSockWriteSeqOffset uint32 `json:"tcp_sock__write_seq_offset"`
  94. StructFilesStructFdtOffset uint32 `json:"struct_files_struct_fdt_offset"`
  95. StructFilesPrivateDataOffset uint32 `json:"struct_files_private_data_offset"`
  96. StructFileFInodeOffset uint32 `json:"struct_file_f_inode_offset"`
  97. StructInodeIModeOffset uint32 `json:"struct_inode_i_mode_offset"`
  98. StructFileDentryOffset uint32 `json:"struct_file_dentry_offset"`
  99. StructDentryNameOffset uint32 `json:"struct_dentry_name_offset"`
  100. StructSockFamilyOffset uint32 `json:"struct_sock_family_offset"`
  101. StructSockSaddrOffset uint32 `json:"struct_sock_saddr_offset"`
  102. StructSockDaddrOffset uint32 `json:"struct_sock_daddr_offset"`
  103. StructSockIp6saddrOffset uint32 `json:"struct_sock_ip6saddr_offset"`
  104. StructSockIp6daddrOffset uint32 `json:"struct_sock_ip6daddr_offset"`
  105. StructSockDportOffset uint32 `json:"struct_sock_dport_offset"`
  106. StructSockSportOffset uint32 `json:"struct_sock_sport_offset"`
  107. StructSockSkcStateOffset uint32 `json:"struct_sock_skc_state_offset"`
  108. StructSockCommonIpv6onlyOffset uint32 `json:"struct_sock_common_ipv6only_offset"`
  109. }
  110. const (
  111. OFFSET_IDX_GOID_RUNTIME_G = iota
  112. OFFSET_IDX_CONN_TLS_CONN
  113. OFFSET_IDX_SYSFD_POLL_FD
  114. OFFSET_IDX_CONN_HTTP2_SERVER_CONN
  115. OFFSET_IDX_TCONN_HTTP2_CLIENT_CONN
  116. OFFSET_IDX_CC_HTTP2_CLIENT_CONN_READ_LOOP
  117. OFFSET_IDX_CONN_GRPC_HTTP2_CLIENT
  118. OFFSET_IDX_CONN_GRPC_HTTP2_SERVER
  119. OFFSET_IDX_FRAMER_GRPC_TRANSPORT_LOOPY_WRITER
  120. OFFSET_IDX_WRITER_GRPC_TRANSPORT_FRAMER
  121. OFFSET_IDX_CONN_GRPC_TRANSPORT_BUFWRITER
  122. OFFSET_IDX_SIDE_GRPC_TRANSPORT_LOOPY_WRITER
  123. OFFSET_IDX_FIELDS_HTTP2_META_HEADERS_FRAME
  124. OFFSET_IDX_STREAM_HTTP2_CLIENT_CONN
  125. OFFSET_IDX_STREAM_ID_HTTP2_FRAME_HEADER
  126. OFFSET_IDX_P_GOIDCACHE // runtime.p.goidcache
  127. OFFSET_IDX_P_RUNNEXT // runtime.p.runnext
  128. OFFSET_IDX_MAX
  129. )
  130. type EbpfTraceConf struct {
  131. SocketID uint64 // 会话标识
  132. CoroutineTraceID uint64 // 同一协程的数据转发关联
  133. ThreadTraceID uint64 // 同一进程/线程的数据转发关联,用于多事务流转场景
  134. DataLimitMax uint64 // Maximum number of data transfers
  135. GoTracingTimeout uint64
  136. IOEventCollectMode uint64
  137. IOEventMinimalDuartion uint64
  138. TotalCpus uint64
  139. HostID HashByte
  140. APPID HashByte
  141. }
  142. /*
  143. struct ebpf_proc_info {
  144. __u32 version;
  145. __u16 offsets[OFFSET_IDX_MAX];
  146. // In golang, itab represents type, and in interface, struct is represented
  147. // by the address of itab. We use itab to judge the structure type, and
  148. // find the fd representing the connection after multiple jumps. These
  149. // types are not available in Go ELF files without a symbol table.
  150. // Go 用 itab 表示类型, 在 interface 中通过 itab 确定具体的 struct, 并根据
  151. // struct 找到表示连接的 fd.
  152. __u64 net_TCPConn_itab;
  153. __u64 crypto_tls_Conn_itab; // TLS_HTTP1,TLS_HTTP2
  154. __u64 credentials_syscallConn_itab; // gRPC
  155. __u64 start_addr;
  156. __u64 end_addr;
  157. unsigned char instance_id[APM_INSTANCE_ID_SIZE];
  158. __u64 method_ptr_pos;
  159. __u64 url_ptr_pos;
  160. __u64 path_ptr_pos;
  161. __u64 status_code_pos;
  162. __u64 request_host_pos;
  163. __u64 request_proto_pos;
  164. __u64 ctx_ptr_pos;
  165. __u64 headers_ptr_pos;
  166. __u64 buckets_ptr_pos;
  167. __u64 use_swiss_map;
  168. //gRPC
  169. __u64 httpclient_nextid_pos;
  170. __u64 stream_method_ptr_pos;
  171. __u64 stream_ctx_pos;
  172. __u8 is_new_frame_pos;
  173. } __attribute__((packed));
  174. */
  175. type EbpfProcInfo struct {
  176. Version uint32
  177. Offsets [OFFSET_IDX_MAX]uint16
  178. NetTCPConnItab uint64
  179. CryptoTLSConnItab uint64 // TLS_HTTP1,TLS_HTTP2
  180. CredentialsSyscallConnItab uint64 // gRPC
  181. StartAddr uint64
  182. EndAddr uint64
  183. InstanceId HashByte
  184. AppId HashByte
  185. CodeType uint16
  186. // go http
  187. MethodPtrPos uint64
  188. UrlPtrPos uint64
  189. PathPtrPos uint64
  190. StatusCodePos uint64
  191. RequestHostPos uint64
  192. UrlHostPos uint64 // url.URL.Host field offset
  193. ProtoPos uint64
  194. CtxPtrPos uint64
  195. HeadersPtrPos uint64
  196. BucketsPtrPos uint64
  197. UseSwissMap uint64
  198. // gRPC
  199. HttpClientNextidPos uint64
  200. StreamMethodPtrPos uint64
  201. StreamCtxPos uint64
  202. IsNewFramePos uint8
  203. // io writer
  204. IoWriterBufPtrPos uint64
  205. IoWriterNPos uint64
  206. // Kafka
  207. KafkaMessageKeyPos uint64
  208. KafkaMessageTopicPos uint64
  209. KafkaMessageHeadersPos uint64
  210. KafkaMessageTimePos uint64
  211. KafkaMessagePartitionPos uint64 // Message.Partition field offset
  212. KafkaMessageOffsetPos uint64 // Message.Offset field offset
  213. KafkaMessageValuePos uint64 // Message.Value field offset
  214. KafkaWriterTopicPos uint64
  215. KafkaWriterAddrPos uint64 // Writer.Brokers field offset
  216. KafkaReaderConfigPos uint64 // Reader.Config field offset
  217. KafkaReaderConfigGroupIDPos uint64 // Reader.Config.GroupID field offset
  218. KafkaReaderConfigTopicsPos uint64 // Reader.Config.Topics field offset
  219. // net.TCPAddr offsets
  220. TcpAddrIPOffset uint64 // net.TCPAddr.IP field offset
  221. TcpAddrPortOffset uint64 // net.TCPAddr.Port field offset
  222. // cwother header value: {app_name_len}:app_name:{SysTagLen}[:SysTag]
  223. Sysvc [76]byte // CW_SYS_HEADER_VAL_LENGTH
  224. }
  225. type allowedHeaderCodeTypes struct {
  226. CodeType uint16
  227. }
  228. type allowPortBitmap struct {
  229. Bitmap [65536 / 8]uint8
  230. }
  231. /*
  232. struct connection_id {
  233. __u64 fd;
  234. __u32 pid;
  235. };
  236. */
  237. type ConnectionId struct {
  238. FD uint64
  239. PID uint32
  240. _ uint32
  241. }
  242. /*
  243. struct connection {
  244. __u64 timestamp;
  245. __u64 bytes_sent;
  246. __u64 bytes_received;
  247. __u64 first_read_time;
  248. __u64 first_write_time;
  249. __u64 new_read_time;
  250. __u16 sport;
  251. __u16 dport;
  252. __u8 saddr[16];
  253. __u8 daddr[16];
  254. } __attribute__((packed));
  255. */
  256. /* 保持与c符号对齐 */
  257. type Connection struct {
  258. Timestamp uint64 // __u64
  259. BytesSent uint64 // __u64
  260. BytesReceived uint64 // __u64
  261. FirstReadTime uint64 // __u64
  262. FirstWriteTime uint64 // __u64
  263. NewReadTime uint64 // __u64
  264. Sport uint16 // __u16
  265. Dport uint16 // __u16
  266. Saddr [16]uint8 // __u8[16]
  267. Daddr [16]uint8 // __u8[16]
  268. }
  269. /* 保持与c符号对齐 */