Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

android: properly handle NXDOMAIN errors #2029

Closed
hellais opened this issue Feb 15, 2022 · 17 comments
Closed

android: properly handle NXDOMAIN errors #2029

hellais opened this issue Feb 15, 2022 · 17 comments
Assignees
Labels
bug Something isn't working correctly data quality ooni/probe-engine platform/android priority/high Important issue that needs attention soon

Comments

@hellais
Copy link
Member

hellais commented Feb 15, 2022

We noticed that certain NXDOMAIN errors are not properly handled by the engine.

Here is a sample measurement that results in an unknown_failure: https://explorer.ooni.org/measurement/20220215T025431Z_webconnectivity_HK_9231_n1_oU1CBKrQbHFoou5h?input=http%3A%2F%2Fwww.hongkongwatch.org

@hellais hellais added bug Something isn't working correctly priority/medium Normal priority issue data quality ooni/probe-engine labels Feb 15, 2022
@bassosimone
Copy link
Contributor

bassosimone commented Feb 21, 2022

It seems this problem is interesting enough to deserve some in-depth level of double checking. We need to figure out whether there are some specifics that make it work somewhere or whether it's all broken.

Let's use as test case the https://thefoobarbay.com/ URL and web_connectivity as the experiment. From my network, AS30722, it's pretty clear that the domain does not exist. So, it should be a good proxy of the original issue.

So, the first objective is to figure our in which platforms does it happen.

software platform engine_version result report
ooniprobe-android android 3.14.0-beta unknown failure #
miniooni windows 3.15.0-alpha nxdomain #
miniooni linux 3.15.0-alpha nxdomain #
miniooni darwin 3.15.0-alpha nxdomain #
ooniprobe darwin 3.14.0-beta nxdomain #
ooniprobe linux 3.14.0-beta nxdomain #
ooniprobe windows 3.14.0-beta nxdomain #
ooniprobe-ios ios 3.14.0-beta nxdomain #

So, this seems to be an Android-only problem. This begs two questions: (1) what is the root cause and (2) how to test it.

@bassosimone
Copy link
Contributor

So, debugging this issue is not immediately straightforward. I think it makes sense for me to explain how I did it.

The first thing to do is to start an emulator using Android studio.

Then, you need root access (IIUC this is mainly to be able to write the disk):

adb root

Then, you need to compile miniooni for Android. In my case, I'll compile for Android/i686 because my emulator is using this architecture. We also need to ensure we're linking with libc. There's two reasons why we need to do that. The first reason is that we're trying to debug/test getaddrinfo, so we need to be using it. The second, lesser reason is that miniooni compiled just for linux/386 does not work. This seems to be related with the Go resolver, but I am not sure. (Since this is a sidetrack, I'll try to investigate this specific aspect later, once I've understood the main issue.)

GOOS=android GOARCH=386 CGO_ENABLED=1 CC=$HOME/sdk/ooni-android/ndk/23.1.7779620/toolchains/llvm/prebuilt/linux-x86_64/bin/i686-linux-android30-clang LD=$HOME/sdk/ooni-android/ndk/23.1.7779620/toolchains/llvm/prebuilt/linux-x86_64/bin/ld  go build -v ./internal/cmd/miniooni

Then you need to copy the miniooni binary:

$HOME/sdk/ooni-android/platform-tools/adb push miniooni /cache

Then you need to shell into Android:

~/sdk/ooni-android/platform-tools/adb shell

At this point it's straightforward:

cd /cache
chmod +x miniooni
./miniooni -i https://thefoobarbay.com web_connectivity

And here's the measurement: https://explorer.ooni.org/measurement/20220221T135225Z_webconnectivity_IT_30722_n1_ersvWVUkwEUJf22g?input=https%3A%2F%2Fthefoobarbay.com

So, the nice fact about this is that we can reproduce using miniooni. So the dev cycle here is much faster.

@bassosimone
Copy link
Contributor

bassosimone commented Feb 21, 2022

To gather more information about what is happening, here's a simple test program:

#include <sys/types.h>

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <netdb.h>

