diff --git a/bin/conf/main.conf b/bin/conf/main.conf index c784709..6906ca9 100644 --- a/bin/conf/main.conf +++ b/bin/conf/main.conf @@ -232,4 +232,5 @@ capacity=32 cost=32 wlb_report_interval=10 -hard_balance_port=20000 \ No newline at end of file +bfd_recv_port= +bfd_send_port= \ No newline at end of file diff --git a/src/hard_keepalive.c b/src/hard_keepalive.c index a5d574d..5b90867 100644 --- a/src/hard_keepalive.c +++ b/src/hard_keepalive.c @@ -106,12 +106,13 @@ int create_send_udp_socket() void* thread_hard_keepalive(void *param) { char buf[1500] = {0}; - long port = (long)param; + char discriminator_temp[ID_SIZE] = {0}; + bfd_port_t* bfd_port = (bfd_port_t*)param; int size = 0; uint32_t src_ip = 0; int send_rec = 0; fd_set rset; - int recv_pkt_sd = create_recv_udp_socket(htons(port)); + int recv_pkt_sd = create_recv_udp_socket(htons(bfd_port->recv_port)); int send_pkt_sd = create_send_udp_socket(); if(-1==recv_pkt_sd || -1==send_pkt_sd) @@ -133,9 +134,13 @@ void* thread_hard_keepalive(void *param) size = udp_socket_recv(recv_pkt_sd, &src_ip, (unsigned char*)buf, sizeof(buf)); if(size>0) { + /*交换discriminator*/ + memcpy(discriminator_temp, buf+MY_ID_OFFSET, ID_SIZE); + memcpy(buf+MY_ID_OFFSET, buf+YOUR_ID_OFFSET, ID_SIZE); + memcpy(buf+YOUR_ID_OFFSET, discriminator_temp, ID_SIZE); send_rec = udp_socket_send(send_pkt_sd, src_ip, - htons(port), + htons(bfd_port->send_port), (char*)buf,size); if(-1==send_rec) { @@ -152,10 +157,8 @@ void* thread_hard_keepalive(void *param) return NULL; } -int hard_keepalive_run(uint32_t udp_port) +int hard_keepalive_run(void* bfd_port) { - if(udp_port<=0) return -1; - pthread_t thread_desc; pthread_attr_t attr; @@ -170,7 +173,7 @@ int hard_keepalive_run(uint32_t udp_port) { return -1; } - if(0 != pthread_create(&(thread_desc), &(attr), thread_hard_keepalive, (void*)udp_port)) + if(0 != pthread_create(&(thread_desc), &(attr), thread_hard_keepalive, (void*)bfd_port)) { pthread_attr_destroy(&(attr)); return -1; diff --git a/src/hard_keepalive.h b/src/hard_keepalive.h index 3b51d01..7eaa7d3 100644 --- a/src/hard_keepalive.h +++ b/src/hard_keepalive.h @@ -1,14 +1,35 @@ #ifndef _HARD_KEEPALIVE_H #define _HARD_KEEPALIVE_H +typedef struct bfd_port_s +{ + uint32_t recv_port; + uint32_t send_port; +}bfd_port_t; + +#define MY_ID_OFFSET 4 +#define YOUR_ID_OFFSET 8 +#define ID_SIZE 4 +typedef struct bfd_header_s +{ + unsigned char version_diag; + unsigned char flags; + unsigned char detect_time_multiplier; + unsigned char length; + unsigned char my_discriminator[4]; /* 业?潞? 虏虏芒*/ + unsigned char your_discriminator[4]; + unsigned char desired_min_tx_interval[4]; + unsigned char required_min_rx_interval[4]; + unsigned char required_min_echo_interval[4]; +}bfd_header_t; #ifdef __cplusplus extern "C" { #endif -/*return 0:succ -1:fail*/ -int hard_keepalive_run(uint32_t udp_port); +/*return 0:succ -1:fail*/ +int hard_keepalive_run(void* bfd_port); #ifdef __cplusplus } diff --git a/src/main.c b/src/main.c index d8885f5..dd93bb3 100644 --- a/src/main.c +++ b/src/main.c @@ -740,7 +740,8 @@ int read_conf_and_init(const char* filename) MESA_load_profile_uint_def(filename, "WLB", "cost", (unsigned int*)&g_frag_cfg.cost,32); MESA_load_profile_uint_def(filename, "WLB", "wlb_report_interval", (unsigned int*)&g_frag_cfg.wlb_report_interval,10); MESA_load_profile_uint_def(filename, "WLB", "enable_override", (unsigned int*)&g_frag_cfg.enable_override,0); - MESA_load_profile_uint_def(filename, "WLB", "hard_balance_port", (unsigned int*)&g_frag_cfg.hard_balance_port,0); + MESA_load_profile_uint_def(filename, "WLB", "bfd_recv_port", (unsigned int*)&g_frag_cfg.bfd_recv_port,0); + MESA_load_profile_uint_def(filename, "WLB", "bfd_send_port", (unsigned int*)&g_frag_cfg.bfd_send_port,0); /*send bizman :粗拼装往前端发数据,监听响应端口*/ MESA_load_profile_short_def(filename, "NETWORK", "BizmanAckPort", (short*)&g_frag_cfg.bizman_ack_port,22084); @@ -1281,9 +1282,12 @@ int main(int argc, char **argv) } } - if(g_frag_cfg.hard_balance_port>0) + if(g_frag_cfg.bfd_recv_port>0 && g_frag_cfg.bfd_send_port>0) { - hard_keepalive_run(g_frag_cfg.hard_balance_port); + bfd_port_t bfd_port; + bfd_port.recv_port = g_frag_cfg.bfd_recv_port; + bfd_port.send_port = g_frag_cfg.bfd_send_port; + hard_keepalive_run(&bfd_port); } while(1) diff --git a/src/main.h b/src/main.h index 27f4659..0a06c3d 100644 --- a/src/main.h +++ b/src/main.h @@ -241,7 +241,8 @@ typedef struct frag_rssb_configure_s uint32_t health_check_port; int16_t save_media; - uint32_t hard_balance_port; + uint32_t bfd_recv_port; + uint32_t bfd_send_port; }frag_rssb_configure_t; typedef struct frag_rssb_status_s