From 512116383215c2f61172dd20e45871ff5d16c030 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Mon, 4 Sep 2023 17:00:31 +0900 Subject: [PATCH] icmp6-util: several cleanups for icmp6_receive() - Rename the argument for storing the sender address, - allow to call it with NULL for ret_xyz, - reduce needless copy of timestamp when the message does not have timestamp. --- src/libsystemd-network/fuzz-ndisc-rs.c | 13 +++++++++---- src/libsystemd-network/icmp6-util.c | 20 ++++++++++++++------ src/libsystemd-network/icmp6-util.h | 8 ++++++-- src/libsystemd-network/test-ndisc-ra.c | 13 +++++++++---- src/libsystemd-network/test-ndisc-rs.c | 13 +++++++++---- 5 files changed, 47 insertions(+), 20 deletions(-) diff --git a/src/libsystemd-network/fuzz-ndisc-rs.c b/src/libsystemd-network/fuzz-ndisc-rs.c index 7a5c45a2f9..5493538fec 100644 --- a/src/libsystemd-network/fuzz-ndisc-rs.c +++ b/src/libsystemd-network/fuzz-ndisc-rs.c @@ -24,12 +24,17 @@ int icmp6_bind_router_advertisement(int index) { return -ENOSYS; } -int icmp6_receive(int fd, void *iov_base, size_t iov_len, - struct in6_addr *dst, triple_timestamp *timestamp) { +int icmp6_receive( + int fd, + void *iov_base, + size_t iov_len, + struct in6_addr *ret_sender, + triple_timestamp *ret_timestamp) { + assert_se(read(fd, iov_base, iov_len) == (ssize_t) iov_len); - if (timestamp) - triple_timestamp_get(timestamp); + if (ret_timestamp) + triple_timestamp_get(ret_timestamp); return 0; } diff --git a/src/libsystemd-network/icmp6-util.c b/src/libsystemd-network/icmp6-util.c index ecddab61e4..46318505ba 100644 --- a/src/libsystemd-network/icmp6-util.c +++ b/src/libsystemd-network/icmp6-util.c @@ -144,8 +144,12 @@ int icmp6_send_router_solicitation(int s, const struct ether_addr *ether_addr) { return 0; } -int icmp6_receive(int fd, void *buffer, size_t size, struct in6_addr *ret_dst, - triple_timestamp *ret_timestamp) { +int icmp6_receive( + int fd, + void *buffer, + size_t size, + struct in6_addr *ret_sender, + triple_timestamp *ret_timestamp) { /* This needs to be initialized with zero. See #20741. */ CMSG_BUFFER_TYPE(CMSG_SPACE(sizeof(int)) + /* ttl */ @@ -206,10 +210,14 @@ int icmp6_receive(int fd, void *buffer, size_t size, struct in6_addr *ret_dst, } } - if (!triple_timestamp_is_set(&t)) - triple_timestamp_get(&t); + if (ret_timestamp) { + if (triple_timestamp_is_set(&t)) + *ret_timestamp = t; + else + triple_timestamp_get(ret_timestamp); + } - *ret_dst = addr; - *ret_timestamp = t; + if (ret_sender) + *ret_sender = addr; return 0; } diff --git a/src/libsystemd-network/icmp6-util.h b/src/libsystemd-network/icmp6-util.h index f7ad26b5e6..0a9ecb4c44 100644 --- a/src/libsystemd-network/icmp6-util.h +++ b/src/libsystemd-network/icmp6-util.h @@ -20,5 +20,9 @@ int icmp6_bind_router_solicitation(int ifindex); int icmp6_bind_router_advertisement(int ifindex); int icmp6_send_router_solicitation(int s, const struct ether_addr *ether_addr); -int icmp6_receive(int fd, void *buffer, size_t size, struct in6_addr *ret_dst, - triple_timestamp *ret_timestamp); +int icmp6_receive( + int fd, + void *buffer, + size_t size, + struct in6_addr *ret_sender, + triple_timestamp *ret_timestamp); diff --git a/src/libsystemd-network/test-ndisc-ra.c b/src/libsystemd-network/test-ndisc-ra.c index bd8c0fd426..d3d96e776c 100644 --- a/src/libsystemd-network/test-ndisc-ra.c +++ b/src/libsystemd-network/test-ndisc-ra.c @@ -223,12 +223,17 @@ int icmp6_send_router_solicitation(int s, const struct ether_addr *ether_addr) { return 0; } -int icmp6_receive(int fd, void *iov_base, size_t iov_len, - struct in6_addr *dst, triple_timestamp *timestamp) { +int icmp6_receive( + int fd, + void *iov_base, + size_t iov_len, + struct in6_addr *ret_sender, + triple_timestamp *ret_timestamp) { + assert_se(read (fd, iov_base, iov_len) == (ssize_t)iov_len); - if (timestamp) - triple_timestamp_get(timestamp); + if (ret_timestamp) + triple_timestamp_get(ret_timestamp); return 0; } diff --git a/src/libsystemd-network/test-ndisc-rs.c b/src/libsystemd-network/test-ndisc-rs.c index e501b64377..e7bf3fab58 100644 --- a/src/libsystemd-network/test-ndisc-rs.c +++ b/src/libsystemd-network/test-ndisc-rs.c @@ -176,12 +176,17 @@ int icmp6_bind_router_advertisement(int ifindex) { return -ENOSYS; } -int icmp6_receive(int fd, void *iov_base, size_t iov_len, - struct in6_addr *dst, triple_timestamp *timestamp) { +int icmp6_receive( + int fd, + void *iov_base, + size_t iov_len, + struct in6_addr *ret_sender, + triple_timestamp *ret_timestamp) { + assert_se(read (fd, iov_base, iov_len) == (ssize_t)iov_len); - if (timestamp) - triple_timestamp_get(timestamp); + if (ret_timestamp) + triple_timestamp_get(ret_timestamp); return 0; } -- 2.25.1