summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQiuwen Lu <[email protected]>2017-07-24 14:25:20 +0800
committerQiuwen Lu <[email protected]>2017-07-24 14:25:20 +0800
commitfbff4ce9bc87eb2940435bdac972890c06dd6706 (patch)
treec651691e45f334468069173d7c8d9c04398d5ad6
parent0891b87be549f7939e3bfe7a55f2babee2e10950 (diff)
TUNNAT:使用写时复制接口。v4.2.6-20170724
- 对于有历史记录的主动发包,使用写时复制的接口,避免报文被其他人持有,造成写入失败。 - 写时复制的实现,增加释放传入报文缓冲区的逻辑,避免内存泄露。
-rw-r--r--app/src/mrb.c3
-rw-r--r--tunnat/src/runtime.cc7
2 files changed, 9 insertions, 1 deletions
diff --git a/app/src/mrb.c b/app/src/mrb.c
index 36e2264..61bf74d 100644
--- a/app/src/mrb.c
+++ b/app/src/mrb.c
@@ -358,6 +358,9 @@ static inline struct rte_mbuf * __copy_on_write_common(
MR_BUFF_CLONE_BUFF | MR_BUFF_CLONE_CTRLZONE);
assert(__cloned_mbuf != NULL);
+
+ /* 对于传入的报文,释放所有权,外面用户不应该再使用传入的MBUF */
+ rte_pktmbuf_free(__mbuf);
return __cloned_mbuf;
}
diff --git a/tunnat/src/runtime.cc b/tunnat/src/runtime.cc
index 610c99a..2ab60d3 100644
--- a/tunnat/src/runtime.cc
+++ b/tunnat/src/runtime.cc
@@ -240,8 +240,13 @@ static int __virt_to_phy_pkt_encap(TunnatInstance * instance, TunnatThreadInstan
#if MR_TUNNAT_USE_PHONY_ETHER_HEADER
/* 去掉以太网头部,因为是应用自己造的包,所以没有备份的以太网类型数据 */
- void * __adj_check = marsio_buff_adj(mbuf, sizeof(struct ether_hdr));
+ /* 使用写时复制的报文修改接口,因为此时报文可能被其他人引用 */
+
+ void * __adj_check;
+ mbuf = marsio_buff_adj_cw(instance->mr_instance, mbuf, sizeof(struct ether_hdr), &__adj_check);
+
assert(__adj_check != NULL);
+ assert(mbuf != NULL);
#endif