blklst:dpvs中ip黑名单

  • 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;
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值