diff --git a/conf/tfe/tfe.conf b/conf/tfe/tfe.conf index f45d182..3020c87 100644 --- a/conf/tfe/tfe.conf +++ b/conf/tfe/tfe.conf @@ -41,3 +41,7 @@ level=10 statsd_server=192.168.10.72 statsd_port=8126 histogram_bins=0.50,0.80,0.9,0.95 + +[sender_scm] +kni_ip = 192.168.10.37 +kni_port = 8888 diff --git a/platform/CMakeLists.txt b/platform/CMakeLists.txt index e6993d3..61c8818 100644 --- a/platform/CMakeLists.txt +++ b/platform/CMakeLists.txt @@ -1,7 +1,7 @@ add_executable(tfe src/acceptor_kni_v1.cpp src/acceptor_kni_v2.cpp src/ssl_stream.cpp src/key_keeper.cpp src/ssl_sess_cache.cpp src/ssl_sess_ticket.cpp src/ssl_service_cache.cpp src/ssl_trusted_cert_storage.cpp src/ev_root_ca_metadata.cpp src/ssl_utils.cpp - src/tcp_stream.cpp src/main.cpp src/proxy.cpp) + src/tcp_stream.cpp src/main.cpp src/proxy.cpp src/sender_scm.cpp) target_include_directories(tfe PUBLIC ${CMAKE_CURRENT_LIST_DIR}/include/external) target_include_directories(tfe PRIVATE ${CMAKE_CURRENT_LIST_DIR}/include/internal) @@ -100,3 +100,11 @@ target_link_libraries(test_chello_parse pthread dl MESA_htable wiredcfg cjson MESA_field_stat) + +#### test_sender_scm +add_executable(test_sender_scm src/sender_scm.cpp test/test_sender_scm.cpp) + +target_include_directories(test_sender_scm PRIVATE ${CMAKE_CURRENT_LIST_DIR}/include/internal) + +target_link_libraries(test_sender_scm common) +target_link_libraries(test_sender_scm pthread dl MESA_prof_load MESA_handle_logger) diff --git a/platform/include/internal/sender_scm.h b/platform/include/internal/sender_scm.h new file mode 100644 index 0000000..690eb86 --- /dev/null +++ b/platform/include/internal/sender_scm.h @@ -0,0 +1,4 @@ +struct sender_scm; +struct sender_scm* sender_scm_init(const char *profile, void *logger); +void send_scm_destroy(struct sender_scm *sender); +int sender_scm_cmsg_send(struct sender_scm *sender, struct tfe_cmsg *cmsg); diff --git a/platform/src/key_keeper.cpp b/platform/src/key_keeper.cpp index 0a1f1db..d38275f 100644 --- a/platform/src/key_keeper.cpp +++ b/platform/src/key_keeper.cpp @@ -39,7 +39,7 @@ struct key_keeper void* logger; X509* trusted_ca_cert; EVP_PKEY* trusted_ca_key; - + X509* untrusted_ca_cert; EVP_PKEY* untrusted_ca_key; unsigned int no_cache; @@ -385,7 +385,7 @@ static void certstore_rpc_on_succ(void* result, void* user) { key_keeper_free_keyring((struct keyring*)kyr); } - } + } ctx->ref_keeper->stat.new_issue++; promise_success(p, (void*)kyr); key_keeper_free_keyring((struct keyring*)kyr); @@ -492,7 +492,7 @@ struct key_keeper* key_keeper_init(const char * profile, const char* section, vo { TFE_LOG_ERROR(logger, "Load Trusted Root CA %s failed.", keeper->trusted_ca_path); goto error_out; - } + } keeper->untrusted_ca_cert=ssl_x509_load(keeper->untrusted_ca_path); keeper->untrusted_ca_key=ssl_key_load(keeper->untrusted_ca_path); if(keeper->untrusted_ca_cert==NULL||keeper->trusted_ca_key==NULL) @@ -503,13 +503,13 @@ struct key_keeper* key_keeper_init(const char * profile, const char* section, vo } TFE_LOG_INFO(logger, "MESA_load_profile, [%s]: mode:%s, no_cache:%u ,ca_path:%s, untrusted_ca_path:%s, cert_store_host:%s, cert_store_port:%d, hash_slot_size:%d, hash_expire_seconds:%d", section, tmp, keeper->no_cache, keeper->trusted_ca_path, keeper->untrusted_ca_path, keeper->cert_store_host, keeper->cert_store_port, keeper->hash_slot_size, keeper->hash_expire_seconds); - + return keeper; - + error_out: key_keeper_destroy(keeper); return NULL; - + } struct keyring* key_keeper_release_keyring(future_result_t* result) @@ -644,7 +644,7 @@ void key_keeper_async_ask(struct future * f, struct key_keeper * keeper, const c key_keeper_free_keyring((struct keyring*)kyr); } } - promise_success(p, (void*)kyr); + promise_success(p, (void*)kyr); keeper->stat.new_issue++; key_keeper_free_keyring((struct keyring*)kyr); } diff --git a/platform/src/sender_scm.cpp b/platform/src/sender_scm.cpp new file mode 100644 index 0000000..5bb1f4c --- /dev/null +++ b/platform/src/sender_scm.cpp @@ -0,0 +1,97 @@ +#include "tfe_utils.h" +#include "tfe_types.h" +#include "tfe_cmsg.h" +#include "MESA/MESA_prof_load.h" +#include +#include + +struct sender_scm +{ + int sockfd; + struct sockaddr_in server_addr; + void *logger; +}; + +void send_scm_destroy(struct sender_scm *sender) +{ + if(sender != NULL) + { + if(sender->sockfd >= 0) + { + close(sender->sockfd); + } + } + FREE(&sender); +} + +struct sender_scm* sender_scm_init(const char *profile, void *logger) +{ + const char *section = "sender_scm"; + char kni_ip[INET_ADDRSTRLEN] = ""; + int kni_port = -1; + int sockfd = -1; + struct sockaddr_in server_addr; + struct sender_scm *sender = ALLOC(struct sender_scm, 1); + sender->logger = logger; + int ret = MESA_load_profile_string_nodef(profile, section, "kni_ip", kni_ip, sizeof(kni_ip)); + if(ret < 0) + { + TFE_LOG_ERROR(logger, "MESA_prof_load: kni_ip not set, profile is %s, section is %s", profile, section); + goto error_out; + } + ret = MESA_load_profile_int_nodef(profile, section, "kni_port", &kni_port); + if(ret < 0) + { + TFE_LOG_ERROR(logger, "MESA_prof_load: kni_port not set, profile is %s, section is %s", profile, section); + goto error_out; + } + TFE_LOG_INFO(logger, "MESA_prof_load, [%s]:\n kni_ip: %s\n kni_port: %d", + section, kni_ip, kni_port); + //create socket + sockfd = socket(AF_INET, SOCK_DGRAM, 0); + if(sockfd < 0) + { + TFE_LOG_ERROR(logger, "Failed at create udp socket, errno is %d, %s", errno, strerror(errno)); + goto error_out; + } + sender->sockfd = sockfd; + //server_addr + memset(&server_addr, 0, sizeof(server_addr)); + server_addr.sin_family = AF_INET; + server_addr.sin_port = htons(kni_port); + server_addr.sin_addr.s_addr = inet_addr(kni_ip); + sender->server_addr = server_addr; + return sender; + +error_out: + send_scm_destroy(sender); + return NULL; +} + +int sender_scm_cmsg_send(struct sender_scm *sender, struct tfe_cmsg *cmsg) +{ + void *logger = sender->logger; + uint16_t bufflen = tfe_cmsg_serialize_size_get(cmsg); + unsigned char *buff = ALLOC(unsigned char, bufflen); + uint16_t serialize_len = 0; + int ret = tfe_cmsg_serialize(cmsg, buff, bufflen, &serialize_len); + if(ret < 0) + { + TFE_LOG_ERROR(logger, "Failed at serialize tfe cmsg, ret is %d", ret); + goto error_out; + } + ret = sendto(sender->sockfd, buff, serialize_len, MSG_CONFIRM, + (struct sockaddr *)&(sender->server_addr), sizeof(sender->server_addr)); + if(ret < 0) + { + TFE_LOG_ERROR(logger, "Failed at send udp data, errno is %d, %s", errno, strerror(errno)); + goto error_out; + } + return 0; + +error_out: + FREE(&buff); + return -1; +} + + diff --git a/platform/test/test_sender_scm.cpp b/platform/test/test_sender_scm.cpp new file mode 100644 index 0000000..03da435 --- /dev/null +++ b/platform/test/test_sender_scm.cpp @@ -0,0 +1,33 @@ +#include "tfe_types.h" +#include "tfe_utils.h" +#include "sender_scm.h" +#include "tfe_cmsg.h" + +int main(){ + + struct tfe_cmsg *cmsg = tfe_cmsg_init(); + if(cmsg == NULL){ + printf("Failed at call tfe_cmsg_init\n"); + } + //set + uint32_t value = 0x12345678; + int ret = tfe_cmsg_set(cmsg, TFE_CMSG_TCP_RESTORE_SEQ, (const unsigned char*)(&value), 4); + if(ret < 0){ + printf("Failed at call tfe_cmsg_set: ret is %d\n", ret); + return -1; + } + + //sender_scm + const char *profile = "../../conf/tfe/tfe.conf"; + struct sender_scm* sender = sender_scm_init(profile, NULL); + if(sender == NULL){ + printf("Failed at call sender_scm_init\n"); + return -1; + } + ret = sender_scm_cmsg_send(sender, cmsg); + if(ret < 0){ + printf("Failed at call sender_scm_cmsg_send, ret is %d\n", ret); + return -1; + } + return 0; +}