dpvs中lcore redirect

  • dp_vs_redirect

    • 主要用于在各种nat模式中,inbond,outbond连接数据可能从不同网卡或者网卡不同硬件队列接收,导致属于同一dp_vs_conn数据会从不同lcore上接收处理,需要传递至连接建立时的lcore上处理

      struct dp_vs_redirect {
          //解决hash表冲突
          struct list_head     list;
          //协议族
          uint8_t              af;
          //传输层协议
          uint8_t              proto;
          //需要转发的lcore id
          lcoreid_t            cid;
          uint8_t              padding;
          //四元组
          union inet_addr      saddr;
          union inet_addr      daddr;
          uint16_t             sport;
          uint16_t             dport;
          //缓存池
          struct rte_mempool  *redirect_pool;
      } __rte_cache_aligned;
      
  • dp_vs_redirect_get

    /**
     * try lookup dp_vs_cr_tbl{} by packet tuple
     *
     *  <af, proto, saddr, sport, daddr, dport>.
     *
     * return r if found or NULL if not exist.
     */
    struct dp_vs_redirect *
    dp_vs_redirect_get(int af, uint16_t proto,
        const union inet_addr *saddr, const union inet_addr *daddr,
        uint16_t sport, uint16_t dport)
    {
        uint32_t hash;
        struct dp_vs_redirect *r;
    
        if (dp_vs_redirect_disable) {
            return NULL;
        }
    
        hash = dp_vs_conn_hashkey(af, saddr, sport, daddr, dport, DPVS_CR_TBL_MASK);
    
        rte_spinlock_lock(&dp_vs_cr_lock[hash]);
        list_for_each_entry(r, &dp_vs_cr_tbl[hash], list) {
            if (r->af == af
                && r->proto == proto
                && r->sport == sport
                && r->dport == dport
                && inet_addr_equal(af, &r->saddr, saddr)
                && inet_addr_equal(af, &r->daddr, daddr)) {
                goto found;
            }
        }
        rte_spinlock_unlock(&dp_vs_cr_lock[hash]);
    
        return NULL;
    
    found:
        rte_spinlock_unlock(&dp_vs_cr_lock[hash]);
    
    #ifdef CONFIG_DPVS_IPVS_DEBUG
        dp_vs_redirect_show(r, "get");
    #endif
    
        return r;
    }
    
  • dp_vs_redirects_init

    int dp_vs_redirects_init(void)
    {
        int err;
    
        if (dp_vs_redirect_disable) {
            return EDPVS_OK;
        }
    
        err = dp_vs_redirect_ring_create();
        if (err != EDPVS_OK) {
            return err;
        }
    
        return dp_vs_redirect_table_create();
    }
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值