]> git.proxmox.com Git - mirror_frr.git/commitdiff
lib: mgmt msg: add version to messages
authorChristian Hopps <chopps@labn.net>
Tue, 25 Apr 2023 13:52:15 +0000 (09:52 -0400)
committerChristian Hopps <chopps@labn.net>
Sun, 28 May 2023 09:13:22 +0000 (05:13 -0400)
Signed-off-by: Christian Hopps <chopps@labn.net>
lib/mgmt_be_client.c
lib/mgmt_fe_client.c
lib/mgmt_msg.c
lib/mgmt_msg.h
mgmtd/mgmt_be_adapter.c
mgmtd/mgmt_fe_adapter.c

index 82e18ca72fb2ff4a6cf516d74bfad550ff97976a..ba8997c5adb1e54f39c48c9fcc998464bb0d3278 100644 (file)
@@ -853,8 +853,8 @@ mgmt_be_client_handle_msg(struct mgmt_be_client_ctx *client_ctx,
        return 0;
 }
 
-static void mgmt_be_client_process_msg(void *user_ctx, uint8_t *data,
-                                      size_t len)
+static void mgmt_be_client_process_msg(uint8_t version, void *user_ctx,
+                                      uint8_t *data, size_t len)
 {
        struct mgmt_be_client_ctx *client_ctx = user_ctx;
        Mgmtd__BeMessage *be_msg;
@@ -912,7 +912,7 @@ static int mgmt_be_client_send_msg(struct mgmt_be_client_ctx *client_ctx,
        }
 
        int rv = mgmt_msg_send_msg(
-               &client_ctx->mstate, be_msg,
+               &client_ctx->mstate, MGMT_MSG_VERSION_PROTOBUF, be_msg,
                mgmtd__be_message__get_packed_size(be_msg),
                (size_t(*)(void *, void *))mgmtd__be_message__pack,
                MGMTD_DBG_BE_CLIENT_CHECK());
index 37b87dee9ce46510b9f77ee175e506f86d17fffa..0458bc1c7a1e0bc6274a0d155e5be68b407f05cc 100644 (file)
@@ -140,7 +140,7 @@ static int mgmt_fe_client_send_msg(struct mgmt_fe_client_ctx *client_ctx,
        }
 
        int rv = mgmt_msg_send_msg(
-               &client_ctx->mstate, fe_msg,
+               &client_ctx->mstate, MGMT_MSG_VERSION_PROTOBUF, fe_msg,
                mgmtd__fe_message__get_packed_size(fe_msg),
                (size_t(*)(void *, void *))mgmtd__fe_message__pack,
                MGMTD_DBG_FE_CLIENT_CHECK());
@@ -614,8 +614,8 @@ mgmt_fe_client_handle_msg(struct mgmt_fe_client_ctx *client_ctx,
        return 0;
 }
 
-static void mgmt_fe_client_process_msg(void *user_ctx, uint8_t *data,
-                                      size_t len)
+static void mgmt_fe_client_process_msg(uint8_t version, void *user_ctx,
+                                      uint8_t *data, size_t len)
 {
        struct mgmt_fe_client_ctx *client_ctx = user_ctx;
        Mgmtd__FeMessage *fe_msg;
index bf694ee88bc094bed1b35661980374baa9f53dfd..e682face97151a368fddc4b4d2e74983074f9d14 100644 (file)
@@ -81,7 +81,7 @@ enum mgmt_msg_rsched mgmt_msg_read(struct mgmt_msg_state *ms, int fd,
        left = stream_get_endp(ms->ins);
        while (left > (long)sizeof(struct mgmt_msg_hdr)) {
                mhdr = (struct mgmt_msg_hdr *)(STREAM_DATA(ms->ins) + total);
-               if (mhdr->marker != MGMT_MSG_MARKER) {
+               if (!MGMT_MSG_IS_MARKER(mhdr->marker)) {
                        MGMT_MSG_DBG(dbgtag, "recv corrupt buffer, disconnect");
                        return MSR_DISCONNECT;
                }
@@ -127,8 +127,8 @@ enum mgmt_msg_rsched mgmt_msg_read(struct mgmt_msg_state *ms, int fd,
  *     true if more to process (so reschedule) else false
  */
 bool mgmt_msg_procbufs(struct mgmt_msg_state *ms,
-                      void (*handle_msg)(void *user, uint8_t *msg,
-                                         size_t msglen),
+                      void (*handle_msg)(uint8_t version, void *user,
+                                         uint8_t *msg, size_t msglen),
                       void *user, bool debug)
 {
        const char *dbgtag = debug ? ms->idtag : NULL;
@@ -153,10 +153,11 @@ bool mgmt_msg_procbufs(struct mgmt_msg_state *ms,
                     left -= mhdr->len, data += mhdr->len) {
                        mhdr = (struct mgmt_msg_hdr *)data;
 
-                       assert(mhdr->marker == MGMT_MSG_MARKER);
+                       assert(MGMT_MSG_IS_MARKER(mhdr->marker));
                        assert(left >= mhdr->len);
 
-                       handle_msg(user, (uint8_t *)(mhdr + 1),
+                       handle_msg(MGMT_MSG_MARKER_VERSION(mhdr->marker), user,
+                                  (uint8_t *)(mhdr + 1),
                                   mhdr->len - sizeof(struct mgmt_msg_hdr));
                        ms->nrxm++;
                        nproc++;
@@ -264,15 +265,19 @@ enum mgmt_msg_wsched mgmt_msg_write(struct mgmt_msg_state *ms, int fd,
  *
  * Args:
  *     ms: mgmt_msg_state for this process.
- *     fd: socket/file to read data from.
+ *     version: version of this message, will be given to receiving side.
+ *     msg: the message to be sent.
+ *     len: the length of the message.
+ *     packf: a function to pack the message.
  *     debug: true to enable debug logging.
  *
  * Returns:
  *      0 on success, otherwise -1 on failure. The only failure mode is if a
  *      the message exceeds the maximum message size configured on init.
  */
-int mgmt_msg_send_msg(struct mgmt_msg_state *ms, void *msg, size_t len,
-                     mgmt_msg_packf packf, bool debug)
+int mgmt_msg_send_msg(struct mgmt_msg_state *ms, uint8_t version, void *msg,
+                     size_t len, size_t (*packf)(void *msg, void *buf),
+                     bool debug)
 {
        const char *dbgtag = debug ? ms->idtag : NULL;
        struct mgmt_msg_hdr *mhdr;
@@ -308,12 +313,17 @@ int mgmt_msg_send_msg(struct mgmt_msg_state *ms, void *msg, size_t len,
 
        /* We have a stream with space, pack the message into it. */
        mhdr = (struct mgmt_msg_hdr *)(STREAM_DATA(s) + s->endp);
-       mhdr->marker = MGMT_MSG_MARKER;
+       mhdr->marker = MGMT_MSG_MARKER(version);
        mhdr->len = mlen;
        stream_forward_endp(s, sizeof(*mhdr));
        endp = stream_get_endp(s);
        dstbuf = STREAM_DATA(s) + endp;
-       n = packf(msg, dstbuf);
+       if (packf)
+               n = packf(msg, dstbuf);
+       else {
+               memcpy(dstbuf, msg, len);
+               n = len;
+       }
        stream_set_endp(s, endp + n);
        ms->ntxm++;
 
index 633c78338d259c7a109696d7043a2cbbb8535fc9..51046e27e97e4bdaf900e0e90d830356f56f4fed 100644 (file)
 #include "stream.h"
 #include "frrevent.h"
 
-#define MGMT_MSG_MARKER (0x4D724B21u) /* ASCII - "MrK!"*/
+/*
+ * Messages on the stream start with a marker that encodes a version octet.
+ */
+#define MGMT_MSG_MARKER_PFX (0x23232300u) /* ASCII - "###\ooo"*/
+#define MGMT_MSG_IS_MARKER(x) (((x)&0xFFFFFF00u) == MGMT_MSG_MARKER_PFX)
+#define MGMT_MSG_MARKER(version) (MGMT_MSG_MARKER_PFX | (version))
+#define MGMT_MSG_MARKER_VERSION(x) (0xFF & (x))
+
+#define MGMT_MSG_VERSION_PROTOBUF 0
+#define MGMT_MSG_VERSION_NATIVE 1
 
 struct mgmt_msg_state {
        struct stream *ins;
@@ -44,13 +53,6 @@ enum mgmt_msg_wsched {
        MSW_DISCONNECT,       /* disconnect and start reconnecting */
 };
 
-static inline uint8_t *msg_payload(struct mgmt_msg_hdr *mhdr)
-{
-       return (uint8_t *)(mhdr + 1);
-}
-
-typedef size_t (*mgmt_msg_packf)(void *msg, void *data);
-
 extern int mgmt_msg_connect(const char *path, size_t sendbuf, size_t recvbuf,
                            const char *dbgtag);
 extern void mgmt_msg_destroy(struct mgmt_msg_state *ms);
@@ -58,13 +60,14 @@ extern void mgmt_msg_init(struct mgmt_msg_state *ms, size_t max_read_buf,
                          size_t max_write_buf, size_t max_msg_sz,
                          const char *idtag);
 extern bool mgmt_msg_procbufs(struct mgmt_msg_state *ms,
-                             void (*handle_msg)(void *user, uint8_t *msg,
-                                                size_t msglen),
+                             void (*handle_msg)(uint8_t version, void *user,
+                                                uint8_t *msg, size_t msglen),
                              void *user, bool debug);
 extern enum mgmt_msg_rsched mgmt_msg_read(struct mgmt_msg_state *ms, int fd,
                                          bool debug);
 extern size_t mgmt_msg_reset_writes(struct mgmt_msg_state *ms);
-extern int mgmt_msg_send_msg(struct mgmt_msg_state *ms, void *msg, size_t len,
+extern int mgmt_msg_send_msg(struct mgmt_msg_state *ms, uint8_t version,
+                            void *msg, size_t len,
                             size_t (*packf)(void *msg, void *buf), bool debug);
 extern enum mgmt_msg_wsched mgmt_msg_write(struct mgmt_msg_state *ms, int fd,
                                           bool debug);
index a25504389257a59e171ff94d6d7f9fa1bb583969..a7869406d41e455178a720d7926c24ddfa00ccf7 100644 (file)
@@ -492,7 +492,7 @@ static int mgmt_be_adapter_send_msg(struct mgmt_be_client_adapter *adapter,
        }
 
        int rv = mgmt_msg_send_msg(
-               &adapter->mstate, be_msg,
+               &adapter->mstate, MGMT_MSG_VERSION_PROTOBUF, be_msg,
                mgmtd__be_message__get_packed_size(be_msg),
                (size_t(*)(void *, void *))mgmtd__be_message__pack,
                MGMT_DEBUG_BE_CHECK());
@@ -569,8 +569,8 @@ static int mgmt_be_send_cfgapply_req(struct mgmt_be_client_adapter *adapter,
        return mgmt_be_adapter_send_msg(adapter, &be_msg);
 }
 
-static void mgmt_be_adapter_process_msg(void *user_ctx, uint8_t *data,
-                                       size_t len)
+static void mgmt_be_adapter_process_msg(uint8_t version, void *user_ctx,
+                                       uint8_t *data, size_t len)
 {
        struct mgmt_be_client_adapter *adapter = user_ctx;
        Mgmtd__BeMessage *be_msg;
index 3b0855d720b6fb9fa794f6b55c7106b6248a7615..2da7ab0903b4e07fb9bdcb93b8adb14c8c73fb3a 100644 (file)
@@ -369,7 +369,7 @@ mgmt_fe_adapter_send_msg(struct mgmt_fe_client_adapter *adapter,
        }
 
        int rv = mgmt_msg_send_msg(
-               &adapter->mstate, fe_msg,
+               &adapter->mstate, MGMT_MSG_VERSION_PROTOBUF, fe_msg,
                mgmtd__fe_message__get_packed_size(fe_msg),
                (size_t(*)(void *, void *))mgmtd__fe_message__pack,
                MGMT_DEBUG_FE_CHECK());
@@ -1387,8 +1387,8 @@ mgmt_fe_adapter_handle_msg(struct mgmt_fe_client_adapter *adapter,
        return 0;
 }
 
-static void mgmt_fe_adapter_process_msg(void *user_ctx, uint8_t *data,
-                                       size_t len)
+static void mgmt_fe_adapter_process_msg(uint8_t version, void *user_ctx,
+                                       uint8_t *data, size_t len)
 {
        struct mgmt_fe_client_adapter *adapter = user_ctx;
        Mgmtd__FeMessage *fe_msg;