Skip to content

Commit edaa0eb

Browse files
committed
Add linting rules to spot use of un-wrapped netlink functions.
Spot netlink functions that may return EINTR because network configuration changed during a state dump, and point at the nlutil wrappers. Signed-off-by: Rob Murray <[email protected]>
1 parent 00bf437 commit edaa0eb

2 files changed

Lines changed: 17 additions & 11 deletions

File tree

.golangci.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,12 @@ linters-settings:
3737
- pkg: ^sync/atomic$
3838
p: ^atomic\.(Add|CompareAndSwap|Load|Store|Swap).
3939
msg: Go 1.19 atomic types should be used instead.
40+
- pkg: github.com/vishvananda/netlink$
41+
p: ^netlink\.(Handle\.)?(AddrList|BridgeVlanList|ChainList|ClassList|ConntrackTableList|ConntrackDeleteFilter$|ConntrackDeleteFilters|DevLinkGetDeviceList|DevLinkGetAllPortList|DevlinkGetDeviceParams|FilterList|FouList|GenlFamilyList|GTPPDPList|LinkByName|LinkByAlias|LinkList|LinkSubscribeWithOptions|NeighList$|NeighProxyList|NeighListExecute|NeighSubscribeWithOptions|LinkGetProtinfo|QdiscList|RdmaLinkList|RdmaLinkByName|RdmaLinkDel|RouteList|RouteListFilteredIter|RuleListFiltered$|RouteSubscribeWithOptions|RuleList$|RuleListFiltered|SocketGet|SocketDiagTCPInfo|SocketDiagTCP|SocketDiagUDPInfo|SocketDiagUDP|UnixSocketDiagInfo|UnixSocketDiag|VDPAGetDevConfigList|VDPAGetDevList|VDPAGetMGMTDevList|XfrmPolicyList|XfrmStateList)
42+
msg: Use internal nlwrap package for EINTR handling.
43+
- pkg: github.com/docker/docker/internal/nlwrap$
44+
p: ^nlwrap.Handle.(BridgeVlanList|ChainList|ClassList|ConntrackDeleteFilter$|DevLinkGetDeviceList|DevLinkGetAllPortList|DevlinkGetDeviceParams|FilterList|FouList|GenlFamilyList|GTPPDPList|LinkByAlias|LinkSubscribeWithOptions|NeighList$|NeighProxyList|NeighListExecute|NeighSubscribeWithOptions|LinkGetProtinfo|QdiscList|RdmaLinkList|RdmaLinkByName|RdmaLinkDel|RouteListFilteredIter|RuleListFiltered$|RouteSubscribeWithOptions|RuleList$|RuleListFiltered|SocketGet|SocketDiagTCPInfo|SocketDiagTCP|SocketDiagUDPInfo|SocketDiagUDP|UnixSocketDiagInfo|UnixSocketDiag|VDPAGetDevConfigList|VDPAGetDevList|VDPAGetMGMTDevList)
45+
msg: Add a wrapper to nlwrap.Handle for EINTR handling and update the list in .golangci.yml.
4046
analyze-types: true
4147
importas:
4248
# Do not allow unaliased imports of aliased packages.

