Skip to content

Commit 124bb8e

Browse files
maxatomeaboch
authored andcommitted
Add RouteChange API
Signed-off-by: Maxime Soulé <[email protected]>
1 parent 6ab7f5a commit 124bb8e

File tree

4 files changed

+89
-1
lines changed

4 files changed

+89
-1
lines changed

Diff for: handle_unspecified.go

+4
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,10 @@ func (h *Handle) RouteAppend(route *Route) error {
263263
return ErrNotImplemented
264264
}
265265

266+
func (h *Handle) RouteChange(route *Route) error {
267+
return ErrNotImplemented
268+
}
269+
266270
func (h *Handle) RouteDel(route *Route) error {
267271
return ErrNotImplemented
268272
}

Diff for: netlink_unspecified.go

+4
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,10 @@ func RouteAppend(route *Route) error {
204204
return ErrNotImplemented
205205
}
206206

207+
func RouteChange(route *Route) error {
208+
return ErrNotImplemented
209+
}
210+
207211
func RouteDel(route *Route) error {
208212
return ErrNotImplemented
209213
}

Diff for: route_linux.go

+15
Original file line numberDiff line numberDiff line change
@@ -790,6 +790,21 @@ func (h *Handle) RouteAddEcmp(route *Route) error {
790790
return err
791791
}
792792

793+
// RouteChange will change an existing route in the system.
794+
// Equivalent to: `ip route change $route`
795+
func RouteChange(route *Route) error {
796+
return pkgHandle.RouteChange(route)
797+
}
798+
799+
// RouteChange will change an existing route in the system.
800+
// Equivalent to: `ip route change $route`
801+
func (h *Handle) RouteChange(route *Route) error {
802+
flags := unix.NLM_F_REPLACE | unix.NLM_F_ACK
803+
req := h.newNetlinkRequest(unix.RTM_NEWROUTE, flags)
804+
_, err := h.routeHandle(route, req, nl.NewRtMsg())
805+
return err
806+
}
807+
793808
// RouteReplace will add a route to the system.
794809
// Equivalent to: `ip route replace $route`
795810
func RouteReplace(route *Route) error {

Diff for: route_test.go

+66-1
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,72 @@ func TestRoute6AddDel(t *testing.T) {
331331
}
332332
}
333333

334+
func TestRouteChange(t *testing.T) {
335+
tearDown := setUpNetlinkTest(t)
336+
defer tearDown()
337+
338+
// get loopback interface
339+
link, err := LinkByName("lo")
340+
if err != nil {
341+
t.Fatal(err)
342+
}
343+
344+
// bring the interface up
345+
if err := LinkSetUp(link); err != nil {
346+
t.Fatal(err)
347+
}
348+
349+
// add a gateway route
350+
dst := &net.IPNet{
351+
IP: net.IPv4(192, 168, 0, 0),
352+
Mask: net.CIDRMask(24, 32),
353+
}
354+
355+
ip := net.IPv4(127, 1, 1, 1)
356+
route := Route{LinkIndex: link.Attrs().Index, Dst: dst, Src: ip}
357+
358+
if err := RouteChange(&route); err == nil {
359+
t.Fatal("Route added while it should fail")
360+
}
361+
362+
if err := RouteAdd(&route); err != nil {
363+
t.Fatal(err)
364+
}
365+
routes, err := RouteList(link, FAMILY_V4)
366+
if err != nil {
367+
t.Fatal(err)
368+
}
369+
if len(routes) != 1 {
370+
t.Fatal("Route not added properly")
371+
}
372+
373+
ip = net.IPv4(127, 1, 1, 2)
374+
route = Route{LinkIndex: link.Attrs().Index, Dst: dst, Src: ip}
375+
if err := RouteChange(&route); err != nil {
376+
t.Fatal(err)
377+
}
378+
379+
routes, err = RouteList(link, FAMILY_V4)
380+
if err != nil {
381+
t.Fatal(err)
382+
}
383+
384+
if len(routes) != 1 || !routes[0].Src.Equal(ip) {
385+
t.Fatal("Route not changed properly")
386+
}
387+
388+
if err := RouteDel(&route); err != nil {
389+
t.Fatal(err)
390+
}
391+
routes, err = RouteList(link, FAMILY_V4)
392+
if err != nil {
393+
t.Fatal(err)
394+
}
395+
if len(routes) != 0 {
396+
t.Fatal("Route not removed properly")
397+
}
398+
}
399+
334400
func TestRouteReplace(t *testing.T) {
335401
tearDown := setUpNetlinkTest(t)
336402
defer tearDown()
@@ -390,7 +456,6 @@ func TestRouteReplace(t *testing.T) {
390456
if len(routes) != 0 {
391457
t.Fatal("Route not removed properly")
392458
}
393-
394459
}
395460

396461
func TestRouteAppend(t *testing.T) {

0 commit comments

Comments
 (0)