# Rust crate for Netlink Route Protocol
The `netlink-packet-route` crate is designed to abstract Netlink route
protocol([`rtnetlink`][rtnetlink_man]) packet into Rust data types. The goal of
this crate is saving netlink user from reading Kernel Netlink codes.
This crate grouped Netlink route protocol into these modules:
* `link`: NIC interface, similar to to `ip link` command.
* `address`: IP address, similar to `ip address` command.
* `route`: Route, similar to `ip route` command.
* `rule`: Route rule, similar to `ip rule` command.
* `tc`: Traffic control, similar to `tc` command.
* `neighbour`: Neighbour, similar to `ip neighbour` command.
* `neighbour_table`: Neighbour table, similar to `ip ntable` command.
* `nsid`: Namespace, similar to `ip netns` command.
Normally, you should use [`rtnetlink`][rtnetlink_url] instead of using this
crate directly.
## Development
* Please use `git commit --signoff` to append Signed-off-by trailer to commit
message.
* For new source file, please append `// SPDX-License-Identifier: MIT` at
the beginning with content of license new code to MIT license.
* No panic is allowed, please use `Result<>` instead of `unwrap()` or
`expect()`.
* Please run `cargo fmt` and `cargo clippy` before creating pull request.
* All struct/enum should be decorated by
[`#[non_exhaustive]`][non_exhaustive_doc] to preserve
API backwards compatibility unless explicit approval from maintainer.
* Unknown netlink attribute should be stored into `Other(DefaultNla)` instead
of breaking decoding.
* Please use unit test case to cover the serialize and deserialize of the
changed netlink attribute. To capture the netlink raw bytes, you may use
tcpdump/wireshark again the `nlmon` interface. For example:
```bash
modprobe nlmon
ip link add nl0 type nlmon
ip link set nl0 up
tcpdump -i nl0 -w netlink_capture_file.cap
# Then use wireshark to open this `netlink_capture_file.cap`
# Find out the packet you are interested,
# right click -> "Copy" -> "...as Hex Dump".
# You may use https://github.com/cathay4t/hex_to_rust to convert this
# hexdump to rust u8 array
```
* The integration test(play with linux kernel netlink interface) should be
placed into `rtnetlink` crate. Current(netlink-packet-route) crate should
only unit test case only.
* For certain netlink message which cannot captured by nlmon, please use
Rust Debug and explain every bits in comment.
* Optionally, please run `tools/test_cross_build.sh` to make sure your
code is compilable on other platforms.
[rtnetlink_man]: https://www.man7.org/linux/man-pages/man7/rtnetlink.7.html
[rtnetlink_url]: https://docs.rs/rtnetlink
[non_exhaustive_doc]: https://doc.rust-lang.org/stable/reference/attributes/type_system.html#the-non_exhaustive-attribute