mbox series

[v4,0/3] net/pcap: build on Windows

Message ID 20210415221055.1575-1-dmitry.kozliuk@gmail.com (mailing list archive)
Headers
Series net/pcap: build on Windows |

Message

Dmitry Kozlyuk April 15, 2021, 10:10 p.m. UTC
  Most modern and actively maintained distribution of libpcap for Windows
is Npcap [1]. It currently doesn't provide a pkg-config file [2].
By default it is installed to C:\Program Files\Npcap and can be located
using standard environment variables [3]:

    $env:C_INCLUDE_PATH += ";C:\Program Files\Npcap"
    $env:LIBRARY_PATH += ";C:\Program Files\Npcap\Lib\x64"     # MinGW
    $env:LINK += ' /LIBPATH:"C:\Program Files\Npcap\Lib\x64"'  # Clang

The following libpcap.pc also works if placed in PKG_CONFIG_PATH:

    prefix="C:/Program Files/Npcap"
    Name: libpcap
    Version: 1.10
    Description: Platform-independent network traffic capture library
    Cflags: -I${prefix}/Include
    Libs: -L${prefix}/Lib/x64 -lwpcap

Example of collecting packets from an interface to a file:

    .\build\examples\dpdk-skeleton.exe `
        --vdev "eth_pcap0,iface=\Device\NPF_{DDD48985-A77C-4FC9-AF48-61E547C8797E}" `
        --vdev "eth_pcap1,tx_pcap=capture.pcap"

Interface name can be obtained as follows, with Wireshark installed:

    & "C:\Program Files\Wireshark\tshark.exe" -D

Implementation in "pcap_osdep_windows.c" does some guesswork to convert
between variants of an interface name. Microsoft experts and interested
users, please take a look and/or give it a try in your environment.

[1]: https://nmap.org/npcap
[2]: https://github.com/nmap/npcap/issues/299
[3]: https://mesonbuild.com/Reference-manual.html#compiler-object

v4:
    * Change libpcap discovery to work without dependent patch.
    * Fix memory leak in osdep_iface_mac_get (in v3, actually).
    * rte_os_internal.h -> rte_os_shim.h in patch 3/3.

Dmitry Kozlyuk (3):
  eal/windows: add timespec_get shim for MinGW
  net/pcap: move OS-dependent code to separate files
  net/pcap: build on Windows

 config/meson.build                            |   5 +-
 doc/guides/rel_notes/release_21_05.rst        |   4 +
 drivers/net/pcap/meson.build                  |  16 +--
 .../pcap/{rte_eth_pcap.c => pcap_ethdev.c}    | 109 +++-------------
 drivers/net/pcap/pcap_osdep.h                 |  18 +++
 drivers/net/pcap/pcap_osdep_freebsd.c         |  59 +++++++++
 drivers/net/pcap/pcap_osdep_linux.c           |  42 +++++++
 drivers/net/pcap/pcap_osdep_windows.c         | 118 ++++++++++++++++++
 lib/librte_eal/windows/include/rte_os_shim.h  |  32 +++++
 9 files changed, 304 insertions(+), 99 deletions(-)
 rename drivers/net/pcap/{rte_eth_pcap.c => pcap_ethdev.c} (95%)
 create mode 100644 drivers/net/pcap/pcap_osdep.h
 create mode 100644 drivers/net/pcap/pcap_osdep_freebsd.c
 create mode 100644 drivers/net/pcap/pcap_osdep_linux.c
 create mode 100644 drivers/net/pcap/pcap_osdep_windows.c
  

Comments

