修正部分maat回调表指针的问题

This commit is contained in:
luqiuwen
2019-06-08 20:49:31 +08:00
committed by zhengchao
parent c994077c3b
commit d5c54b96a7
3 changed files with 65 additions and 24 deletions

View File

@@ -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;