> -----Original Message----- > From: James Yonan [mailto:j...@yonan.net]
... > > etc. I believe the object spaces have been unified, and I know you > > can take a socket and pass it to, say WaitForSingleObject > and have it > > work. > They sort of did that with WSAEventSelect -- if there was a way that > WSAEventSelect could be used on the TAP device handle (as well as the > network socket), then that would be another route towards moving away > from overlapped I/O. Upon thinking about your suggestion, I think there are some problems: * SOCKETs that go to select() can be signalled in three different ways: read data available, ready to accept writes, and error (more for WSAEventSelect). Windows handles are either signalled or non-signalled, so there isn't that breakdown. I think this is internal architecture to Winsock and I don't know if it could be replicated into other systems. An interesting research project, though. I also noticed that sockets are not handles in CE, so the likelihood of select ever accepting HANDLEs directly is slim to none. There might be some funky wrapper that could be made, though again there would be research to do on that. > > the existing event architecture as-is, and I just had to make some > > specialized versions of tun_finalize, queue_read, open, close, etc. > How did you deal with getting socket.c off of overlapped I/O > (or did you > figure out a way that PocketPC can do overlapped I/O?). The latter, mostly. It was a happy confluence of events that: * Winsock implementations are required to support overlapped IO, at least through the WSA- functions, * you happily were already using the WSA- functions for the waits and get results, * the WSAEvent in CE is really a native event, and the WSAOVERLAPPED is defined the same as OVERLAPPED So it all fell into place. I had to modify tun to call my emulated overlapped io api, but this wound up being fairly a fairly surgical (i.e. not gross) change. > > I didn't bother > > doing the same with writes since they always completed immediately > > anyway once handing off to NDIS. > I would worry about assuming this unless the API guarantees it. I've > seen a few cases in the overall development of OpenVPN where assuming > that writes always complete immediately (even when totally > supported by > observed behavior) introduced subtle bugs. I'm curious if you can expound. Subtlety is not a virtue in bugs! I was going by my interpretation of the existing driver code. It seemed to me it went like: 1) IRP_MJ_CREATE comes in 2) packet is handed off to NDIS via NdisMEthIndicateReceive and finished via NdisMEthIndicateReceiveComplete 3) the IoCompleteRequest() finished the IRP under all code paths immediately So it seemed that really it was always completing immediately. And even if it wasn't, since the next time usermode queues a write it waits for the first to complete (via finalize) so it didn't seem to be a big loss to leave that call synchronous. NDIS sends the packet up the stack asynchronously already. > It's probably not essential to support control-c/keyboard > signaling -- > this feature is used mostly by developers who run OpenVPN in console > mode. Real-world usage of OpenVPN usually involves running Ah! So I'm the only one to bear the burden! Well, good to know that -- I hadn't delved that far into the openvpn architecture. Actually, the management interface sounds like it will make the future task of packaging up a PPC-relevant UI much more easy than I expected, so that's good news indeed. > The driver has quite a bit of instrumentation code to help debug/test > the DHCP handshake. Yes, now I must figure out how to interpret it. Care to take a look at the output from the driver and/or openvpn? You might can tell me immediately what it means where it might take me days to figure it out. I'll stick an excerpt at the bottom of this message. > Nobind is quite an important option, so I'm surprised that CE > wouldn't > support it. If it's really not supported on UDP sockets, it might be > possible to simulate nobind by binding to a dynamic port number (from > 49152 through 65535) and if the bind fails, retry the next > higher value. What clued me in was the docs for WSARecv which explicitly stated that the socket must be bound, so I suppose that technically it shouldn't work on NT either, but just does as a 'gift'. Again, I should be able to emulate the behavior somewhat by binding a port of 0, though for some reason this chooses between 1024 and 5000, as opposed to the high ones. The try-and-repeat you suggest should also work. > > Iftikhar: I updated the source and also I fixed the problem I > > mentioned previously about the driver not handling the > power-off state > > correctly; you can power on and off to heart's content. > > > Is this fix relevant to the 2000/XP version of the driver as > well? If > so, would you mind posting a patch that only addresses this fix? It's not relevant. The stream driver part for CE has some additional power management stuff. My doing debug file io at that time is apparently uncool. I removed that and all worked again. The NDIS power management behaves fine as-is. > Okay, a couple questions for you: > > The 2000/XP version of the driver uses the OemWin2k.inf file and > tapinstall.exe (basically a clone of devcon.exe from the DDK) > to install > and configure the TAP device nodes. What is the PocketPC way > of doing this? Pretty easy: registry keys are set up. If one wishes you can then load the driver immediately with an ioctl you send to NDIS, or you can soft-reset (sortof like 'restart windows') and it will be loaded automatically. For testing, I made a little app that adds/removes the keys and loads/unloads the driver. In a release situation this can be handled in the CAB file, and/or little app like the tapinstall.exe you mention. > 2000/XP provides the netsh utility for programmatically configuring > network devices. Does PocketPC have any equivalent utility/API? Yes and no. I'm not familiar with netsh, but understand it to have been created because it is fancier than the sundry other tools and more amenable to scripting. There is not an equivalent to this for CE. Now, the stuff like ping, route, ipconfig, etc., do exist. They don't ship with PPC because it doesn't have a console out-of-box anyway. They are findable on the internet and I have a set which I am using now. Actually I think Microsoft releases the source available -- they're pretty much all a UI to the IpHelper functions. Which, since you already have those calls in openvpn, it might obviate the necessity for an end user to worry about them. -Dave PS Oh, regarding output from my DHCP, this is what my windows box says during the last phase of negotiation: Sun Mar 26 17:36:30 2006 us=885461 TAP-WIN32 device [OpenVPN] opened: \\.\Global\{0B8E84A0-84E7-46DB-BEE7-C4B0166791E9}.tap Sun Mar 26 17:36:30 2006 us=885495 TAP-Win32 Driver Version 8.1 Sun Mar 26 17:36:30 2006 us=885512 TAP-Win32 MTU=1500 Sun Mar 26 17:36:30 2006 us=885537 Notified TAP-Win32 driver to set a DHCP IP/netmask of 10.8.0.50/255.255.255.0 on interface {0B8E84A0-84E7-46DB-BEE7-C4B0166791E9} [DHCP-serv: 10.8.0.0, lease-time: 31536000] Sun Mar 26 17:36:30 2006 us=892848 Successful ARP Flush on interface [5] {0B8E84A0-84E7-46DB-BEE7-C4B0166791E9} Sun Mar 26 17:36:30 2006 us=901492 TEST ROUTES: 0/0 succeeded len=-1 ret=0 a=0 u/d=down Sun Mar 26 17:36:30 2006 us=901537 Route: Waiting for TUN/TAP interface to come up... Sun Mar 26 17:36:32 2006 us=65631 TEST ROUTES: 0/0 succeeded len=-1 ret=0 a=0 u/d=down Sun Mar 26 17:36:32 2006 us=65678 Route: Waiting for TUN/TAP interface to come up... Sun Mar 26 17:36:33 2006 us=434239 TEST ROUTES: 0/0 succeeded len=-1 ret=1 a=0 u/d=up Sun Mar 26 17:36:33 2006 us=434277 Initialization Sequence Completed And this is what the similar section on the pocket pc says: Mon Mar 27 08:56:29 2006 us=47349 TAP-WIN32 device [TAP1:] opened: TAP1: Mon Mar 27 08:56:29 2006 us=48315 TAP-Win32 Driver Version 8.1 (DEBUG) Mon Mar 27 08:56:29 2006 us=48978 TAP-Win32 MTU=1500 Mon Mar 27 08:56:29 2006 us=49755 Notified TAP-Win32 driver to set a DHCP IP/netmask of 10.8.0.51/255.255.255.0 on interface TAP1: [DHCP-serv: 10.8.0.0, lease-time: 31536000] Mon Mar 27 08:56:29 2006 us=51431 Successful ARP Flush on interface [131074] TAP DEVICE 1 Mon Mar 27 08:56:29 2006 us=84761 TEST ROUTES: 0/0 succeeded len=-1 ret=0 a=0 u/d=down Mon Mar 27 08:56:29 2006 us=85677 Route: Waiting for TUN/TAP interface to come up... (...12 times...) Mon Mar 27 08:56:58 2006 us=389816 Initialization Sequence Completed With Errors ( see http://openvpn.net/faq.html#dhcpclientserv ) During that activity the driver is spewing out the following debug: [TAP DEVICE 1] Unhandled OID ffffff [TAP DEVICE 1] Unhandled OID 20214 [TAP DEVICE 1] Unhandled OID 20215 [TAP DEVICE 1] Unhandled OID 20215 TAP_Open; dwData = 0x00036110, dwAccess = 0xc0000000, dwShareMode = 0x00000000; inst = 0x00036110 [TAP DEVICE 1] [TAP] release [8.1] open request (m_TapOpens=0) AdapterTransmit ??? src=0:ff:2d:4b:be:28 dest=33:33:ff:4b:be:28 proto=0x86dd len=86 AdapterTransmit ??? src=0:ff:2d:4b:be:28 dest=33:33:0:0:0:2 proto=0x86dd len=62 AdapterTransmit ??? src=0:ff:2d:4b:be:28 dest=33:33:ff:4b:be:28 proto=0x86dd len=78 AdapterTransmit ??? src=0:ff:2d:4b:be:28 dest=33:33:0:0:0:2 proto=0x86dd len=70 AdapterTransmit ??? src=0:ff:2d:4b:be:28 dest=33:33:ff:4b:be:28 proto=0x86dd len=86 AdapterTransmit ??? src=0:ff:2d:4b:be:28 dest=33:33:0:0:0:2 proto=0x86dd len=70 AdapterTransmit IPv4 UDP[342] BOOTREQUEST DHCPDISCOVER 0.0.0.0:BOOTPC[0:ff:2d:4b:be:28] -> 255.255.255.255:BOOTPS[ff:ff:ff:ff:ff:ff] ch=0:ff:2d:4b:be:28 xid=0x00000ae9 ma=0x00000383 id=0x4451 ttl=128 ic=0xf554 [0x0000] uc=0x75e6 [0x0000/60] OPT.53.1.1.61.7.1.0.255.45.75.190.40.55.7.1.3.6.15.44.46.47.255.0.0.0.0.0.0. 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 DHCPMsg IPv4 UDP[304] BOOTREPLY DHCPOFFER 10.8.0.0:BOOTPS[0:ff:2f:4b:be:28] -> 255.255.255.255:BOOTPC[ff:ff:ff:ff:ff:ff] yi=10.8.0.51 si=10.8.0.0 ch=0:ff:2d:4b:be:28 xid=0x00000ae9 ma=0x00000300 ttl=16 ic=0x9fc4 [0x0000] uc=0x311e [0x0000/22] OPT.53.1.2.54.4.10.8.0.0.51.4.49.0.0.0.1.4.255.255.255.0.255 With the last pair repeated 12 times. In the short term I modified the client config to use: ifconfig 10.8.0.40 255.255.255.0 ip-win32 ipapi Which gets me further but I don't really know what I'm doing, I'm just hacking around. When those configs are used, I then get the address of 10.8.0.51. Hmmm. Shouldn't I have gotten .40? The .51 what what I originally was going to be assigned from DHCP!