Ferruh Yigit April 16, 2021, 5:22 p.m. UTC | #1
On 4/15/2021 11:10 PM, Dmitry Kozlyuk wrote:
> Most modern and actively maintained distribution of libpcap for Windows
> is Npcap [1]. It currently doesn't provide a pkg-config file [2].
> By default it is installed to C:\Program Files\Npcap and can be located
> using standard environment variables [3]:
> 
>      $env:C_INCLUDE_PATH += ";C:\Program Files\Npcap"
>      $env:LIBRARY_PATH += ";C:\Program Files\Npcap\Lib\x64"     # MinGW
>      $env:LINK += ' /LIBPATH:"C:\Program Files\Npcap\Lib\x64"'  # Clang
> 
> The following libpcap.pc also works if placed in PKG_CONFIG_PATH:
> 
>      prefix="C:/Program Files/Npcap"
>      Name: libpcap
>      Version: 1.10
>      Description: Platform-independent network traffic capture library
>      Cflags: -I${prefix}/Include
>      Libs: -L${prefix}/Lib/x64 -lwpcap
> 
> Example of collecting packets from an interface to a file:
> 
>      .\build\examples\dpdk-skeleton.exe `
>          --vdev "eth_pcap0,iface=\Device\NPF_{DDD48985-A77C-4FC9-AF48-61E547C8797E}" `
>          --vdev "eth_pcap1,tx_pcap=capture.pcap"
> 
> Interface name can be obtained as follows, with Wireshark installed:
> 
>      & "C:\Program Files\Wireshark\tshark.exe" -D
> 
> Implementation in "pcap_osdep_windows.c" does some guesswork to convert
> between variants of an interface name. Microsoft experts and interested
> users, please take a look and/or give it a try in your environment.
> 
> [1]: https://nmap.org/npcap
> [2]: https://github.com/nmap/npcap/issues/299
> [3]: https://mesonbuild.com/Reference-manual.html#compiler-object
> 
> v4:
>      * Change libpcap discovery to work without dependent patch.
>      * Fix memory leak in osdep_iface_mac_get (in v3, actually).
>      * rte_os_internal.h -> rte_os_shim.h in patch 3/3.
> 
> Dmitry Kozlyuk (3):
>    eal/windows: add timespec_get shim for MinGW
>    net/pcap: move OS-dependent code to separate files
>    net/pcap: build on Windows
> 


Hi Dmitry,

Since the dependent patches merged, I checked/tested the set and it looks good 
to me, pcap patch already has my review tag.

But not able to test the pcap on Windows. Because if Windows & eal part of the 
patch, I am delegating it to Thomas in patchwork.

>   config/meson.build                            |   5 +-
>   doc/guides/rel_notes/release_21_05.rst        |   4 +
>   drivers/net/pcap/meson.build                  |  16 +--
>   .../pcap/{rte_eth_pcap.c => pcap_ethdev.c}    | 109 +++-------------
>   drivers/net/pcap/pcap_osdep.h                 |  18 +++
>   drivers/net/pcap/pcap_osdep_freebsd.c         |  59 +++++++++
>   drivers/net/pcap/pcap_osdep_linux.c           |  42 +++++++
>   drivers/net/pcap/pcap_osdep_windows.c         | 118 ++++++++++++++++++
>   lib/librte_eal/windows/include/rte_os_shim.h  |  32 +++++
>   9 files changed, 304 insertions(+), 99 deletions(-)
>   rename drivers/net/pcap/{rte_eth_pcap.c => pcap_ethdev.c} (95%)
>   create mode 100644 drivers/net/pcap/pcap_osdep.h
>   create mode 100644 drivers/net/pcap/pcap_osdep_freebsd.c
>   create mode 100644 drivers/net/pcap/pcap_osdep_linux.c
>   create mode 100644 drivers/net/pcap/pcap_osdep_windows.c
>
  
Thomas Monjalon April 20, 2021, 10:20 p.m. UTC | #2
> Dmitry Kozlyuk (3):
>   eal/windows: add timespec_get shim for MinGW
>   net/pcap: move OS-dependent code to separate files
>   net/pcap: build on Windows

Compilation is failing on FreeBSD 11:
http://mails.dpdk.org/archives/test-report/2021-April/188997.html
	implicit declaration of function 'timespec_get' is invalid in C99
	use of undeclared identifier 'TIME_UTC'

It should be fixed by including time.h

I cannot reproduce the issue with FreeBSD 12.
  
Dmitry Kozlyuk April 21, 2021, 2:53 p.m. UTC | #3
2021-04-21 00:20 (UTC+0200), Thomas Monjalon:
> > Dmitry Kozlyuk (3):
> >   eal/windows: add timespec_get shim for MinGW
> >   net/pcap: move OS-dependent code to separate files
> >   net/pcap: build on Windows  
> 
> Compilation is failing on FreeBSD 11:
> http://mails.dpdk.org/archives/test-report/2021-April/188997.html
> 	implicit declaration of function 'timespec_get' is invalid in C99
> 	use of undeclared identifier 'TIME_UTC'
> 
> It should be fixed by including time.h 

