func()

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
}