diff options
-rw-r--r-- | lib/mlag.c | 18 | ||||
-rw-r--r-- | lib/mlag.h | 29 | ||||
-rw-r--r-- | pimd/pim_mlag.c | 20 | ||||
-rw-r--r-- | zebra/zebra_mlag.c | 81 | ||||
-rw-r--r-- | zebra/zebra_mlag_private.c | 6 | ||||
-rw-r--r-- | zebra/zebra_router.h | 1 |
6 files changed, 71 insertions, 84 deletions
diff --git a/lib/mlag.c b/lib/mlag.c index 7aac571da..1daf29072 100644 --- a/lib/mlag.c +++ b/lib/mlag.c @@ -40,8 +40,7 @@ char *mlag_role2str(enum mlag_role role, char *buf, size_t size) return buf; } -char *zebra_mlag_lib_msgid_to_str(enum mlag_msg_type msg_type, char *buf, - size_t size) +char *mlag_lib_msgid_to_str(enum mlag_msg_type msg_type, char *buf, size_t size) { switch (msg_type) { case MLAG_REGISTER: @@ -82,7 +81,7 @@ char *zebra_mlag_lib_msgid_to_str(enum mlag_msg_type msg_type, char *buf, } -int zebra_mlag_lib_decode_mlag_hdr(struct stream *s, struct mlag_msg *msg) +int mlag_lib_decode_mlag_hdr(struct stream *s, struct mlag_msg *msg) { if (s == NULL || msg == NULL) return -1; @@ -95,8 +94,7 @@ stream_failure: return -1; } -int zebra_mlag_lib_decode_mroute_add(struct stream *s, - struct mlag_mroute_add *msg) +int mlag_lib_decode_mroute_add(struct stream *s, struct mlag_mroute_add *msg) { if (s == NULL || msg == NULL) return -1; @@ -115,8 +113,7 @@ stream_failure: return -1; } -int zebra_mlag_lib_decode_mroute_del(struct stream *s, - struct mlag_mroute_del *msg) +int mlag_lib_decode_mroute_del(struct stream *s, struct mlag_mroute_del *msg) { if (s == NULL || msg == NULL) return -1; @@ -132,7 +129,7 @@ stream_failure: return -1; } -int zebra_mlag_lib_decode_mlag_status(struct stream *s, struct mlag_status *msg) +int mlag_lib_decode_mlag_status(struct stream *s, struct mlag_status *msg) { if (s == NULL || msg == NULL) return -1; @@ -145,7 +142,7 @@ stream_failure: return -1; } -int zebra_mlag_lib_decode_vxlan_update(struct stream *s, struct mlag_vxlan *msg) +int mlag_lib_decode_vxlan_update(struct stream *s, struct mlag_vxlan *msg) { if (s == NULL || msg == NULL) return -1; @@ -158,8 +155,7 @@ stream_failure: return -1; } -int zebra_mlag_lib_decode_frr_status(struct stream *s, - struct mlag_frr_status *msg) +int mlag_lib_decode_frr_status(struct stream *s, struct mlag_frr_status *msg) { if (s == NULL || msg == NULL) return -1; diff --git a/lib/mlag.h b/lib/mlag.h index c8a345698..c531fb5b6 100644 --- a/lib/mlag.h +++ b/lib/mlag.h @@ -119,24 +119,23 @@ struct mlag_msg { uint16_t data_len; uint16_t msg_cnt; uint8_t data[0]; -}__attribute__((packed)); +} __attribute__((packed)); extern char *mlag_role2str(enum mlag_role role, char *buf, size_t size); -extern char *zebra_mlag_lib_msgid_to_str(enum mlag_msg_type msg_type, char *buf, - size_t size); -extern int zebra_mlag_lib_decode_mlag_hdr(struct stream *s, - struct mlag_msg *msg); -extern int zebra_mlag_lib_decode_mroute_add(struct stream *s, - struct mlag_mroute_add *msg); -extern int zebra_mlag_lib_decode_mroute_del(struct stream *s, - struct mlag_mroute_del *msg); -extern int zebra_mlag_lib_decode_mlag_status(struct stream *s, - struct mlag_status *msg); -extern int zebra_mlag_lib_decode_vxlan_update(struct stream *s, - struct mlag_vxlan *msg); -extern int zebra_mlag_lib_decode_frr_status(struct stream *s, - struct mlag_frr_status *msg); +extern char *mlag_lib_msgid_to_str(enum mlag_msg_type msg_type, char *buf, + size_t size); +extern int mlag_lib_decode_mlag_hdr(struct stream *s, struct mlag_msg *msg); +extern int mlag_lib_decode_mroute_add(struct stream *s, + struct mlag_mroute_add *msg); +extern int mlag_lib_decode_mroute_del(struct stream *s, + struct mlag_mroute_del *msg); +extern int mlag_lib_decode_mlag_status(struct stream *s, + struct mlag_status *msg); +extern int mlag_lib_decode_vxlan_update(struct stream *s, + struct mlag_vxlan *msg); +extern int mlag_lib_decode_frr_status(struct stream *s, + struct mlag_frr_status *msg); #ifdef __cplusplus } #endif diff --git a/pimd/pim_mlag.c b/pimd/pim_mlag.c index a66f604d5..f60c18204 100644 --- a/pimd/pim_mlag.c +++ b/pimd/pim_mlag.c @@ -87,22 +87,22 @@ int pim_zebra_mlag_handle_msg(struct stream *s, int len) char buf[ZLOG_FILTER_LENGTH_MAX]; int rc = 0; - rc = zebra_mlag_lib_decode_mlag_hdr(s, &mlag_msg); + rc = mlag_lib_decode_mlag_hdr(s, &mlag_msg); if (rc) return (rc); if (PIM_DEBUG_MLAG) zlog_debug("%s: Received msg type: %s length: %d, bulk_cnt: %d", __func__, - zebra_mlag_lib_msgid_to_str(mlag_msg.msg_type, buf, - sizeof(buf)), + mlag_lib_msgid_to_str(mlag_msg.msg_type, buf, + sizeof(buf)), mlag_msg.data_len, mlag_msg.msg_cnt); switch (mlag_msg.msg_type) { case MLAG_STATUS_UPDATE: { struct mlag_status msg; - rc = zebra_mlag_lib_decode_mlag_status(s, &msg); + rc = mlag_lib_decode_mlag_status(s, &msg); if (rc) return (rc); pim_mlag_process_mlagd_state_change(msg); @@ -110,7 +110,7 @@ int pim_zebra_mlag_handle_msg(struct stream *s, int len) case MLAG_PEER_FRR_STATUS: { struct mlag_frr_status msg; - rc = zebra_mlag_lib_decode_frr_status(s, &msg); + rc = mlag_lib_decode_frr_status(s, &msg); if (rc) return (rc); pim_mlag_process_peer_frr_state_change(msg); @@ -118,7 +118,7 @@ int pim_zebra_mlag_handle_msg(struct stream *s, int len) case MLAG_VXLAN_UPDATE: { struct mlag_vxlan msg; - rc = zebra_mlag_lib_decode_vxlan_update(s, &msg); + rc = mlag_lib_decode_vxlan_update(s, &msg); if (rc) return rc; pim_mlag_process_vxlan_update(&msg); @@ -126,7 +126,7 @@ int pim_zebra_mlag_handle_msg(struct stream *s, int len) case MLAG_MROUTE_ADD: { struct mlag_mroute_add msg; - rc = zebra_mlag_lib_decode_mroute_add(s, &msg); + rc = mlag_lib_decode_mroute_add(s, &msg); if (rc) return (rc); pim_mlag_process_mroute_add(msg); @@ -134,7 +134,7 @@ int pim_zebra_mlag_handle_msg(struct stream *s, int len) case MLAG_MROUTE_DEL: { struct mlag_mroute_del msg; - rc = zebra_mlag_lib_decode_mroute_del(s, &msg); + rc = mlag_lib_decode_mroute_del(s, &msg); if (rc) return (rc); pim_mlag_process_mroute_del(msg); @@ -145,7 +145,7 @@ int pim_zebra_mlag_handle_msg(struct stream *s, int len) for (i = 0; i < mlag_msg.msg_cnt; i++) { - rc = zebra_mlag_lib_decode_mroute_add(s, &msg); + rc = mlag_lib_decode_mroute_add(s, &msg); if (rc) return (rc); pim_mlag_process_mroute_add(msg); @@ -157,7 +157,7 @@ int pim_zebra_mlag_handle_msg(struct stream *s, int len) for (i = 0; i < mlag_msg.msg_cnt; i++) { - rc = zebra_mlag_lib_decode_mroute_del(s, &msg); + rc = mlag_lib_decode_mroute_del(s, &msg); if (rc) return (rc); pim_mlag_process_mroute_del(msg); diff --git a/zebra/zebra_mlag.c b/zebra/zebra_mlag.c index 1cbe54b17..1a911e429 100644 --- a/zebra/zebra_mlag.c +++ b/zebra/zebra_mlag.c @@ -153,7 +153,7 @@ static int zebra_mlag_client_msg_handler(struct thread *event) wr_count = stream_fifo_count_safe(zrouter.mlag_info.mlag_fifo); if (IS_ZEBRA_DEBUG_MLAG) - zlog_debug(":%s: Processing MLAG write, %d messages in queue", + zlog_debug(":%s: Processing MLAG write, %u messages in queue", __func__, wr_count); max_count = MIN(wr_count, ZEBRA_MLAG_POST_LIMIT); @@ -240,16 +240,17 @@ void zebra_mlag_handle_process_state(enum zebra_mlag_state state) */ static int zebra_mlag_signal_write_thread(void) { - frr_with_mutex (&zrouter.mlag_info.mlag_th_mtx) { - if (zrouter.mlag_info.zebra_pth_mlag) { - if (IS_ZEBRA_DEBUG_MLAG) - zlog_debug(":%s: Scheduling MLAG write", - __func__); - thread_add_event(zrouter.mlag_info.th_master, - zebra_mlag_client_msg_handler, NULL, 0, - &zrouter.mlag_info.t_write); - } - } + if (IS_ZEBRA_DEBUG_MLAG) + zlog_debug(":%s: Scheduling MLAG write", __func__); + /* + * This api will be called from Both main & MLAG Threads. + * main thread writes, "zrouter.mlag_info.th_master" only + * during Zebra Init/after MLAG thread is destroyed. + * so it is safe to use without any locking + */ + thread_add_event(zrouter.mlag_info.th_master, + zebra_mlag_client_msg_handler, NULL, 0, + &zrouter.mlag_info.t_write); return 0; } @@ -593,13 +594,14 @@ DEFUN_HIDDEN (show_mlag, return CMD_SUCCESS; } -DEFPY(test_mlag, test_mlag_cmd, - "test zebra mlag <none$none|primary$primary|secondary$secondary>", - "Test code\n" ZEBRA_STR - "Modify the Mlag state\n" - "Mlag is not setup on the machine\n" - "Mlag is setup to be primary\n" - "Mlag is setup to be the secondary\n") +DEFPY_HIDDEN(test_mlag, test_mlag_cmd, + "test zebra mlag <none$none|primary$primary|secondary$secondary>", + "Test code\n" + ZEBRA_STR + "Modify the Mlag state\n" + "Mlag is not setup on the machine\n" + "Mlag is setup to be primary\n" + "Mlag is setup to be the secondary\n") { enum mlag_role orig = zrouter.mlag_info.role; char buf1[MLAG_ROLE_STRSIZE], buf2[MLAG_ROLE_STRSIZE]; @@ -621,12 +623,8 @@ DEFPY(test_mlag, test_mlag_cmd, if (zrouter.mlag_info.role != MLAG_ROLE_NONE) { if (zrouter.mlag_info.clients_interested_cnt == 0 && test_mlag_in_progress == false) { - frr_with_mutex ( - &zrouter.mlag_info.mlag_th_mtx) { - if (zrouter.mlag_info.zebra_pth_mlag - == NULL) - zebra_mlag_spawn_pthread(); - } + if (zrouter.mlag_info.zebra_pth_mlag == NULL) + zebra_mlag_spawn_pthread(); zrouter.mlag_info.clients_interested_cnt++; test_mlag_in_progress = true; zebra_mlag_private_open_channel(); @@ -649,8 +647,8 @@ void zebra_mlag_init(void) install_element(ENABLE_NODE, &test_mlag_cmd); /* - * Intialiaze teh MLAG Global variableis - * write thread will be craeted during actual registration with MCLAG + * Intialiaze the MLAG Global variables + * write thread will be created during actual registration with MCLAG */ zrouter.mlag_info.clients_interested_cnt = 0; zrouter.mlag_info.connected = false; @@ -662,7 +660,6 @@ void zebra_mlag_init(void) zrouter.mlag_info.t_write = NULL; test_mlag_in_progress = false; zebra_mlag_reset_read_buffer(); - pthread_mutex_init(&zrouter.mlag_info.mlag_th_mtx, NULL); } void zebra_mlag_terminate(void) @@ -692,18 +689,16 @@ int zebra_mlag_protobuf_encode_client_data(struct stream *s, uint32_t *msg_type) if (IS_ZEBRA_DEBUG_MLAG) zlog_debug("%s: Entering..", __func__); - rc = zebra_mlag_lib_decode_mlag_hdr(s, &mlag_msg); + rc = mlag_lib_decode_mlag_hdr(s, &mlag_msg); if (rc) return rc; if (IS_ZEBRA_DEBUG_MLAG) - zlog_debug("%s: Decoded msg length:%d..", __func__, + zlog_debug("%s: Mlag ProtoBuf encoding of message:%s, len:%d", + __func__, + mlag_lib_msgid_to_str(mlag_msg.msg_type, buf, + sizeof(buf)), mlag_msg.data_len); - - if (IS_ZEBRA_DEBUG_MLAG) - zlog_debug("%s: Mlag ProtoBuf encoding of message:%s", __func__, - zebra_mlag_lib_msgid_to_str(mlag_msg.msg_type, buf, - sizeof(buf))); *msg_type = mlag_msg.msg_type; switch (mlag_msg.msg_type) { case MLAG_MROUTE_ADD: { @@ -711,7 +706,7 @@ int zebra_mlag_protobuf_encode_client_data(struct stream *s, uint32_t *msg_type) ZebraMlagMrouteAdd pay_load = ZEBRA_MLAG_MROUTE_ADD__INIT; uint32_t vrf_name_len = 0; - rc = zebra_mlag_lib_decode_mroute_add(s, &msg); + rc = mlag_lib_decode_mroute_add(s, &msg); if (rc) return rc; vrf_name_len = strlen(msg.vrf_name) + 1; @@ -743,7 +738,7 @@ int zebra_mlag_protobuf_encode_client_data(struct stream *s, uint32_t *msg_type) ZebraMlagMrouteDel pay_load = ZEBRA_MLAG_MROUTE_DEL__INIT; uint32_t vrf_name_len = 0; - rc = zebra_mlag_lib_decode_mroute_del(s, &msg); + rc = mlag_lib_decode_mroute_del(s, &msg); if (rc) return rc; vrf_name_len = strlen(msg.vrf_name) + 1; @@ -783,7 +778,7 @@ int zebra_mlag_protobuf_encode_client_data(struct stream *s, uint32_t *msg_type) uint32_t vrf_name_len = 0; - rc = zebra_mlag_lib_decode_mroute_add(s, &msg); + rc = mlag_lib_decode_mroute_add(s, &msg); if (rc) { cleanup = true; break; @@ -848,7 +843,7 @@ int zebra_mlag_protobuf_encode_client_data(struct stream *s, uint32_t *msg_type) uint32_t vrf_name_len = 0; - rc = zebra_mlag_lib_decode_mroute_del(s, &msg); + rc = mlag_lib_decode_mroute_del(s, &msg); if (rc) { cleanup = true; break; @@ -903,8 +898,8 @@ int zebra_mlag_protobuf_encode_client_data(struct stream *s, uint32_t *msg_type) if (IS_ZEBRA_DEBUG_MLAG) zlog_debug("%s: length of Mlag ProtoBuf encoded message:%s, %d", __func__, - zebra_mlag_lib_msgid_to_str(mlag_msg.msg_type, buf, - sizeof(buf)), + mlag_lib_msgid_to_str(mlag_msg.msg_type, buf, + sizeof(buf)), len); hdr.type = (ZebraMlagHeader__MessageType)mlag_msg.msg_type; if (len != 0) { @@ -934,8 +929,8 @@ int zebra_mlag_protobuf_encode_client_data(struct stream *s, uint32_t *msg_type) zlog_debug( "%s: length of Mlag ProtoBuf message:%s with Header %d", __func__, - zebra_mlag_lib_msgid_to_str(mlag_msg.msg_type, buf, - sizeof(buf)), + mlag_lib_msgid_to_str(mlag_msg.msg_type, buf, + sizeof(buf)), len); if (hdr.data.data) XFREE(MTYPE_MLAG_PBUF, hdr.data.data); @@ -963,7 +958,7 @@ int zebra_mlag_protobuf_decode_message(struct stream *s, uint8_t *data, if (IS_ZEBRA_DEBUG_MLAG) zlog_debug("%s: Mlag ProtoBuf decoding of message:%s", __func__, - zebra_mlag_lib_msgid_to_str(msg_type, buf, 80)); + mlag_lib_msgid_to_str(msg_type, buf, 80)); /* * Internal MLAG Message-types & MLAG.proto message types should diff --git a/zebra/zebra_mlag_private.c b/zebra/zebra_mlag_private.c index 6cb40a9c1..6a31d4705 100644 --- a/zebra/zebra_mlag_private.c +++ b/zebra/zebra_mlag_private.c @@ -71,10 +71,8 @@ int zebra_mlag_private_write_data(uint8_t *data, uint32_t len) static void zebra_mlag_sched_read(void) { - frr_with_mutex (&zrouter.mlag_info.mlag_th_mtx) { - thread_add_read(zmlag_master, zebra_mlag_read, NULL, - mlag_socket, &zrouter.mlag_info.t_read); - } + thread_add_read(zmlag_master, zebra_mlag_read, NULL, mlag_socket, + &zrouter.mlag_info.t_read); } static int zebra_mlag_read(struct thread *thread) diff --git a/zebra/zebra_router.h b/zebra/zebra_router.h index 6fe3e4840..437cab5bb 100644 --- a/zebra/zebra_router.h +++ b/zebra/zebra_router.h @@ -100,7 +100,6 @@ struct zebra_mlag_info { /* Threads for read/write. */ struct thread *t_read; struct thread *t_write; - pthread_mutex_t mlag_th_mtx; }; struct zebra_router { |