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 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
|
# netlink [](https://github.com/mdlayher/netlink/actions) [](https://pkg.go.dev/github.com/mdlayher/netlink) [](https://goreportcard.com/report/github.com/mdlayher/netlink)
Package `netlink` provides low-level access to Linux netlink sockets
(`AF_NETLINK`). MIT Licensed.
For more information about how netlink works, check out my blog series
on [Linux, Netlink, and Go](https://mdlayher.com/blog/linux-netlink-and-go-part-1-netlink/).
If you have any questions or you'd like some guidance, please join us on
[Gophers Slack](https://invite.slack.golangbridge.org) in the `#networking`
channel!
## Stability
See the [CHANGELOG](./CHANGELOG.md) file for a description of changes between
releases.
This package has a stable v1 API and any future breaking changes will prompt
the release of a new major version. Features and bug fixes will continue to
occur in the v1.x.x series.
This package only supports the two most recent major versions of Go, mirroring
Go's own release policy. Older versions of Go may lack critical features and bug
fixes which are necessary for this package to function correctly.
## Design
A number of netlink packages are already available for Go, but I wasn't able to
find one that aligned with what I wanted in a netlink package:
- Straightforward, idiomatic API
- Well tested
- Well documented
- Doesn't use package/global variables or state
- Doesn't necessarily need root to work
My goal for this package is to use it as a building block for the creation
of other netlink family packages.
## Ecosystem
Over time, an ecosystem of Go packages has developed around package `netlink`.
Many of these packages provide building blocks for further interactions with
various netlink families, such as `NETLINK_GENERIC` or `NETLINK_ROUTE`.
To have your package included in this diagram, please send a pull request!
```mermaid
flowchart LR
netlink["github.com/mdlayher/netlink"]
click netlink "https://github.com/mdlayher/netlink"
subgraph "NETLINK_CONNECTOR"
direction LR
garlic["github.com/fearful-symmetry/garlic"]
click garlic "https://github.com/fearful-symmetry/garlic"
end
subgraph "NETLINK_CRYPTO"
direction LR
cryptonl["github.com/mdlayher/cryptonl"]
click cryptonl "https://github.com/mdlayher/cryptonl"
end
subgraph "NETLINK_GENERIC"
direction LR
genetlink["github.com/mdlayher/genetlink"]
click genetlink "https://github.com/mdlayher/genetlink"
devlink["github.com/mdlayher/devlink"]
click devlink "https://github.com/mdlayher/devlink"
ethtool["github.com/mdlayher/ethtool"]
click ethtool "https://github.com/mdlayher/ethtool"
go-openvswitch["github.com/digitalocean/go-openvswitch"]
click go-openvswitch "https://github.com/digitalocean/go-openvswitch"
ipvs["github.com/cloudflare/ipvs"]
click ipvs "https://github.com/cloudflare/ipvs"
l2tp["github.com/axatrax/l2tp"]
click l2tp "https://github.com/axatrax/l2tp"
nbd["github.com/Merovius/nbd"]
click nbd "https://github.com/Merovius/nbd"
quota["github.com/mdlayher/quota"]
click quota "https://github.com/mdlayher/quota"
router7["github.com/rtr7/router7"]
click router7 "https://github.com/rtr7/router7"
taskstats["github.com/mdlayher/taskstats"]
click taskstats "https://github.com/mdlayher/taskstats"
u-bmc["github.com/u-root/u-bmc"]
click u-bmc "https://github.com/u-root/u-bmc"
wgctrl["golang.zx2c4.com/wireguard/wgctrl"]
click wgctrl "https://golang.zx2c4.com/wireguard/wgctrl"
wifi["github.com/mdlayher/wifi"]
click wifi "https://github.com/mdlayher/wifi"
devlink & ethtool & go-openvswitch & ipvs --> genetlink
l2tp & nbd & quota & router7 & taskstats --> genetlink
u-bmc & wgctrl & wifi --> genetlink
end
subgraph "NETLINK_KOBJECT_UEVENT"
direction LR
kobject["github.com/mdlayher/kobject"]
click kobject "https://github.com/mdlayher/kobject"
end
subgraph "NETLINK_NETFILTER"
direction LR
go-conntrack["github.com/florianl/go-conntrack"]
click go-conntrack "https://github.com/florianl/go-conntrack"
go-nflog["github.com/florianl/go-nflog"]
click go-nflog "https://github.com/florianl/go-nflog"
go-nfqueue["github.com/florianl/go-nfqueue"]
click go-nfqueue "https://github.com/florianl/go-nfqueue"
netfilter["github.com/ti-mo/netfilter"]
click netfilter "https://github.com/ti-mo/netfilter"
nftables["github.com/google/nftables"]
click nftables "https://github.com/google/nftables"
conntrack["github.com/ti-mo/conntrack"]
click conntrack "https://github.com/ti-mo/conntrack"
conntrack --> netfilter
end
subgraph "NETLINK_ROUTE"
direction LR
go-tc["github.com/florianl/go-tc"]
click go-tc "https://github.com/florianl/go-tc"
qdisc["github.com/ema/qdisc"]
click qdisc "https://github.com/ema/qdisc"
rtnetlink["github.com/jsimonetti/rtnetlink"]
click rtnetlink "https://github.com/jsimonetti/rtnetlink"
rtnl["gitlab.com/mergetb/tech/rtnl"]
click rtnl "https://gitlab.com/mergetb/tech/rtnl"
end
subgraph "NETLINK_W1"
direction LR
go-onewire["github.com/SpComb/go-onewire"]
click go-onewire "https://github.com/SpComb/go-onewire"
end
NETLINK_CONNECTOR --> netlink
NETLINK_CRYPTO --> netlink
NETLINK_GENERIC --> netlink
NETLINK_KOBJECT_UEVENT --> netlink
NETLINK_NETFILTER --> netlink
NETLINK_ROUTE --> netlink
NETLINK_W1 --> netlink
```
|