Merge pull request #76 from dd4e/add-replace-route

Added methods for replace route
This commit is contained in:
Jeroen Simonetti 2020-04-13 19:08:23 +02:00 committed by GitHub
commit 2d3c724ef0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 53 additions and 10 deletions

View File

@ -111,6 +111,17 @@ func (r *RouteService) Add(req *RouteMessage) error {
return nil
}
// Replace or add new route
func (r *RouteService) Replace(req *RouteMessage) error {
flags := netlink.Request | netlink.Create | netlink.Replace | netlink.Acknowledge
_, err := r.c.Execute(req, unix.RTM_NEWROUTE, flags)
if err != nil {
return err
}
return nil
}
// Delete existing route
func (r *RouteService) Delete(req *RouteMessage) error {
flags := netlink.Request | netlink.Acknowledge

View File

@ -8,17 +8,11 @@ import (
"github.com/jsimonetti/rtnetlink"
)
// RouteAdd adds infomation about a network route.
func (c *Conn) RouteAdd(ifc *net.Interface, dst net.IPNet, gw net.IP) (err error) {
return c.RouteAddSrc(ifc, dst, nil, gw)
}
// RouteAddSrc adds infomation about a network route with the given destination
// and source. If source is `nil` it's ignored.
func (c *Conn) RouteAddSrc(ifc *net.Interface, dst net.IPNet, src *net.IPNet, gw net.IP) (err error) {
// generating route message
func genRouteMessage(ifc *net.Interface, dst net.IPNet, src *net.IPNet, gw net.IP) (rm *rtnetlink.RouteMessage, err error) {
af, err := addrFamily(dst.IP)
if err != nil {
return err
return nil, err
}
// Determine scope
@ -60,7 +54,45 @@ func (c *Conn) RouteAddSrc(ifc *net.Interface, dst net.IPNet, src *net.IPNet, gw
SrcLength: uint8(srclen),
Attributes: attr,
}
return c.Conn.Route.Add(tx)
return tx, nil
}
// RouteAdd adds infomation about a network route.
func (c *Conn) RouteAdd(ifc *net.Interface, dst net.IPNet, gw net.IP) (err error) {
rm, err := genRouteMessage(ifc, dst, nil, gw)
if err != nil {
return err
}
return c.Conn.Route.Add(rm)
}
// RouteReplace adds or replace information about a network route.
func (c *Conn) RouteReplace(ifc *net.Interface, dst net.IPNet, gw net.IP) (err error) {
rm, err := genRouteMessage(ifc, dst, nil, gw)
if err != nil {
return err
}
return c.Conn.Route.Replace(rm)
}
// RouteReplaceSrc adds or replace infomation about a network route with the given destination
// and source. If source is `nil` it's ignored.
func (c *Conn) RouteReplaceSrc(ifc *net.Interface, dst net.IPNet, src *net.IPNet, gw net.IP) (err error) {
rm, err := genRouteMessage(ifc, dst, src, gw)
if err != nil {
return err
}
return c.Conn.Route.Replace(rm)
}
// RouteAddSrc adds infomation about a network route with the given destination
// and source. If source is `nil` it's ignored.
func (c *Conn) RouteAddSrc(ifc *net.Interface, dst net.IPNet, src *net.IPNet, gw net.IP) (err error) {
rm, err := genRouteMessage(ifc, dst, src, gw)
if err != nil {
return err
}
return c.Conn.Route.Add(rm)
}
// RouteDel deletes the route to the given destination.