-
blklst_entry
struct blklst_entry { //通过该list解决hash冲突 struct list_head list; //协议族 int af; //传输层协议 uint8_t proto; //virtual server port uint16_t vport; //virtual server addr union inet_addr vaddr; //黑名单ip union inet_addr blklst; };
-
全局实例
#define DPVS_BLKLST_TAB_BITS 16 #define DPVS_BLKLST_TAB_SIZE (1 << DPVS_BLKLST_TAB_BITS) #define DPVS_BLKLST_TAB_MASK (DPVS_BLKLST_TAB_SIZE - 1) //per-lcore黑名单hash结构链表头数组,在dp_vs_blklst_init中初始化 #define this_blklst_tab (RTE_PER_LCORE(dp_vs_blklst_tab)) #define this_num_blklsts (RTE_PER_LCORE(num_blklsts))
-
this_blklst_tab初始化
- dp_vs_blklst_init中初始化
int dp_vs_blklst_init(void) { int err; lcoreid_t cid; struct dpvs_msg_type msg_type; rte_atomic32_set(&this_num_blklsts, 0); //因为是per-lcore结构,所以需要在每个lcore上进行初始化 rte_eal_mp_remote_launch(blklst_lcore_init, NULL, CALL_MASTER); RTE_LCORE_FOREACH_SLAVE(cid) { if ((err = rte_eal_wait_lcore(cid)) < 0) { RTE_LOG(WARNING, SERVICE, "%s: lcore %d: %s.\\n", __func__, cid, dpvs_strerror(err)); return err; } } memset(&msg_type, 0, sizeof(struct dpvs_msg_type)); msg_type.type = MSG_TYPE_BLKLST_ADD; msg_type.mode = DPVS_MSG_MULTICAST; msg_type.prio = MSG_PRIO_NORM; msg_type.cid = rte_lcore_id(); msg_type.unicast_msg_cb = blklst_add_msg_cb; err = msg_type_mc_register(&msg_type); if (err != EDPVS_OK) { RTE_LOG(ERR, SERVICE, "%s: fail to register msg.\\n", __func__); return err; } memset(&msg_type, 0, sizeof(struct dpvs_msg_type)); msg_type.type = MSG_TYPE_BLKLST_DEL; msg_type.mode = DPVS_MSG_MULTICAST; msg_type.prio = MSG_PRIO_NORM; msg_type.cid = rte_lcore_id(); msg_type.unicast_msg_cb = blklst_del_msg_cb; err = msg_type_mc_register(&msg_type); if (err != EDPVS_OK) { RTE_LOG(ERR, SERVICE, "%s: fail to register msg.\\n", __func__); return err; } if ((err = sockopt_register(&blklst_sockopts)) != EDPVS_OK) return err; dp_vs_blklst_rnd = (uint32_t)random(); return EDPVS_OK; }
-
blklst_lcore_init
//初始化per-lcore blklst结构体 static int blklst_lcore_init(void *args) { int i; if (!rte_lcore_is_enabled(rte_lcore_id())) return EDPVS_DISABLED; this_blklst_tab = rte_malloc_socket(NULL, sizeof(struct list_head) * DPVS_BLKLST_TAB_SIZE, RTE_CACHE_LINE_SIZE, rte_socket_id()); if (!this_blklst_tab) return EDPVS_NOMEM; for (i = 0; i < DPVS_BLKLST_TAB_SIZE; i++) INIT_LIST_HEAD(&this_blklst_tab[i]); return EDPVS_OK; }
-
blklst查找
- 在对应per-lcore实例this_blklst_tab中查找
- add,del时会广播至所有lcore
struct blklst_entry *dp_vs_blklst_lookup(int af, uint8_t proto, const union inet_addr *vaddr, uint16_t vport, const union inet_addr *blklst) { unsigned hashkey; struct blklst_entry *blklst_node; hashkey = blklst_hashkey(vaddr, blklst); list_for_each_entry(blklst_node, &this_blklst_tab[hashkey], list) { if (blklst_node->af == af && blklst_node->proto == proto && blklst_node->vport == vport && inet_addr_equal(af, &blklst_node->vaddr, vaddr) && inet_addr_equal(af, &blklst_node->blklst, blklst)) return blklst_node; } return NULL; }
blklst:dpvs中ip黑名单
最新推荐文章于 2023-01-12 17:19:07 发布