-
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(); }
dpvs中lcore redirect
最新推荐文章于 2021-05-10 00:14:22 发布