in pkg/skoop/assertions/netstack.go [248:315]
func (na *NetstackAssertion) AssertRoute(expected RouteAssertion, packet model.Packet, iif, oif string) error {
router := na.netns.Router
route, err := router.Route(&packet, iif, oif)
if err == netstack.ErrNoRouteToHost {
na.AddSuspicion(model.SuspicionLevelFatal,
fmt.Sprintf("no route to host %s", packet.Dst))
return nil
}
if err != nil {
return err
}
if slices.Contains([]int{netstack.RtnUnreachable, netstack.RtnBlackhole, netstack.RtnProhibit, netstack.RtnThrow}, route.Type) {
na.AddSuspicion(model.SuspicionLevelFatal,
fmt.Sprintf("route with type %d which indicates %s is unreachable", route.Type, packet.Dst))
return nil
}
if route.Type == netstack.RtnLocal {
return nil
}
if expected.Dev != nil && *expected.Dev != route.OifName {
na.AddSuspicion(model.SuspicionLevelFatal,
fmt.Sprintf("invalid route %q for packet {src=%s, dst=%s}, expected: %q",
route, packet.Src, packet.Dst, expected))
return nil
}
if expected.Scope != nil && *expected.Scope != route.Scope {
na.AddSuspicion(model.SuspicionLevelFatal,
fmt.Sprintf("invalid route %q for packet {src=%s, dst=%s}, expected: %q",
route, packet.Src, packet.Dst, expected))
return nil
}
if expected.Src != nil && !route.Src.Equal(*expected.Src) {
na.AddSuspicion(model.SuspicionLevelFatal,
fmt.Sprintf("invalid route %q for packet {src=%s, dst=%s}, expected: %q",
route, packet.Src, packet.Dst, expected))
return nil
}
if expected.Dst != nil && (*route.Dst).String() != (*expected.Dst).String() {
na.AddSuspicion(model.SuspicionLevelFatal,
fmt.Sprintf("invalid route %q for packet {src=%s, dst=%s}, expected: %q",
route, packet.Src, packet.Dst, expected))
return nil
}
if expected.Gw != nil && !route.Gw.Equal(*expected.Gw) {
na.AddSuspicion(model.SuspicionLevelFatal,
fmt.Sprintf("invalid route %q for packet {src=%s, dst=%s}, expected: %q",
route, packet.Src, packet.Dst, expected))
return nil
}
if expected.Type != nil && *expected.Type != route.Type {
na.AddSuspicion(model.SuspicionLevelFatal,
fmt.Sprintf("invalid route %q for packet {src=%s, dst=%s}, expected: %q",
route, packet.Src, packet.Dst, expected))
return nil
}
if expected.Protocol != nil && *expected.Protocol != route.Protocol {
na.AddSuspicion(model.SuspicionLevelFatal,
fmt.Sprintf("invalid route %q for packet {src=%s, dst=%s}, expected: %q",
route, packet.Src, packet.Dst, expected))
return nil
}
return nil
}