Commit 1ec9daf9 authored by Matthew Wood's avatar Matthew Wood Committed by David S. Miller

net: netconsole: append userdata to fragmented netconsole messages

Regardless of whether the original message body or formatted userdata
exceeds the MAX_PRINT_CHUNK, append userdata to the netconsole message
starting with the first chunk that has available space after writing the
body.
Co-developed-by: default avatarBreno Leitao <leitao@debian.org>
Signed-off-by: default avatarBreno Leitao <leitao@debian.org>
Signed-off-by: default avatarMatthew Wood <thepacketgeek@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b4ab4f2c
...@@ -1085,24 +1085,48 @@ static void send_ext_msg_udp(struct netconsole_target *nt, const char *msg, ...@@ -1085,24 +1085,48 @@ static void send_ext_msg_udp(struct netconsole_target *nt, const char *msg,
memcpy(buf + release_len, header, header_len); memcpy(buf + release_len, header, header_len);
header_len += release_len; header_len += release_len;
while (offset < body_len) { while (offset < body_len + userdata_len) {
int this_header = header_len; int this_header = header_len;
int this_chunk; int this_offset = 0;
int this_chunk = 0;
this_header += scnprintf(buf + this_header, this_header += scnprintf(buf + this_header,
sizeof(buf) - this_header, sizeof(buf) - this_header,
",ncfrag=%d/%d;", offset, body_len); ",ncfrag=%d/%d;", offset,
body_len + userdata_len);
this_chunk = min(body_len - offset,
MAX_PRINT_CHUNK - this_header); /* Not all body data has been written yet */
if (WARN_ON_ONCE(this_chunk <= 0)) if (offset < body_len) {
return; this_chunk = min(body_len - offset,
MAX_PRINT_CHUNK - this_header);
memcpy(buf + this_header, body + offset, this_chunk); if (WARN_ON_ONCE(this_chunk <= 0))
return;
netpoll_send_udp(&nt->np, buf, this_header + this_chunk); memcpy(buf + this_header, body + offset, this_chunk);
this_offset += this_chunk;
}
/* Body is fully written and there is pending userdata to write,
* append userdata in this chunk
*/
if (offset + this_offset >= body_len &&
offset + this_offset < userdata_len + body_len) {
int sent_userdata = (offset + this_offset) - body_len;
int preceding_bytes = this_chunk + this_header;
if (WARN_ON_ONCE(sent_userdata < 0))
return;
this_chunk = min(userdata_len - sent_userdata,
MAX_PRINT_CHUNK - preceding_bytes);
if (WARN_ON_ONCE(this_chunk <= 0))
return;
memcpy(buf + this_header + this_offset,
userdata + sent_userdata,
this_chunk);
this_offset += this_chunk;
}
offset += this_chunk; netpoll_send_udp(&nt->np, buf, this_header + this_offset);
offset += this_offset;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment