diff options
| author | yangwei <[email protected]> | 2023-09-18 19:44:14 +0800 |
|---|---|---|
| committer | yangwei <[email protected]> | 2023-09-19 17:52:54 +0800 |
| commit | f77dcf1c603a9b2b518c76385be3487ab1d9f94a (patch) | |
| tree | 5067764f40c2462c1a4ec2cf79408724a2e50ac1 /src | |
| parent | 4d30bc177990ed5854760f54d9b88bf551079e1b (diff) | |
🦄 refactor(sapp_inject_ctrl_pkt): 重构实现,不再直接复用注欺骗包接口
Diffstat (limited to 'src')
| -rw-r--r-- | src/packet_io/sapp_inject.c | 6 | ||||
| -rw-r--r-- | src/packet_io/sendpacket.c | 74 |
2 files changed, 70 insertions, 10 deletions
diff --git a/src/packet_io/sapp_inject.c b/src/packet_io/sapp_inject.c index dd127f3..48fe5a4 100644 --- a/src/packet_io/sapp_inject.c +++ b/src/packet_io/sapp_inject.c @@ -90,12 +90,12 @@ int sapp_inject_ctrl_pkt(struct streaminfo *stream, enum sapp_inject_opt sio, co { return -1; } - +/* stream_pr->is_ctrl_pkt=1; int ret=sapp_inject_pkt(stream, SIO_DEFAULT, payload, payload_len, snd_routedir); stream_pr->is_ctrl_pkt=0; - - return ret; +*/ + return __sapp_inject_ctrl_pkt(stream, sio, payload, payload_len, snd_routedir); } diff --git a/src/packet_io/sendpacket.c b/src/packet_io/sendpacket.c index d6af9b4..a8f2282 100644 --- a/src/packet_io/sendpacket.c +++ b/src/packet_io/sendpacket.c @@ -1,3 +1,4 @@ +#include <MESA_handle_logger.h> #ifdef __cplusplus extern "C" { #endif @@ -2847,6 +2848,72 @@ static int get_eth_carry_layer_type(struct streaminfo *stream, UCHAR send_stream return ret; } +int __sapp_inject_ctrl_pkt(struct streaminfo *stream, enum sapp_inject_opt sio, const void *payload, int payload_len, unsigned char snd_routedir) +{ + if(dir_check(snd_routedir) < 0){ + return -1; + } + int snd_routedir_reverse; + struct streaminfo_private *raw_stream_pr = (struct streaminfo_private *)stream; + const raw_pkt_t *raw_pkt = update_raw_pkt(raw_stream_pr, snd_routedir, &snd_routedir_reverse); + if(NULL == raw_pkt){ + sapp_runtime_log(RLOG_LV_INFO, "__sapp_inject_ctrl_pkt() error, not found raw_pkt!"); + return -1; + } + if(raw_stream_pr->sid_append_list != NULL) + { + ((raw_pkt_t *)raw_pkt)->append_list=raw_stream_pr->sid_append_list; + } + if (raw_stream_pr->stream_trace_id != 0) + { + ((raw_pkt_t *)raw_pkt)->stream_trace_id = raw_stream_pr->stream_trace_id; + } + + int low_net_layer_type = get_eth_carry_layer_type(stream, stream->curdir); + int raw_pkt_l3_hdr_len=raw_pkt->offset_to_raw_pkt_hdr - raw_pkt->overlay_layer_bytes; + int raw_pkt_l4_hdr_len=0; + if(stream->type==STREAM_TYPE_TCP) + { + struct mesa_tcp_hdr *tcph = (struct mesa_tcp_hdr *)((char *)raw_pkt->raw_pkt_data + raw_pkt_l3_hdr_len); + raw_pkt_l4_hdr_len = tcph->th_off<<2; + } + else if(stream->type==STREAM_TYPE_UDP) + { + raw_pkt_l4_hdr_len = sizeof(struct mesa_udp_hdr); + } + else + { + sapp_runtime_log(RLOG_LV_FATAL, "__sapp_inject_ctrl_pkt() error! not support stream_type:%d.\n", + stream->type); + return -1; + } + if (payload_len + raw_pkt_l3_hdr_len + raw_pkt_l4_hdr_len > MTU_MAX) + { + sapp_runtime_log(RLOG_LV_INFO, "__sapp_inject_ctrl_pkt() error! payload_len too long:%d.\n", + payload_len + raw_pkt_l3_hdr_len); + return -1; + } + MESA_send_handle *send_handle = &g_send_handle[stream->threadnum]; + send_handle->send_buf = packet_io_get_sendbuf(SEND_TYPE_LINK_INJECT, stream->threadnum); + send_handle->user_arg = (void *)stream; + memcpy(send_handle->send_buf, (const char *)(raw_pkt->raw_pkt_data)+raw_pkt->overlay_layer_bytes, raw_pkt_l3_hdr_len+raw_pkt_l4_hdr_len); + memcpy(send_handle->send_buf+raw_pkt_l3_hdr_len+raw_pkt_l4_hdr_len, payload, payload_len); + ((raw_pkt_t *)raw_pkt)->is_ctrl_pkt=1; + int raw_payload_len=((raw_pkt_t *)raw_pkt)->payload_len; + ((raw_pkt_t *)raw_pkt)->payload_len=payload_len; + int ret = packet_io_send(send_handle, raw_pkt_l4_hdr_len+raw_pkt_l3_hdr_len+payload_len, SEND_TYPE_LINK_INJECT, + low_net_layer_type, snd_routedir, stream->threadnum, + (char *)KILL_TCP_PHONY_POINTER, (int *)KILL_TCP_PHONY_POINTER, + raw_pkt); + ((raw_pkt_t *)raw_pkt)->is_ctrl_pkt=0; + ((raw_pkt_t *)raw_pkt)->payload_len=raw_payload_len; + if(ret < 0) + { + sapp_runtime_log(RLOG_LV_FATAL, "packet_io_send() ret < 0, stream_type:%d, addrtype:%d\n", stream->type, stream->addr.addrtype); + } + return ret; +} + int __sapp_inject_pkt(struct streaminfo *raw_stream, enum sapp_inject_opt sio, const void *payload, int payload_len, unsigned char snd_routedir, void *user_arg) @@ -2943,13 +3010,6 @@ int __sapp_inject_pkt(struct streaminfo *raw_stream, enum sapp_inject_opt sio, { ((raw_pkt_t *)raw_pkt)->stream_trace_id = raw_stream_pr->stream_trace_id; } - - if (raw_stream_pr->is_ctrl_pkt==1) - { - ((raw_pkt_t *)raw_pkt)->is_ctrl_pkt=1; - ((raw_pkt_t *)raw_pkt)->payload_len=payload_len; - } - /* injectʹ�õ���routedir, �˴�ת����stream dir, ע��: ��������Ķ������ܲ����ɵ�ǰ��������, ����kni, �Ǵ����������յ����ݰ�, ��ע����·��, ���ܴ�raw_pkt��raw_stream->routedir�жϷ���!!!! |
