network: ping pong keepalive for tcp connections

To make the tcp connections keepalive and better handle the timeout
of connections

con_timeout indicate the connection timeout and it is configurable

Signed-off-by: Chen Minqiang <ptpt52@gmail.com>
This commit is contained in:
Chen Minqiang 2022-07-21 06:03:58 +08:00 committed by Nick Hainke
parent eba03547a5
commit 47e98efed6
8 changed files with 136 additions and 30 deletions

View file

@ -23,7 +23,9 @@ void update_clients(struct uloop_timeout *t);
void update_tcp_connections(struct uloop_timeout *t);
void check_client_timeouts(struct uloop_timeout *t);
void server_ping_clients(struct uloop_timeout *t);
void check_timeouts(struct uloop_timeout *t);
void update_channel_utilization(struct uloop_timeout *t);
@ -40,8 +42,11 @@ struct uloop_timeout hostapd_timer = {
struct uloop_timeout tcp_con_timer = {
.cb = update_tcp_connections
};
struct uloop_timeout client_timeout_timer = {
.cb = check_client_timeouts
struct uloop_timeout server_ping_timer = {
.cb = server_ping_clients
};
struct uloop_timeout check_timeout_timer = {
.cb = check_timeouts
};
struct uloop_timeout channel_utilization_timer = {
.cb = update_channel_utilization
@ -1153,20 +1158,29 @@ void update_tcp_connections(struct uloop_timeout *t) {
uloop_timeout_set(&tcp_con_timer, timeout_config.update_tcp_con * 1000);
}
void check_client_timeouts(struct uloop_timeout *t) {
void server_ping_clients(struct uloop_timeout *t) {
dawnlog_debug_func("Entering...");
check_client_timeout(timeout_config.client_timeout);
server_to_clients_ping();
uloop_timeout_set(&client_timeout_timer, CHECK_CLIENT_TIMEOUT * 1000);
uloop_timeout_set(&server_ping_timer, 20 * 1000);
}
void check_timeouts(struct uloop_timeout *t) {
dawnlog_debug_func("Entering...");
check_timeout(timeout_config.con_timeout);
uloop_timeout_set(&check_timeout_timer, CHECK_TIMEOUT * 1000);
}
void start_tcp_con_update() {
dawnlog_debug_func("Entering...");
uloop_timeout_add(&server_ping_timer);
// update connections
uloop_timeout_add(&tcp_con_timer); // callback = update_tcp_connections
uloop_timeout_add(&client_timeout_timer); // callback = client_timeout
uloop_timeout_add(&check_timeout_timer); // callback = con_timeout
}
void update_hostapd_sockets(struct uloop_timeout *t) {
@ -1902,7 +1916,7 @@ int uci_send_via_network()
blobmsg_add_u32(&b, "update_tcp_con", timeout_config.update_tcp_con);
blobmsg_add_u32(&b, "update_chan_util", timeout_config.update_chan_util);
blobmsg_add_u32(&b, "update_beacon_reports", timeout_config.update_beacon_reports);
blobmsg_add_u32(&b, "client_timeout", timeout_config.client_timeout);
blobmsg_add_u32(&b, "con_timeout", timeout_config.con_timeout);
blobmsg_close_table(&b, times);
send_blob_attr_via_network(b.head, "uci");