/* * Copyright (C) 2017-2021 THL A29 Limited, a Tencent company. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #ifndef __FSTACK_CONFIG_H #define __FSTACK_CONFIG_H #ifdef __cplusplus extern "C" { #endif // dpdk argc, argv, max argc: 16, member of dpdk_config #define DPDK_CONFIG_NUM 16 #define DPDK_CONFIG_MAXLEN 256 #define DPDK_MAX_LCORE 128 #define DPDK_MAX_VLAN_FILTER 128 #define PCAP_SNAP_MINLEN 94 #define PCAP_SAVE_MINLEN (2<<22) /* * KNI ratelimit default value. * The total speed limit for a single process entering the kni ring is 10,000 QPS, * 1000 QPS for general packets, 9000 QPS for console packets (ospf/arp, etc.) * The total speed limit for kni forwarding to the kernel is 20,000 QPS. */ #define KNI_RATELIMT_PROCESS (10000) #define KNI_RATELIMT_GENERAL (1000) #define KNI_RATELIMT_CONSOLE (KNI_RATELIMT_PROCESS - KNI_RATELIMT_GENERAL) #define KNI_RATELIMT_KERNEL (KNI_RATELIMT_PROCESS * 2) extern int dpdk_argc; extern char *dpdk_argv[DPDK_CONFIG_NUM + 1]; #define MAX_PKT_BURST 32 #define BURST_TX_DRAIN_US 100 /* TX drain every ~100us */ #define VIP_MAX_NUM 64 /* exception path(KNI) type */ #define KNI_TYPE_KNI 0 #define KNI_TYPE_VIRTIO 1 struct ff_hw_features { uint8_t rx_csum; uint8_t rx_lro; uint8_t tx_csum_ip; uint8_t tx_csum_l4; uint8_t tx_tso; }; #ifdef FF_IPFW struct ff_ipfw_pr_cfg { //uint32_t rule_num; //uint32_t fib_num; /* Use portN or vlanN's idx * 100 */ char *addr; char *netmask; }; #endif struct ff_vlan_cfg { char *name; char *ifname; /* global vlan idx, also use for route table's fib num */ int vlan_idx; uint16_t vlan_id; uint16_t port_id; char *addr; char *netmask; char *broadcast; char *gateway; char *vip_ifname; char *vip_addr_str; char **vip_addr_array; uint32_t nb_vip; /* simple policy routing, only need rule num(100/200/300/400), ip/mask,fib num(0/1/2/3/4) */ char *pr_addr_str; #ifdef FF_IPFW struct ff_ipfw_pr_cfg *pr_cfg; uint32_t nb_pr; #endif #ifdef INET6 char *addr6_str; char *gateway6_str; uint8_t prefix_len; char *vip_addr6_str; char **vip_addr6_array; uint32_t nb_vip6; uint8_t vip_prefix_len; #endif }; struct ff_port_cfg { char *name; char *ifname; uint16_t port_id; uint8_t mac[6]; struct ff_hw_features hw_features; char *addr; char *netmask; char *broadcast; char *gateway; char *vip_ifname; char *vip_addr_str; char **vip_addr_array; uint32_t nb_vip; #ifdef FF_IPFW char *pr_addr_str; struct ff_ipfw_pr_cfg *pr_cfg; uint32_t nb_pr; #endif #ifdef INET6 char *addr6_str; char *gateway6_str; uint8_t prefix_len; char *vip_addr6_str; char **vip_addr6_array; uint32_t nb_vip6; uint8_t vip_prefix_len; #endif int nb_lcores; int nb_slaves; uint16_t lcore_list[DPDK_MAX_LCORE]; uint16_t *slave_portid_list; int nb_vlan; struct ff_vlan_cfg *vlan_cfgs[DPDK_MAX_VLAN_FILTER]; }; struct ff_vdev_cfg { char *name; char *iface; char *path; char *mac; uint8_t vdev_id; uint8_t nb_queues; uint8_t nb_cq; uint16_t queue_size; }; struct ff_bond_cfg { char *name; char *slave; char *primary; char *bond_mac; char *xmit_policy; uint8_t bond_id; uint8_t mode; uint8_t socket_id; uint8_t lsc_poll_period_ms; uint16_t up_delay; uint16_t down_delay; }; struct ff_freebsd_cfg { char *name; char *str; void *value; size_t vlen; struct ff_freebsd_cfg *next; }; struct ff_config { char *filename; struct { char *proc_type; /* mask of enabled lcores */ char *lcore_mask; /* mask of current proc on all lcores */ char *proc_mask; /* specify base virtual address to map. */ char *base_virtaddr; /* allow processes that do not want to co-operate to have different memory regions */ char *file_prefix; /* load an external driver */ char *pci_whitelist; int nb_channel; int memory; int no_huge; int nb_procs; int proc_id; int promiscuous; int nb_vdev; int nb_bond; int numa_on; int tso; int tx_csum_offoad_skip; int vlan_strip; int nb_vlan_filter; uint16_t vlan_filter_id[DPDK_MAX_VLAN_FILTER]; int symmetric_rss; /* sleep x microseconds when no pkts incomming */ unsigned idle_sleep; /* TX burst queue drain nodelay dalay time */ unsigned pkt_tx_delay; /* list of proc-lcore */ uint16_t *proc_lcore; int nb_ports; uint16_t max_portid; uint16_t *portid_list; // load dpdk log level uint16_t log_level; // MAP(portid => struct ff_port_cfg*) struct ff_port_cfg *port_cfgs; struct ff_vlan_cfg *vlan_cfgs; struct ff_vdev_cfg *vdev_cfgs; struct ff_bond_cfg *bond_cfgs; } dpdk; struct { int enable; int type; int console_packets_ratelimit; int general_packets_ratelimit; int kernel_packets_ratelimit; char *kni_action; char *method; char *tcp_port; char *udp_port; } kni; struct { int level; const char *dir; } log; struct { struct ff_freebsd_cfg *boot; struct ff_freebsd_cfg *sysctl; long physmem; int hz; int fd_reserve; int mem_size; } freebsd; struct { uint16_t enable; uint16_t snap_len; uint32_t save_len; char* save_path; } pcap; }; extern struct ff_config ff_global_cfg; int ff_load_config(int argc, char * const argv[]); #ifdef __cplusplus } #endif #endif /* ifndef __FSTACK_CONFIG_H */