diff options
| author | Qiuwen Lu <[email protected]> | 2017-07-24 14:25:20 +0800 |
|---|---|---|
| committer | Qiuwen Lu <[email protected]> | 2017-07-24 14:25:20 +0800 |
| commit | fbff4ce9bc87eb2940435bdac972890c06dd6706 (patch) | |
| tree | c651691e45f334468069173d7c8d9c04398d5ad6 | |
| parent | 0891b87be549f7939e3bfe7a55f2babee2e10950 (diff) | |
TUNNAT:使用写时复制接口。v4.2.6-20170724
- 对于有历史记录的主动发包,使用写时复制的接口,避免报文被其他人持有,造成写入失败。
- 写时复制的实现,增加释放传入报文缓冲区的逻辑,避免内存泄露。
| -rw-r--r-- | app/src/mrb.c | 3 | ||||
| -rw-r--r-- | tunnat/src/runtime.cc | 7 |
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 |
