freebsd(13.2): add netlink/netlink.h support - #5326
Conversation
This comment has been minimized.
This comment has been minimized.
653f197 to
0b6bb29
Compare
This comment has been minimized.
This comment has been minimized.
|
The API looks fine from a quick skim, but since there is no hurry, I think it may be worth trying to add support to ctest first so the tricky test setup isn't needed. (It's useful otherwise too.) Sketched some of that up at #5344 |
|
Noted. Since you already pinged some contributor on that issue, I'll wait and |
|
Could you try adding a separate |
|
Either author or blocked, depending on whether that works. @rustbot author |
|
Reminder, once the PR becomes ready for a review, use |
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
a6a6a8d to
266acdf
Compare
This comment has been minimized.
This comment has been minimized.
| !matches!( | ||
| c.ident(), | ||
| "CTRL_CMD_UNSPEC" | ||
| | "CTRL_CMD_NEWFAMILY" | ||
| | "CTRL_CMD_DELFAMILY" | ||
| | "CTRL_CMD_GETFAMILY" | ||
| | "CTRL_CMD_NEWOPS" | ||
| | "CTRL_CMD_DELOPS" | ||
| | "CTRL_CMD_GETOPS" | ||
| | "CTRL_CMD_NEWMCAST_GRP" |
There was a problem hiding this comment.
These could be put into functions like is_netlink_const(c: &Const) -> bool so the list can be shared the two places it's needed.
| let freebsd14 = matches!(freebsd_ver, Some(n) if n >= 14); | ||
| let freebsd15 = matches!(freebsd_ver, Some(n) if n >= 15); | ||
|
|
||
| if let Some(net_header) = net_header { |
There was a problem hiding this comment.
I think you can drop the net_header arg, one invocation of test_freebsd can create all 2-3 ctest objects. I assume you're doing this to share the setup above, so I applied 023c0a3 to make that cfg a bit easier to share.
There was a problem hiding this comment.
Done. I didn't actually mean that. That was just cruft from prior attempts with
a different approach.
| @@ -0,0 +1,6 @@ | |||
| //! Directory: `netlink/` | |||
| //! | |||
| //! <https://github.com/freebsd/freebsd-src/tree/df9d6403caa6426e92f5e100602f4d2be474bbae/sys/netlink> | |||
There was a problem hiding this comment.
Fyi, no need to permalink these kind of files since we do want to see updates, and the file locations are usually stable enough. As long as there's a permalink in the commit message to show us what it actually looked like at that point in time.
There was a problem hiding this comment.
You mean the files for the upstream directories only, or also the files
referring to the upstream header files?
|
It seems having separate invocations gets the job done just fine. Still, that Those seem to me like they're going to need extending (though it's notably less |
This comment has been minimized.
This comment has been minimized.
|
I haven't tried this but do things just work™️ if the semver tests have lines like |
7f883df to
1306298
Compare
This comment has been minimized.
This comment has been minimized.
net/netlink.h supportnetlink/netlink.h support
4608465 to
b0e2869
Compare
This comment has been minimized.
This comment has been minimized.
@tgross35 They do. Just cleaned up commit history as all tests seem to pass now. |
2b52cf7 to
30133e0
Compare
| pub(crate) use freebsd::*; | ||
| // FIXME(1.0,remove): glob reexport should be the default. | ||
| pub use freebsd::netlink; | ||
| pub(crate) use freebsd::{ | ||
| net, | ||
| netinet6, | ||
| sys, | ||
| unistd, | ||
| }; |
There was a problem hiding this comment.
| pub const CTRL_CMD_UNSPEC: c_int = 0; | ||
| pub const CTRL_CMD_NEWFAMILY: c_int = 1; | ||
| pub const CTRL_CMD_DELFAMILY: c_int = 2; | ||
| pub const CTRL_CMD_GETFAMILY: c_int = 3; | ||
| pub const CTRL_CMD_NEWOPS: c_int = 4; | ||
| pub const CTRL_CMD_DELOPS: c_int = 5; | ||
| pub const CTRL_CMD_GETOPS: c_int = 6; | ||
| pub const CTRL_CMD_NEWMCAST_GRP: c_int = 7; | ||
| pub const CTRL_CMD_DELMCAST_GRP: c_int = 8; | ||
| pub const CTRL_CMD_GETMCAST_GRP: c_int = 9; | ||
| pub const CTRL_CMD_GETPOLICY: c_int = 10; | ||
|
|
||
| pub const CTRL_ATTR_UNSPEC: c_int = 0; | ||
| pub const CTRL_ATTR_FAMILY_ID: c_int = 1; | ||
| pub const CTRL_ATTR_FAMILY_NAME: c_int = 2; | ||
| pub const CTRL_ATTR_VERSION: c_int = 3; | ||
| pub const CTRL_ATTR_HDRSIZE: c_int = 4; | ||
| pub const CTRL_ATTR_MAXATTR: c_int = 5; | ||
| pub const CTRL_ATTR_OPS: c_int = 6; | ||
| pub const CTRL_ATTR_MCAST_GROUPS: c_int = 7; | ||
| pub const CTRL_ATTR_POLICY: c_int = 8; | ||
| pub const CTRL_ATTR_OP_POLICY: c_int = 9; | ||
| pub const CTRL_ATTR_OP: c_int = 10; | ||
|
|
||
| pub const CTRL_ATTR_MCAST_GRP_UNSPEC: c_int = 0; | ||
| pub const CTRL_ATTR_MCAST_GRP_NAME: c_int = 1; | ||
| pub const CTRL_ATTR_MCAST_GRP_ID: c_int = 2; |
There was a problem hiding this comment.
I think these aren't in the semver file
| netlink::netlink::NETLINK_ADD_MEMBERSHIP | ||
| netlink::netlink::NETLINK_AUDIT | ||
| netlink::netlink::NETLINK_BROADCAST_ERROR | ||
| netlink::netlink::NETLINK_CAP_ACK | ||
| netlink::netlink::NETLINK_CONNECTOR | ||
| netlink::netlink::NETLINK_DNRTMSG | ||
| netlink::netlink::NETLINK_DROP_MEMBERSHIP | ||
| netlink::netlink::NETLINK_EXT_ACK | ||
| netlink::netlink::NETLINK_FIB_LOOKUP | ||
| netlink::netlink::NETLINK_FIREWALL | ||
| netlink::netlink::NETLINK_GENERIC | ||
| netlink::netlink::NETLINK_GET_STRICT_CHK | ||
| netlink::netlink::NETLINK_IP6_FW | ||
| netlink::netlink::NETLINK_ISCSI | ||
| netlink::netlink::NETLINK_KOBJECT_UEVENT | ||
| netlink::netlink::NETLINK_LISTEN_ALL_NSID | ||
| netlink::netlink::NETLINK_LIST_MEMBERSHIPS | ||
| netlink::netlink::NETLINK_NETFILTER | ||
| netlink::netlink::NETLINK_NFLOG | ||
| netlink::netlink::NETLINK_NO_ENOBUFS | ||
| netlink::netlink::NETLINK_PKTINFO | ||
| netlink::netlink::NETLINK_ROUTE | ||
| netlink::netlink::NETLINK_RX_RING | ||
| netlink::netlink::NETLINK_SELINUX | ||
| netlink::netlink::NETLINK_SOCK_DIAG | ||
| netlink::netlink::NETLINK_TX_RING | ||
| netlink::netlink::NETLINK_UNUSED | ||
| netlink::netlink::NETLINK_USERSOCK | ||
| netlink::netlink::NETLINK_XFRM | ||
| netlink::netlink::NLMSG_ALIGNTO | ||
| netlink::netlink::NLMSG_DONE | ||
| netlink::netlink::NLMSG_ERROR | ||
| netlink::netlink::NLMSG_NOOP | ||
| netlink::netlink::NLMSG_OVERRUN | ||
| netlink::netlink::NLM_F_ACK | ||
| netlink::netlink::NLM_F_ACK_TLVS | ||
| netlink::netlink::NLM_F_APPEND | ||
| netlink::netlink::NLM_F_ATOMIC | ||
| netlink::netlink::NLM_F_CAPPED | ||
| netlink::netlink::NLM_F_CREATE | ||
| netlink::netlink::NLM_F_DUMP | ||
| netlink::netlink::NLM_F_DUMP_FILTERED | ||
| netlink::netlink::NLM_F_DUMP_INTR | ||
| netlink::netlink::NLM_F_ECHO | ||
| netlink::netlink::NLM_F_EXCL | ||
| netlink::netlink::NLM_F_MATCH | ||
| netlink::netlink::NLM_F_MULTI | ||
| netlink::netlink::NLM_F_NONREC | ||
| netlink::netlink::NLM_F_REPLACE | ||
| netlink::netlink::NLM_F_REQUEST | ||
| netlink::netlink::NLM_F_ROOT | ||
| netlink::netlink::NL_ITEM_ALIGN_SIZE | ||
| netlink::netlink::SOL_NETLINK |
There was a problem hiding this comment.
It would be better if we can keep all this directly within a netlink module. In the exports, perhaps an in-file mod netlink { pub use ... }
| let mut netlink_cfg = cfg.clone(); | ||
| headers!(netlink_cfg, "netlink/netlink.h",); | ||
| netlink_cfg | ||
| .skip_struct(|ty| !matches!(ty.ident(), "sockaddr_nl")) | ||
| .skip_const(|c| !is_netlink_const(c)) | ||
| .skip_union(|_| true) | ||
| .skip_alias(|_| true) | ||
| .skip_static(|_| true) | ||
| .skip_fn(|_| true) | ||
| .skip_c_enum(|_| true); | ||
| ctest::generate_test(&mut netlink_cfg, "../src/lib.rs", "netlink_ctest_output.rs").unwrap(); | ||
|
|
||
| // We must restore the above sure-skips because `TestGenerator` shares skips | ||
| // between cloned instances (here `cfg` and `netlink_cfg`.) | ||
| cfg.skip_struct(|_| false) | ||
| .skip_const(|_| false) | ||
| .skip_union(|_| false) | ||
| .skip_alias(|_| false) | ||
| .skip_static(|_| false) | ||
| .skip_fn(|_| false) | ||
| .skip_c_enum(|_| false); |
There was a problem hiding this comment.
Sharing skips isn't intentional, why does this happen?
| // This is tested in a separate ctest invocation because some symbols | ||
| // `netlink/netlink.h` conflict with some other symbols from `net/if_mib.h`. | ||
| "sockaddr_nl" => true, |
There was a problem hiding this comment.
Is this one needed still? I think we should be checking a sockaddr_nl in each ctest invocation
30133e0 to
f9649f6
Compare
|
This PR was rebased onto a different main commit. Here's a range-diff highlighting what actually changed. Rebasing is a normal part of keeping PRs up to date, so no action is needed—this note is just to help reviewers. |
This is an early subset of the Netlink interface, but it proves sufficient for monitoring changes in IP addresses. Coverage can be extended later as needed. See [^1] and [^2]. [^1]: <https://github.com/freebsd/freebsd-src/blob/df9d6403caa6426e92f5e100602f4d2be474bbae/sys/netlink/netlink.h> [^2]: <https://github.com/freebsd/freebsd-src/blob/df9d6403caa6426e92f5e100602f4d2be474bbae/sys/netlink/netlink_generic.h> A small workaround has been necessary in the SemVer tests to ensure we get the right paths to the public submodules for the `netlink/netlink.h` interfaces. Those symbols now are also prepended a `netlink::netlink`. Signed-off-by: Yann Dirson <yann.dirson@vates.fr> Co-authored-by: Yann Dirson <yann.dirson@vates.fr>
Add specific test for `netlink/netlink.h` bindings. This is necessary to avoid conflicts with the bindings for `net/if_mib.h`. libc-test now builds two different `TestGenerator` instances. One of the instances builds tests for the same set of bindings as before this patchset, while the other builds tests only for the `netlink/netlink.h` bindings.
f9649f6 to
1654258
Compare
Description
This PR updates #3201 with merge conflicts resolved and follows the new plan at
1.
The patch adds support for
netlink.hinterfaces in OpenBSD, where there's anitem resolution conflict if we expose the Rust bindings alongside those of
if_mib.h. This set of APIs is "scoped" in C because they live on separateheaders. In rust-lang/libc, we reexport all items at the root crate level, which
makes item resolution fail.
Note this depends on #5325. It won't pass tests but it will build. This is
because the test templates will gather all items in a single file, so item
resolution fails. We can't really skip these items altogether from the tests, so
it may just be necessary to extend
ctestto allow skipping module-specificRust items.
Checklist
libc-test/semverhave been updated*LASTor*MAXhave the standarddoc comment
cargo test -p libc-test --target mytarget); especiallyrelevant for platforms that may not be checked in CI
@rustbot label +stable-nominated
Footnotes
https://github.com/rust-lang/libc/pull/3201#issuecomment-4736374182 ↩