#include <sys/socket.h>
#include <linux/filter.h>
-#define PRINT_STMT_SYM(pfx, code, k) PRINT_STMT_SYM_(pfx, #code, #k)
-#define PRINT_STMT_SYM_(pfx, code, k) \
- printf("%sBPF_STMT(%s, %s)", pfx, code, k)
-#define PRINT_STMT_VAL(pfx, code, k) PRINT_STMT_VAL_(pfx, #code, k)
-#define PRINT_STMT_VAL_(pfx, code, k) \
- printf("%sBPF_STMT(%s, %#x)", pfx, code, k)
+#define HEX_FMT "%#x"
+
+#if XLAT_RAW
+# define XLAT_FMT HEX_FMT
+# define XLAT_ARGS(a_) (a_)
+#elif XLAT_VERBOSE
+# define XLAT_FMT HEX_FMT " /* %s */"
+# define XLAT_ARGS(a_) (a_), #a_
+#else
+# define XLAT_FMT "%s"
+# define XLAT_ARGS(a_) #a_
+#endif
+
+#define PRINT_STMT(pfx, code_fmt, k_fmt, ...) \
+ printf("%sBPF_STMT(" code_fmt ", " k_fmt ")", pfx, __VA_ARGS__)
-#define PRINT_JUMP(pfx, code, k, jt, jf) PRINT_JUMP_(pfx, #code, k, jt, jf)
-#define PRINT_JUMP_(pfx, code, k, jt, jf) \
- printf("%sBPF_JUMP(%s, %#x, %#x, %#x)", pfx, code, k, jt, jf)
+#define PRINT_JUMP(pfx, code_fmt, k, jt, jf, ...) \
+ printf("%sBPF_JUMP(" code_fmt ", %#x, %#x, %#x)", \
+ pfx, __VA_ARGS__, k, jt, jf)
static const struct sock_filter bpf_filter[] = {
BPF_STMT(BPF_LD|BPF_B|BPF_ABS, SKF_LL_OFF+4),
static void
print_filter(void)
{
- PRINT_STMT_SYM("[", BPF_LD|BPF_B|BPF_ABS, SKF_LL_OFF+4);
- PRINT_STMT_SYM(", ", BPF_LD|BPF_B|BPF_ABS, SKF_NET_OFF+8);
- PRINT_STMT_SYM(", ", BPF_LD|BPF_B|BPF_ABS, SKF_AD_OFF+SKF_AD_PROTOCOL);
- PRINT_JUMP(", ", BPF_JMP|BPF_K|BPF_JEQ, IPPROTO_UDP, 0, 5);
- PRINT_STMT_VAL(", ", BPF_LD|BPF_W|BPF_LEN, 0);
- PRINT_JUMP(", ", BPF_JMP|BPF_K|BPF_JGE, 100, 0, 3);
- PRINT_STMT_VAL(", ", BPF_LD|BPF_B|BPF_ABS, 42);
- PRINT_JUMP(", ", BPF_JMP|BPF_K|BPF_JEQ, 'a', 0, 1);
- PRINT_STMT_VAL(", ", BPF_RET|BPF_K, -1U);
- PRINT_STMT_VAL(", ", BPF_RET|BPF_K, 0);
+ PRINT_STMT("[", XLAT_FMT "|" XLAT_FMT "|" XLAT_FMT,
+ XLAT_FMT "+4",
+ XLAT_ARGS(BPF_LD), XLAT_ARGS(BPF_B), XLAT_ARGS(BPF_ABS),
+ XLAT_ARGS(SKF_LL_OFF));
+ PRINT_STMT(", ", XLAT_FMT "|" XLAT_FMT "|" XLAT_FMT,
+ XLAT_FMT "+8",
+ XLAT_ARGS(BPF_LD), XLAT_ARGS(BPF_B), XLAT_ARGS(BPF_ABS),
+ XLAT_ARGS(SKF_NET_OFF));
+ PRINT_STMT(", ", XLAT_FMT "|" XLAT_FMT "|" XLAT_FMT,
+ XLAT_FMT "+" XLAT_FMT,
+ XLAT_ARGS(BPF_LD), XLAT_ARGS(BPF_B), XLAT_ARGS(BPF_ABS),
+ XLAT_ARGS(SKF_AD_OFF), XLAT_ARGS(SKF_AD_PROTOCOL));
+ PRINT_JUMP(", ", XLAT_FMT "|" XLAT_FMT "|" XLAT_FMT,
+ IPPROTO_UDP, 0, 5,
+ XLAT_ARGS(BPF_JMP), XLAT_ARGS(BPF_K), XLAT_ARGS(BPF_JEQ));
+ PRINT_STMT(", ", XLAT_FMT "|" XLAT_FMT "|" XLAT_FMT,
+ HEX_FMT,
+ XLAT_ARGS(BPF_LD), XLAT_ARGS(BPF_W), XLAT_ARGS(BPF_LEN),
+ 0);
+ PRINT_JUMP(", ", XLAT_FMT "|" XLAT_FMT "|" XLAT_FMT,
+ 100, 0, 3,
+ XLAT_ARGS(BPF_JMP), XLAT_ARGS(BPF_K), XLAT_ARGS(BPF_JGE));
+ PRINT_STMT(", ", XLAT_FMT "|" XLAT_FMT "|" XLAT_FMT,
+ HEX_FMT,
+ XLAT_ARGS(BPF_LD), XLAT_ARGS(BPF_B), XLAT_ARGS(BPF_ABS),
+ 42);
+ PRINT_JUMP(", ", XLAT_FMT "|" XLAT_FMT "|" XLAT_FMT,
+ 'a', 0, 1,
+ XLAT_ARGS(BPF_JMP), XLAT_ARGS(BPF_K), XLAT_ARGS(BPF_JEQ));
+ PRINT_STMT(", ", XLAT_FMT "|" XLAT_FMT,
+ HEX_FMT,
+ XLAT_ARGS(BPF_RET), XLAT_ARGS(BPF_K),
+ -1U);
+ PRINT_STMT(", ", XLAT_FMT "|" XLAT_FMT,
+ HEX_FMT,
+ XLAT_ARGS(BPF_RET), XLAT_ARGS(BPF_K),
+ 0);
putchar(']');
}
rc = get_filter(fd, NULL, len);
if (rc)
perror_msg_and_skip("getsockopt SOL_SOCKET SO_ATTACH_FILTER");
- printf("getsockopt(%d, SOL_SOCKET, SO_ATTACH_FILTER"
- ", NULL, [%u->0]) = 0\n", fd, BPF_MAXINSNS);
+ printf("getsockopt(%d, " XLAT_FMT ", " XLAT_FMT ", NULL, [%u->0]) "
+ "= 0\n",
+ fd, XLAT_ARGS(SOL_SOCKET), XLAT_ARGS(SO_ATTACH_FILTER),
+ BPF_MAXINSNS);
/* getsockopt NULL optlen - EFAULT */
rc = get_filter(fd, NULL, NULL);
- printf("getsockopt(%d, SOL_SOCKET, SO_ATTACH_FILTER, NULL, NULL)"
- " = %s\n", fd, errstr);
+ printf("getsockopt(%d, " XLAT_FMT ", " XLAT_FMT ", NULL, NULL) "
+ "= %s\n",
+ fd, XLAT_ARGS(SOL_SOCKET), XLAT_ARGS(SO_ATTACH_FILTER), errstr);
/* attach a filter */
rc = set_filter(fd, prog, sizeof(*prog));
if (rc)
perror_msg_and_skip("setsockopt SOL_SOCKET SO_ATTACH_FILTER");
- printf("setsockopt(%d, SOL_SOCKET, SO_ATTACH_FILTER, {len=%u, filter=",
- fd, prog->len);
+ printf("setsockopt(%d, " XLAT_FMT ", " XLAT_FMT ", {len=%u, filter=",
+ fd, XLAT_ARGS(SOL_SOCKET), XLAT_ARGS(SO_ATTACH_FILTER),
+ prog->len);
print_filter();
printf("}, %u) = 0\n", (unsigned int) sizeof(*prog));
/* setsockopt optlen is too small - EINVAL */
rc = set_filter(fd, prog, sizeof(*prog) - 4);
- printf("setsockopt(%d, SOL_SOCKET, SO_ATTACH_FILTER, %p, %u) = %s\n",
- fd, prog, (unsigned int) sizeof(*prog) - 4, errstr);
+ printf("setsockopt(%d, " XLAT_FMT ", " XLAT_FMT ", %p, %u) = %s\n",
+ fd, XLAT_ARGS(SOL_SOCKET), XLAT_ARGS(SO_ATTACH_FILTER), prog,
+ (unsigned int) sizeof(*prog) - 4, errstr);
#ifdef SO_ATTACH_REUSEPORT_CBPF
rc = setsockopt(fd, SOL_SOCKET, SO_ATTACH_REUSEPORT_CBPF,
prog, sizeof(*prog));
errstr = sprintrc(rc);
- printf("setsockopt(%d, SOL_SOCKET, SO_ATTACH_REUSEPORT_CBPF"
- ", {len=%u, filter=", fd, prog->len);
+ printf("setsockopt(%d, " XLAT_FMT ", " XLAT_FMT ", {len=%u, filter=",
+ fd, XLAT_ARGS(SOL_SOCKET), XLAT_ARGS(SO_ATTACH_REUSEPORT_CBPF),
+ prog->len);
print_filter();
printf("}, %u) = %s\n", (unsigned int) sizeof(*prog), errstr);
#endif
/* query sock_filter program length -> ARRAY_SIZE(bpf_filter) */
*len = 0;
rc = get_filter(fd, efault, len);
- printf("getsockopt(%d, SOL_SOCKET, SO_ATTACH_FILTER, %p"
- ", [0->%u]) = %s\n",
- fd, efault, (unsigned int) ARRAY_SIZE(bpf_filter), errstr);
+ printf("getsockopt(%d, " XLAT_FMT ", " XLAT_FMT ", %p, [0->%u]) "
+ "= %s\n",
+ fd, XLAT_ARGS(SOL_SOCKET), XLAT_ARGS(SO_ATTACH_FILTER), efault,
+ (unsigned int) ARRAY_SIZE(bpf_filter), errstr);
/* getsockopt optlen is too small - EINVAL */
*len = ARRAY_SIZE(bpf_filter) - 1;
rc = get_filter(fd, efault, len);
- printf("getsockopt(%d, SOL_SOCKET, SO_ATTACH_FILTER, %p"
- ", [%u]) = %s\n",
- fd, efault, (unsigned int) ARRAY_SIZE(bpf_filter) - 1, errstr);
+ printf("getsockopt(%d, " XLAT_FMT ", " XLAT_FMT ", %p, [%u]) = %s\n",
+ fd, XLAT_ARGS(SOL_SOCKET), XLAT_ARGS(SO_ATTACH_FILTER), efault,
+ (unsigned int) ARRAY_SIZE(bpf_filter) - 1, errstr);
/* getsockopt optval EFAULT */
*len = ARRAY_SIZE(bpf_filter);
rc = get_filter(fd, filter + 1, len);
- printf("getsockopt(%d, SOL_SOCKET, SO_ATTACH_FILTER, %p"
- ", [%u]) = %s\n", fd, filter + 1,
- (unsigned int) ARRAY_SIZE(bpf_filter), errstr);
+ printf("getsockopt(%d, " XLAT_FMT ", " XLAT_FMT ", %p, [%u]) = %s\n",
+ fd, XLAT_ARGS(SOL_SOCKET), XLAT_ARGS(SO_ATTACH_FILTER),
+ filter + 1, (unsigned int) ARRAY_SIZE(bpf_filter), errstr);
/* getsockopt optlen is too large - truncated */
*len = ARRAY_SIZE(bpf_filter) + 1;
rc = get_filter(fd, filter, len);
- printf("getsockopt(%d, SOL_SOCKET, SO_ATTACH_FILTER, ", fd);
+ printf("getsockopt(%d, " XLAT_FMT ", " XLAT_FMT ", ",
+ fd, XLAT_ARGS(SOL_SOCKET), XLAT_ARGS(SO_ATTACH_FILTER));
print_filter();
printf(", [%u->%d]) = %s\n",
(unsigned int) ARRAY_SIZE(bpf_filter) + 1, *len, errstr);