From 54fc755c56db517e911717fe40e995de5467adbb Mon Sep 17 00:00:00 2001
From: Eugene Syromyatnikov <evgsyr@gmail.com>
Date: Mon, 27 Aug 2018 12:46:34 +0200
Subject: [PATCH] socketutils: add more IP/IPv6 transport protocols

* defs.h (sock_proto): Add SOCK_PROTO_UDPLITE, SOCK_PROTO_DCCP,
SOCK_PROTO_SCTP, SOCK_PROTO_L2TP_IP, SOCK_PROTO_PING, SOCK_PROTO_RAW,
SOCK_PROTO_UDPLITEv6, SOCK_PROTO_DCCPv6, SOCK_PROTO_L2TP_IPv6,
SOCK_PROTO_SCTPv6, SOCK_PROTO_PINGv6, and SOCK_PROTO_RAWv6.
* socketutils.c: Include "xlat/inet_protocols.h" in XLAT_MACROS_ONLY
mode.
(protocols): Add protocol descriptions for them.
---
 defs.h        | 14 +++++++++++++-
 socketutils.c | 33 +++++++++++++++++++++++++++++++++
 2 files changed, 46 insertions(+), 1 deletion(-)

diff --git a/defs.h b/defs.h
index 78e2d9a0..22ab1970 100644
--- a/defs.h
+++ b/defs.h
@@ -379,9 +379,21 @@ enum sock_proto {
 	SOCK_PROTO_UNIX,
 	SOCK_PROTO_TCP,
 	SOCK_PROTO_UDP,
+	SOCK_PROTO_UDPLITE,
+	SOCK_PROTO_DCCP,
+	SOCK_PROTO_SCTP,
+	SOCK_PROTO_L2TP_IP,
+	SOCK_PROTO_PING,
+	SOCK_PROTO_RAW,
 	SOCK_PROTO_TCPv6,
 	SOCK_PROTO_UDPv6,
-	SOCK_PROTO_NETLINK
+	SOCK_PROTO_UDPLITEv6,
+	SOCK_PROTO_DCCPv6,
+	SOCK_PROTO_L2TP_IPv6,
+	SOCK_PROTO_SCTPv6,
+	SOCK_PROTO_PINGv6,
+	SOCK_PROTO_RAWv6,
+	SOCK_PROTO_NETLINK,
 };
 extern enum sock_proto get_proto_by_name(const char *);
 
diff --git a/socketutils.c b/socketutils.c
index ff02c2fb..dd8451e4 100644
--- a/socketutils.c
+++ b/socketutils.c
@@ -48,6 +48,10 @@
 
 #include "xstring.h"
 
+#define XLAT_MACROS_ONLY
+# include "xlat/inet_protocols.h"
+#undef XLAT_MACROS_ONLY
+
 typedef struct {
 	unsigned long inode;
 	char *details;
@@ -451,14 +455,43 @@ static const struct {
 	int proto;
 } protocols[] = {
 	[SOCK_PROTO_UNIX]	= { "UNIX",	unix_get,	AF_UNIX},
+	/*
+	 * inet_diag handlers are currently implemented only for TCP,
+	 * UDP(lite), SCTP, RAW, and DCCP, but we try to resolve it for all
+	 * protocols anyway, just in case.
+	 */
 	[SOCK_PROTO_TCP]	=
 		{ "TCP",	inet_get, AF_INET,  IPPROTO_TCP },
 	[SOCK_PROTO_UDP]	=
 		{ "UDP",	inet_get, AF_INET,  IPPROTO_UDP },
+	[SOCK_PROTO_UDPLITE]	=
+		{ "UDPLITE",	inet_get, AF_INET,  IPPROTO_UDPLITE },
+	[SOCK_PROTO_DCCP]	=
+		{ "DCCP",	inet_get, AF_INET,  IPPROTO_DCCP },
+	[SOCK_PROTO_SCTP]	=
+		{ "SCTP",	inet_get, AF_INET,  IPPROTO_SCTP },
+	[SOCK_PROTO_L2TP_IP]	=
+		{ "L2TP/IP",	inet_get, AF_INET,  IPPROTO_L2TP },
+	[SOCK_PROTO_PING]	=
+		{ "PING",	inet_get, AF_INET,  IPPROTO_ICMP },
+	[SOCK_PROTO_RAW]	=
+		{ "RAW",	inet_get, AF_INET,  IPPROTO_RAW },
 	[SOCK_PROTO_TCPv6]	=
 		{ "TCPv6",	inet_get, AF_INET6, IPPROTO_TCP },
 	[SOCK_PROTO_UDPv6]	=
 		{ "UDPv6",	inet_get, AF_INET6, IPPROTO_UDP },
+	[SOCK_PROTO_UDPLITEv6]	=
+		{ "UDPLITEv6",	inet_get, AF_INET6, IPPROTO_UDPLITE },
+	[SOCK_PROTO_DCCPv6]	=
+		{ "DCCPv6",	inet_get, AF_INET6, IPPROTO_DCCP },
+	[SOCK_PROTO_SCTPv6]	=
+		{ "SCTPv6",	inet_get, AF_INET6, IPPROTO_SCTP },
+	[SOCK_PROTO_L2TP_IPv6]	=
+		{ "L2TP/IPv6",	inet_get, AF_INET6, IPPROTO_L2TP },
+	[SOCK_PROTO_PINGv6]	=
+		{ "PINGv6",	inet_get, AF_INET6, IPPROTO_ICMP },
+	[SOCK_PROTO_RAWv6]	=
+		{ "RAWv6",	inet_get, AF_INET6, IPPROTO_RAW },
 	[SOCK_PROTO_NETLINK]	= { "NETLINK",	netlink_get,	AF_NETLINK },
 };