-
Notifications
You must be signed in to change notification settings - Fork 15
/
Copy pathnetdata_socket.h
196 lines (161 loc) · 4.83 KB
/
netdata_socket.h
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
// SPDX-License-Identifier: GPL-3.0-or-later
#ifndef _NETDATA_NETWORK_H_
#define _NETDATA_NETWORK_H_ 1
// Conflict with CO-RE code
// #include <linux/in6.h>
/**
* SOCKET
*/
/**
* Union used to store ip addresses
*/
union netdata_ip {
__u8 addr8[16];
__u16 addr16[8];
__u32 addr32[4];
__u64 addr64[2];
};
typedef struct netdata_socket {
char name[TASK_COMM_LEN];
// Timestamp
__u64 first; // First timestamp
__u64 ct; // Current timestamp
// Socket additional info
__u16 protocol;
__u16 family;
__u32 external_origin; // We are using only lower bits, so if it is
// necessary to store more info, this shoud be
// split in two __u16.
// Stats
// Number of bytes
struct {
__u32 call_tcp_sent;
__u32 call_tcp_received;
__u64 tcp_bytes_sent;
__u64 tcp_bytes_received;
__u32 close; //It is never used with UDP
__u32 retransmit; //It is never used with UDP
__u32 ipv4_connect; // Use to count new connections
__u32 ipv6_connect; // Use to count new connections
__u32 state; //Current socket state
} tcp;
// Number of calls
struct {
__u32 call_udp_sent; // Use to count new connections
__u32 call_udp_received;
__u64 udp_bytes_sent;
__u64 udp_bytes_received;
} udp;
} netdata_socket_t;
typedef struct netdata_bandwidth {
__u64 first;
__u64 ct;
__u64 bytes_sent;
__u64 bytes_received;
__u64 call_tcp_sent;
__u64 call_tcp_received;
__u64 retransmit;
__u64 call_udp_sent;
__u64 call_udp_received;
__u64 close;
__u32 ipv4_connect;
__u32 ipv6_connect;
} netdata_bandwidth_t;
// Index used together previous structure
typedef struct netdata_socket_idx {
union netdata_ip saddr;
//__u16 sport;
union netdata_ip daddr;
__u16 dport;
__u32 pid;
} netdata_socket_idx_t;
typedef struct netdata_passive_connection {
__u32 tgid;
__u32 pid;
__u64 counter;
} netdata_passive_connection_t;
typedef struct netdata_passive_connection_idx {
__u16 protocol;
__u16 port;
} netdata_passive_connection_idx_t;
enum socket_counters {
NETDATA_KEY_CALLS_TCP_SENDMSG,
NETDATA_KEY_ERROR_TCP_SENDMSG,
NETDATA_KEY_BYTES_TCP_SENDMSG,
NETDATA_KEY_CALLS_TCP_CLEANUP_RBUF,
NETDATA_KEY_ERROR_TCP_CLEANUP_RBUF,
NETDATA_KEY_BYTES_TCP_CLEANUP_RBUF,
NETDATA_KEY_CALLS_TCP_CLOSE,
NETDATA_KEY_CALLS_UDP_RECVMSG,
NETDATA_KEY_ERROR_UDP_RECVMSG,
NETDATA_KEY_BYTES_UDP_RECVMSG,
NETDATA_KEY_CALLS_UDP_SENDMSG,
NETDATA_KEY_ERROR_UDP_SENDMSG,
NETDATA_KEY_BYTES_UDP_SENDMSG,
NETDATA_KEY_TCP_RETRANSMIT,
NETDATA_KEY_CALLS_TCP_CONNECT_IPV4,
NETDATA_KEY_ERROR_TCP_CONNECT_IPV4,
NETDATA_KEY_CALLS_TCP_CONNECT_IPV6,
NETDATA_KEY_ERROR_TCP_CONNECT_IPV6,
NETDATA_KEY_CALLS_TCP_SET_STATE,
// Keep this as last and don't skip numbers as it is used as element counter
NETDATA_SOCKET_COUNTER
};
enum socket_functions {
NETDATA_FCNT_INET_CSK_ACCEPT,
NETDATA_FCNT_TCP_RETRANSMIT,
NETDATA_FCNT_CLEANUP_RBUF,
NETDATA_FCNT_TCP_CLOSE,
NETDATA_FCNT_UDP_RECEVMSG,
NETDATA_FCNT_TCP_SENDMSG,
NETDATA_FCNT_UDP_SENDMSG,
NETDATA_FCNT_TCP_V4_CONNECT,
NETDATA_FCNT_TCP_V6_CONNECT,
NETDATA_FCNT_TCP_SET_STATE,
NETDATA_SOCKET_FCNT_END
};
/**
* NETWORK VIEWER
*/
typedef enum __attribute__((packed)) {
NETDATA_SOCKET_DIRECTION_NONE = 0,
NETDATA_SOCKET_DIRECTION_LISTEN = (1 << 0), // a listening socket
NETDATA_SOCKET_DIRECTION_INBOUND = (1 << 1), // an inbound socket connecting a remote system to a local listening socket
NETDATA_SOCKET_DIRECTION_OUTBOUND = (1 << 2), // a socket initiated by this system, connecting to another system
NETDATA_SOCKET_DIRECTION_LOCAL_INBOUND = (1 << 3), // the socket connecting 2 localhost applications
NETDATA_SOCKET_DIRECTION_LOCAL_OUTBOUND = (1 << 4), // the socket connecting 2 localhost applications
} NETDATA_SOCKET_DIRECTION;
// simplified version from https://elixir.bootlin.com/linux/v3.19.8/source/include/uapi/linux/in6.h
struct netdata_in6_addr {
union {
__u8 u6_addr8[16];
} in6_u;
};
union ipv46 {
uint32_t ipv4;
struct netdata_in6_addr ipv6;
};
typedef struct netdata_nv_idx {
union ipv46 saddr;
union ipv46 daddr;
__u16 sport;
__u16 dport;
} netdata_nv_idx_t;
typedef struct netdata_nv_data {
int state;
__u32 pid;
__u32 tgid;
__u32 uid;
__u64 ts;
__u8 timer;
__u8 retransmits;
__u16 closed;
__u32 expires;
__u32 rqueue;
__u32 wqueue;
char name[TASK_COMM_LEN];
NETDATA_SOCKET_DIRECTION direction;
__u16 family;
__u16 protocol;
} netdata_nv_data_t;
#endif /* _NETDATA_NETWORK_H_ */