修正部分maat回调表指针的问题
This commit is contained in:
@@ -153,19 +153,24 @@ static void l2_send_to_target(struct traffic_mirror_ethdev * ethdev,
|
||||
{
|
||||
assert(l3_data_offset >= (sizeof(struct ethhdr) + sizeof(struct vlan_hdr)));
|
||||
unsigned int header_offset = l3_data_offset;
|
||||
unsigned int header_len = 0;
|
||||
|
||||
/* need to construct vlan header */
|
||||
if (vlan_tci > 0)
|
||||
{
|
||||
header_offset -= sizeof(struct vlan_hdr);
|
||||
header_len += sizeof(struct vlan_hdr);
|
||||
vlan_tag_construct(snd_buffer + header_offset, vlan_tci, l3_protocol);
|
||||
}
|
||||
|
||||
unsigned int eth_protocol = vlan_tci > 0 ? ETH_P_8021Q : l3_protocol;
|
||||
header_offset -= sizeof(struct ethhdr);
|
||||
header_len += sizeof(struct ethhdr);
|
||||
|
||||
ether_header_construct(snd_buffer + header_offset, (unsigned char *)target_addr->ether_addr_octet,
|
||||
(unsigned char *)ethdev->local_ether_addr, eth_protocol);
|
||||
|
||||
traffic_mirror_ethdev_inject(ethdev, (char *)snd_buffer + header_offset, header_len + l3_data_len);
|
||||
}
|
||||
|
||||
static void l2_send_to_target_group(struct traffic_mirror_ethdev * ethdev, struct profile_table_ex_data * t_group,
|
||||
@@ -183,19 +188,24 @@ static void tcp_segment_send_to_target_group(struct tfe_stream_addr * addr, stru
|
||||
unsigned int seq, unsigned int ack, char flags)
|
||||
{
|
||||
char pkt[ETHER_MAX_LEN];
|
||||
unsigned sz_pkt_prepend = sizeof(struct ethhdr) + sizeof(struct iphdr) + sizeof(struct tcphdr);
|
||||
unsigned sz_pkt_prepend = sizeof(struct ethhdr) + sizeof(struct vlan_hdr) + sizeof(struct iphdr) + sizeof(struct tcphdr);
|
||||
unsigned l3_l4_header_len = 0;
|
||||
unsigned header_len = 0;
|
||||
|
||||
l3_l4_header_len += tcp_header_construct_by_stream_addr(addr,
|
||||
header_len = tcp_header_construct_by_stream_addr(addr,
|
||||
(unsigned char *)pkt + sz_pkt_prepend, seq, ack, flags, 0xffff, 0);
|
||||
|
||||
l3_l4_header_len += ip_header_construct_by_stream_addr(addr, (unsigned char *)pkt + sz_pkt_prepend,
|
||||
sz_pkt_prepend -= header_len;
|
||||
l3_l4_header_len += header_len;
|
||||
|
||||
header_len = ip_header_construct_by_stream_addr(addr, (unsigned char *)pkt + sz_pkt_prepend,
|
||||
sizeof(struct tcphdr) + payload_len, 0, 0x1000, 0, 128, IPPROTO_TCP);
|
||||
|
||||
sz_pkt_prepend -= l3_l4_header_len;
|
||||
sz_pkt_prepend -= header_len;
|
||||
l3_l4_header_len += header_len;
|
||||
|
||||
l2_send_to_target_group(ethdev, t_group, (unsigned char *)pkt,
|
||||
sz_pkt_prepend, l3_l4_header_len + payload_len, ETHERTYPE_IP);
|
||||
l2_send_to_target_group(ethdev, t_group, (unsigned char *)pkt, sz_pkt_prepend,
|
||||
l3_l4_header_len + payload_len, ETHERTYPE_IP);
|
||||
}
|
||||
|
||||
static void tcp_send_to_target_group(struct tfe_stream_addr * addr, struct traffic_mirror_ethdev * ethdev,
|
||||
@@ -205,7 +215,7 @@ static void tcp_send_to_target_group(struct tfe_stream_addr * addr, struct traff
|
||||
unsigned int payload_offset = 0;
|
||||
unsigned mss = ethdev->mtu - (sizeof(struct iphdr) + sizeof(struct tcphdr));
|
||||
|
||||
while(payload_offset < payload_len)
|
||||
while(payload_offset <= payload_len)
|
||||
{
|
||||
unsigned int payload_sz_seg = MIN(payload_offset, mss);
|
||||
const char * payload_ptr_seg = payload + payload_offset;
|
||||
@@ -213,6 +223,8 @@ static void tcp_send_to_target_group(struct tfe_stream_addr * addr, struct traff
|
||||
tcp_segment_send_to_target_group(addr, ethdev, t_group, payload_ptr_seg, payload_sz_seg, seq, ack, flags);
|
||||
seq += payload_sz_seg;
|
||||
payload_offset += payload_sz_seg;
|
||||
|
||||
if (payload_sz_seg == 0) break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -220,6 +232,7 @@ struct traffic_mirror_rebuild * traffic_mirror_rebuild_create(struct tfe_stream_
|
||||
struct profile_table_ex_data * target, struct traffic_mirror_ethdev * ethdev)
|
||||
{
|
||||
struct traffic_mirror_rebuild * instance = ALLOC(struct traffic_mirror_rebuild, 1);
|
||||
instance->addr = addr;
|
||||
instance->target = target;
|
||||
instance->ethdev = ethdev;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user