#pragma once #include #include #include #include #ifndef MR_STACK_DEFAULT_SZ_DELIVER_RING #define MR_STACK_DEFAULT_SZ_DELIVER_RING 1024 #endif #ifndef MR_STACK_DEFAULT_SZ_DELIVER_BUFFER #define MR_STACK_DEFAULT_SZ_DELIVER_BUFFER 128 #endif #ifndef MR_STACK_DEFAULT_SZ_LOOP_RING #define MR_STACK_DEFAULT_SZ_LOOP_RING 1024 #endif #ifndef MR_STACK_DEFAULT_NEIGH_NR_MAX_NEIGH #define MR_STACK_DEFAULT_NEIGH_NR_MAX_NEIGH 2048 #endif #ifndef MR_STACK_DEFAULT_NEIGH_T_ARP_SEND #define MR_STACK_DEFAULT_NEIGH_T_ARP_SEND 1 #endif #ifndef MR_STACK_DEFAULT_NEIGH_T_TIMEOUT #define MR_STACK_DEFAULT_NEIGH_T_TIMEOUT 3600 #endif #define LPORT_START 0x8000 #define LPORT_END MAX_PORT_NUM #define LPORT_START_BLK PORT_BLK(LPORT_START) #define LPORT_END_BLCK PORT_BLK(LPORT_END) struct sk_param { // 服务名称 char servsym[MR_SYMBOL_MAX]; // 服务线程数量(报文注入协议栈线程、从协议栈取报文的线程) unsigned int nr_serv_thread; // 分发队列大小 unsigned int sz_deliver_ring; // 分发队列缓冲区大小 unsigned int sz_deliver_buffer; // 自循环队列大小 unsigned int sz_loop_ring; // 邻居子系统:超时时间 unsigned int t_neigh_timeout; // 邻居子系统:ARP发送间隔 unsigned int t_neigh_arp_send; // 邻居子系统:最大邻居数量 unsigned int nr_neigh_max_neigh; // 内存池:缺省数据内存池 struct rte_mempool * def_direct_pktmbuf_pool; // 内存池:缺省引用数据内存池 struct rte_mempool * def_indirect_pktmbuf_pool; }; struct sk_instance { // 协议栈运行参数 struct sk_param param; // Core指针 struct mr_core_instance * core_instance; // 协议栈设备信息 struct sk_dev_info_list dev_info_list; // 邻居子系统句柄 struct neighbour_manager * neigh_manager; // 默认路由表 struct sk_route_tbl * default_route; // IP报文计数 rte_atomic16_t ip_counter; // Packet Info 控制域ID uint8_t ctrlzone_id_pktinfo; // SOQ Info 控制域ID(MR3兼容) uint8_t ctrlzone_id_soqinfo; }; #define SK_CTRLZONE_PKTINFO_SYMBOL "sk_pktinfo" #define SK_CTRLZONE_SOQINFO_SYMBOL "sk_soqinfo" #define SK_CTRLZONE_PKTINFO_SIZE 32 #define SK_CTRLZONE_SOQINFO_SIZE 32 struct sk_ucb; struct sk_stack_udp_ctx { struct sk_app_instance * app_instance_; rte_rwlock_t rwlock; struct portmap pbm_local; struct sk_ucb * ucbs_local[MAX_PORT_NUM]; }; struct sk_app_instance { // 应用名称 char appsym[MR_SYMBOL_MAX]; // instance指针 struct sk_instance * instance; // 协议栈设备句柄 struct sk_dev_desc_list dev_desc_list; // UDP运行时上下文机构 struct sk_stack_udp_ctx udp_ctx; // 内存池:缺省数据内存池 struct rte_mempool * def_direct_pktmbuf_pool; // 内存池:缺省引用数据内存池 struct rte_mempool * def_indirect_pktmbuf_pool; }; struct sk_instance * sk_instance_create(struct mr_core_instance * core_instance, struct sk_param * param); struct sk_app_instance * sk_app_instance_create(struct sk_instance * instance, const char* appsym); int sk_serv_device_rx_bulk(struct sk_dev_desc * dev_desc, thread_id_t sid, struct rte_mbuf * mbufs_in[], int nr_mbufs_in); int sk_serv_device_tx_bulk(struct sk_dev_desc * dev_desc, thread_id_t sid, struct rte_mbuf * mbufs_out[], int nr_mbufs_max); void sk_default_instance_set(struct sk_instance * instance, struct sk_app_instance * app_instance);