diff options
author | Eugene Syromyatnikov <evgsyr@gmail.com> | 2022-07-28 18:15:21 +0200 |
---|---|---|
committer | Eugene Syromyatnikov <evgsyr@gmail.com> | 2022-08-11 14:34:17 +0200 |
commit | c6aa96b4ef83337df078667eef5af725501d1d94 (patch) | |
tree | 66f6de88b855545fc1cc49a13724f713ddef3719 | |
parent | 1f8df42d24c9e2bbe1df8448e8eee852934a4c57 (diff) | |
download | strace-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-- | NEWS | 1 | ||||
-rw-r--r-- | src/net.c | 29 | ||||
-rwxr-xr-x | src/xlat/sock_options.in | 8 | ||||
-rw-r--r-- | src/xlat/sockopt_txrehash_vals.in | 3 | ||||
-rw-r--r-- | tests/sockopt-sol_socket.c | 42 |
5 files changed, 70 insertions, 13 deletions
@@ -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. @@ -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) |