]> git.proxmox.com Git - mirror_frr.git/blobdiff - lib/mlag.c
Merge pull request #12798 from donaldsharp/rib_match_multicast
[mirror_frr.git] / lib / mlag.c
index 1daf2907252210d18022081390f124261b5d4ed4..a370bf8924a2f0676b9703e292b0e588302afbfb 100644 (file)
@@ -1,23 +1,7 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
 /* mlag generic code.
  * Copyright (C) 2018 Cumulus Networks, Inc.
  *                    Donald Sharp
- *
- * This file is part of FRR.
- *
- * FRR is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2, or (at your option) any
- * later version.
- *
- * FRR is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with FRR; see the file COPYING.  If not, write to the Free
- * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
  */
 #include <zebra.h>
 
@@ -73,7 +57,10 @@ char *mlag_lib_msgid_to_str(enum mlag_msg_type msg_type, char *buf, size_t size)
        case MLAG_PEER_FRR_STATUS:
                snprintf(buf, size, "Mlag Peer FRR Status");
                break;
-       default:
+       case MLAG_PIM_CFG_DUMP:
+               snprintf(buf, size, "Mlag Pim Configuration Dump");
+               break;
+       case MLAG_MSG_NONE:
                snprintf(buf, size, "Unknown %d", msg_type);
                break;
        }
@@ -81,22 +68,36 @@ char *mlag_lib_msgid_to_str(enum mlag_msg_type msg_type, char *buf, size_t size)
 }
 
 
-int 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,
+                            size_t *length)
 {
+#define LIB_MLAG_HDR_LENGTH 8
        if (s == NULL || msg == NULL)
                return -1;
 
+       *length = stream_get_endp(s);
+
+       if (*length < LIB_MLAG_HDR_LENGTH)
+               return -1;
+
+       *length -= LIB_MLAG_HDR_LENGTH;
+
        STREAM_GETL(s, msg->msg_type);
        STREAM_GETW(s, msg->data_len);
        STREAM_GETW(s, msg->msg_cnt);
+
        return 0;
 stream_failure:
        return -1;
 }
 
-int mlag_lib_decode_mroute_add(struct stream *s, struct mlag_mroute_add *msg)
+#define MLAG_MROUTE_ADD_LENGTH                                                 \
+       (VRF_NAMSIZ + INTERFACE_NAMSIZ + 4 + 4 + 4 + 4 + 1 + 1 + 4)
+
+int mlag_lib_decode_mroute_add(struct stream *s, struct mlag_mroute_add *msg,
+                              size_t *length)
 {
-       if (s == NULL || msg == NULL)
+       if (s == NULL || msg == NULL || *length < MLAG_MROUTE_ADD_LENGTH)
                return -1;
 
        STREAM_GET(msg->vrf_name, s, VRF_NAMSIZ);
@@ -108,14 +109,18 @@ int mlag_lib_decode_mroute_add(struct stream *s, struct mlag_mroute_add *msg)
        STREAM_GETC(s, msg->am_i_dual_active);
        STREAM_GETL(s, msg->vrf_id);
        STREAM_GET(msg->intf_name, s, INTERFACE_NAMSIZ);
+
        return 0;
 stream_failure:
        return -1;
 }
 
-int mlag_lib_decode_mroute_del(struct stream *s, struct mlag_mroute_del *msg)
+#define MLAG_MROUTE_DEL_LENGTH (VRF_NAMSIZ + INTERFACE_NAMSIZ + 4 + 4 + 4 + 4)
+
+int mlag_lib_decode_mroute_del(struct stream *s, struct mlag_mroute_del *msg,
+                              size_t *length)
 {
-       if (s == NULL || msg == NULL)
+       if (s == NULL || msg == NULL || *length < MLAG_MROUTE_DEL_LENGTH)
                return -1;
 
        STREAM_GET(msg->vrf_name, s, VRF_NAMSIZ);
@@ -124,6 +129,7 @@ int mlag_lib_decode_mroute_del(struct stream *s, struct mlag_mroute_del *msg)
        STREAM_GETL(s, msg->owner_id);
        STREAM_GETL(s, msg->vrf_id);
        STREAM_GET(msg->intf_name, s, INTERFACE_NAMSIZ);
+
        return 0;
 stream_failure:
        return -1;