summaryrefslogtreecommitdiff
path: root/pimd/pim_mlag.c
diff options
context:
space:
mode:
authorSatheesh Kumar K <sathk@cumulusnetworks.com>2019-11-12 00:17:13 -0800
committerSatheesh Kumar K <sathk@cumulusnetworks.com>2019-11-13 20:43:15 -0800
commit46c2687c72e59dce69a5f5d35fc7bd4d76bc740e (patch)
tree36bfd76a80572e00abd9db78e49b10ced1153e39 /pimd/pim_mlag.c
parent36b5b98fefd2f77297f31274ca031104902f8b38 (diff)
pimd, lib: adding support for MLAG Message processing at PIM
This includes: 1. Defining message formats 2. Stream Decoding after receiving the message at PIM 3. Handling MLAG UP & Down Notifications Signed-off-by: Satheesh Kumar K <sathk@cumulusnetworks.com>
Diffstat (limited to 'pimd/pim_mlag.c')
-rw-r--r--pimd/pim_mlag.c162
1 files changed, 160 insertions, 2 deletions
diff --git a/pimd/pim_mlag.c b/pimd/pim_mlag.c
index 5e5da29002..740373bc40 100644
--- a/pimd/pim_mlag.c
+++ b/pimd/pim_mlag.c
@@ -28,6 +28,165 @@
extern struct zclient *zclient;
+
+/********************API to process PIM MLAG Data ************************/
+
+static void pim_mlag_process_mlagd_state_change(struct mlag_status msg)
+{
+ char buf[MLAG_ROLE_STRSIZE];
+
+ if (PIM_DEBUG_MLAG)
+ zlog_debug("%s: msg dump: my_role: %s, peer_state: %s",
+ __func__,
+ mlag_role2str(msg.my_role, buf, sizeof(buf)),
+ (msg.peer_state == MLAG_STATE_RUNNING ? "RUNNING"
+ : "DOWN"));
+}
+
+static void pim_mlag_process_peer_frr_state_change(struct mlag_frr_status msg)
+{
+ if (PIM_DEBUG_MLAG)
+ zlog_debug(
+ "%s: msg dump: peer_frr_state: %s", __func__,
+ (msg.frr_state == MLAG_FRR_STATE_UP ? "UP" : "DOWN"));
+}
+
+static void pim_mlag_process_vxlan_update(struct mlag_vxlan *msg)
+{
+}
+
+static void pim_mlag_process_mroute_add(struct mlag_mroute_add msg)
+{
+ if (PIM_DEBUG_MLAG) {
+ zlog_debug(
+ "%s: msg dump: vrf_name: %s, s.ip: 0x%x, g.ip: 0x%x cost: %u",
+ __func__, msg.vrf_name, msg.source_ip, msg.group_ip,
+ msg.cost_to_rp);
+ zlog_debug(
+ "owner_id: %d, DR: %d, Dual active: %d, vrf_id: 0x%x intf_name: %s",
+ msg.owner_id, msg.am_i_dr, msg.am_i_dual_active,
+ msg.vrf_id, msg.intf_name);
+ }
+}
+
+static void pim_mlag_process_mroute_del(struct mlag_mroute_del msg)
+{
+ if (PIM_DEBUG_MLAG) {
+ zlog_debug(
+ "%s: msg dump: vrf_name: %s, s.ip: 0x%x, g.ip: 0x%x ",
+ __func__, msg.vrf_name, msg.source_ip, msg.group_ip);
+ zlog_debug("owner_id: %d, vrf_id: 0x%x intf_name: %s",
+ msg.owner_id, msg.vrf_id, msg.intf_name);
+ }
+}
+
+
+int pim_zebra_mlag_handle_msg(struct stream *s, int len)
+{
+ struct mlag_msg mlag_msg;
+ char buf[ZLOG_FILTER_LENGTH_MAX];
+ int rc = 0;
+
+ rc = zebra_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_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);
+ if (rc)
+ return (rc);
+ pim_mlag_process_mlagd_state_change(msg);
+ } break;
+ case MLAG_PEER_FRR_STATUS: {
+ struct mlag_frr_status msg;
+
+ rc = zebra_mlag_lib_decode_frr_status(s, &msg);
+ if (rc)
+ return (rc);
+ pim_mlag_process_peer_frr_state_change(msg);
+ } break;
+ case MLAG_VXLAN_UPDATE: {
+ struct mlag_vxlan msg;
+
+ rc = zebra_mlag_lib_decode_vxlan_update(s, &msg);
+ if (rc)
+ return rc;
+ pim_mlag_process_vxlan_update(&msg);
+ } break;
+ case MLAG_MROUTE_ADD: {
+ struct mlag_mroute_add msg;
+
+ rc = zebra_mlag_lib_decode_mroute_add(s, &msg);
+ if (rc)
+ return (rc);
+ pim_mlag_process_mroute_add(msg);
+ } break;
+ case MLAG_MROUTE_DEL: {
+ struct mlag_mroute_del msg;
+
+ rc = zebra_mlag_lib_decode_mroute_del(s, &msg);
+ if (rc)
+ return (rc);
+ pim_mlag_process_mroute_del(msg);
+ } break;
+ case MLAG_MROUTE_ADD_BULK: {
+ struct mlag_mroute_add msg;
+ int i = 0;
+
+ for (i = 0; i < mlag_msg.msg_cnt; i++) {
+
+ rc = zebra_mlag_lib_decode_mroute_add(s, &msg);
+ if (rc)
+ return (rc);
+ pim_mlag_process_mroute_add(msg);
+ }
+ } break;
+ case MLAG_MROUTE_DEL_BULK: {
+ struct mlag_mroute_del msg;
+ int i = 0;
+
+ for (i = 0; i < mlag_msg.msg_cnt; i++) {
+
+ rc = zebra_mlag_lib_decode_mroute_del(s, &msg);
+ if (rc)
+ return (rc);
+ pim_mlag_process_mroute_del(msg);
+ }
+ } break;
+ default:
+ break;
+ }
+ return 0;
+}
+
+/****************End of PIM Mesasge processing handler********************/
+
+int pim_zebra_mlag_process_up(void)
+{
+ if (PIM_DEBUG_MLAG)
+ zlog_debug("%s: Received Process-Up from Mlag", __func__);
+
+ return 0;
+}
+
+int pim_zebra_mlag_process_down(void)
+{
+ if (PIM_DEBUG_MLAG)
+ zlog_debug("%s: Received Process-Down from Mlag", __func__);
+
+ return 0;
+}
+
static int pim_mlag_register_handler(struct thread *thread)
{
uint32_t bit_mask = 0;
@@ -132,8 +291,7 @@ void pim_if_unconfigure_mlag_dualactive(struct pim_interface *pim_ifp)
__func__, "NULL");
pim_ifp->activeactive = false;
- if (pim_ifp->pim)
- pim_ifp->pim->inst_mlag_intf_cnt--;
+ pim_ifp->pim->inst_mlag_intf_cnt--;
router->pim_mlag_intf_cnt--;
if (PIM_DEBUG_MLAG)