diff options
Diffstat (limited to 'entry/src')
| -rw-r--r-- | entry/src/kni_entry.cpp | 39 |
1 files changed, 35 insertions, 4 deletions
diff --git a/entry/src/kni_entry.cpp b/entry/src/kni_entry.cpp index ee1bc7b..f2b6091 100644 --- a/entry/src/kni_entry.cpp +++ b/entry/src/kni_entry.cpp @@ -790,12 +790,43 @@ static int send_to_tfe_tun_mode(char *raw_data, uint16_t raw_len, addr_type_t ad static int send_to_tfe(char *raw_data, uint16_t raw_len, int thread_seq, int tfe_id, addr_type_t addr_type){ int mode = g_kni_handle->deploy_mode; int ret; - if(mode == KNI_DEPLOY_MODE_TUN){ - ret = send_to_tfe_tun_mode(raw_data, raw_len, addr_type); + + if (addr_type == ADDR_TYPE_IPV6) + { + if (mode == KNI_DEPLOY_MODE_TUN) + { + ret = send_to_tfe_tun_mode(raw_data, raw_len, addr_type); + } + else + { + ret = send_to_tfe_normal_mode(raw_data, raw_len, thread_seq, tfe_id, addr_type); + } } - else{ - ret = send_to_tfe_normal_mode(raw_data, raw_len, thread_seq, tfe_id, addr_type); + else + { + struct pkt_info pktinfo; + memset(&pktinfo, 0, sizeof(pkt_info)); + + char *ptr = (char *)malloc(raw_len); + memcpy(ptr, raw_data, raw_len); + kni_ipv4_header_parse((void*)ptr, &pktinfo); + struct iphdr *iphdr = (struct iphdr*)ptr; + iphdr->check = 0; + iphdr->check = kni_ip_checksum((void*)iphdr, pktinfo.iphdr_len); + + if (mode == KNI_DEPLOY_MODE_TUN) + { + ret = send_to_tfe_tun_mode(ptr, raw_len, addr_type); + } + else + { + ret = send_to_tfe_normal_mode(ptr, raw_len, thread_seq, tfe_id, addr_type); + } + + free(ptr); + ptr = NULL; } + return ret; } |
