[PATCH 1/3] sockaddr: Implement decoding of AF_TIPC socket addresses

sahilcdq0 at gmail.com sahilcdq0 at gmail.com
Thu May 22 19:33:59 UTC 2025


From: Sahil Siddiq <sahilcdq0 at gmail.com>

* src/sockaddr.c: Include <linux/tipc.h> and "xlat/af_tipc_*" headers.
(print_sockaddr_data_tipc): New function.
(print_sockaddr_data_raw): Add AF_TIPC decoding.
* src/xlat/af_tipc_scope.in: New file.
* src/xlat/af_tipc_types.in: New file.

Signed-off-by: Sahil Siddiq <sahilcdq0 at gmail.com>
---
 src/sockaddr.c            | 75 +++++++++++++++++++++++++++++++++++++++
 src/xlat/af_tipc_scope.in |  2 ++
 src/xlat/af_tipc_types.in |  4 +++
 3 files changed, 81 insertions(+)
 create mode 100644 src/xlat/af_tipc_scope.in
 create mode 100644 src/xlat/af_tipc_types.in

diff --git a/src/sockaddr.c b/src/sockaddr.c
index ee1ce8828..6d15da352 100644
--- a/src/sockaddr.c
+++ b/src/sockaddr.c
@@ -27,6 +27,7 @@
 #include <linux/mctp.h>
 #include <linux/nfc.h>
 #include <linux/qrtr.h>
+#include <linux/tipc.h>
 #include <linux/vm_sockets.h>
 #include <linux/x25.h>
 
@@ -35,6 +36,9 @@
 #include "xlat/ethernet_protocols.h"
 #include "xlat/af_packet_types.h"
 
+#include "xlat/af_tipc_scope.h"
+#include "xlat/af_tipc_types.h"
+
 #include "xlat/bdaddr_types.h"
 #include "xlat/bluetooth_l2_cid.h"
 #include "xlat/bluetooth_l2_psm.h"
@@ -580,6 +584,76 @@ print_sockaddr_data_ll(struct tcb *tcp, const void *const buf,
 	}
 }
 
+static void
+print_sockaddr_data_tipc(struct tcb *tcp, const void *const buf,
+			  const int len)
+{
+	const struct sockaddr_tipc *const sa = buf;
+
+	PRINT_FIELD_XVAL_VERBOSE(*sa, addrtype, af_tipc_types, "TIPC_ADDR_???");
+	tprint_struct_next();
+	tprints_field_name("scope");
+
+	signed char scope = sa->scope;
+
+	if (scope < 0) {
+		tprints_string("-");
+		scope = -scope;
+	}
+
+	printxval(af_tipc_scope, scope, "TIPC_???_SCOPE");
+	tprint_struct_next();
+	tprints_field_name("addr");
+
+	const void *const addr_buf = buf + offsetof(struct sockaddr_tipc, addr);
+	const int addr_len = sizeof(struct sockaddr_tipc) - offsetof(struct sockaddr_tipc, addr);
+
+	switch (sa->addrtype) {
+	case TIPC_SERVICE_RANGE:
+		tprint_union_begin();
+		tprints_field_name("nameseq");
+		tprint_struct_begin();
+		PRINT_FIELD_U(sa->addr.nameseq, type);
+		tprint_struct_next();
+		PRINT_FIELD_U(sa->addr.nameseq, lower);
+		tprint_struct_next();
+		PRINT_FIELD_U(sa->addr.nameseq, upper);
+		tprint_struct_end();
+		break;
+
+	case TIPC_SERVICE_ADDR:
+		tprint_union_begin();
+		tprints_field_name("name");
+		tprint_struct_begin();
+		tprints_field_name("name");
+		tprint_struct_begin();
+		PRINT_FIELD_U(sa->addr.name.name, type);
+		tprint_struct_next();
+		PRINT_FIELD_U(sa->addr.name.name, instance);
+		tprint_struct_end();
+		tprint_struct_next();
+		PRINT_FIELD_X(sa->addr.name, domain);
+		tprint_struct_end();
+		break;
+
+	case TIPC_SOCKET_ADDR:
+		tprint_union_begin();
+		tprints_field_name("id");
+		tprint_struct_begin();
+		PRINT_FIELD_U(sa->addr.id, ref);
+		tprint_struct_next();
+		PRINT_FIELD_X(sa->addr.id, node);
+		tprint_struct_end();
+		break;
+
+	default:
+		print_quoted_string(addr_buf, addr_len, 0);
+		return;
+	}
+
+	tprint_union_end();
+}
+
 static void
 print_sockaddr_data_raw(const void *const buf, const int addrlen)
 {
@@ -1037,6 +1111,7 @@ static const struct {
 	[AF_INET6] = { print_sockaddr_data_in6, SIN6_MIN_LEN },
 	[AF_NETLINK] = { print_sockaddr_data_nl, sizeof(struct sockaddr_nl) },
 	[AF_PACKET] = { print_sockaddr_data_ll, sizeof(struct sockaddr_ll) },
+	[AF_TIPC] = { print_sockaddr_data_tipc, sizeof(struct sockaddr_tipc) },
 	[AF_BLUETOOTH] = { print_sockaddr_data_bt, SIZEOF_SA_FAMILY + 1 },
 	[AF_RXRPC] = { print_sockaddr_data_rxrpc, sizeof(struct sockaddr_rxrpc) },
 	[AF_IEEE802154] = { print_sockaddr_data_ieee802154, sizeof(struct sockaddr_ieee802154) },
diff --git a/src/xlat/af_tipc_scope.in b/src/xlat/af_tipc_scope.in
new file mode 100644
index 000000000..b026019c5
--- /dev/null
+++ b/src/xlat/af_tipc_scope.in
@@ -0,0 +1,2 @@
+TIPC_CLUSTER_SCOPE	2
+TIPC_NODE_SCOPE		3
diff --git a/src/xlat/af_tipc_types.in b/src/xlat/af_tipc_types.in
new file mode 100644
index 000000000..8f6d778e7
--- /dev/null
+++ b/src/xlat/af_tipc_types.in
@@ -0,0 +1,4 @@
+#value_indexed
+TIPC_SERVICE_RANGE      1
+TIPC_SERVICE_ADDR       2
+TIPC_SOCKET_ADDR        3
-- 
2.49.0



More information about the Strace-devel mailing list