summaryrefslogtreecommitdiff
path: root/entry/src/kni_entry.cpp
diff options
context:
space:
mode:
authorluwenpeng <[email protected]>2021-11-23 14:56:33 +0300
committerluwenpeng <[email protected]>2021-11-24 09:24:04 +0300
commit304c818f54efaaecb42f7d746a3b20aa0e0fcfb3 (patch)
tree71b7146026746d2927908f4f67f2a1236cb37a59 /entry/src/kni_entry.cpp
parent5718d879f3b37d1e90b8f9834b3837137fb69766 (diff)
当Sapp收到的IP包进行分片重组后,KNI发给TFE的包需重新计算IPv4的校验和bugfix-checksum-ip
Diffstat (limited to 'entry/src/kni_entry.cpp')
-rw-r--r--entry/src/kni_entry.cpp39
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;
}