aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuy Harris <gharris@sonic.net>2023-01-10 00:09:44 -0800
committerGuy Harris <gharris@sonic.net>2023-01-10 00:36:07 -0800
commit16de5e6b4c24de40d3ae5e2cd000b57fe5e51f19 (patch)
treea2bb6ba3ef7e800dd9e491e9b71b6751a650307c
parentda069383bac4b9d39dfc818006e17bfd0c45fe1e (diff)
downloadlibpcap-16de5e6b4c24de40d3ae5e2cd000b57fe5e51f19.tar.gz
NPF: update handling of failure to set promiscuous mode.
Change comments and #defines to reflect more information we now know. (cherry picked from commit b98941d35b20b01a1de58701a194bda6077d4914)
-rw-r--r--CHANGES2
-rw-r--r--pcap-npf.c47
2 files changed, 42 insertions, 7 deletions
diff --git a/CHANGES b/CHANGES
index 9c4d665d..63d22e5f 100644
--- a/CHANGES
+++ b/CHANGES
@@ -4,6 +4,8 @@ Monthday, Month DD, YYYY:
Sort the PUBHDR variable in Makefile.in in "ls" order.
Fix typo in comment in pflog.h.
Remove two no-longer-present files from .gitignore.
+ Update code and comments for handling failure to set promiscuous
+ mode based on new information.
Building and testing:
install: Fixed not to install the non-public pcap-util.h header.
pcap-config: add a --version flag.
diff --git a/pcap-npf.c b/pcap-npf.c
index c9e5195d..c531a393 100644
--- a/pcap-npf.c
+++ b/pcap-npf.c
@@ -985,8 +985,6 @@ pcap_breakloop_npf(pcap_t *p)
}
/*
- * Vendor-specific error codes.
- *
* These are NTSTATUS values:
*
* https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-erref/87fba13e-bf06-450e-83b1-9241dc81e781
@@ -995,15 +993,34 @@ pcap_breakloop_npf(pcap_t *p)
* mapped to Windows error values in userland; they're returned by
* GetLastError().
*
+ * Note that "driver" here includes the Npcap NPF driver, as various
+ * versions would take NT status values and set the "Customer" bit
+ * before returning the status code. The commit message for the
+ * change that started doing that is
+ *
+ * Returned a customer-defined NTSTATUS in OID requests to avoid
+ * NTSTATUS-to-Win32 Error code translation.
+ *
+ * but I don't know why the goal was to avoid that translation.
+ *
* Attempting to set non-promiscuous mode on a Microsoft Surface Pro's
- * Mobile Broadband Adapter returns an error; that error can safely be
- * ignored, as it's always in non-promiscuous mode.
+ * Mobile Broadband Adapter returns an error that appears to be
+ * NDIS_STATUS_NOT_SUPPORTED ORed with the "Customer" bit, so it's
+ * probably indicating that it doesn't support promiscuous mode,
+ * as one might expect, given that it's not going to promiscuously
+ * snoop for arbitrary mobile telecom network packets. That error can
+ * safely be ignored, as it's always in non-promiscuous mode; an
+ * alternative would be to report the PCAP_WARNING_PROMISC_NOTSUP
+ * warning, which indicates that the activate call succeeded but
+ * that something happened that the user might want to know about.
*
* It is likely that there are other devices which throw spurious errors,
* at which point this will need refactoring to efficiently check against
- * a list, but for now we can just check this one value.
+ * a list, but for now we can just check this one value. Perhaps the
+ * right way to do this is compare against various NDIS errors with
+ * the "customer" bit ORed in.
*/
-#define NPF_SURFACE_MOBILE_NONPROMISC 0xe00000bb
+#define NT_STATUS_CUSTOMER_DEFINED 0x20000000
static int
pcap_activate_npf(pcap_t *p)
@@ -1295,6 +1312,13 @@ pcap_activate_npf(pcap_t *p)
* Suppress spurious error generated by non-compiant
* MS Surface mobile adapters.
*
+ * It appears to be reporting STATUS_NOT_SUPPORTED
+ * (ndis.h defines NDIS_STATUS_NOT_SUPPORTED to
+ * have the same value as the NT status value
+ * STATUS_NOT_SUPPORTED), but with the NT status
+ * value "Customer" bit set, probably by the
+ * Npcap NPF driver.
+ *
* If we knew that this meant "promiscuous mode
* isn't supported", we could add a "promiscuous
* mode isn't supported" error code and return
@@ -1315,8 +1339,17 @@ pcap_activate_npf(pcap_t *p)
* and rejecting it with an error could disrupt
* attempts to capture, as many programs (tcpdump,
* *shark) default to promiscuous mode.
+ *
+ * Alternatively, we could return the "promiscuous
+ * mode not supported" *warning* value, so that
+ * correct code will either ignore it or report
+ * it and continue capturing. (This may require
+ * a pcap_init() flag to request that return
+ * value, so that old incorrect programs that
+ * assume a non-zero return from pcap_activate()
+ * is an error don't break.)
*/
- if (errcode != NPF_SURFACE_MOBILE_NONPROMISC)
+ if (errcode != (NDIS_STATUS_NOT_SUPPORTED|NT_STATUS_CUSTOMER_DEFINED))
{
pcap_fmt_errmsg_for_win32_err(p->errbuf,
PCAP_ERRBUF_SIZE, errcode,