#pragma once #ifdef __cplusplus extern "C" { #endif #include #include #include #include #include struct sk_dev_param { // 设备名称 char symbol[MR_SYMBOL_MAX]; // MTU unsigned int mtu; // IP地址 struct in_addr in_addr; // 子网掩码 struct in_addr in_mask; // 网关 struct in_addr in_gateway; // MAC地址 struct ether_addr mac_addr; // Raw协议使能 unsigned int en_raw; // TCP协议使能 unsigned int en_tcp; // UDP协议使能 unsigned int en_udp; // ARP协议使能 unsigned int en_arp; // ICMP协议使能 unsigned int en_icmp; // 自循环缓冲区大小 unsigned int sz_rx_loop_buffer; // 自循环缓冲区大小 unsigned int sz_tx_loop_buffer; // 报文内存池资源 struct rte_mempool * direct_pktmbuf_pool; struct rte_mempool * indirect_pktmbuf_pool; }; struct sk_dev_open_param { // 设备名称 char symbol[MR_SYMBOL_MAX]; // 启用模式(主进程或从进程) unsigned int mode; // TCP协议收线程数 unsigned int nr_tcp_rxstream; // TCP协议发线程数 unsigned int nr_tcp_txstream; // UDP协议收线程数 unsigned int nr_udp_rxstream; // UDP协议发线程数 unsigned int nr_udp_txstream; // 自循环缓冲区数量 unsigned int nr_loop_rxstream; // 自循环缓冲区数量 unsigned int nr_loop_txstream; }; // 设备基础信息 struct sk_dev_info { // 协议栈CTX struct sk_instance * instance_; // 设备链表下一项 TAILQ_ENTRY(sk_dev_info) next; // 设备参数 struct sk_dev_param param; // 设备名称 char symbol[MR_SYMBOL_MAX]; // 是否启用 unsigned int enable; // MTU大小 unsigned int mtu; // 是否启用混杂模式 unsigned int promisc; // 本地IP地址 struct in_addr in_addr; // 子网掩码 struct in_addr in_mask; // 网关 struct in_addr in_gateway; // 本地MAC地址 struct ether_addr mac_addr; }; enum sk_dev_sid_type { SK_DEVQ_TYPE_SERV, SK_DEVQ_TYPE_RAW_RX, SK_DEVQ_TYPE_RAW_TX, SK_DEVQ_TYPE_TCP_RX, SK_DEVQ_TYPE_TCP_TX, SK_DEVQ_TYPE_UDP_RX, SK_DEVQ_TYPE_UDP_TX, SK_DEVQ_TYPE_MAX }; // 设备句柄(主从进程通用) struct sk_dev_desc { #define SK_DEV_MODE_SERV 0 #define SK_DEV_MODE_APP 1 // 链表下一项 TAILQ_ENTRY(sk_dev_desc) next; // 所属的应用句柄 struct sk_app_instance * app_instance_; // 模式(主进程或从进程) unsigned int mode; // 打开参数 struct sk_dev_open_param open_param; // 设备信息句柄 struct sk_dev_info * dev_info; // 设备内存池 struct rte_mempool * direct_pool; // 设备内存池 struct rte_mempool * indirect_pool; // 自循环报文缓冲区,在收报文流程中处理。 struct rte_ring * rx_loop_buffer[MR_SID_MAX]; // 自循环报文缓冲区,在发报文流程中处理。 struct rte_ring * tx_loop_buffer[MR_SID_MAX]; // tcp协议虚设备 struct rtdev_desc * tcp_device; // udp协议虚设备 struct rtdev_desc * udp_device; // tcp协议应用虚设备 struct rtdev_app_desc * tcp_app_device; // udp协议应用虚设备 struct rtdev_app_desc * udp_app_device; // SID管理器锁 rte_spinlock_t sid_alloc_lock; // SID管理器 uint8_t sid_alloc_record[SK_DEVQ_TYPE_MAX][MR_SID_MAX]; // SID数量记录 uint8_t nr_sid[SK_DEVQ_TYPE_MAX]; }; TAILQ_HEAD(sk_dev_info_list, sk_dev_info); TAILQ_HEAD(sk_dev_desc_list, sk_dev_desc); struct sk_instance; struct sk_app_instance; struct sk_dev_info * sk_device_lookup(struct sk_instance * instance, const char * symbol); struct sk_dev_desc * sk_device_desc_lookup(struct sk_app_instance* app_instance, const char * symbol); // 设备信息迭代器 int sk_device_iterate(struct sk_instance * instance, struct sk_dev_info ** dev_info); // 创建一个协议栈设备 int sk_device_create(struct sk_instance* instance, struct sk_dev_param* param); // 销毁协议栈设备 int sk_device_destory(struct sk_dev_info * devinfo); int sk_device_attach(struct sk_dev_desc * dev_desc, enum sk_dev_sid_type type, thread_id_t * out_sid); void sk_device_deattach(struct sk_dev_desc * dev_desc, enum sk_dev_sid_type type, thread_id_t sid); struct sk_dev_desc * sk_device_open(struct sk_app_instance * app_instance, struct sk_dev_open_param * open_param); // 设置协议栈的IP地址 int sk_device_set_inaddr(struct sk_dev_info * dev_info, struct in_addr in_addr, struct in_addr in_mask); // 读取协议栈设备的IP地址 int sk_device_get_inaddr(struct sk_dev_info * devinfo, struct in_addr * in_addr, struct in_addr * in_mask); // 设置协议栈设备的MTU int sk_device_set_mtu(struct sk_dev_info * devinfo, unsigned int mtu); // 读取协议栈设备的MTU int sk_device_get_mtu(struct sk_dev_info * devinfo); // 启动设备 int sk_device_enable(struct sk_dev_info * devinfo); // 禁用设备 int sk_device_disable(struct sk_dev_info * devinfo); // 报文发送(通过自循环队列) static inline int sk_device_loop_packet_send(struct sk_dev_desc * dev_desc, thread_id_t sid, struct rte_mbuf * mbufs[], int nr_mbufs) { return rte_ring_enqueue_burst(dev_desc->tx_loop_buffer[sid], (void **)mbufs, nr_mbufs); } // 本地报文过滤器(二层) static inline int sk_device_local_frame_filter(struct sk_dev_info * dev_info, struct ether_addr * ether_addr) { if (is_broadcast_ether_addr(ether_addr)) return 1; if (is_same_ether_addr(&dev_info->mac_addr, ether_addr)) return 1; return 0; } // 本地报文过滤器(三层) static inline int sk_device_local_inaddr_filter(struct sk_dev_info * dev_info, struct in_addr * in_addr) { return (dev_info->in_addr.s_addr == in_addr->s_addr); } #ifdef __cplusplus } #endif