|
Packit |
6d2c1b |
/*
|
|
Packit |
6d2c1b |
* Copyright (c) 2001-2020 Mellanox Technologies, Ltd. All rights reserved.
|
|
Packit |
6d2c1b |
*
|
|
Packit |
6d2c1b |
* This software is available to you under a choice of one of two
|
|
Packit |
6d2c1b |
* licenses. You may choose to be licensed under the terms of the GNU
|
|
Packit |
6d2c1b |
* General Public License (GPL) Version 2, available from the file
|
|
Packit |
6d2c1b |
* COPYING in the main directory of this source tree, or the
|
|
Packit |
6d2c1b |
* BSD license below:
|
|
Packit |
6d2c1b |
*
|
|
Packit |
6d2c1b |
* Redistribution and use in source and binary forms, with or
|
|
Packit |
6d2c1b |
* without modification, are permitted provided that the following
|
|
Packit |
6d2c1b |
* conditions are met:
|
|
Packit |
6d2c1b |
*
|
|
Packit |
6d2c1b |
* - Redistributions of source code must retain the above
|
|
Packit |
6d2c1b |
* copyright notice, this list of conditions and the following
|
|
Packit |
6d2c1b |
* disclaimer.
|
|
Packit |
6d2c1b |
*
|
|
Packit |
6d2c1b |
* - Redistributions in binary form must reproduce the above
|
|
Packit |
6d2c1b |
* copyright notice, this list of conditions and the following
|
|
Packit |
6d2c1b |
* disclaimer in the documentation and/or other materials
|
|
Packit |
6d2c1b |
* provided with the distribution.
|
|
Packit |
6d2c1b |
*
|
|
Packit |
6d2c1b |
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
Packit |
6d2c1b |
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
Packit |
6d2c1b |
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
Packit |
6d2c1b |
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
|
Packit |
6d2c1b |
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
|
Packit |
6d2c1b |
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
Packit |
6d2c1b |
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
Packit |
6d2c1b |
* SOFTWARE.
|
|
Packit |
6d2c1b |
*/
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
#ifndef SYSCNTL_READER_H_
|
|
Packit |
6d2c1b |
#define SYSCNTL_READER_H_
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
#include "vlogger/vlogger.h"
|
|
Packit |
6d2c1b |
#include "utils.h"
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
struct sysctl_tcp_mem {
|
|
Packit |
6d2c1b |
int min_value;
|
|
Packit |
6d2c1b |
int default_value;
|
|
Packit |
6d2c1b |
int max_value;
|
|
Packit |
6d2c1b |
};
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
class sysctl_reader_t {
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
private:
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
int sysctl_read(const char* path, int argument_num ,const char *format, ...){
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
FILE* pfile = fopen (path, "r");
|
|
Packit |
6d2c1b |
int ans;
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
if (pfile == NULL) {
|
|
Packit |
6d2c1b |
return -1;
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
va_list arg;
|
|
Packit |
6d2c1b |
va_start (arg, format);
|
|
Packit |
6d2c1b |
ans = vfscanf(pfile, format, arg);
|
|
Packit |
6d2c1b |
va_end (arg);
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
fclose(pfile);
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
if (ans != argument_num) {
|
|
Packit |
6d2c1b |
return -1;
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
return 0;
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
void init(){
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
sysctl_reader_t() {
|
|
Packit |
6d2c1b |
this->init();
|
|
Packit |
6d2c1b |
this->update_all();
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
public :
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
static sysctl_reader_t & instance() {
|
|
Packit |
6d2c1b |
static sysctl_reader_t the_instance;
|
|
Packit |
6d2c1b |
return the_instance;
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
void update_all(){
|
|
Packit |
6d2c1b |
get_tcp_max_syn_backlog(true);
|
|
Packit |
6d2c1b |
get_listen_maxconn(true);
|
|
Packit |
6d2c1b |
get_tcp_wmem(true);
|
|
Packit |
6d2c1b |
get_tcp_rmem(true);
|
|
Packit |
6d2c1b |
get_tcp_window_scaling(true);
|
|
Packit |
6d2c1b |
get_net_core_rmem_max(true);
|
|
Packit |
6d2c1b |
get_net_core_wmem_max(true);
|
|
Packit |
6d2c1b |
get_net_ipv4_tcp_timestamps(true);
|
|
Packit |
6d2c1b |
get_net_ipv4_ttl(true);
|
|
Packit |
6d2c1b |
get_igmp_max_membership(true);
|
|
Packit |
6d2c1b |
get_igmp_max_source_membership(true);
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
int get_tcp_max_syn_backlog(bool update = false) {
|
|
Packit |
6d2c1b |
static int val;
|
|
Packit |
6d2c1b |
if (update)
|
|
Packit |
6d2c1b |
val = read_file_to_int("/proc/sys/net/ipv4/tcp_max_syn_backlog", 1024);
|
|
Packit |
6d2c1b |
return val;
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
int get_listen_maxconn(bool update = false) {
|
|
Packit |
6d2c1b |
static int val;
|
|
Packit |
6d2c1b |
if (update)
|
|
Packit |
6d2c1b |
val = read_file_to_int("/proc/sys/net/core/somaxconn", SOMAXCONN);
|
|
Packit |
6d2c1b |
return val;
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
const sysctl_tcp_mem *get_tcp_wmem(bool update = false) {
|
|
Packit |
6d2c1b |
static sysctl_tcp_mem tcp_mem;
|
|
Packit |
6d2c1b |
if (update) {
|
|
Packit |
6d2c1b |
if (sysctl_read("/proc/sys/net/ipv4/tcp_wmem", 3, "%d %d %d", &tcp_mem.min_value, &tcp_mem.default_value, &tcp_mem.max_value) == -1) {
|
|
Packit |
6d2c1b |
tcp_mem.min_value = 4096;
|
|
Packit |
6d2c1b |
tcp_mem.default_value = 16384;
|
|
Packit |
6d2c1b |
tcp_mem.max_value = 4194304;
|
|
Packit |
6d2c1b |
vlog_printf(VLOG_WARNING, "sysctl_reader failed to read net.ipv4.tcp_wmem values - Using defaults : %d %d %d\n", tcp_mem.min_value, tcp_mem.default_value, tcp_mem.max_value);
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
return &tcp_mem;
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
const sysctl_tcp_mem *get_tcp_rmem(bool update = false) {
|
|
Packit |
6d2c1b |
static sysctl_tcp_mem tcp_mem;
|
|
Packit |
6d2c1b |
if (update) {
|
|
Packit |
6d2c1b |
if (sysctl_read("/proc/sys/net/ipv4/tcp_rmem", 3, "%d %d %d", &tcp_mem.min_value, &tcp_mem.default_value, &tcp_mem.max_value) == -1) {
|
|
Packit |
6d2c1b |
// defaults were taken based on man (7) tcp
|
|
Packit |
6d2c1b |
tcp_mem.min_value = 4096;
|
|
Packit |
6d2c1b |
tcp_mem.default_value = 87380;
|
|
Packit |
6d2c1b |
tcp_mem.max_value = 4194304;
|
|
Packit |
6d2c1b |
vlog_printf(VLOG_WARNING, "sysctl_reader failed to read net.ipv4.tcp_rmem values - Using defaults : %d %d %d\n", tcp_mem.min_value, tcp_mem.default_value, tcp_mem.max_value);
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
return &tcp_mem;
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
int get_tcp_window_scaling(bool update = false) {
|
|
Packit |
6d2c1b |
static int val;
|
|
Packit |
6d2c1b |
if (update)
|
|
Packit |
6d2c1b |
val = read_file_to_int("/proc/sys/net/ipv4/tcp_window_scaling", 0);
|
|
Packit |
6d2c1b |
return val;
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
int get_net_core_rmem_max(bool update = false) {
|
|
Packit |
6d2c1b |
static int val;
|
|
Packit |
6d2c1b |
if (update)
|
|
Packit |
6d2c1b |
val = read_file_to_int("/proc/sys/net/core/rmem_max", 229376);
|
|
Packit |
6d2c1b |
return val;
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
int get_net_core_wmem_max(bool update = false) {
|
|
Packit |
6d2c1b |
static int val;
|
|
Packit |
6d2c1b |
if (update)
|
|
Packit |
6d2c1b |
val = read_file_to_int("/proc/sys/net/core/wmem_max", 229376);
|
|
Packit |
6d2c1b |
return val;
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
int get_net_ipv4_tcp_timestamps(bool update = false) {
|
|
Packit |
6d2c1b |
static int val;
|
|
Packit |
6d2c1b |
if (update)
|
|
Packit |
6d2c1b |
val = read_file_to_int("/proc/sys/net/ipv4/tcp_timestamps", 0);
|
|
Packit |
6d2c1b |
return val;
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
int get_net_ipv4_ttl(bool update = false) {
|
|
Packit |
6d2c1b |
static int val;
|
|
Packit |
6d2c1b |
if (update)
|
|
Packit |
6d2c1b |
val = read_file_to_int("/proc/sys/net/ipv4/ip_default_ttl", 64);
|
|
Packit |
6d2c1b |
return val;
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
int get_igmp_max_membership(bool update = false) {
|
|
Packit |
6d2c1b |
static int val;
|
|
Packit |
6d2c1b |
if (update) {
|
|
Packit |
6d2c1b |
val = read_file_to_int("/proc/sys/net/ipv4/igmp_max_memberships", 1024);
|
|
Packit |
6d2c1b |
if (0 > val) {
|
|
Packit |
6d2c1b |
vlog_printf(VLOG_WARNING, "failed to read get_igmp_max_membership value");
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
return val;
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
int get_igmp_max_source_membership(bool update = false) {
|
|
Packit |
6d2c1b |
static int val;
|
|
Packit |
6d2c1b |
if (update) {
|
|
Packit |
6d2c1b |
val = read_file_to_int("/proc/sys/net/ipv4/igmp_max_msf", 1024);
|
|
Packit |
6d2c1b |
if (0 > val) {
|
|
Packit |
6d2c1b |
vlog_printf(VLOG_WARNING, "failed to read get_igmp_max_source_membership value");
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
return val;
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
};
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
#endif /* SYSCNTL_READER_H_ */
|