On 3/21/25 7:31 AM, Ales Musil wrote:
> @@ -108,40 +98,52 @@ bool
>  ofctrl_acked_seqnos_contains(const struct ofctrl_acked_seqnos *seqnos,
>                               uint64_t val)
>  {
> -    struct ofctrl_ack_seqno *sn;
> +    if (vector_is_empty(&seqnos->acked)) {
> +        return false;
> +    }
> +
> +    size_t low = 0;
> +    size_t high = vector_len(&seqnos->acked) -1;
> +    uint64_t *acked = vector_get_array(&seqnos->acked);
>  
> -    HMAP_FOR_EACH_WITH_HASH (sn, node, hash_uint64(val), &seqnos->acked) {
> -        if (sn->seqno == val) {
> +    while (low <= high) {
> +        size_t mid = low + (high - low) / 2;
> +
> +        if (acked[mid] == val) {
>              return true;
>          }
> +
> +        if (acked[mid] >= acked[low]) {
> +            if (val >= acked[low] && val < acked[mid]) {
> +                high = mid - 1;
> +            } else {
> +                low = mid + 1;
> +            }
> +        } else {
> +            if (val > acked[mid] && val <= acked[high]) {
> +                low = mid + 1;
> +            } else {
> +                high = mid - 1;
> +            }
> +        }
>      }
> -    return false;
> -}

I think this definitely deserves a comment. :)

This works because sequence numbers are acked in increasing order
(except for the case when sequence numbers overflow).  So the sequence
number collection is always a "sorted and shifted" ordered collection
which allows us to implement the binary search above if we store them as
a vector.

Regards,
Dumitru

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to