summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEugene Syromyatnikov <evgsyr@gmail.com>2022-07-28 18:15:21 +0200
committerEugene Syromyatnikov <evgsyr@gmail.com>2022-08-11 14:34:17 +0200
commitc6aa96b4ef83337df078667eef5af725501d1d94 (patch)
tree66f6de88b855545fc1cc49a13724f713ddef3719
parent1f8df42d24c9e2bbe1df8448e8eee852934a4c57 (diff)
downloadstrace-c6aa96b4ef83337df078667eef5af725501d1d94.tar.gz
net: implement SO_TXREHASH socket option support
* src/xlat/sock_options.in (SO_TXREHASH): New constant, introduced by Linux commit v5.18-rc1~136^2~484^2~3. * src/xlat/sockopt_txrehash_vals.in: New file. * src/net.c: Include "xlat/sockopt_txrehash_vals.h". (print_txrehash): New function. (print_getsockopt, print_setsockopt) <case SO_TXREHASH>: Call print_txrehash. * tests/sockopt-sol_socket.c: Add checks for SO_TXREHASH decoding. * NEWS: Mention it.
-rw-r--r--NEWS1
-rw-r--r--src/net.c29
-rwxr-xr-xsrc/xlat/sock_options.in8
-rw-r--r--src/xlat/sockopt_txrehash_vals.in3
-rw-r--r--tests/sockopt-sol_socket.c42
5 files changed, 70 insertions, 13 deletions
diff --git a/NEWS b/NEWS
index 5bd64ce02..5c3a5af0b 100644
--- a/NEWS
+++ b/NEWS
@@ -8,6 +8,7 @@ Noteworthy changes in release ?.?? (????-??-??)
* Improvements
* Implemented printing of Unix socket sun_path field's SELinux context.
+ * Implemented decoding of SO_TXREHASH socket option.
* Implemented decoding of IFLA_TSO_MAX_SIZE, IFLA_TSO_MAX_SEGS,
NDA_FDB_EXT_ATTRS, NDA_FLAGS_EXT, NDA_NDM_FLAGS_MASK,
and NDA_NDM_STATE_MASK netlink attributes.
diff --git a/src/net.c b/src/net.c
index 43db0d8c5..a6ff1d653 100644
--- a/src/net.c
+++ b/src/net.c
@@ -706,6 +706,29 @@ print_get_error(struct tcb *const tcp, const kernel_ulong_t addr,
tprint_indirect_end();
}
+#include "xlat/sockopt_txrehash_vals.h"
+
+static void
+print_txrehash(struct tcb *const tcp, const kernel_ulong_t addr, const int len)
+{
+ int val = 0;
+
+ if (len < (int) sizeof(val)) {
+ if (entering(tcp))
+ printaddr(addr);
+ else
+ printstrn(tcp, addr, len);
+ return;
+ }
+
+ if (umove_or_printaddr(tcp, addr, &val))
+ return;
+
+ tprint_indirect_begin();
+ printxval_d(sockopt_txrehash_vals, val, "SOCK_TXREHASH_???");
+ tprint_indirect_end();
+}
+
static void
print_tpacket_stats(struct tcb *const tcp, const kernel_ulong_t addr,
unsigned int len)
@@ -796,6 +819,9 @@ print_getsockopt(struct tcb *const tcp, const unsigned int level,
case SO_ERROR:
print_get_error(tcp, addr, rlen);
return;
+ case SO_TXREHASH:
+ print_txrehash(tcp, addr, rlen);
+ return;
/* All known int-like options */
case SO_DEBUG:
@@ -1062,6 +1088,9 @@ print_setsockopt(struct tcb *const tcp, const unsigned int level,
else
printaddr(addr);
return;
+ case SO_TXREHASH:
+ print_txrehash(tcp, addr, len);
+ return;
/* All known int-like options */
case SO_DEBUG:
diff --git a/src/xlat/sock_options.in b/src/xlat/sock_options.in
index 942cbc7db..839441912 100755
--- a/src/xlat/sock_options.in
+++ b/src/xlat/sock_options.in
@@ -553,6 +553,14 @@ SO_RESERVE_MEM 73
#endif
#if defined __sparc__
+SO_TXREHASH 83
+#elif defined __hppa__
+SO_TXREHASH 16456
+#else
+SO_TXREHASH 74
+#endif
+
+#if defined __sparc__
SO_RCVMARK 84
#elif defined __hppa__
SO_RCVMARK 16457
diff --git a/src/xlat/sockopt_txrehash_vals.in b/src/xlat/sockopt_txrehash_vals.in
new file mode 100644
index 000000000..15c9e59e0
--- /dev/null
+++ b/src/xlat/sockopt_txrehash_vals.in
@@ -0,0 +1,3 @@
+SOCK_TXREHASH_DISABLED 0
+SOCK_TXREHASH_ENABLED 1
+SOCK_TXREHASH_DEFAULT 255
diff --git a/tests/sockopt-sol_socket.c b/tests/sockopt-sol_socket.c
index d2c4254a5..7aa58cb15 100644
--- a/tests/sockopt-sol_socket.c
+++ b/tests/sockopt-sol_socket.c
@@ -47,6 +47,19 @@ set_sockopt(int fd, int name, void *val, socklen_t len)
return rc;
}
+static void
+print_optval(int val, const struct intstr *vecs, size_t vecs_sz)
+{
+ for (size_t k = 0; k < vecs_sz; k++) {
+ if (vecs[k].val == val) {
+ printf("[%s]", vecs[k].str);
+ return;
+ }
+ }
+
+ printf("[%d]", val);
+}
+
int
main(void)
{
@@ -56,6 +69,16 @@ main(void)
{ ARG_STR(1234567890) },
{ ARG_STR(-1234567890) },
};
+ static const struct intstr txrehash_vecs[] = {
+ { ARG_XLAT_KNOWN(0, "SOCK_TXREHASH_DISABLED") },
+ { ARG_XLAT_KNOWN(1, "SOCK_TXREHASH_ENABLED") },
+ { ARG_XLAT_UNKNOWN(2, "SOCK_TXREHASH_???") },
+ { ARG_XLAT_UNKNOWN(254, "SOCK_TXREHASH_???") },
+ { ARG_XLAT_KNOWN(255, "SOCK_TXREHASH_DEFAULT") },
+ { ARG_XLAT_UNKNOWN(256, "SOCK_TXREHASH_???") },
+ { ARG_XLAT_UNKNOWN(511, "SOCK_TXREHASH_???") },
+ { ARG_XLAT_UNKNOWN(-1, "SOCK_TXREHASH_???") },
+ };
static const struct {
int val;
const char *str;
@@ -133,6 +156,7 @@ main(void)
{ ARG_STR(SO_NETNS_COOKIE), /* TODO */ },
{ ARG_STR(SO_BUF_LOCK), /* TODO */ },
{ ARG_STR(SO_RESERVE_MEM), .optsz = sizeof(int) },
+ { ARG_STR(SO_TXREHASH), ARRSZ_PAIR(txrehash_vecs), sizeof(int) },
{ ARG_STR(SO_RCVMARK), .optsz = sizeof(int) },
{ 76, NULL },
{ -1, NULL },
@@ -176,10 +200,8 @@ main(void)
printf("g%s", pfx_str);
if (rc < 0)
printf("%p", val);
- else if (!rc)
- printf("[%d]", *val);
else
- printf("[%s]", vecs[j].str);
+ print_optval(*val, vecs, vecs_sz);
printf(", [%d]) = %s" INJSTR "\n", *len, errstr);
/* optlen larger than accessible memory */
@@ -188,10 +210,8 @@ main(void)
printf("g%s", pfx_str);
if (rc < 0 || (!names[i].optsz && *len > sizeof(*val)))
printf("%p", val);
- else if (rc > 0)
- printf("[%s]", vecs[j].str);
else
- printf("[%d]", *val);
+ print_optval(*val, vecs, vecs_sz);
printf(", [%d", (int) sizeof(*val) + 1);
if ((int) sizeof(*val) + 1 != *len)
printf(" => %d", *len);
@@ -205,14 +225,10 @@ main(void)
if (rc < 0) {
printf("%p", bigval);
} else {
- if (*len == sizeof(*val) || names[i].optsz) {
- if (rc)
- printf("[%s]", vecs[j].str);
- else
- printf("[%d]", *val);
- } else {
+ if (*len == sizeof(*val) || names[i].optsz)
+ print_optval(*val, vecs, vecs_sz);
+ else
print_quoted_memory(bigval, *len);
- }
}
printf(", [%d", (int) sizeof(*val) + 1);
if ((int) sizeof(*val) + 1 != *len)