No, FreeBSD 11 is missing timespec_get indeed.

> I cannot reproduce the issue with FreeBSD 12.

After adding a FreeBSD 11 shim and rebasing over "main"
I get another error unrelated to the patch.
It seems FreeBSD 11 is missing pthread_setname_np() as well.

[11/1847] Compiling C object lib/librte_telemetry.a.p/telemetry_telemetry.c.o
../src/lib/telemetry/telemetry.c:445:2: warning: implicit declaration of function 'pthread_setname_np' is invalid in C99 [-Wimplicit-function-declaration]
        pthread_setname_np(t_old, "telemetry-v1");
        ^
../src/lib/telemetry/telemetry.c:474:2: warning: implicit declaration of function 'pthread_setname_np' is invalid in C99 [-Wimplicit-function-declaration]
        pthread_setname_np(t_new, "telemetry-v2");
        ^
2 warnings generated.
[60/1847] Linking target lib/librte_telemetry.so.21.2
FAILED: lib/librte_telemetry.so.21.2 
cc  -o lib/librte_telemetry.so.21.2 lib/librte_telemetry.a.p/telemetry_telemetry.c.o lib/librte_telemetry.a.p/telemetry_telemetry_data.c.o lib/librte_telemetry.a.p/telemetry_telemetry_legacy.c.o -Wl,--as-needed -Wl,--no-undefined -Wl,-O1 -shared -fPIC -Wl,--start-group -Wl,-soname,librte_telemetry.so.21 -Wl,--no-as-needed -pthread -lm -lexecinfo -Wl,--end-group -Wl,--version-script=/tmp/src/lib/telemetry/version.map
lib/librte_telemetry.a.p/telemetry_telemetry.c.o: In function `rte_telemetry_init':
telemetry.c:(.text.internal+0x15a): undefined reference to `pthread_setname_np'
telemetry.c:(.text.internal+0x24d): undefined reference to `pthread_setname_np'
cc: error: linker command failed with exit code 1 (use -v to see invocation)
  
Thomas Monjalon April 21, 2021, 6:12 p.m. UTC | #4
21/04/2021 16:53, Dmitry Kozlyuk:
> 2021-04-21 00:20 (UTC+0200), Thomas Monjalon:
> > > Dmitry Kozlyuk (3):
> > >   eal/windows: add timespec_get shim for MinGW
> > >   net/pcap: move OS-dependent code to separate files
> > >   net/pcap: build on Windows  
> > 
> > Compilation is failing on FreeBSD 11:
> > http://mails.dpdk.org/archives/test-report/2021-April/188997.html
> > 	implicit declaration of function 'timespec_get' is invalid in C99
> > 	use of undeclared identifier 'TIME_UTC'
> > 
> > It should be fixed by including time.h 
> 
> No, FreeBSD 11 is missing timespec_get indeed.
> 
> > I cannot reproduce the issue with FreeBSD 12.
> 
> After adding a FreeBSD 11 shim and rebasing over "main"
> I get another error unrelated to the patch.
> It seems FreeBSD 11 is missing pthread_setname_np() as well.
> 
> [11/1847] Compiling C object lib/librte_telemetry.a.p/telemetry_telemetry.c.o
> ../src/lib/telemetry/telemetry.c:445:2: warning: implicit declaration of function 'pthread_setname_np' is invalid in C99 [-Wimplicit-function-declaration]
>         pthread_setname_np(t_old, "telemetry-v1");
>         ^
> ../src/lib/telemetry/telemetry.c:474:2: warning: implicit declaration of function 'pthread_setname_np' is invalid in C99 [-Wimplicit-function-declaration]
>         pthread_setname_np(t_new, "telemetry-v2");
>         ^

Sorry, that's because I've merged a patch which is failing
with FreeBSD < 12.2 and I missed the CI report.

I am fixing with this patch:
https://patches.dpdk.org/project/dpdk/patch/20210421181157.1634301-1-thomas@monjalon.net/