From 87f48df29a2b016f9a2107133ae59727f2ac8f10 Mon Sep 17 00:00:00 2001 From: luqiuwen Date: Fri, 16 Aug 2019 16:23:45 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9C=A8=E6=B5=81=E9=87=8F=E8=BD=AC=E5=8F=91?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E4=B8=AD=E5=A2=9E=E5=8A=A0DEFER=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E7=9A=84=E8=AF=86=E5=88=AB=E5=8A=9F=E8=83=BD=EF=BC=8C?= =?UTF-8?q?=E9=81=BF=E5=85=8DDEFER=E7=9A=84=E6=95=B0=E6=8D=AE=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E9=95=9C=E5=83=8F=E3=80=82=20*=20=E5=8E=9F=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E6=B2=A1=E6=9C=89=E5=85=B6=E4=BB=96=E6=8F=92=E4=BB=B6?= =?UTF-8?q?DEFER=E6=95=B0=E6=8D=AE=E7=9A=84=E6=83=85=E5=86=B5=EF=BC=8C?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E5=85=B6=E4=BB=96=E6=8F=92=E4=BB=B6=E6=89=A7?= =?UTF-8?q?=E8=A1=8CDEFER=E5=8A=A8=E4=BD=9C=E6=97=B6=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E9=95=9C=E5=83=8F=E8=A2=ABDEFER=E7=9A=84=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=EF=BC=9B=20*=20=E7=8E=B0=E4=BF=AE=E6=AD=A3=EF=BC=8C=E5=9C=A8?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=85=A5=E5=8F=A3=E5=A4=84=E8=AF=BB=E5=8F=96?= =?UTF-8?q?=E6=9C=AC=E6=AC=A1=E5=9B=9E=E8=B0=83=E7=9A=84=E6=B5=81OFFSET?= =?UTF-8?q?=E5=80=BC=EF=BC=8C=E5=BD=93=E6=95=B0=E6=8D=AE=E8=A2=ABDEFER?= =?UTF-8?q?=E6=97=B6=EF=BC=8C=E4=BB=85=E5=8F=91=E9=80=81=E6=9C=AC=E6=AC=A1?= =?UTF-8?q?=E8=B0=83=E7=94=A8=E5=A2=9E=E5=8A=A0=E7=9A=84=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugin/business/traffic-mirror/src/entry.cpp | 59 +++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/plugin/business/traffic-mirror/src/entry.cpp b/plugin/business/traffic-mirror/src/entry.cpp index 3ec13b2..75410f5 100644 --- a/plugin/business/traffic-mirror/src/entry.cpp +++ b/plugin/business/traffic-mirror/src/entry.cpp @@ -11,6 +11,11 @@ struct traffic_mirror_me { struct profile_table_ex_data * profile_ex_data; struct traffic_mirror_rebuild * rebuild_ctx; + + /* Make the DEFER data not to mirror twice + * TODO: the size of (size_t) is enough for a tcp stream offset ? */ + size_t downstream_rx_offset_mirrored; + size_t upstream_tx_offset_mirrored; }; struct traffic_mirror_instance __g_traffic_mirror_instance; @@ -635,8 +640,60 @@ enum tfe_stream_action traffic_mirror_on_data_cb(const struct tfe_stream * strea enum tfe_conn_dir dir, const unsigned char * data, size_t len, void ** pme) { struct traffic_mirror_me * me = (struct traffic_mirror_me *)(*pme); - traffic_mirror_rebuild_data(me->rebuild_ctx, thread_id, (const char *) data, (size_t) len, dir); + + /* Rx offset of this callback */ + size_t rx_offset_this_time; + size_t rx_offset_mirrored; + enum tfe_stream_info rx_offset_type; + + /* Need to mirrored data */ + const unsigned char * ptr_data_need_to_mirrored; + size_t sz_data_need_to_mirrored = 0; + + if (dir == CONN_DIR_DOWNSTREAM) + { + rx_offset_type = INFO_FROM_DOWNSTREAM_RX_OFFSET; + rx_offset_mirrored = me->downstream_rx_offset_mirrored; + } + else + { + rx_offset_type = INFO_FROM_UPSTREAM_RX_OFFSET; + rx_offset_mirrored = me->upstream_tx_offset_mirrored; + } + + /* Get the offset of this callback */ + int ret = tfe_stream_info_get(stream, rx_offset_type, &rx_offset_this_time, sizeof(rx_offset_this_time)); + if (unlikely(ret < 0)) + { + TFE_STREAM_LOG_ERROR(stream, "Failed at fetch rx offset, detached."); + goto errout; + } + + /* Mirrored offset must be larger than rx_offset, + * Otherwise, there is a hole in data stream */ + assert(rx_offset_mirrored >= rx_offset_this_time); + assert(rx_offset_this_time + len >= rx_offset_mirrored); + + sz_data_need_to_mirrored = len - (rx_offset_mirrored - rx_offset_this_time); + ptr_data_need_to_mirrored = data + (len - sz_data_need_to_mirrored); + + /* Don't need to mirrored, the data has been mirrored in DEFER state */ + if (sz_data_need_to_mirrored == 0) + goto out; + + /* Update the mirrored offset */ + if (dir == CONN_DIR_DOWNSTREAM) me->downstream_rx_offset_mirrored += sz_data_need_to_mirrored; + else me->upstream_tx_offset_mirrored += sz_data_need_to_mirrored; + + traffic_mirror_rebuild_data(me->rebuild_ctx, thread_id, (const char *) ptr_data_need_to_mirrored, + (size_t) sz_data_need_to_mirrored, dir); + +out: return ACTION_FORWARD_DATA; + +errout: + tfe_stream_detach(stream); + return ACTION_FORWARD_DATA; } void traffic_mirror_on_close_cb(const struct tfe_stream * stream, unsigned int thread_id,