int main() {
    struct addrinfo *res;
    struct addrinfo hints;
    memset(&hints, 0, sizeof (hints));
    hints.ai_flags |= AI_CANONNAME;
    int r = getaddrinfo("thefoobarbay.com", NULL, &hints, &res);
    if (r != 0) {
        fprintf(stderr, "failure: %d %s\n", r, gai_strerror(r));
        exit(1);
    }
    struct addrinfo *aip = res;
    for (; aip != NULL; aip = aip->ai_next) {
        fprintf(stderr, "- %p\n", aip);
    }
    freeaddrinfo(res);
    return 0;
}

We can compile using

~/sdk/ooni-android/ndk/23.1.7779620/toolchains/llvm/prebuilt/linux-x86_64/bin/i686-linux-android30-clang -Wall -Wextra getaddrinfo.c

After copying and running on the device, as we did above, we obtain:

./a.out
failure: 7 No address associated with hostname

Now, the interesting thing is that, when running the same small program locally on GNU/Linux, I get:

./a.out 
failure: -2 Name or service not known

If we read the resolv.conf used by Android in netdb.h, we see:

/*
 * Error return codes from getaddrinfo()
 */
#define EAI_ADDRFAMILY   1      /* address family for hostname not supported */
#define EAI_AGAIN        2      /* temporary failure in name resolution */
#define EAI_BADFLAGS     3      /* invalid value for ai_flags */
#define EAI_FAIL         4      /* non-recoverable failure in name resolution */
#define EAI_FAMILY       5      /* ai_family not supported */
#define EAI_MEMORY       6      /* memory allocation failure */
#define EAI_NODATA       7      /* no address associated with hostname */
#define EAI_NONAME       8      /* hostname nor servname provided, or not known */
#define EAI_SERVICE      9      /* servname not supported for ai_socktype */
#define EAI_SOCKTYPE    10      /* ai_socktype not supported */
#define EAI_SYSTEM      11      /* system error returned in errno */
#define EAI_BADHINTS    12      /* invalid value for hints */
#define EAI_PROTOCOL    13      /* resolved protocol is unknown */
#define EAI_OVERFLOW    14      /* argument buffer overflow */
#define EAI_MAX         15

whereas, if we read my GNU/Linux system's netdb.h, we see:

/* Error values for `getaddrinfo' function.  */
# define EAI_BADFLAGS     -1    /* Invalid value for `ai_flags' field.  */
# define EAI_NONAME       -2    /* NAME or SERVICE is unknown.  */
# define EAI_AGAIN        -3    /* Temporary failure in name resolution.  */
# define EAI_FAIL         -4    /* Non-recoverable failure in name res.  */
# define EAI_FAMILY       -6    /* `ai_family' not supported.  */
# define EAI_SOCKTYPE     -7    /* `ai_socktype' not supported.  */
# define EAI_SERVICE      -8    /* SERVICE not supported for `ai_socktype'.  */
# define EAI_MEMORY       -10   /* Memory allocation failure.  */
# define EAI_SYSTEM       -11   /* System error returned in `errno'.  */
# define EAI_OVERFLOW     -12   /* Argument buffer overflow.  */
# ifdef __USE_GNU
#  define EAI_NODATA      -5    /* No address associated with NAME.  */
#  define EAI_ADDRFAMILY  -9    /* Address family for NAME not supported.  */
#  define EAI_INPROGRESS  -100  /* Processing request in progress.  */
#  define EAI_CANCELED    -101  /* Request canceled.  */
#  define EAI_NOTCANCELED -102  /* Request not canceled.  */
#  define EAI_ALLDONE     -103  /* All requests done.  */
#  define EAI_INTR        -104  /* Interrupted by a signal.  */
#  define EAI_IDN_ENCODE  -105  /* IDN encoding failed.  */

So, we can conclude that on Android getaddrinfo is returning EAI_NODATA while on GNU/Linux it's EAI_NONAME.

Now, I think this should clarify what is the actual problem. Consider how Go handles this result value:

	if gerrno != 0 {
		isErrorNoSuchHost := false
		isTemporary := false
		switch gerrno {
		case C.EAI_SYSTEM:
			if err == nil {
				// err should not be nil, but sometimes getaddrinfo returns
				// gerrno == C.EAI_SYSTEM with err == nil on Linux.
				// The report claims that it happens when we have too many
				// open files, so use syscall.EMFILE (too many open files in system).
				// Most system calls would return ENFILE (too many open files),
				// so at the least EMFILE should be easy to recognize if this
				// comes up again. golang.org/issue/6232.
				err = syscall.EMFILE
			}
		case C.EAI_NONAME:
			err = errNoSuchHost
			isErrorNoSuchHost = true
		default:
			err = addrinfoErrno(gerrno)
			isTemporary = addrinfoErrno(gerrno).Temporary()
		}

		return nil, "", &DNSError{Err: err.Error(), Name: name, IsNotFound: isErrorNoSuchHost, IsTemporary: isTemporary}
	}

