aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGleb Smirnoff <glebius@FreeBSD.org>2024-01-11 04:51:53 +0000
committerGleb Smirnoff <glebius@FreeBSD.org>2024-01-11 04:51:53 +0000
commit26caf57e0b0c02771b58ed99bc37b4810249d58e (patch)
tree8e91dc93f4cc30584441f162418e50f7ccd79b58
parenteffa0f6c0aad54a07917af6986d71cd0a57223b8 (diff)
downloadsrc-26caf57e0b0c02771b58ed99bc37b4810249d58e.tar.gz
src-26caf57e0b0c02771b58ed99bc37b4810249d58e.zip
tests/netlink: improve recently added netlink_socket:membership
Change sequence of syscalls: instead of "add, delete, check, check" run sequence "add, check, delete, check". Seems to make more sense. Do minimal parsing of incoming messages: find the IPv4 address there and compare it to the original.
-rw-r--r--tests/sys/netlink/netlink_socket.c36
1 files changed, 31 insertions, 5 deletions
diff --git a/tests/sys/netlink/netlink_socket.c b/tests/sys/netlink/netlink_socket.c
index 3015a585199b..6dcc894b6695 100644
--- a/tests/sys/netlink/netlink_socket.c
+++ b/tests/sys/netlink/netlink_socket.c
@@ -256,6 +256,19 @@ ATF_TC_BODY(sizes, tc)
cmsg_check(&msg);
}
+static struct nlattr *
+nla_RTA_DST(struct nlattr *start, ssize_t len)
+{
+ struct nlattr *nla;
+
+ for (nla = start; (char *)nla < (char *)start + len;
+ nla = (struct nlattr *)((char *)nla + NLA_ALIGN(nla->nla_len))) {
+ if (nla->nla_type == RTA_DST)
+ return (nla);
+ }
+
+ return (NULL);
+}
/*
* Check that NETLINK_ADD_MEMBERSHIP subscribes us. Add & delete a temporary
* route and check if announcements came in.
@@ -270,7 +283,7 @@ ATF_TC_BODY(membership, tc)
struct in_addr dst;
struct nlattr rta_oif;
uint32_t oif;
- } msg = {
+ } reply, msg = {
.hdr.nlmsg_type = RTM_NEWROUTE,
.hdr.nlmsg_flags = NLM_F_REQUEST | NLM_F_CREATE | NLM_F_EXCL,
.hdr.nlmsg_len = sizeof(msg),
@@ -286,19 +299,32 @@ ATF_TC_BODY(membership, tc)
.rta_oif.nla_len = sizeof(uint32_t) + sizeof(struct nlattr),
.oif = 1,
};
+ struct nlattr *nla;
int fd;
ATF_REQUIRE((fd = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE)) != -1);
ATF_REQUIRE(setsockopt(fd, SOL_NETLINK, NETLINK_ADD_MEMBERSHIP,
&(int){RTNLGRP_IPV4_ROUTE}, sizeof(int)) == 0);
+
ATF_REQUIRE(send(fd, &msg, sizeof(msg), 0) == sizeof(msg));
+ ATF_REQUIRE(recv(fd, &reply, sizeof(reply), 0) == sizeof(reply));
+ ATF_REQUIRE(reply.hdr.nlmsg_type == msg.hdr.nlmsg_type);
+ ATF_REQUIRE(reply.rtm.rtm_type == msg.rtm.rtm_type);
+ ATF_REQUIRE(reply.rtm.rtm_dst_len == msg.rtm.rtm_dst_len);
+ ATF_REQUIRE(nla = nla_RTA_DST(&reply.rta_dst, sizeof(reply)));
+ ATF_REQUIRE(memcmp(&msg.dst, (char *)nla + sizeof(struct nlattr),
+ sizeof(struct in_addr)) == 0);
+
msg.hdr.nlmsg_type = RTM_DELROUTE;
msg.hdr.nlmsg_len -= sizeof(struct nlattr) + sizeof(uint32_t);
ATF_REQUIRE(send(fd, &msg, msg.hdr.nlmsg_len, 0) == msg.hdr.nlmsg_len);
- ATF_REQUIRE(recv(fd, &msg, sizeof(msg), 0) == sizeof(msg));
- ATF_REQUIRE(msg.hdr.nlmsg_type == RTM_NEWROUTE);
- ATF_REQUIRE(recv(fd, &msg, sizeof(msg), 0) == sizeof(msg));
- ATF_REQUIRE(msg.hdr.nlmsg_type == RTM_DELROUTE);
+ ATF_REQUIRE(recv(fd, &reply, sizeof(reply), 0) == sizeof(reply));
+ ATF_REQUIRE(reply.hdr.nlmsg_type == msg.hdr.nlmsg_type);
+ ATF_REQUIRE(reply.rtm.rtm_type == msg.rtm.rtm_type);
+ ATF_REQUIRE(reply.rtm.rtm_dst_len == msg.rtm.rtm_dst_len);
+ ATF_REQUIRE(nla = nla_RTA_DST(&reply.rta_dst, sizeof(reply)));
+ ATF_REQUIRE(memcmp(&msg.dst, (char *)nla + sizeof(struct nlattr),
+ sizeof(struct in_addr)) == 0);
}
ATF_TP_ADD_TCS(tp)