diff --git a/common/include/kni_cmsg.h b/common/include/kni_cmsg.h index 70f2cb9..29527a4 100644 --- a/common/include/kni_cmsg.h +++ b/common/include/kni_cmsg.h @@ -39,7 +39,9 @@ enum tfe_cmsg_tlv_type TFE_CMSG_SSL_DOWNSTREAM_VERSION, TFE_CMSG_SSL_PINNING_STATE, //size uint64_t, 0-not pinning 1-pinning 2-maybe pinning TFE_CMSG_SSL_CERT_VERIFY, //uint16_t - TFE_CMSG_SSL_ERROR //string + TFE_CMSG_SSL_ERROR, //string + TFE_CMSG_SRC_MAC, + TFE_CMSG_DST_MAC, }; struct kni_cmsg* kni_cmsg_init(); diff --git a/entry/src/kni_entry.cpp b/entry/src/kni_entry.cpp index 58c0c82..2003975 100644 --- a/entry/src/kni_entry.cpp +++ b/entry/src/kni_entry.cpp @@ -531,7 +531,7 @@ static int wrapped_kni_cmsg_set(struct kni_cmsg *cmsg, uint16_t type, const unsi return ret; } -static unsigned char* kni_cmsg_serialize_header_new(struct pme_info *pmeinfo, struct pkt_info *pktinfo, uint16_t *len){ +static unsigned char* kni_cmsg_serialize_header_new(struct pme_info *pmeinfo, struct streaminfo *stream, struct pkt_info *pktinfo, uint16_t *len){ void *logger = g_kni_handle->local_logger; uint16_t bufflen = 0, serialize_len = 0; unsigned char *buff = NULL; @@ -596,7 +596,25 @@ static unsigned char* kni_cmsg_serialize_header_new(struct pme_info *pmeinfo, st ret = wrapped_kni_cmsg_set(cmsg, TFE_CMSG_STREAM_TRACE_ID, (const unsigned char*)trace_id, strnlen(pmeinfo->stream_traceid, sizeof(pmeinfo->stream_traceid)), pmeinfo->stream_traceid); if(ret < 0) goto error_out; - + //src mac + char src_mac[6]; + ret = get_rawpkt_opt_from_streaminfo(stream, RAW_PKT_GET_VXLAN_OUTER_GDEV_MAC, src_mac); + if(ret < 0){ + KNI_LOG_ERROR(logger, "Failed at get src mac from rawpkt"); + goto error_out; + } + ret = wrapped_kni_cmsg_set(cmsg, TFE_CMSG_SRC_MAC, (const unsigned char*)src_mac, sizeof(src_mac), pmeinfo->stream_traceid); + if(ret < 0) goto error_out; + //dst mac + char dst_mac[6]; + ret = get_rawpkt_opt_from_streaminfo(stream, RAW_PKT_GET_VXLAN_OUTER_LOCAL_MAC, dst_mac); + if(ret < 0){ + KNI_LOG_ERROR(logger, "Failed at get dst mac from rawpkt"); + goto error_out; + } + ret = wrapped_kni_cmsg_set(cmsg, TFE_CMSG_DST_MAC, (const unsigned char*)dst_mac, sizeof(dst_mac), pmeinfo->stream_traceid); + if(ret < 0) goto error_out; + bufflen = kni_cmsg_serialize_size_get(cmsg); buff = (unsigned char*)ALLOC(char, bufflen); serialize_len = 0; @@ -615,7 +633,7 @@ error_out: return NULL; } -static char* add_cmsg_to_packet(struct pme_info *pmeinfo, struct pkt_info *pktinfo, int *len){ +static char* add_cmsg_to_packet(struct pme_info *pmeinfo, struct streaminfo *stream, struct pkt_info *pktinfo, int *len){ //tcp option: kind 88, len 4, control_info_len char *new_pkt = (char*)ALLOC(struct wrapped_packet, 1); int offset = 0; @@ -645,7 +663,7 @@ static char* add_cmsg_to_packet(struct pme_info *pmeinfo, struct pkt_info *pktin offset += pktinfo->data_len; //kni_cmsg_serialize_header uint16_t header_len = 0; - unsigned char* header = kni_cmsg_serialize_header_new(pmeinfo, pktinfo, &header_len); + unsigned char* header = kni_cmsg_serialize_header_new(pmeinfo, stream, pktinfo, &header_len); memcpy(new_pkt + offset, (void*)header, header_len); offset += header_len; FREE(&header); @@ -1015,7 +1033,7 @@ static int first_data_intercept(struct streaminfo *stream, struct pme_info *pmei traceid2pme_htable_add(pmeinfo); //action = KNI_ACTION_INTERCEPT, sendto tfe int len = 0; - char *buff = add_cmsg_to_packet(pmeinfo, pktinfo, &len); + char *buff = add_cmsg_to_packet(pmeinfo, stream, pktinfo, &len); ret = send_to_tfe(buff, len, thread_seq, pmeinfo->tfe_id, pmeinfo->addr_type); if(ret < 0){ KNI_LOG_DEBUG(logger, "Stream error: failed at send first packet to tfe%d, stream traceid = %s", pmeinfo->tfe_id, pmeinfo->stream_traceid); diff --git a/script/tsgkni.service b/script/tsgkni.service index 993a8f5..b9b3932 100644 --- a/script/tsgkni.service +++ b/script/tsgkni.service @@ -13,4 +13,4 @@ Restart=always RestartSec=5s [Install] -WantedBy=multi-user.target +WantedBy=multi-user.target \ No newline at end of file