and it should be clear why we don't get the errNoSuchHost error.

@bassosimone
Copy link
Contributor

bassosimone commented Feb 21, 2022

So, the simplest fix for this issue seems to add a specific filtering rule for Android that treats the given string specifically. A more structurde fix seems that we call getaddrinfo directly. Then, it becomes our problem to correctly map the results of getaddrinfo to errors. And, also, we have an opportunity of recording the real getaddrinfo return code.

bassosimone added a commit to ooni/probe-cli that referenced this issue Feb 21, 2022
The issue at ooni/probe#2029 is fixed
if we directly call getaddrinfo and correctly map its return code.

While the main reason to propose this diff is to fix the above
mentioned issue, we should note that this diff also paves the way
for ooni/probe#1569.

(Of course, regarding ooni/probe#1569,
we don't have the Rcode when we're calling getaddrinfo, but the
spirit of ooni/probe#1569 is that we
should include the lowest-level error we have seen and, when we're
calling getaddrinfo, such an error is getaddrinfo's retval.)
@bassosimone bassosimone changed the title probe-engine: properly handle NXDOMAIN errors android: properly handle NXDOMAIN errors Feb 22, 2022
bassosimone added a commit to ooni/probe-cli that referenced this issue Feb 23, 2022
The problem is explained in ooni/probe#2029.

I am also working on a more comprehensive fix for this
issue in #698.

This diff WILL NOT need forwardporting. It's just meant as
an hotfix for the release/3.14 branch and it's not such that
I'd be happy keeping it in release/3.15+.
@bassosimone
Copy link
Contributor

Commit ooni/probe-cli@2b48dcf contains an hotfix that should be good enough for the release/3.14 branch. It's clear we want a more comprehensive solution for release/3.15+.

@bassosimone
Copy link
Contributor

We're not going to close this issue now, since we're still working out a solution for master that improves our data quality (see ooni/probe-cli#698 (comment)). But we've done what we needed for release/3.14.

bassosimone added a commit to ooni/probe-cli that referenced this issue May 20, 2022
This cherry-picks 2b48dcf for
the release/3.15 branch. Original commit message follows:

- - -

The problem is explained in ooni/probe#2029.

I am also working on a more comprehensive fix for this
issue in #698.

This diff WILL NOT need forwardporting. It's just meant as
an hotfix for the release/3.14 branch and it's not such that
I'd be happy keeping it in release/3.15+.
@bassosimone
Copy link
Contributor

bassosimone commented May 23, 2022

For release/3.15, I have cherry-picked the fix originally developed for 3.14: ooni/probe-cli@ce35b64

@bassosimone
Copy link
Contributor

bassosimone added a commit to ooni/probe-cli that referenced this issue May 27, 2022
This commit changes our system resolver to call getaddrinfo
directly when CGO is enabled. This change allows us to:

1. obtain the CNAME easily

2. obtain the real getaddrinfo retval

See ooni/probe#2029

See ooni/probe#2033
@bassosimone
Copy link
Contributor

I am about to merge ooni/probe-cli#764, which provides a theory explaining the issue we were witnessing for Android devices. A theory does not mean that it's necessarily reality, but it's convincing.

Here's the theory:

// 3. Android libc: EAI_NODATA is defined in netdb.h and is not
// protected by any feature flag. The getaddrinfo function (as
// of 4ebdeebef74) calls android_getaddrinfofornet, which in turns
// calls android_getaddrinfofornetcontext. This function will
// eventually call android_getaddrinfo_proxy. If this function
// returns any status code different from EAI_SYSTEM, then bionic
// will return its return value. Otherwise, the code ends up
// calling explore_fqdn, which in turn calls nsdispatch, which
// is what NetBSD is still doing today.
//
// So, android_getaddrinfo_proxy was introduced a long time
// ago on October 28, 2010 by this commit:
//
//     https://github.com/aosp-mirror/platform_bionic/commit/a1dbf0b453801620565e5911f354f82706b0200d
//
// Then a subsequent commit changed android_getaddrinfo_proxy
// to basically default to EAI_NODATA on proxy errors:
//
//     https://github.com/aosp-mirror/platform_bionic/commit/c63e59039d28c352e3053bb81319e960c392dbd4
//
// As of today and 4ebdeebef74, android_getaddrinfo_proxy returns
// one of the following possible return codes:
//
// a) 0 on success;
//
// b) EAI_SYSTEM if it cannot speak to the proxy (which causes the code
// to fall through to the original NetBSD implementation);
//
// c) EAI_NODATA in all the other cases.
//
// The above discussion about Android provides us with a theory that explains the
// https://github.com/ooni/probe/issues/2029 issue. That said, we are still missing
// some bits, e.g., why some Android 6 phones did not experience this problem.
//
// We originally proposed to handle the EAI_NODATA error on Android like it was a
// EAI_NONAME error. However, this mapping seems very inaccurate. Any error inside
// the DNS proxy could cause EAI_NODATA (_unless_ we're "lucky" for some reason
// and the original NetBSD code runs). Therefore, the sanest choice is to introduce
// a new OONI error describing this error condition `android_dns_cache_no_data`
// and handle this error as a special case when checking for NXDOMAIN.

See https://github.com/ooni/probe-cli/pull/764/files#diff-3b2397df28603c7fc86efad2e2e2d7a77b2e2806e7cb74b0eaea110aa1238f25R92 for the complete discussion.

bassosimone added a commit to ooni/probe-cli that referenced this issue May 28, 2022
This commit changes our system resolver to call getaddrinfo directly when CGO is enabled. This change allows us to:

1. obtain the CNAME easily

2. obtain the real getaddrinfo retval

3. handle platform specific oddities such as `EAI_NODATA`
returned on Android devices

See ooni/probe#2029 and ooni/probe#2029 (comment) in particular.

See ooni/probe#2033 for documentation regarding the desire to see `getaddrinfo`'s retval.

See ooni/probe#2118 for possible follow-up changes.
bassosimone added a commit to ooni/spec that referenced this issue May 30, 2022
See ooni/probe-cli#765, where I identified
I needed to sync up spec with probe-cli.

## Checklist

- [x] I have read the [contribution guidelines](https://github.com/ooni/spec/blob/master/CONTRIBUTING.md)
- [x] reference issue for this pull request: ooni/probe#2029
- [x] related ooni/probe-cli pull request: ooni/probe-cli#765
- [x] If I changed a spec, I also bumped its version number and/or date
bassosimone added a commit to ooni/probe-cli that referenced this issue May 30, 2022
After #764, the build for
CGO_ENABLED=0 has been broken for miniooni:

https://github.com/ooni/probe-cli/runs/6636995859?check_suite_focus=true

Likewise, it's not possible to run tests with CGO_ENABLED=0.

To make tests work with `CGO_ENABLED=0`, I needed to sacrifice some
unit tests run for the CGO case. It is not fully clear to me what was happening
here, but basically `getaddrinfo_cgo_test.go` was compiled with CGO
being disabled, even though the ``//go:build cgo` flag was specified.

Additionally, @hellais previously raised a valid point in the review
of #698:

> Another issue we should consider is that, if I understand how
> this works correctly, depending on whether or not we have built
> with CGO_ENABLED=0 on or not, we are going to be measuring
> things in a different way (using our cgo inspired getaddrinfo
> implementation or using netgo). This might present issues when
> analyzing or interpreting the data.
>
> Do we perhaps want to add some field to the output data format that
> gives us an indication of which DNS resolution code was used to
> generate the the metric?

This comment is relevant to the current commit because
#698 is the previous
iteration of #764.

So, while fixing the build and test issues, let us also distinguish
between the CGO_ENABLED=1 and CGO_ENABLED=0 cases.

Before this commit, OONI used "system" to indicate the case where
we were using net.DefaultResolver. This behavior dates back to the
Measurement Kit days. While it is true that ooni/probe-engine and
ooni/probe-cli could have been using netgo in the past when we
said "system" as the resolver, it also seems reasonable to continue
to use "system" top indicate getaddrinfo.

So, the choice here is basically to use "netgo" from now on to
indicate the cases in which we were built with CGO_ENABLED=0.

This change will need to be documented into ooni/spec along with
the introduction of the `android_dns_cache_no_data` error.

## Checklist

- [x] I have read the [contribution guidelines](https://github.com/ooni/probe-cli/blob/master/CONTRIBUTING.md)
- [x] reference issue for this pull request: ooni/probe#2029
- [x] if you changed anything related how experiments work and you need to reflect these changes in the ooni/spec repository, please link to the related ooni/spec pull request: ooni/spec#242
@bassosimone
Copy link
Contributor

After ooni/probe-cli#765, there's one (hopefully last) residual issue: if I cross compile, say, miniooni for windows/amd64, my understanding from the codebase is that I should be using WSA's getaddrinfo via the Go standard library rather than netgo. However, the measurement result would say I am using netgo.

bassosimone added a commit to ooni/spec that referenced this issue May 30, 2022
In ooni/probe#2029 (comment), we
explained why calling it "netgo" would be incorrect.

In other words, we can get the platform's `getaddrinfo` as long as
we're not cross compiling. We do cross compile `ooniprobe`, actually
it's not even possible to cross compile it.

For increased accuracy, we should stop cross compiling `miniooni`
as well, so it would also directly use `getaddrinfo`.

This diff fixes at the same time ooni/probe-cli and ooni/spec
and we'll open two pull requests in parallel.
bassosimone added a commit to ooni/spec that referenced this issue May 30, 2022
In ooni/probe#2029 (comment), we
explained why calling it "netgo" would be incorrect.

In other words, we can get the platform's `getaddrinfo` as long as
we're not cross compiling. We do cross compile `ooniprobe`, actually
it's not even possible to cross compile it.

For increased accuracy, we should stop cross compiling `miniooni`
as well, so it would also directly use `getaddrinfo`.

This diff fixes at the same time ooni/probe-cli and ooni/spec
and we'll open two pull requests in parallel.
bassosimone added a commit to ooni/probe-cli that referenced this issue May 30, 2022
In ooni/probe#2029 (comment), we
explained why calling it "netgo" would be incorrect.

In other words, we can get the platform's `getaddrinfo` as long as
we're not cross compiling. We do cross compile `ooniprobe`, actually
it's not even possible to cross compile it.

For increased accuracy, we should stop cross compiling `miniooni`
as well, so it would also directly use `getaddrinfo`.

This diff fixes at the same time ooni/probe-cli and ooni/spec
and we'll open two pull requests in parallel.
@bassosimone
Copy link
Contributor

I created #2120 to track the issue that we cannot consider the result of getaddrinfo called on Android reliable unless the result is successful.

@bassosimone
Copy link
Contributor

Most work required by this issue has been done. It remains to merge ooni/probe-cli#698.

@bassosimone
Copy link
Contributor

Ah, wait, another piece of work is to implement the Resolver.LookupHostAndCNAME operation. This operation would return at the same time the addresses and the CNAME for the domain. This is the maximum amount of information one could get using the getaddrinfo backend. For the other resolvers, it's gonna be a bit more tricky to easily expose that but I suppose we could just check whether A and AAAA replies returned a CNAME. It MAY also be useful to pause for a second and think about how to improve measurex in light of recent DNS changes, because it MAY be that exposing this operation as a general DNS resolver operation is not actually needed or useful.

@bassosimone bassosimone added priority/high Important issue that needs attention soon and removed priority/medium Normal priority issue labels Jun 3, 2022
@bassosimone
Copy link
Contributor

(This issue looked like medium priority when we triaged it, but it's actually high priority now.)

@bassosimone
Copy link
Contributor

As of 3.17.0-alpha.1, we correctly detect this issue for Android by using the android_dns_cache_no_data failure. However, we still need to correctly handle this case when processing results in webconnectivity LTE. I am going to add a note to the webconnectivity LTE codebase referring back to this issue comment.

bassosimone added a commit to ooni/probe-cli that referenced this issue Feb 1, 2023
bassosimone added a commit to ooni/probe-cli that referenced this issue Mar 16, 2023
bassosimone added a commit to ooni/netem that referenced this issue Aug 24, 2023
bassosimone added a commit to ooni/netem that referenced this issue Aug 24, 2023
bassosimone added a commit to ooni/probe-cli that referenced this issue Aug 24, 2023
Part of ooni/probe#2029. The general idea is to
modify v0.4 in a subsequent PR to make it WAI for this test case.
bassosimone added a commit to ooni/probe-cli that referenced this issue Aug 24, 2023
Part of ooni/probe#2029. The general idea is
to modify v0.4 in a subsequent PR to make it WAI for this test case.
Currently v0.4 does not correctly support this case, which is why we're
doing this work. (See also ooni/probe#2499).
bassosimone added a commit to ooni/probe-cli that referenced this issue Aug 24, 2023
This diff changes the handling of android_dns_cache_no_data to mark it and
any other DNS inconsistenct as DNS anomaly.

The previous implementation was not handling any DNS inconsistency as an
anomaly, therefore I needed to adjust a bunch of summary_test.go tests.

Part of ooni/probe#2499 and
ooni/probe#2029.

I bumped the version number because this is a significant change
in the analysis algorithm implemented by the probe.
bassosimone added a commit to ooni/probe-cli that referenced this issue Oct 10, 2023
## Checklist

- [x] I have read the [contribution
guidelines](https://github.com/ooni/probe-cli/blob/master/CONTRIBUTING.md)
- [x] reference issue for this pull request:
ooni/probe#2499
- [x] if you changed anything related to how experiments work and you
need to reflect these changes in the ooni/spec repository, please link
to the related ooni/spec pull request: N/A
- [x] if you changed code inside an experiment, make sure you bump its
version number

## Summary

This diff changes the `summary.go` algorithm of Web Connectivity v0.4 to
handle `android_dns_cache_no_data` as an anomaly when the DNS is
inconsistent. We continue handling `dns_nxdomain_error` as an anomaly
when the DNS is inconsistent, as demonstrated by the fact that the
corresponding netem test is still passing.

This diff also bumps the version number to v0.4.3. Version v0.4.2 did
not handle this case, which caused measurements to be marked as failed
as documented by ooni/probe#2499.

This diff is also related to ooni/probe#2029,
in the sense that it is slightly improving our analysis results when the
is an NXDOMAIN error (even if it's masked by Android's DNS cache
behavior).

While there, add empty lines to improve the code readability.
Murphy-OrangeMud pushed a commit to Murphy-OrangeMud/probe-cli that referenced this issue Feb 13, 2024
…#1210)

Part of ooni/probe#2029. The general idea is
to modify v0.4 in a subsequent PR to make it WAI for this test case.
Currently v0.4 does not correctly support this case, which is why we're
doing this work. (See also ooni/probe#2499).
Murphy-OrangeMud pushed a commit to Murphy-OrangeMud/probe-cli that referenced this issue Feb 13, 2024
…i#1211)

## Checklist

- [x] I have read the [contribution
guidelines](https://github.com/ooni/probe-cli/blob/master/CONTRIBUTING.md)
- [x] reference issue for this pull request:
ooni/probe#2499
- [x] if you changed anything related to how experiments work and you
need to reflect these changes in the ooni/spec repository, please link
to the related ooni/spec pull request: N/A
- [x] if you changed code inside an experiment, make sure you bump its
version number

## Summary

This diff changes the `summary.go` algorithm of Web Connectivity v0.4 to
handle `android_dns_cache_no_data` as an anomaly when the DNS is
inconsistent. We continue handling `dns_nxdomain_error` as an anomaly
when the DNS is inconsistent, as demonstrated by the fact that the
corresponding netem test is still passing.

This diff also bumps the version number to v0.4.3. Version v0.4.2 did
not handle this case, which caused measurements to be marked as failed
as documented by ooni/probe#2499.

This diff is also related to ooni/probe#2029,
in the sense that it is slightly improving our analysis results when the
is an NXDOMAIN error (even if it's masked by Android's DNS cache
behavior).

While there, add empty lines to improve the code readability.
@hellais hellais added this to Roadmap Jan 7, 2025
@hellais
Copy link
Member Author

hellais commented Jan 23, 2025

This issue is linked from the spec and it's not something which is directly actionable atm. Closing.

@hellais hellais closed this as completed Jan 23, 2025
@github-project-automation github-project-automation bot moved this to Done in Roadmap Jan 23, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working correctly data quality ooni/probe-engine platform/android priority/high Important issue that needs attention soon
Projects
Archived in project
Development

No branches or pull requests

2 participants