修复cmsg解析问题

This commit is contained in:
崔一鸣
2019-06-04 21:18:55 +08:00
parent 8f1a4f3dbd
commit 03a5f7ec6c
4 changed files with 39 additions and 13 deletions

View File

@@ -8,7 +8,8 @@ struct kni_cmsg_serialize_header;
enum kni_cmsg_errno{ enum kni_cmsg_errno{
KNI_CMSG_INVALID_FORMAT = -1, KNI_CMSG_INVALID_FORMAT = -1,
KNI_CMSG_BUFF_NOT_ENOUGH = -2, KNI_CMSG_BUFF_NOT_ENOUGH = -2,
KNI_CMSG_INVALID_TYPE = -3 KNI_CMSG_INVALID_TYPE = -3,
KNI_CMSG_TYPE_UNSET = -4,
}; };
enum tfe_cmsg_tlv_type enum tfe_cmsg_tlv_type

View File

@@ -65,11 +65,15 @@ int kni_cmsg_set(struct kni_cmsg *cmsg, uint16_t type, const unsigned char *valu
int kni_cmsg_get(struct kni_cmsg *cmsg, uint16_t type, uint16_t *size, unsigned char **pvalue) int kni_cmsg_get(struct kni_cmsg *cmsg, uint16_t type, uint16_t *size, unsigned char **pvalue)
{ {
struct kni_cmsg_tlv *tlv = NULL; struct kni_cmsg_tlv *tlv = NULL;
if(type >= KNI_CMSG_TLV_NR_MAX || (tlv = cmsg->tlvs[type]) == NULL) if(type >= KNI_CMSG_TLV_NR_MAX)
{ {
*size = 0; *size = 0;
return KNI_CMSG_INVALID_TYPE; return KNI_CMSG_INVALID_TYPE;
} }
if((tlv = cmsg->tlvs[type]) == NULL){
*size = 0;
return KNI_CMSG_TYPE_UNSET;
}
*size = tlv->length - sizeof(struct kni_cmsg_tlv); *size = tlv->length - sizeof(struct kni_cmsg_tlv);
*pvalue = tlv->value_as_string; *pvalue = tlv->value_as_string;
return 0; return 0;
@@ -153,6 +157,7 @@ int kni_cmsg_deserialize(const unsigned char *data, uint16_t len, struct kni_cms
cmsg = ALLOC(struct kni_cmsg, 1); cmsg = ALLOC(struct kni_cmsg, 1);
offset = sizeof(struct kni_cmsg_serialize_header); offset = sizeof(struct kni_cmsg_serialize_header);
nr_tlvs = ntohs(header->nr_tlvs); nr_tlvs = ntohs(header->nr_tlvs);
printf("nr_tlvs is %d\n", nr_tlvs);
for(int i = 0; i < nr_tlvs; i++) for(int i = 0; i < nr_tlvs; i++)
{ {
struct kni_cmsg_tlv *tlv = (struct kni_cmsg_tlv*)(data + offset); struct kni_cmsg_tlv *tlv = (struct kni_cmsg_tlv*)(data + offset);
@@ -161,6 +166,7 @@ int kni_cmsg_deserialize(const unsigned char *data, uint16_t len, struct kni_cms
goto error_out; goto error_out;
} }
uint16_t type = ntohs(tlv->type); uint16_t type = ntohs(tlv->type);
printf("type = %d\n", type);
uint16_t length = ntohs(tlv->length); uint16_t length = ntohs(tlv->length);
if(length < sizeof(struct kni_cmsg_tlv) || offset + length > len) if(length < sizeof(struct kni_cmsg_tlv) || offset + length > len)
{ {

View File

@@ -6,7 +6,7 @@ local_eth = enp8s0
[maat] [maat]
#readconf_mode: 0 = iris, 1 = json, 2 = redis #readconf_mode: 0 = iris, 1 = json, 2 = redis
readconf_mode = 1 readconf_mode = 2
tableinfo_path = ./conf/kni/maat_tableinfo.conf tableinfo_path = ./conf/kni/maat_tableinfo.conf
maatjson_path = ./conf/kni/maat_test.json maatjson_path = ./conf/kni/maat_test.json
redis_ip = 192.168.10.120 redis_ip = 192.168.10.120
@@ -50,4 +50,13 @@ security.protocol = MG
[tfe_cmsg_receiver] [tfe_cmsg_receiver]
listen_eth = enp8s0 listen_eth = enp8s0
listen_port = 8888 listen_port = 2475
[traceid2pme_htable]
mho_screen_print_ctrl = 0
mho_thread_safe = 1
mho_mutex_num = 160
mho_hash_slot_size = 160000
mho_hash_max_element_num = 640000
mho_expire_time = 30
mho_eliminate_type = LRU

View File

@@ -53,13 +53,13 @@ struct pme_info{
time_t start_time; time_t start_time;
uint64_t con_duration; uint64_t con_duration;
//from tfe, kafka log //from tfe, kafka log
int intercept_state; uint64_t intercept_state;
int pinningst; //defalut 0 uint64_t pinningst; //defalut 0
uint64_t ssl_server_side_latency; uint64_t ssl_server_side_latency;
uint64_t ssl_client_side_latency; uint64_t ssl_client_side_latency;
char ssl_server_side_version[KNI_SYMBOL_MAX]; char ssl_server_side_version[KNI_SYMBOL_MAX];
char ssl_client_side_version[KNI_SYMBOL_MAX]; char ssl_client_side_version[KNI_SYMBOL_MAX];
int ssl_cert_verify; uint64_t ssl_cert_verify;
char ssl_error[KNI_STRING_MAX]; char ssl_error[KNI_STRING_MAX];
}; };
@@ -493,6 +493,7 @@ static char data_opstate(const struct streaminfo *stream, struct pme_info *pmein
return APP_STATE_DROPPKT | APP_STATE_GIVEME; return APP_STATE_DROPPKT | APP_STATE_GIVEME;
case KNI_ACTION_BYPASS: case KNI_ACTION_BYPASS:
FS_operate(g_kni_fs_handle->handle, g_kni_fs_handle->fields[KNI_FIELD_BYP_PKT], 0, FS_OP_ADD, 1); FS_operate(g_kni_fs_handle->handle, g_kni_fs_handle->fields[KNI_FIELD_BYP_PKT], 0, FS_OP_ADD, 1);
pmeinfo->tfe_release = 1;
return APP_STATE_FAWPKT | APP_STATE_GIVEME; return APP_STATE_FAWPKT | APP_STATE_GIVEME;
default: default:
break; break;
@@ -641,15 +642,19 @@ extern "C" char kni_tcpall_entry(const struct streaminfo *stream, void** pme, in
pktinfo->data = (char*)pktinfo->tcphdr + pktinfo->tcphdr_len; pktinfo->data = (char*)pktinfo->tcphdr + pktinfo->tcphdr_len;
pktinfo->data_len = pktinfo->ip_totlen - pktinfo->iphdr_len - pktinfo->tcphdr_len; pktinfo->data_len = pktinfo->ip_totlen - pktinfo->iphdr_len - pktinfo->tcphdr_len;
int ret; int ret;
int key_size;
switch(stream->pktstate){ switch(stream->pktstate){
case OP_STATE_PENDING: case OP_STATE_PENDING:
*pme = pmeinfo = pme_info_new(stream, thread_seq, logger); *pme = pmeinfo = pme_info_new(stream, thread_seq, logger);
key_size = strlen(pmeinfo->stream_trace_id);
ret = MESA_htable_add(g_kni_handle->traceid2pme_htable, (const unsigned char *)(pmeinfo->stream_trace_id), ret = MESA_htable_add(g_kni_handle->traceid2pme_htable, (const unsigned char *)(pmeinfo->stream_trace_id),
strlen(pmeinfo->stream_trace_id), (const void*)pmeinfo); key_size, (const void*)pmeinfo);
if(ret < 0){ if(ret < 0){
KNI_LOG_ERROR(logger, "MESA_htable: failed at MESA_htable_add," KNI_LOG_ERROR(logger, "MESA_htable: failed at MESA_htable_add,"
"table is traceid2pme_htable, key is %s", pmeinfo->stream_trace_id); "table is traceid2pme_htable, key is %s", pmeinfo->stream_trace_id);
} }
KNI_LOG_DEBUG(logger, "MESA_htable: succeed at MESA_htable_add, table is traceid2pme_htable, key is %s, key_size is %d",
key_size, pmeinfo->stream_trace_id);
ret = pending_opstate(stream, pmeinfo, pktinfo); ret = pending_opstate(stream, pmeinfo, pktinfo);
break; break;
case OP_STATE_DATA: case OP_STATE_DATA:
@@ -759,11 +764,13 @@ static int wrapped_kni_cmsg_get(struct pme_info *pmeinfo, struct kni_cmsg *cmsg,
unsigned char *value = NULL; unsigned char *value = NULL;
int ret = kni_cmsg_get(cmsg, type, &value_size, &value); int ret = kni_cmsg_get(cmsg, type, &value_size, &value);
if(ret < 0){ if(ret < 0){
KNI_LOG_ERROR(logger, "Failed at kni_cmsg_get: type is %d, ret is %d", type, ret); if(ret == KNI_CMSG_INVALID_TYPE){
KNI_LOG_ERROR(logger, "Failed at kni_cmsg_get: type is %d, ret is %d", type, ret);
}
return -1; return -1;
} }
if(value_size > value_size_max){ if(value_size > value_size_max){
KNI_LOG_ERROR(logger, "kni_cmsg_get: type is %s, size is %d, which should <= %d", type, value_size, value_size_max); KNI_LOG_ERROR(logger, "kni_cmsg_get: type is %d, size is %d, which should <= %d", type, value_size, value_size_max);
return -1; return -1;
} }
switch(type) switch(type)
@@ -812,14 +819,17 @@ static long traceid2pme_htable_search_cb(void *data, const uchar *key, uint size
wrapped_kni_cmsg_get(pmeinfo, cmsg, TFE_CMSG_SSL_PINNING_STATE, sizeof(pmeinfo->pinningst), logger); wrapped_kni_cmsg_get(pmeinfo, cmsg, TFE_CMSG_SSL_PINNING_STATE, sizeof(pmeinfo->pinningst), logger);
wrapped_kni_cmsg_get(pmeinfo, cmsg, TFE_CMSG_SSL_CERT_VERIFY, sizeof(pmeinfo->ssl_cert_verify), logger); wrapped_kni_cmsg_get(pmeinfo, cmsg, TFE_CMSG_SSL_CERT_VERIFY, sizeof(pmeinfo->ssl_cert_verify), logger);
wrapped_kni_cmsg_get(pmeinfo, cmsg, TFE_CMSG_SSL_ERROR, sizeof(pmeinfo->ssl_error), logger); wrapped_kni_cmsg_get(pmeinfo, cmsg, TFE_CMSG_SSL_ERROR, sizeof(pmeinfo->ssl_error), logger);
FREE(&cmsg);
pmeinfo->tfe_release = 1; pmeinfo->tfe_release = 1;
int key_size = strlen(pmeinfo->stream_trace_id);
int ret = MESA_htable_del(g_kni_handle->traceid2pme_htable, (const unsigned char *)pmeinfo->stream_trace_id, int ret = MESA_htable_del(g_kni_handle->traceid2pme_htable, (const unsigned char *)pmeinfo->stream_trace_id,
sizeof(pmeinfo->stream_trace_id), NULL); key_size, NULL);
if(ret < 0){ if(ret < 0){
KNI_LOG_ERROR(logger, "MESA_htable: failed at del, table is %s, key is %s, ret is %d", KNI_LOG_ERROR(logger, "MESA_htable: failed at del, table is %s, key is %s, key_size is %d, ret is %d",
"traceid2pme_htable", pmeinfo->stream_trace_id, ret); "traceid2pme_htable", pmeinfo->stream_trace_id, key_size, ret);
} }
} }
FREE(&cmsg);
return 0; return 0;
} }