From 17836de1fed2439fd35ed3468f5b6c96e43b8723 Mon Sep 17 00:00:00 2001 From: Nick Banks Date: Thu, 27 Oct 2016 13:58:55 -0700 Subject: [PATCH] Add a README.md for Windows (#895) * Initial readme changes * Update image --- doc/images/windows_design.png | Bin 0 -> 59500 bytes examples/drivers/windows/README.md | 115 +++++++++++++++++++++++++++++ 2 files changed, 115 insertions(+) create mode 100644 doc/images/windows_design.png create mode 100644 examples/drivers/windows/README.md diff --git a/doc/images/windows_design.png b/doc/images/windows_design.png new file mode 100644 index 0000000000000000000000000000000000000000..bfd3e4eed50135346278d7c04b268af75bf1a8b8 GIT binary patch literal 59500 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 Z%=4Pf`(GCLfyX4QkK0>T9y|BT{{nL%u*CoX literal 0 HcmV?d00001 diff --git a/examples/drivers/windows/README.md b/examples/drivers/windows/README.md new file mode 100644 index 000000000..e475f71a3 --- /dev/null +++ b/examples/drivers/windows/README.md @@ -0,0 +1,115 @@ +# OpenThread on Windows # + +These components are the building blocks to get OpenThread integrated into the Windows +networking stack and provide an interface for applications to control it. + +## Architecture ## + +[ndis]: https://msdn.microsoft.com/en-us/windows/hardware/drivers/network/ndis-drivers +[lwf]: https://msdn.microsoft.com/en-us/windows/hardware/drivers/network/ndis-filter-drivers +[miniport]: https://msdn.microsoft.com/en-us/windows/hardware/drivers/network/ndis-miniport-drivers2 +[ioctl]: https://msdn.microsoft.com/en-us/library/windows/desktop/aa363219(v=vs.85).aspx +[oid]: https://msdn.microsoft.com/en-us/library/windows/hardware/ff566707(v=vs.85).aspx +[nbl]: https://msdn.microsoft.com/en-us/windows/hardware/drivers/network/net-buffer-architecture + +![Windows Architecture](../../../doc/images/windows_design.png) + +This design allows for support of both simple radio devices and devices running the complete +OpenThread stack. + +### otApi.dll ### + +This is the dynamic libray for applications to control the OpenThread stack from user mode. It +exposes all the control path APIs from `openthread.h`. It interfaces with the driver by the use +of [IOCTL][ioctl]s. The IOCTLs allow otApi.dll to serialize and send commands, and poll for notifications, +which can then be returned back to the client. + +### otLwf.sys ### + +This is where most of the real logic lives. `otLwf.sys` is an [NDIS][ndis] Light Weight Filter ([LWF][lwf]) driver. +It plugs into the networking stack, binding to a protocol driver (TCPIP) at the top, and an NDIS [Miniport][miniport] +at the bottom. It's job is to take IPv6 packets from TCPIP and pass the necessary data down to the Miniport +in order to send the packets out over the network. + +`otLwf.sys` supports operating in two modes: Full Stack and Tunnel. Full Stack mode is where OpenThread is +running on the host (in Windows) and a simple radio device is connected externally. Tunnel mode is where +OpenThread is running on the external device and Windows is merely a pass through for commands and packets. + +In Full Stack mode, `otLwf.sys` hosts the OpenThread core library and manages serializing all Windows +networking inputs to the OpenThread APIs. It maintains one dedicated worker thread for running all +OpenThread related logic, including IOCTL commands, data packets, and basic OpenThread processing logic. +`otLwf.sys` uses [OID][oid]s to send control path commands (channel, panid, etc.) and [NBL][nbl]s to send and +receive the 802.15.4 data packets to/from the miniport. The miniport then passes this information, in the +proper format, off to the radio device. + +In Tunnel mode, `otLwf.sys` mainly just manages the serialization of Windows networking inputs to +Spinel commands (and back). The Spinel commands are passed down (in [NBL][nbl]s) to the miniport which will then pass +the commands (correctly encoded) to whatever device is externally connected. + +### 802.15.4 PHY Miniport ### + +This is the component responsible for taking the [OID][oid]s and [NBL][nbl]s from `otLwf.sys` and sending the +information down to the matching 802.15.4 PHY Device, in the proper format. In other words, it's job is mainly +handling the arrival/removal of the physical device and serialization of the info in the proper format for +the device it's paired with. + +### Thread Miniport ### + +This is the component for taking the [NBL][nbl]s, containing Spinel commands, from `otLwf.sys` and sending them +down to the matching OpenThread (NCP) Device. Again, like the PHY miniport, it's job is handling device arrival/removal +and command serialization. + +### 802.15.4 PHY Device ### + +This is a 'simple' device, exposing a mostly PHY layer interface (with a few MAC layer constructs). + +### OpenThread (NCP) Device ### + +This is a 'full solution' device, that exposes the entire OpenThread interface via NCP. + +## Build ## + +Open the Visual Studio Solution `openthread.sln` under `etc\visual-studio` and then pick the +configuration and platform you wish to build for. For instance, `Release` and `x64`. Build +the whole solution (F6). This will output the files here: + +``` +build\bin\\ +``` + +## Install ## + +### Filter Driver ### + +1. Copy the following files to a temporary location on the target machine: + +``` +build\bin\\\sys\otLwf.cer +build\bin\\\sys\otLwf\otLwf.cat +build\bin\\\sys\otLwf\otLwf.inf +build\bin\\\sys\otLwf\otLwf.sys +``` + +2. Open an admin command prompt in the location of the temporary files. + +3. Install the certificate to the root and TrustedPublisher store by running: + +``` +certutil -addstore root otLwf.cer +certutil -addstore TrustedPublisher otLwf.cer +``` + +4. Install the driver by running: + +``` +netcfg.exe -v -l otlwf.inf -c s -i otLwf +``` + +### Miniport Driver ### + +`TODO` + +## Controlling OpenThread from an Application ## + +`TODO` +