net: netconsole: separate fragmented message handling in send_ext_msg
authorBreno Leitao <leitao@debian.org>
Thu, 17 Oct 2024 09:50:18 +0000 (02:50 -0700)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 22 Oct 2024 13:44:24 +0000 (15:44 +0200)
Following the previous change, where the non-fragmented case was moved
to its own function, this update introduces a new function called
send_msg_fragmented to specifically manage scenarios where message
fragmentation is required.

Signed-off-by: Breno Leitao <leitao@debian.org>
Reviewed-by: Simon Horman <horms@kernel.org>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/netconsole.c

index 23fe9edff26ed867c5c16ee64765bb7208f7b0c4..6e916131c061a6e05792069f6c85992e2c0a76be 100644 (file)
@@ -1084,42 +1084,23 @@ static void send_msg_no_fragmentation(struct netconsole_target *nt,
        netpoll_send_udp(&nt->np, buf, msg_len);
 }
 
-/**
- * send_ext_msg_udp - send extended log message to target
- * @nt: target to send message to
- * @msg: extended log message to send
- * @msg_len: length of message
- *
- * Transfer extended log @msg to @nt.  If @msg is longer than
- * MAX_PRINT_CHUNK, it'll be split and transmitted in multiple chunks with
- * ncfrag header field added to identify them.
- */
-static void send_ext_msg_udp(struct netconsole_target *nt, const char *msg,
-                            int msg_len)
+static void send_msg_fragmented(struct netconsole_target *nt,
+                               const char *msg,
+                               const char *userdata,
+                               int msg_len,
+                               int release_len)
 {
        static char buf[MAX_PRINT_CHUNK]; /* protected by target_list_lock */
+       int offset = 0, userdata_len = 0;
        const char *header, *body;
-       int offset = 0;
        int header_len, body_len;
        const char *release;
-       int release_len = 0;
-       int userdata_len = 0;
-       char *userdata = NULL;
 
 #ifdef CONFIG_NETCONSOLE_DYNAMIC
-       userdata = nt->userdata_complete;
-       userdata_len = nt->userdata_length;
+       if (userdata)
+               userdata_len = nt->userdata_length;
 #endif
 
-       if (nt->release) {
-               release = init_utsname()->release;
-               release_len = strlen(release) + 1;
-       }
-
-       if (msg_len + release_len + userdata_len <= MAX_PRINT_CHUNK)
-               return send_msg_no_fragmentation(nt, msg, userdata, msg_len,
-                                                release_len);
-
        /* need to insert extra header fields, detect header and body */
        header = msg;
        body = memchr(msg, ';', msg_len);
@@ -1134,11 +1115,18 @@ static void send_ext_msg_udp(struct netconsole_target *nt, const char *msg,
         * Transfer multiple chunks with the following extra header.
         * "ncfrag=<byte-offset>/<total-bytes>"
         */
-       if (nt->release)
+       if (release_len) {
+               release = init_utsname()->release;
                scnprintf(buf, MAX_PRINT_CHUNK, "%s,", release);
+       }
+
+       /* Copy the header into the buffer */
        memcpy(buf + release_len, header, header_len);
        header_len += release_len;
 
+       /* for now on, the header will be persisted, and the body
+        * will be replaced
+        */
        while (offset < body_len + userdata_len) {
                int this_header = header_len;
                int this_offset = 0;
@@ -1190,6 +1178,38 @@ static void send_ext_msg_udp(struct netconsole_target *nt, const char *msg,
        }
 }
 
+/**
+ * send_ext_msg_udp - send extended log message to target
+ * @nt: target to send message to
+ * @msg: extended log message to send
+ * @msg_len: length of message
+ *
+ * Transfer extended log @msg to @nt.  If @msg is longer than
+ * MAX_PRINT_CHUNK, it'll be split and transmitted in multiple chunks with
+ * ncfrag header field added to identify them.
+ */
+static void send_ext_msg_udp(struct netconsole_target *nt, const char *msg,
+                            int msg_len)
+{
+       char *userdata = NULL;
+       int userdata_len = 0;
+       int release_len = 0;
+
+#ifdef CONFIG_NETCONSOLE_DYNAMIC
+       userdata = nt->userdata_complete;
+       userdata_len = nt->userdata_length;
+#endif
+
+       if (nt->release)
+               release_len = strlen(init_utsname()->release) + 1;
+
+       if (msg_len + release_len + userdata_len <= MAX_PRINT_CHUNK)
+               return send_msg_no_fragmentation(nt, msg, userdata, msg_len,
+                                                release_len);
+
+       return send_msg_fragmented(nt, msg, userdata, msg_len, release_len);
+}
+
 static void write_ext_msg(struct console *con, const char *msg,
                          unsigned int len)
 {