* Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved.
* gazelle is licensed under the Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
* PURPOSE.
* See the Mulan PSL v2 for more details.
*/
#ifndef _GAZELLE_NET_CFG_H_
#define _GAZELLE_NET_CFG_H_
#include <stdbool.h>
#ifndef IFNAMSIZ
#include <net/if.h>
#endif
#include <lwip/ip_addr.h>
#include <rte_ether.h>
#include <rte_pci.h>
#include <rte_bus_pci.h>
#include "lstack_protocol_stack.h"
#include "common/gazelle_reg_msg.h"
#include "common/gazelle_opt.h"
#define BASE_BIN_SCALE 2
#define BASE_OCT_SCALE 8
#define BASE_DEC_SCALE 10
#define BASE_HEX_SCALE 16
#define TX_RING_NAME 64
#define RX_RING_NAME 64
#define MBUF_POOL_NAME 64
#define CFG_MAX_PORTS UINT8_MAX
#define ARP_MAX_ENTRIES 1024
#define LOG_DIR_PATH PATH_MAX
#define LOG_LEVEL_LEN 16
#define MAX_PROCESS_NUM 32
#define LSTACK_LPM_DETECT_MS_MIN (5 * 1000)
#define LSTACK_LPM_DETECT_MS_MAX (60 * 10000)
#define LSTACK_LPM_RX_PKTS_MIN 5
#define LSTACK_LPM_RX_PKTS_MAX 100
#define LSTACK_LPM_DETECT_MS 1000
#define LSTACK_LPM_PKTS_IN_DETECT 1000
#define LSTACK_LPM_RX_PKTS 20
#define LSTACK_LPM_PKTS_IN_DETECT_MIN 5
#define LSTACK_LPM_PKTS_IN_DETECT_MAX 65535
struct dev_addr {
#define DEV_ADDR_TYPE_EMPTY 0
#define DEV_ADDR_TYPE_MAC 1
#define DEV_ADDR_TYPE_PCI 2
uint8_t addr_type;
union addr_union {
struct rte_ether_addr mac_addr;
struct rte_pci_addr pci_addr;
} addr;
};
struct cfg_params {
char log_file[PATH_MAX];
struct {
char **dpdk_argv;
uint8_t dpdk_argc;
struct secondary_attach_arg {
uint8_t socket_num;
uint64_t socket_size;
uint32_t socket_per_size[GAZELLE_MAX_NUMA_NODES];
uintptr_t base_virtaddr;
char file_prefix[PATH_MAX];
} sec_attach_arg;
char socket_mem[SOCKET_MEM_STRLEN];
char lcores[RTE_MAX_LCORE];
};
struct {
ip4_addr_t host_addr;
ip6_addr_t host_addr6;
ip4_addr_t netmask;
ip4_addr_t gateway_addr;
char xdp_eth_name[IFNAMSIZ];
uint8_t mac_addr[ETHER_ADDR_LEN];
int8_t bond_mode;
int32_t bond_miimon;
struct dev_addr bond_slave_addr[GAZELLE_MAX_BOND_NUM];
};
struct {
uint16_t low_power_mod;
uint16_t lpm_rx_pkts;
uint32_t lpm_detect_ms;
uint32_t lpm_pkts_in_detect;
};
struct {
uint32_t rxqueue_size;
uint32_t txqueue_size;
uint16_t num_queue;
uint16_t tot_queue_num;
bool send_cache_mode;
bool flow_bifurcation;
int32_t vlan_mode;
};
struct {
uint16_t num_cpu;
uint16_t numa_id;
uint16_t stack_num;
uint32_t cpus[CPUS_MAX_NUM];
bool main_thread_affinity;
bool app_bind_numa;
uint16_t app_exclude_num_cpu;
uint32_t app_exclude_cpus[CPUS_MAX_NUM];
bool stack_mode_rtc;
bool listen_shadow;
bool stack_interrupt;
uint32_t nic_read_number;
uint32_t rpc_number;
};
struct {
uint16_t tcp_conn_count;
uint16_t mbuf_count_per_conn;
uint16_t mem_cache_num;
bool mem_async_mode;
};
struct {
char unix_socket_filename[NAME_MAX];
bool use_ltran;
bool udp_enable;
bool kni_switch;
};
struct {
uint16_t num_process;
uint16_t is_primary;
uint8_t process_idx;
uint32_t process_numa[PROTOCOL_STACK_MAX];
bool tuple_filter;
bool use_sockmap;
};
};
struct cfg_params *get_global_cfg_params(void);
static inline uint8_t use_ltran(void)
{
return get_global_cfg_params()->use_ltran;
}
static inline bool xdp_eth_enabled(void)
{
if (get_global_cfg_params()->xdp_eth_name[0] != '\0') {
return true;
}
return false;
}
int cfg_init(void);
int gazelle_param_init(int *argc, char **argv);
int gazelle_copy_param(const char *param, bool is_double, int *argc, char argv[][PATH_MAX]);
int match_host_addr(ip_addr_t *addr);
int numa_to_cpusnum(uint16_t numa_id, uint32_t *cpulist, int num);
#endif