internal/nlwrap/nlwrap_linux.go

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ func retryOnIntr(f func() error) {
6666
// AddrList calls nlh.LinkList, retrying if necessary.
6767
func (nlh Handle) AddrList(link netlink.Link, family int) (addrs []netlink.Addr, err error) {
6868
retryOnIntr(func() error {
69-
addrs, err = nlh.Handle.AddrList(link, family)
69+
addrs, err = nlh.Handle.AddrList(link, family) //nolint:forbidigo
7070
return err
7171
})
7272
return addrs, err
@@ -75,7 +75,7 @@ func (nlh Handle) AddrList(link netlink.Link, family int) (addrs []netlink.Addr,
7575
// AddrList calls netlink.LinkList, retrying if necessary.
7676
func AddrList(link netlink.Link, family int) (addrs []netlink.Addr, err error) {
7777
retryOnIntr(func() error {
78-
addrs, err = netlink.AddrList(link, family)
78+
addrs, err = netlink.AddrList(link, family) //nolint:forbidigo
7979
return err
8080
})
8181
return addrs, err
@@ -88,7 +88,7 @@ func (nlh Handle) ConntrackDeleteFilters(
8888
filters ...netlink.CustomConntrackFilter,
8989
) (matched uint, err error) {
9090
retryOnIntr(func() error {
91-
matched, err = nlh.Handle.ConntrackDeleteFilters(table, family, filters...)
91+
matched, err = nlh.Handle.ConntrackDeleteFilters(table, family, filters...) //nolint:forbidigo
9292
return err
9393
})
9494
return matched, err
@@ -100,7 +100,7 @@ func ConntrackTableList(
100100
family netlink.InetFamily,
101101
) (flows []*netlink.ConntrackFlow, err error) {
102102
retryOnIntr(func() error {
103-
flows, err = netlink.ConntrackTableList(table, family)
103+
flows, err = netlink.ConntrackTableList(table, family) //nolint:forbidigo
104104
return err
105105
})
106106
return flows, err
@@ -111,7 +111,7 @@ func ConntrackTableList(
111111
// will do as a fallback and that dump may get inconsistent results.
112112
func (nlh Handle) LinkByName(name string) (link netlink.Link, err error) {
113113
retryOnIntr(func() error {
114-
link, err = nlh.Handle.LinkByName(name)
114+
link, err = nlh.Handle.LinkByName(name) //nolint:forbidigo
115115
return err
116116
})
117117
return link, err
@@ -122,7 +122,7 @@ func (nlh Handle) LinkByName(name string) (link netlink.Link, err error) {
122122
// kernel, it will do as a fallback and that dump may get inconsistent results.
123123
func LinkByName(name string) (link netlink.Link, err error) {
124124
retryOnIntr(func() error {
125-
link, err = netlink.LinkByName(name)
125+
link, err = netlink.LinkByName(name) //nolint:forbidigo
126126
return err
127127
})
128128
return link, err
@@ -131,7 +131,7 @@ func LinkByName(name string) (link netlink.Link, err error) {
131131
// LinkList calls nlh.LinkList, retrying if necessary.
132132
func (nlh Handle) LinkList() (links []netlink.Link, err error) {
133133
retryOnIntr(func() error {
134-
links, err = nlh.Handle.LinkList()
134+
links, err = nlh.Handle.LinkList() //nolint:forbidigo
135135
return err
136136
})
137137
return links, err
@@ -140,7 +140,7 @@ func (nlh Handle) LinkList() (links []netlink.Link, err error) {
140140
// LinkList calls netlink.LinkList, retrying if necessary.
141141
func LinkList() (links []netlink.Link, err error) {
142142
retryOnIntr(func() error {
143-
links, err = netlink.LinkList()
143+
links, err = netlink.LinkList() //nolint:forbidigo
144144
return err
145145
})
146146
return links, err
@@ -149,23 +149,23 @@ func LinkList() (links []netlink.Link, err error) {
149149
// RouteList calls nlh.RouteList, retrying if necessary.
150150
func (nlh Handle) RouteList(link netlink.Link, family int) (routes []netlink.Route, err error) {
151151
retryOnIntr(func() error {
152-
routes, err = nlh.Handle.RouteList(link, family)
152+
routes, err = nlh.Handle.RouteList(link, family) //nolint:forbidigo
153153
return err
154154
})
155155
return routes, err
156156
}
157157

158158
func (nlh Handle) XfrmPolicyList(family int) (policies []netlink.XfrmPolicy, err error) {
159159
retryOnIntr(func() error {
160-
policies, err = nlh.Handle.XfrmPolicyList(family)
160+
policies, err = nlh.Handle.XfrmPolicyList(family) //nolint:forbidigo
161161
return err
162162
})
163163
return policies, err
164164
}
165165

166166
func (nlh Handle) XfrmStateList(family int) (states []netlink.XfrmState, err error) {
167167
retryOnIntr(func() error {
168-
states, err = nlh.Handle.XfrmStateList(family)
168+
states, err = nlh.Handle.XfrmStateList(family) //nolint:forbidigo
169169
return err
170170
})
171171
return states, err

0 commit comments

Comments
 (0)