MINOR: raw_sock: Report the number of bytes emitted using the splicing

In the continuity of the commit 7cf0e4517 ("MINOR: raw_sock: report global
traffic statistics"), we are now able to report the global number of bytes
emitted using the splicing. It can be retrieved in "show info" output on the
CLI.

Note this counter is always declared, regardless the splicing support. This
eases the integration with monitoring tools plugged on the CLI.
diff --git a/include/haproxy/global-t.h b/include/haproxy/global-t.h
index 677d98f..8acba89 100644
--- a/include/haproxy/global-t.h
+++ b/include/haproxy/global-t.h
@@ -109,6 +109,7 @@
 	struct freq_ctr comp_bps_out;	/* bytes per second, after http compression */
 	struct freq_ctr out_32bps;      /* #of 32-byte blocks emitted per second */
 	unsigned long long out_bytes;   /* total #of bytes emitted */
+	unsigned long long spliced_out_bytes; /* total #of bytes emitted though a kernel pipe */
 	int cps_lim, cps_max;
 	int sps_lim, sps_max;
 	int ssl_lim, ssl_max;
diff --git a/include/haproxy/stats-t.h b/include/haproxy/stats-t.h
index 01c399d..baf2fac 100644
--- a/include/haproxy/stats-t.h
+++ b/include/haproxy/stats-t.h
@@ -314,6 +314,7 @@
 	INF_BUSY_POLLING,
 	INF_FAILED_RESOLUTIONS,
 	INF_TOTAL_BYTES_OUT,
+	INF_TOTAL_SPLICED_BYTES_OUT,
 	INF_BYTES_OUT_RATE,
 	INF_DEBUG_COMMANDS_ISSUED,
 
diff --git a/src/raw_sock.c b/src/raw_sock.c
index 2d31b18..1900a5c 100644
--- a/src/raw_sock.c
+++ b/src/raw_sock.c
@@ -154,6 +154,7 @@
 		 * limited to 4GB and that it's not enough per second.
 		 */
 		_HA_ATOMIC_ADD(&global.out_bytes, retval);
+		_HA_ATOMIC_ADD(&global.spliced_out_bytes, retval);
 		update_freq_ctr(&global.out_32bps, (retval + 16) / 32);
 	}
 	return retval;
diff --git a/src/stats.c b/src/stats.c
index 1a453c3..e8ea831 100644
--- a/src/stats.c
+++ b/src/stats.c
@@ -144,6 +144,7 @@
 	[INF_BUSY_POLLING]                   = { .name = "BusyPolling",                 .desc = "1 if busy-polling is currently in use on the worker process, otherwise zero (config.busy-polling)" },
 	[INF_FAILED_RESOLUTIONS]             = { .name = "FailedResolutions",           .desc = "Total number of failed DNS resolutions in current worker process since started" },
 	[INF_TOTAL_BYTES_OUT]                = { .name = "TotalBytesOut",               .desc = "Total number of bytes emitted by current worker process since started" },
+	[INF_TOTAL_SPLICED_BYTES_OUT]        = { .name = "TotalSplicdedBytesOut",       .desc = "Total number of bytes emitted by current worker process through a kernel pipe since started" },
 	[INF_BYTES_OUT_RATE]                 = { .name = "BytesOutRate",                .desc = "Number of bytes emitted by current worker process over the last second" },
 	[INF_DEBUG_COMMANDS_ISSUED]          = { .name = "DebugCommandsIssued",         .desc = "Number of debug commands issued on this process (anything > 0 is unsafe)" },
 };
@@ -3519,6 +3520,7 @@
 	info[INF_BUSY_POLLING]                   = mkf_u32(0, !!(global.tune.options & GTUNE_BUSY_POLLING));
 	info[INF_FAILED_RESOLUTIONS]             = mkf_u32(0, dns_failed_resolutions);
 	info[INF_TOTAL_BYTES_OUT]                = mkf_u64(0, global.out_bytes);
+	info[INF_TOTAL_SPLICED_BYTES_OUT]        = mkf_u64(0, global.spliced_out_bytes);
 	info[INF_BYTES_OUT_RATE]                 = mkf_u64(FN_RATE, (unsigned long long)read_freq_ctr(&global.out_32bps) * 32);
 	info[INF_DEBUG_COMMANDS_ISSUED]          = mkf_u32(0, debug_commands_issued);