1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
//! Generic Netlink (GENL) support.
//!
//! This module provides infrastructure for working with Generic Netlink families,
//! which are used by kernel subsystems like WireGuard and MACsec for configuration.
//!
//! Generic Netlink extends the standard netlink protocol with:
//! - Dynamic family ID allocation (resolved via control family)
//! - Family-specific commands and attributes
//! - Multicast group support per family
//!
//! # Architecture
//!
//! ```text
//! ┌─────────────────────────────────────────┐
//! │ WireguardConnection / MacsecConnection │
//! │ (Family-specific high-level API) │
//! └────────────────┬────────────────────────┘
//! │
//! ┌────────────────▼────────────────────────┐
//! │ Connection<Generic> │
//! │ (Generic GENL operations, family cache) │
//! └────────────────┬────────────────────────┘
//! │
//! ┌────────────────▼────────────────────────┐
//! │ NetlinkSocket (Protocol::Generic) │
//! └─────────────────────────────────────────┘
//! ```
//!
//! # Example
//!
//! ```rust,no_run
//! use nlink::netlink::{Connection, Generic};
//!
//! # async fn example() -> nlink::Result<()> {
//! let conn = Connection::<Generic>::new()?;
//!
//! // Resolve a family ID
//! let family = conn.get_family("wireguard").await?;
//! println!("WireGuard family ID: {}", family.id);
//! # Ok(())
//! # }
//! ```
pub use FamilyInfo;
pub use ;
// Control family constants (fixed, not dynamically assigned)
pub const GENL_ID_CTRL: u16 = 0x10;
/// Control family commands
/// Control family attributes
/// Control family multicast group attributes