diff --git a/common.go b/common.go index 2a9a6ea..e9b03ed 100644 --- a/common.go +++ b/common.go @@ -57,8 +57,8 @@ func (r routeSlice) Swap(i, j int) { } type router struct { - ifaces []net.Interface - addrs []ipAddrs + ifaces map[int]net.Interface + addrs map[int]ipAddrs v4, v6 routeSlice } @@ -98,9 +98,12 @@ func (r *router) RouteWithSrc(input net.HardwareAddr, src, dst net.IP) (iface *n } // Interfaces are 1-indexed, but we store them in a 0-indexed array. - ifaceIndex-- + correspondingIface, ok := r.ifaces[ifaceIndex] + if !ok { + err = errors.New("Route refereced unknown interface") + } + iface = &correspondingIface - iface = &r.ifaces[ifaceIndex] if preferredSrc == nil { switch { case dst.To4() != nil: diff --git a/netroute_bsd.go b/netroute_bsd.go index a6bc6cc..76ce8db 100644 --- a/netroute_bsd.go +++ b/netroute_bsd.go @@ -53,6 +53,8 @@ const ( func New() (routing.Router, error) { rtr := &router{} + rtr.ifaces = make(map[int]net.Interface) + rtr.addrs = make(map[int]ipAddrs) tab, err := route.FetchRIB(syscall.AF_UNSPEC, route.RIBTypeRoute, 0) if err != nil { return nil, err @@ -125,7 +127,7 @@ func New() (routing.Router, error) { return nil, err } for _, iface := range ifaces { - rtr.ifaces = append(rtr.ifaces, iface) + rtr.ifaces[iface.Index] = iface var addrs ipAddrs ifaceAddrs, err := iface.Addrs() if err != nil { @@ -145,7 +147,7 @@ func New() (routing.Router, error) { } } } - rtr.addrs = append(rtr.addrs, addrs) + rtr.addrs[iface.Index] = addrs } return rtr, nil } diff --git a/netroute_linux.go b/netroute_linux.go index fe769c5..203f285 100644 --- a/netroute_linux.go +++ b/netroute_linux.go @@ -22,6 +22,8 @@ import ( func New() (routing.Router, error) { rtr := &router{} + rtr.ifaces = make(map[int]net.Interface) + rtr.addrs = make(map[int]ipAddrs) tab, err := syscall.NetlinkRIB(syscall.RTM_GETROUTE, syscall.AF_UNSPEC) if err != nil { return nil, err @@ -83,7 +85,7 @@ loop: return nil, err } for _, iface := range ifaces { - rtr.ifaces = append(rtr.ifaces, iface) + rtr.ifaces[iface.Index] = iface var addrs ipAddrs ifaceAddrs, err := iface.Addrs() if err != nil { @@ -103,7 +105,7 @@ loop: } } } - rtr.addrs = append(rtr.addrs, addrs) + rtr.addrs[iface.Index] = addrs } return rtr, nil }