Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions handle_unspecified.go
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,10 @@ func (h *Handle) RouteReplace(route *Route) error {
return ErrNotImplemented
}

func (h *Handle) RouteChange(route *Route) error {
return ErrNotImplemented
}

func (h *Handle) RuleAdd(rule *Rule) error {
return ErrNotImplemented
}
Expand Down
4 changes: 4 additions & 0 deletions netlink_unspecified.go
Original file line number Diff line number Diff line change
Expand Up @@ -212,6 +212,10 @@ func RouteReplace(route *Route) error {
return ErrNotImplemented
}

func RouteChange(route *Route) error {
return ErrNotImplemented
}

func XfrmPolicyAdd(policy *XfrmPolicy) error {
return ErrNotImplemented
}
Expand Down
15 changes: 15 additions & 0 deletions route_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -702,6 +702,21 @@ func (h *Handle) RouteReplace(route *Route) error {
return err
}

// RouteChange will change a route on the system.
// Equivalent to: `ip route change $route`
func RouteChange(route *Route) error {
return pkgHandle.RouteChange(route)
}

// RouteChange will change a route on the system.
// Equivalent to: `ip route change $route`
func (h *Handle) RouteChange(route *Route) error {
flags := unix.NLM_F_REPLACE | unix.NLM_F_ACK
req := h.newNetlinkRequest(unix.RTM_NEWROUTE, flags)
_, err := h.routeHandle(route, req, nl.NewRtMsg())
return err
}

// RouteDel will delete a route from the system.
// Equivalent to: `ip route del $route`
func RouteDel(route *Route) error {
Expand Down
61 changes: 61 additions & 0 deletions route_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,67 @@ func TestRouteReplace(t *testing.T) {

}

func TestRouteChange(t *testing.T) {
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),
}

ip := net.IPv4(127, 1, 1, 1)
route := Route{LinkIndex: link.Attrs().Index, Dst: dst, Src: ip}
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")
}

ip = net.IPv4(127, 1, 1, 2)
route = Route{LinkIndex: link.Attrs().Index, Dst: dst, Src: ip}
if err := RouteChange(&route); err != nil {
t.Fatal(err)
}

routes, err = RouteList(link, FAMILY_V4)
if err != nil {
t.Fatal(err)
}

if len(routes) != 1 || !routes[0].Src.Equal(ip) {
t.Fatal("Route not replaced 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 TestRouteAppend(t *testing.T) {
tearDown := setUpNetlinkTest(t)
defer tearDown()
Expand Down