diff options
Diffstat (limited to 'src/packet_io/sendpacket.c')
| -rw-r--r-- | src/packet_io/sendpacket.c | 296 |
1 files changed, 237 insertions, 59 deletions
diff --git a/src/packet_io/sendpacket.c b/src/packet_io/sendpacket.c index 5937763..03f1c81 100644 --- a/src/packet_io/sendpacket.c +++ b/src/packet_io/sendpacket.c @@ -827,39 +827,39 @@ static int calc_mpls_hdr_len(struct streaminfo_private * stream_pr, UCHAR send_s if(g_asymmetric_addr_layer_set.layer_type_index[ADDR_TYPE_MPLS][stream_pr->layer_index] != 0){ if(send_stream_dir == DIR_C2S){ - mpls_layer_len = sizeof(struct mesa_mpls_hdr) * mpls_addr->src_mpls_layer_num; - if(mpls_addr->src_has_ctrl_word){ + mpls_layer_len = sizeof(struct mesa_mpls_hdr) * mpls_addr->c2s_layer_num; + if(mpls_addr->c2s_has_ctrl_word){ mpls_layer_len += sizeof(int); } }else{ - mpls_layer_len = sizeof(struct mesa_mpls_hdr) * mpls_addr->dest_mpls_layer_num; - if(mpls_addr->dst_has_ctrl_word){ + mpls_layer_len = sizeof(struct mesa_mpls_hdr) * mpls_addr->s2c_layer_num; + if(mpls_addr->s2c_has_ctrl_word){ mpls_layer_len += sizeof(int); } } }else{ /* �����ǿ��Ҫ��ǶԳƵ�ַ, �������û�е�ַ, ��ʹ�öԲ��ַ��Ϣ */ if(send_stream_dir == DIR_C2S){ - if(mpls_addr->src_mpls_layer_num > 0){ - mpls_layer_len = sizeof(struct mesa_mpls_hdr) * mpls_addr->src_mpls_layer_num; - if(mpls_addr->src_has_ctrl_word){ + if(mpls_addr->c2s_layer_num > 0){ + mpls_layer_len = sizeof(struct mesa_mpls_hdr) * mpls_addr->c2s_layer_num; + if(mpls_addr->c2s_has_ctrl_word){ mpls_layer_len += sizeof(int); } }else{ - mpls_layer_len = sizeof(struct mesa_mpls_hdr) * mpls_addr->dest_mpls_layer_num; - if(mpls_addr->dst_has_ctrl_word){ + mpls_layer_len = sizeof(struct mesa_mpls_hdr) * mpls_addr->s2c_layer_num; + if(mpls_addr->s2c_has_ctrl_word){ mpls_layer_len += sizeof(int); } } }else{ - if(mpls_addr->dest_mpls_layer_num > 0){ - mpls_layer_len = sizeof(struct mesa_mpls_hdr) * mpls_addr->dest_mpls_layer_num; - if(mpls_addr->dst_has_ctrl_word){ + if(mpls_addr->s2c_layer_num > 0){ + mpls_layer_len = sizeof(struct mesa_mpls_hdr) * mpls_addr->s2c_layer_num; + if(mpls_addr->s2c_has_ctrl_word){ mpls_layer_len += sizeof(int); } }else{ - mpls_layer_len = sizeof(struct mesa_mpls_hdr) * mpls_addr->src_mpls_layer_num; - if(mpls_addr->src_has_ctrl_word){ + mpls_layer_len = sizeof(struct mesa_mpls_hdr) * mpls_addr->c2s_layer_num; + if(mpls_addr->c2s_has_ctrl_word){ mpls_layer_len += sizeof(int); } } @@ -876,23 +876,23 @@ static int calc_vlan_hdr_len(struct streaminfo_private * stream_pr, UCHAR send_s if(g_asymmetric_addr_layer_set.layer_type_index[ADDR_TYPE_VLAN][stream_pr->layer_index] != 0){ if(send_stream_dir == DIR_C2S){ - vlan_layer_len = sizeof(struct mesa_vlan_hdr) * vlan_addr->src_vlan_layer_num; + vlan_layer_len = sizeof(struct mesa_vlan_hdr) * vlan_addr->c2s_layer_num; }else{ - vlan_layer_len = sizeof(struct mesa_vlan_hdr) * vlan_addr->dst_vlan_layer_num; + vlan_layer_len = sizeof(struct mesa_vlan_hdr) * vlan_addr->s2c_layer_num; } }else{ /* �����ǿ��Ҫ��ǶԳƵ�ַ, �������û��, ��ʹ�öԲ��ַ��Ϣ */ if(send_stream_dir == DIR_C2S){ - if(vlan_addr->src_vlan_layer_num != 0){ - vlan_layer_len = sizeof(struct mesa_vlan_hdr) * vlan_addr->src_vlan_layer_num; + if(vlan_addr->c2s_layer_num != 0){ + vlan_layer_len = sizeof(struct mesa_vlan_hdr) * vlan_addr->c2s_layer_num; }else{ - vlan_layer_len = sizeof(struct mesa_vlan_hdr) * vlan_addr->dst_vlan_layer_num; + vlan_layer_len = sizeof(struct mesa_vlan_hdr) * vlan_addr->s2c_layer_num; } }else{ - if(vlan_addr->dst_vlan_layer_num != 0){ - vlan_layer_len = sizeof(struct mesa_vlan_hdr) * vlan_addr->dst_vlan_layer_num; + if(vlan_addr->s2c_layer_num != 0){ + vlan_layer_len = sizeof(struct mesa_vlan_hdr) * vlan_addr->s2c_layer_num; }else{ - vlan_layer_len = sizeof(struct mesa_vlan_hdr) * vlan_addr->src_vlan_layer_num; + vlan_layer_len = sizeof(struct mesa_vlan_hdr) * vlan_addr->c2s_layer_num; } } } @@ -1444,6 +1444,43 @@ static int build_net_layer_pppoe_ses(struct streaminfo_private *stream_pr, int c return sizeof(struct mesa_pppoe_session_hdr); } +/* �����紫��ĵ�ַת��Ϊ�ڴ�ṹ, ����ҵ�������� */ +int vlan_addr_net_to_mem(const struct mesa_vlan_detail_hdr *net_vlan_hdr, struct single_layer_vlan_addr *mem_vlan_hdr) +{ + mem_vlan_hdr->VID = htons(net_vlan_hdr->vlan_id_high << 8 | net_vlan_hdr->vlan_id_low); + mem_vlan_hdr->TPID = net_vlan_hdr->type; + mem_vlan_hdr->PCP = net_vlan_hdr->priority; + mem_vlan_hdr->DEI = net_vlan_hdr->del_flag; + + return 0; +} + +/* ���ڴ��ַ�ṹת��ΪRFC��ͷ����ʽ, ���͵������� */ +int vlan_addr_mem_to_net(const struct single_layer_vlan_addr *mem_vlan_hdr, struct mesa_vlan_detail_hdr *net_vlan_hdr) +{ + net_vlan_hdr->vlan_id_high = (ntohs(mem_vlan_hdr->VID) & 0xF00) >> 8; + net_vlan_hdr->vlan_id_low = (ntohs(mem_vlan_hdr->VID) & 0xFF); + net_vlan_hdr->type = mem_vlan_hdr->TPID; + net_vlan_hdr->priority = mem_vlan_hdr->PCP; + net_vlan_hdr->del_flag = mem_vlan_hdr->DEI; + + return 0; +} + + +static int build_net_multilayer_vlan(const struct single_layer_vlan_addr *layer_array, int layer_num, struct mesa_vlan_detail_hdr *net_vlan_hdr) +{ + int i; + + for( i = 0; i < layer_num; i++){ + vlan_addr_mem_to_net(&layer_array[i], net_vlan_hdr); + net_vlan_hdr++; + } + + return 0; +} + + static int build_net_layer_vlan(struct streaminfo_private *stream_pr, int carry_layer_type, int carry_layer_len, unsigned char *buf, UCHAR send_stream_dir, const raw_pkt_t *raw_pkt) { @@ -1453,25 +1490,35 @@ static int build_net_layer_vlan(struct streaminfo_private *stream_pr, int carry_ in_stream_addr = (struct layer_addr_vlan *)(stream_pr->stream_public.addr.vlan); if(DIR_C2S == send_stream_dir){ - if(in_stream_addr->src_vlan_layer_num > 0){ - layer_len = sizeof(struct mesa_vlan_hdr) * in_stream_addr->src_vlan_layer_num; - memcpy(buf, in_stream_addr->src_vlan_pkt, layer_len); + if(in_stream_addr->c2s_layer_num > 0){ + layer_len = sizeof(struct mesa_vlan_hdr) * in_stream_addr->c2s_layer_num; + //memcpy(buf, in_stream_addr->c2s_addr_array, layer_len); + build_net_multilayer_vlan(in_stream_addr->c2s_addr_array, in_stream_addr->c2s_layer_num, (struct mesa_vlan_detail_hdr *)buf); }else{ /* ����û�е�ַ, ȡ���������ļ�asymmetric_addr_layer�Ƿ�����öԲ��ַ */ if(0 == g_asymmetric_addr_layer_set.layer_type_index[ADDR_TYPE_VLAN][stream_pr->layer_index]){ - layer_len = sizeof(struct mesa_vlan_hdr) * in_stream_addr->dst_vlan_layer_num; - memcpy(buf, in_stream_addr->dst_vlan_pkt, layer_len); + layer_len = sizeof(struct mesa_vlan_hdr) * in_stream_addr->s2c_layer_num; + build_net_multilayer_vlan(in_stream_addr->s2c_addr_array, in_stream_addr->s2c_layer_num, (struct mesa_vlan_detail_hdr *)buf); + ///memcpy(buf, in_stream_addr->s2c_addr_array, layer_len); + }else{ + sapp_runtime_log(RLOG_LV_FATAL, "build_net_layer_vlan() error, no c2s vlan addr, but asymmetric_addr_layer is set!\n"); + return -1; } } }else{ - if(in_stream_addr->dst_vlan_layer_num > 0){ - layer_len = sizeof(struct mesa_vlan_hdr) * in_stream_addr->dst_vlan_layer_num; - memcpy(buf, in_stream_addr->dst_vlan_pkt, layer_len); + if(in_stream_addr->s2c_layer_num > 0){ + layer_len = sizeof(struct mesa_vlan_hdr) * in_stream_addr->s2c_layer_num; + //memcpy(buf, in_stream_addr->s2c_addr_array, layer_len); + build_net_multilayer_vlan(in_stream_addr->s2c_addr_array, in_stream_addr->s2c_layer_num, (struct mesa_vlan_detail_hdr *)buf); }else{ /* ����û�е�ַ, ȡ���������ļ�asymmetric_addr_layer�Ƿ�����öԲ��ַ */ if(0 == g_asymmetric_addr_layer_set.layer_type_index[ADDR_TYPE_VLAN][stream_pr->layer_index]){ - layer_len = sizeof(struct mesa_vlan_hdr) * in_stream_addr->src_vlan_layer_num; - memcpy(buf, in_stream_addr->src_vlan_pkt, layer_len); + layer_len = sizeof(struct mesa_vlan_hdr) * in_stream_addr->c2s_layer_num; + //memcpy(buf, in_stream_addr->c2s_addr_array, layer_len); + build_net_multilayer_vlan(in_stream_addr->c2s_addr_array, in_stream_addr->c2s_layer_num, (struct mesa_vlan_detail_hdr *)buf); + }else{ + sapp_runtime_log(RLOG_LV_FATAL, "build_net_layer_vlan() error, no s2c vlan addr, but asymmetric_addr_layer is set!\n"); + return -1; } } } @@ -1622,6 +1669,46 @@ static int build_net_layer_gre(struct streaminfo_private *stream_pr, int carry_l return gre_hdr_len; } +/* �����紫��ĵ�ַת��Ϊ�ڴ�ṹ, ����ҵ�������� */ +int mpls_addr_net_to_mem(const struct mesa_mpls_hdr *net_mpls_hdr, struct single_layer_mpls_addr *mem_mpls_hdr) +{ + memset(mem_mpls_hdr, 0, sizeof(struct single_layer_mpls_addr)); + + mem_mpls_hdr->label = htonl( (net_mpls_hdr->mpls_label_low<<12) | (net_mpls_hdr->mpls_label_mid<<4) | net_mpls_hdr->mpls_label_high ); /* network order */ + mem_mpls_hdr->experimental = net_mpls_hdr->mpls_exp; + mem_mpls_hdr->bottom = net_mpls_hdr->mpls_bls; + mem_mpls_hdr->ttl = net_mpls_hdr->mpls_ttl; + + return 0; +} + +/* ���ڴ��ַ�ṹת��ΪRFC��ͷ����ʽ, ���͵������� */ +int mpls_addr_mem_to_net(const struct single_layer_mpls_addr *mem_mpls_hdr, struct mesa_mpls_hdr *net_mpls_hdr) +{ + memset(net_mpls_hdr, 0, sizeof(struct mesa_mpls_hdr)); + + net_mpls_hdr->mpls_label_low = (ntohl(mem_mpls_hdr->label) & 0xFF000) >> 12; + net_mpls_hdr->mpls_label_mid = (ntohl(mem_mpls_hdr->label) & 0xFF0) >> 4; + net_mpls_hdr->mpls_label_high = ntohl(mem_mpls_hdr->label) & 0xF; + net_mpls_hdr->mpls_exp = mem_mpls_hdr->experimental; + net_mpls_hdr->mpls_bls = mem_mpls_hdr->bottom; + net_mpls_hdr->mpls_ttl = mem_mpls_hdr->ttl; + + return 0; +} + + +static int build_net_multilayer_mpls(const struct single_layer_mpls_addr *layer_array, int layer_num, struct mesa_mpls_hdr *net_mpls_hdr) +{ + int i; + + for( i = 0; i < layer_num; i++){ + mpls_addr_mem_to_net(&layer_array[i], net_mpls_hdr); + net_mpls_hdr++; + } + + return 0; +} static int build_net_layer_mpls(struct streaminfo_private *stream_pr, int carry_layer_type, @@ -1633,41 +1720,52 @@ static int build_net_layer_mpls(struct streaminfo_private *stream_pr, int carry_ in_stream_addr = (struct layer_addr_mpls *)(stream_pr->stream_public.addr.mpls); if(DIR_C2S == send_stream_dir){ - if(in_stream_addr->src_mpls_layer_num > 0){ - layer_len = sizeof(struct mesa_mpls_hdr) * in_stream_addr->src_mpls_layer_num; - memcpy(buf, in_stream_addr->src_mpls_pkt, layer_len); - if(in_stream_addr->src_has_ctrl_word){ - memcpy(buf + layer_len, &in_stream_addr->src_mpls_ctrl_word, sizeof(int)); + if(in_stream_addr->c2s_layer_num > 0){ + layer_len = sizeof(struct mesa_mpls_hdr) * in_stream_addr->c2s_layer_num; + //memcpy(buf, in_stream_addr->src_mpls_pkt, layer_len); + build_net_multilayer_mpls(in_stream_addr->c2s_addr_array, in_stream_addr->c2s_layer_num, (struct mesa_mpls_hdr *)buf); + + if(in_stream_addr->c2s_has_ctrl_word){ + memcpy(buf + layer_len, &in_stream_addr->c2s_mpls_ctrl_word, sizeof(int)); layer_len += sizeof(int); } }else{ /* ����û�е�ַ, ȡ���������ļ�asymmetric_addr_layer�Ƿ�����öԲ��ַ */ if(0 == g_asymmetric_addr_layer_set.layer_type_index[ADDR_TYPE_MPLS][stream_pr->layer_index]){ - layer_len = sizeof(struct mesa_mpls_hdr) * in_stream_addr->dest_mpls_layer_num; - memcpy(buf, in_stream_addr->dest_mpls_pkt, layer_len); - if(in_stream_addr->dst_has_ctrl_word){ - memcpy(buf + layer_len, &in_stream_addr->dst_mpls_ctrl_word, sizeof(int)); + layer_len = sizeof(struct mesa_mpls_hdr) * in_stream_addr->s2c_layer_num; + //memcpy(buf, in_stream_addr->dest_mpls_pkt, layer_len); + build_net_multilayer_mpls(in_stream_addr->s2c_addr_array, in_stream_addr->s2c_layer_num, (struct mesa_mpls_hdr *)buf); + if(in_stream_addr->s2c_has_ctrl_word){ + memcpy(buf + layer_len, &in_stream_addr->s2c_mpls_ctrl_word, sizeof(int)); layer_len += sizeof(int); } + }else{ + sapp_runtime_log(RLOG_LV_FATAL, "build_net_layer_mpls() error, no c2s mpls addr, but asymmetric_addr_layer is set!\n"); + return -1; } } }else{ - if(in_stream_addr->dest_mpls_layer_num > 0){ - layer_len = sizeof(struct mesa_mpls_hdr) * in_stream_addr->dest_mpls_layer_num; - memcpy(buf, in_stream_addr->dest_mpls_pkt, layer_len); - if(in_stream_addr->dst_has_ctrl_word){ - memcpy(buf + layer_len, &in_stream_addr->dst_mpls_ctrl_word, sizeof(int)); + if(in_stream_addr->s2c_layer_num > 0){ + layer_len = sizeof(struct mesa_mpls_hdr) * in_stream_addr->s2c_layer_num; + //memcpy(buf, in_stream_addr->dest_mpls_pkt, layer_len); + build_net_multilayer_mpls(in_stream_addr->s2c_addr_array, in_stream_addr->s2c_layer_num, (struct mesa_mpls_hdr *)buf); + if(in_stream_addr->s2c_has_ctrl_word){ + memcpy(buf + layer_len, &in_stream_addr->s2c_mpls_ctrl_word, sizeof(int)); layer_len += sizeof(int); } }else{ /* ����û�е�ַ, ȡ���������ļ�asymmetric_addr_layer�Ƿ�����öԲ��ַ */ if(0 == g_asymmetric_addr_layer_set.layer_type_index[ADDR_TYPE_MPLS][stream_pr->layer_index]){ - layer_len = sizeof(struct mesa_mpls_hdr) * in_stream_addr->src_mpls_layer_num; - memcpy(buf, in_stream_addr->src_mpls_pkt, layer_len); - if(in_stream_addr->src_has_ctrl_word){ - memcpy(buf + layer_len, &in_stream_addr->src_mpls_ctrl_word, sizeof(int)); + layer_len = sizeof(struct mesa_mpls_hdr) * in_stream_addr->c2s_layer_num; + //memcpy(buf, in_stream_addr->src_mpls_pkt, layer_len); + build_net_multilayer_mpls(in_stream_addr->c2s_addr_array, in_stream_addr->c2s_layer_num, (struct mesa_mpls_hdr *)buf); + if(in_stream_addr->c2s_has_ctrl_word){ + memcpy(buf + layer_len, &in_stream_addr->c2s_mpls_ctrl_word, sizeof(int)); layer_len += sizeof(int); } + }else{ + sapp_runtime_log(RLOG_LV_FATAL, "build_net_layer_mpls() error, no s2c mpls addr, but asymmetric_addr_layer is set!\n"); + return -1; } } } @@ -1845,6 +1943,59 @@ static int build_net_layer_l2tp(struct streaminfo_private *stream_pr, int carry_ return l2tp_raw_hdr_len; } + +/* ���֮ǰ�������ظ�����, ����ÿ������ǰN��������Ҫ����bloom filter */ +static void sendpkt_dup_pkt_mark(const struct streaminfo *top_stream, unsigned char addrtype, const char *this_iphdr, const char *this_transport_hdr) +{ + const struct streaminfo_private *top_stream_pr; + int need_process_dup_pkt_flag = 0; + + top_stream_pr = (struct streaminfo_private *)top_stream; + if(top_stream_pr->has_duplicate_pkt){ + need_process_dup_pkt_flag = 1; + }else{ + if(STREAM_TYPE_TCP == top_stream->type){ + if(top_stream->ptcpdetail->clientpktnum + top_stream->ptcpdetail->serverpktnum < SAPP_DUP_FIRST_PKT_NUM){ + need_process_dup_pkt_flag = 1; + } + }else{ + if(top_stream->pudpdetail->clientpktnum + top_stream->pudpdetail->serverpktnum < SAPP_DUP_FIRST_PKT_NUM){ + need_process_dup_pkt_flag = 1; + } + } + } + + if(need_process_dup_pkt_flag != 0){ + if(STREAM_TYPE_TCP == top_stream->type){ + sapp_dup_pkt_mark_tcp(top_stream->threadnum, addrtype, this_iphdr, (const struct mesa_tcp_hdr *)(this_transport_hdr)); + }else{ + sapp_dup_pkt_mark_udp(top_stream->threadnum, addrtype, this_iphdr, (const struct mesa_udp_hdr *)(this_transport_hdr)); + } + } + + return; +} + +void sendpkt_dup_pkt_mark_stream(const struct streaminfo *top_stream, const char *ip_hdr) +{ + const struct mesa_ip4_hdr *ip4hdr; + const struct mesa_ip6_hdr *ip6hdr; + sapp_dup_pkt_key_v4_t dup_bloom_key_v4; + sapp_dup_pkt_key_v6_t dup_bloom_key_v6; + const char *transport_layer_hdr; + + if(ADDR_TYPE_IPV4 == top_stream->addr.addrtype){ + ip4hdr = (struct mesa_ip4_hdr *)ip_hdr; + transport_layer_hdr = ip_hdr + ip4hdr->ip_hl * 4; + sendpkt_dup_pkt_mark(top_stream, ADDR_TYPE_IPV4, ip_hdr, transport_layer_hdr); + }else{ + ip6hdr = (struct mesa_ip6_hdr *)ip_hdr; + transport_layer_hdr = ip_hdr + sizeof(struct mesa_ip6_hdr); + sendpkt_dup_pkt_mark(top_stream, ADDR_TYPE_IPV6, ip_hdr, transport_layer_hdr); + } +} + + /* buf: ִ��Ӧ�ò㸺�ص�ַ, skip hdr. reverse: ��Ӧ�ò�ĽǶ�����dir, ��ʾ�뵱ǰraw_pkt�����, �����Ƿ�һ��, �����з����Եĵ�ַ, �跴�����. @@ -1863,6 +2014,7 @@ static int build_net_layer_pkt(const struct streaminfo *top_stream, const struct char debug_print_buf[256]; const struct streaminfo *carry_layer_stream; + if(NULL == stream_pr){ return carry_layer_len; } @@ -1903,6 +2055,11 @@ static int build_net_layer_pkt(const struct streaminfo *top_stream, const struct sapp_runtime_log(RLOG_LV_DEBUG, "build_net_layer_pkt()->IPV4, %s, send_stream_dir:%d, ipid:%u, ip_checksum:0x%x", sapp_raw_ipv4_ntop(ip4hdr, debug_print_buf, sizeof(debug_print_buf)), send_stream_dir, ntohs(ip4hdr->ip_id), ntohs(ip4hdr->ip_sum)); + + /* �ظ�����ʶ��, �ӵ���������Ϊ���������, ���ܻ��ж��, �Ҳ����پ���jump_layer��ת���ڲ�udp/tcp���� */ + if(sapp_global_val->config.packet_io.dup_pkt_para.dup_pkt_distinguish_enable != 0){ + sendpkt_dup_pkt_mark(top_stream, ADDR_TYPE_IPV4, (char *)buf, buf+sizeof(struct mesa_ip4_hdr)); + } } break; @@ -1928,6 +2085,11 @@ static int build_net_layer_pkt(const struct streaminfo *top_stream, const struct /* TCP��У�����ҪIP��ַ��Ϣ, ����Ҫ�ڹ�����IP����Ϣ��, �ټ���checksum */ checksum_for_carry_layer(buf, __ADDR_TYPE_IP_PAIR_V6, carry_layer_type, carry_layer_len+transport_layer_len); carry_layer_type = __ADDR_TYPE_IP_PAIR_V6; + + /* �ظ�����ʶ��, �ӵ���������Ϊ���������, ���ܻ��ж��, �Ҳ����پ���jump_layer��ת���ڲ�udp/tcp���� */ + if(sapp_global_val->config.packet_io.dup_pkt_para.dup_pkt_distinguish_enable != 0){ + sendpkt_dup_pkt_mark(top_stream, ADDR_TYPE_IPV6, (char *)buf, buf+sizeof(struct mesa_ip6_hdr)); + } break; case __ADDR_TYPE_IP_PAIR_V4: @@ -1956,7 +2118,11 @@ static int build_net_layer_pkt(const struct streaminfo *top_stream, const struct /* ���÷����ַ, ���¼��㳤��, ����vlan��ַ */ this_layer_len = calc_vlan_hdr_len(stream_pr, send_stream_dir ^ DIR_DOUBLE); buf -= this_layer_len; - build_net_layer_vlan(stream_pr, carry_layer_type, carry_layer_len, buf, send_stream_dir ^ DIR_DOUBLE, raw_pkt); + ret = build_net_layer_vlan(stream_pr, carry_layer_type, carry_layer_len, buf, send_stream_dir ^ DIR_DOUBLE, raw_pkt); + if(ret < 0){ + sapp_runtime_log(RLOG_LV_FATAL, "build_net_layer_vlan() error!\n"); + return -1; + } carry_layer_type = ADDR_TYPE_VLAN; sapp_runtime_log(10, "build_net_layer_vlan() build vlan layer, but no addr of dir:%d, use opposite_addr.\n", send_stream_dir); }else{ @@ -1965,7 +2131,11 @@ static int build_net_layer_pkt(const struct streaminfo *top_stream, const struct } }else{ buf -= this_layer_len; - build_net_layer_vlan(stream_pr, carry_layer_type, carry_layer_len, buf, send_stream_dir, raw_pkt); + ret = build_net_layer_vlan(stream_pr, carry_layer_type, carry_layer_len, buf, send_stream_dir, raw_pkt); + if(ret < 0){ + sapp_runtime_log(RLOG_LV_FATAL, "build_net_layer_vlan() error!\n"); + return -1; + } carry_layer_type = ADDR_TYPE_VLAN; } break; @@ -2019,7 +2189,11 @@ static int build_net_layer_pkt(const struct streaminfo *top_stream, const struct break; }else{ buf -= this_layer_len; - build_net_layer_mpls(stream_pr, carry_layer_type, carry_layer_len, buf, send_stream_dir, raw_pkt); + ret = build_net_layer_mpls(stream_pr, carry_layer_type, carry_layer_len, buf, send_stream_dir, raw_pkt); + if(ret < 0){ + sapp_runtime_log(RLOG_LV_FATAL, "build_net_layer_mpls() error!\n"); + return -1; + } carry_layer_type = ADDR_TYPE_MPLS; } @@ -2939,14 +3113,14 @@ static int skip_asymmetric_presence_layer(const struct streaminfo *stream, UCHAR /* ��������������������ղ�, ���п����ǵ�����, ��Ҫ��ʵ����û�е�ַ */ if(DIR_C2S == send_stream_dir){ - if(0 == vaddr->src_vlan_layer_num){ + if(0 == vaddr->c2s_layer_num){ /* �������û�е�ַ, ���Ƿ�ǿ��Ҫ��ǶԳ�ԭ��, �����, ��ʵ���߲�������,�����ʱ��ʧ����; ������ǿ��Ը��öԲ��ַ */ if(g_asymmetric_addr_layer_set.layer_type_index[ADDR_TYPE_VLAN][stream_pr->layer_index] != 0){ need_skip = 1; } } }else{ - if(0 == vaddr->dst_vlan_layer_num){ + if(0 == vaddr->s2c_layer_num){ /* �������û�е�ַ, ���Ƿ�ǿ��Ҫ��ǶԳ�ԭ��, �����, ��ʵ���߲�������,�����ʱ��ʧ����; ������ǿ��Ը��öԲ��ַ */ if(g_asymmetric_addr_layer_set.layer_type_index[ADDR_TYPE_VLAN][stream_pr->layer_index] != 0){ need_skip = 1; @@ -2961,14 +3135,14 @@ static int skip_asymmetric_presence_layer(const struct streaminfo *stream, UCHAR const struct layer_addr_mpls *maddr = stream->addr.mpls; if(DIR_C2S == send_stream_dir){ - if(0 == maddr->src_mpls_layer_num){ + if(0 == maddr->c2s_layer_num){ /* �������û�е�ַ, ���Ƿ�ǿ��Ҫ��ǶԳ�ԭ��, �����, ��ʵ���߲�������,�����ʱ��ʧ����; ������ǿ��Ը��öԲ��ַ */ if(g_asymmetric_addr_layer_set.layer_type_index[ADDR_TYPE_MPLS][stream_pr->layer_index] != 0){ need_skip = 1; } } }else{ - if(0 == maddr->dest_mpls_layer_num){ + if(0 == maddr->s2c_layer_num){ if(g_asymmetric_addr_layer_set.layer_type_index[ADDR_TYPE_MPLS][stream_pr->layer_index] != 0){ need_skip = 1; } @@ -3055,6 +3229,11 @@ int __sapp_inject_pkt(struct streaminfo *raw_stream, enum sapp_inject_opt sio, /* ������ǰ�� */ inject_stream = raw_stream->pfather; inject_stream_pr = (struct streaminfo_private *)inject_stream; + /* ����������ʱָ����SIO_EXCLUDE_THIS_LAYER_HDR, ˵���ڲ���Ԫ�����ɲ�������, + һ�㲻�����ߵ�build_pkt�ĺ�����, �˴���Ҫ����ip��������bloom filter */ + if(sapp_global_val->config.packet_io.dup_pkt_para.dup_pkt_distinguish_enable != 0){ + sendpkt_dup_pkt_mark_stream(raw_stream, (char *)payload); + } }else{ if((ADDR_TYPE_IPV4 == inject_stream->addr.addrtype) || (ADDR_TYPE_TCP == inject_stream->addr.addrtype)){ @@ -3230,13 +3409,12 @@ static int send_handle_init(int tot_thread_num) } g_send_handle[i].threadnum = i; -#if (0 == SAPP_AS_TARGET_SO) g_send_handle[i].low_level_send_handle = dl_io_fun_list.dl_io_get_send_handle(i); if(NULL == g_send_handle[i].low_level_send_handle){ printf("dl_io_get_send_handle error !\n"); return -1; } -#endif + g_packet_dl_send_handle[i] = g_send_handle[i].low_level_send_handle; /* 20161117 lijia move from packet_io_init() */ } |
