xref: /openbmc/linux/tools/perf/trace/beauty/sockaddr.c (revision d5a7e661)
1d5a7e661SArnaldo Carvalho de Melo // SPDX-License-Identifier: GPL-2.0
2d5a7e661SArnaldo Carvalho de Melo // Copyright (C) 2018, Red Hat Inc, Arnaldo Carvalho de Melo <acme@redhat.com>
3d5a7e661SArnaldo Carvalho de Melo 
4d5a7e661SArnaldo Carvalho de Melo #include "trace/beauty/beauty.h"
5d5a7e661SArnaldo Carvalho de Melo #include <sys/socket.h>
6d5a7e661SArnaldo Carvalho de Melo #include <sys/types.h>
7d5a7e661SArnaldo Carvalho de Melo #include <sys/un.h>
8d5a7e661SArnaldo Carvalho de Melo #include <arpa/inet.h>
9d5a7e661SArnaldo Carvalho de Melo 
10d5a7e661SArnaldo Carvalho de Melo static const char *socket_families[] = {
11d5a7e661SArnaldo Carvalho de Melo 	"UNSPEC", "LOCAL", "INET", "AX25", "IPX", "APPLETALK", "NETROM",
12d5a7e661SArnaldo Carvalho de Melo 	"BRIDGE", "ATMPVC", "X25", "INET6", "ROSE", "DECnet", "NETBEUI",
13d5a7e661SArnaldo Carvalho de Melo 	"SECURITY", "KEY", "NETLINK", "PACKET", "ASH", "ECONET", "ATMSVC",
14d5a7e661SArnaldo Carvalho de Melo 	"RDS", "SNA", "IRDA", "PPPOX", "WANPIPE", "LLC", "IB", "CAN", "TIPC",
15d5a7e661SArnaldo Carvalho de Melo 	"BLUETOOTH", "IUCV", "RXRPC", "ISDN", "PHONET", "IEEE802154", "CAIF",
16d5a7e661SArnaldo Carvalho de Melo 	"ALG", "NFC", "VSOCK",
17d5a7e661SArnaldo Carvalho de Melo };
18d5a7e661SArnaldo Carvalho de Melo DEFINE_STRARRAY(socket_families);
19d5a7e661SArnaldo Carvalho de Melo 
20d5a7e661SArnaldo Carvalho de Melo static size_t syscall_arg__scnprintf_augmented_sockaddr(struct syscall_arg *arg, char *bf, size_t size)
21d5a7e661SArnaldo Carvalho de Melo {
22d5a7e661SArnaldo Carvalho de Melo 	struct sockaddr_in *sin = (struct sockaddr_in *)arg->augmented.args;
23d5a7e661SArnaldo Carvalho de Melo 	char family[32];
24d5a7e661SArnaldo Carvalho de Melo 	size_t printed;
25d5a7e661SArnaldo Carvalho de Melo 
26d5a7e661SArnaldo Carvalho de Melo 	strarray__scnprintf(&strarray__socket_families, family, sizeof(family), "%d", sin->sin_family);
27d5a7e661SArnaldo Carvalho de Melo 	printed = scnprintf(bf, size, "{ .family: %s", family);
28d5a7e661SArnaldo Carvalho de Melo 
29d5a7e661SArnaldo Carvalho de Melo 	if (sin->sin_family == AF_INET) {
30d5a7e661SArnaldo Carvalho de Melo 		char tmp[512];
31d5a7e661SArnaldo Carvalho de Melo 		printed += scnprintf(bf + printed, size - printed, ", port: %d, addr: %s", ntohs(sin->sin_port),
32d5a7e661SArnaldo Carvalho de Melo 				     inet_ntop(sin->sin_family, &sin->sin_addr, tmp, sizeof(tmp)));
33d5a7e661SArnaldo Carvalho de Melo 	} else if (sin->sin_family == AF_INET6) {
34d5a7e661SArnaldo Carvalho de Melo 		struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sin;
35d5a7e661SArnaldo Carvalho de Melo 		u32 flowinfo = ntohl(sin6->sin6_flowinfo);
36d5a7e661SArnaldo Carvalho de Melo 		char tmp[512];
37d5a7e661SArnaldo Carvalho de Melo 
38d5a7e661SArnaldo Carvalho de Melo 		printed += scnprintf(bf + printed, size - printed, ", port: %d, addr: %s", ntohs(sin6->sin6_port),
39d5a7e661SArnaldo Carvalho de Melo 				     inet_ntop(sin6->sin6_family, &sin6->sin6_addr, tmp, sizeof(tmp)));
40d5a7e661SArnaldo Carvalho de Melo 		if (flowinfo != 0)
41d5a7e661SArnaldo Carvalho de Melo 			printed += scnprintf(bf + printed, size - printed, ", flowinfo: %lu", flowinfo);
42d5a7e661SArnaldo Carvalho de Melo 		if (sin6->sin6_scope_id != 0)
43d5a7e661SArnaldo Carvalho de Melo 			printed += scnprintf(bf + printed, size - printed, ", scope_id: %lu", sin6->sin6_scope_id);
44d5a7e661SArnaldo Carvalho de Melo 	} else if (sin->sin_family == AF_LOCAL) {
45d5a7e661SArnaldo Carvalho de Melo 		struct sockaddr_un *sun = (struct sockaddr_un *)sin;
46d5a7e661SArnaldo Carvalho de Melo 		printed += scnprintf(bf + printed, size - printed, ", path: %s", sun->sun_path);
47d5a7e661SArnaldo Carvalho de Melo 	}
48d5a7e661SArnaldo Carvalho de Melo 
49d5a7e661SArnaldo Carvalho de Melo 	return printed + scnprintf(bf + printed, size - printed, " }");
50d5a7e661SArnaldo Carvalho de Melo }
51d5a7e661SArnaldo Carvalho de Melo 
52d5a7e661SArnaldo Carvalho de Melo size_t syscall_arg__scnprintf_sockaddr(char *bf, size_t size, struct syscall_arg *arg)
53d5a7e661SArnaldo Carvalho de Melo {
54d5a7e661SArnaldo Carvalho de Melo 	if (arg->augmented.args)
55d5a7e661SArnaldo Carvalho de Melo 		return syscall_arg__scnprintf_augmented_sockaddr(arg, bf, size);
56d5a7e661SArnaldo Carvalho de Melo 
57d5a7e661SArnaldo Carvalho de Melo 	return scnprintf(bf, size, "%#x", arg->val);
58d5a7e661SArnaldo Carvalho de Melo }
59