mirror of
https://github.com/vishvananda/netlink.git
synced 2025-09-26 20:01:13 +08:00
feat: add support for RtoMin lock
This commit is contained in:

committed by
Alessandro Boch

parent
6b5dd30007
commit
9d88d8385b
1
route.go
1
route.go
@@ -82,6 +82,7 @@ type Route struct {
|
||||
InitCwnd int
|
||||
Features int
|
||||
RtoMin int
|
||||
RtoMinLock bool
|
||||
InitRwnd int
|
||||
QuickACK int
|
||||
Congctl string
|
||||
|
@@ -1138,6 +1138,10 @@ func (h *Handle) prepareRouteReq(route *Route, req *nl.NetlinkRequest, msg *nl.R
|
||||
if route.RtoMin > 0 {
|
||||
b := nl.Uint32Attr(uint32(route.RtoMin))
|
||||
metrics = append(metrics, nl.NewRtAttr(unix.RTAX_RTO_MIN, b))
|
||||
if route.RtoMinLock {
|
||||
b := nl.Uint32Attr(uint32(1 << unix.RTAX_RTO_MIN))
|
||||
metrics = append(metrics, nl.NewRtAttr(unix.RTAX_LOCK, b))
|
||||
}
|
||||
}
|
||||
if route.InitRwnd > 0 {
|
||||
b := nl.Uint32Attr(uint32(route.InitRwnd))
|
||||
@@ -1464,6 +1468,7 @@ func deserializeRoute(m []byte) (Route, error) {
|
||||
route.MTU = int(native.Uint32(metric.Value[0:4]))
|
||||
case unix.RTAX_LOCK:
|
||||
route.MTULock = native.Uint32(metric.Value[0:4]) == uint32(1<<unix.RTAX_MTU)
|
||||
route.RtoMinLock = native.Uint32(metric.Value[0:4]) == uint32(1<<unix.RTAX_RTO_MIN)
|
||||
case unix.RTAX_WINDOW:
|
||||
route.Window = int(native.Uint32(metric.Value[0:4]))
|
||||
case unix.RTAX_RTT:
|
||||
|
@@ -2336,6 +2336,64 @@ func TestMTULockRouteAddDel(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestRtoMinLockRouteAddDel(t *testing.T) {
|
||||
_, err := RouteList(nil, FAMILY_V4)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
tearDown := setUpNetlinkTest(t)
|
||||
defer tearDown()
|
||||
|
||||
// get loopback interface
|
||||
link, err := LinkByName("lo")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// bring the interface up
|
||||
if err := LinkSetUp(link); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// add a gateway route
|
||||
dst := &net.IPNet{
|
||||
IP: net.IPv4(192, 168, 0, 0),
|
||||
Mask: net.CIDRMask(24, 32),
|
||||
}
|
||||
|
||||
route := Route{LinkIndex: link.Attrs().Index, Dst: dst, RtoMin: 40, RtoMinLock: true}
|
||||
if err := RouteAdd(&route); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
routes, err := RouteList(link, FAMILY_V4)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if len(routes) != 1 {
|
||||
t.Fatal("Route not added properly")
|
||||
}
|
||||
|
||||
if route.RtoMin != routes[0].RtoMin {
|
||||
t.Fatal("Route RtoMin not set properly")
|
||||
}
|
||||
|
||||
if route.RtoMinLock != routes[0].RtoMinLock {
|
||||
t.Fatal("Route RtoMin lock not set properly")
|
||||
}
|
||||
|
||||
if err := RouteDel(&route); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
routes, err = RouteList(link, FAMILY_V4)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if len(routes) != 0 {
|
||||
t.Fatal("Route not removed properly")
|
||||
}
|
||||
}
|
||||
|
||||
func TestRouteViaAddDel(t *testing.T) {
|
||||
minKernelRequired(t, 5, 4)
|
||||
tearDown := setUpNetlinkTest(t)
|
||||
|
Reference in New Issue
Block a user