/*++ Copyright (c) 2001-2002 Microsoft Corporation Module Name: elip6.c Abstract: This module contains the interface to the IPv6 stack. Required, since the IPv6 stack needs restart its protocol mechanisms on the link once authentication succeeds. Author: Mohit Talwar (mohitt) Fri Apr 20 12:05:23 2001 --*/ #include "pcheapol.h" #pragma hdrstop // // Ip6RenewInterface // // Description: // // Function called from within FSMAutheticated i.e. once authentication // has completed successfully. The IPv6 stack is instructed to restart // its protocol mechanism on the indicated interface. // // Arguments: // pwszInterface - Adapter name (GUID identifying the interface). // // Return values: // NO_ERROR on success, Error code o/w. // DWORD Ip6RenewInterface ( IN WCHAR *pwszInterface ) { HANDLE hIp6Device; IPV6_QUERY_INTERFACE Query; UINT BytesReturned; DWORD dwError = NO_ERROR; do { // We could make the hIp6Device handle a global/static variable. // The first successful call to CreateFileW in Ip6RenewInterface // would initialize it with a handle to the IPv6 Device. This would // be used for all subsequent DeviceIoControl requests. // // Since this function is not called in a thread safe environment, // we would need to perform an InterlockedCompareExchange after // calling CreateFileW. This is needed to ensure that no handles // are leaked. Also, since this service would have an open handle // to tcpip6.sys, we would not be able to unload that driver. // // For now, however, we keep things simple and open and close this // handle every time Ip6RenewInterface is called. hIp6Device = CreateFileW( WIN_IPV6_DEVICE_NAME, GENERIC_WRITE, // requires administrator privileges FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, // security attributes OPEN_EXISTING, 0, // flags & attributes NULL); // template file if (hIp6Device == INVALID_HANDLE_VALUE) { dwError = GetLastError(); TRACE1 (ANY, "Ip6RenewInterface: CreateFileW failed with error %ld", dwError); break; } // Pretend as though the interface was reconnected. This causes // IPv6 to resend Router Solicitation|Advertisement, Multicast // Listener Discovery, and Duplicate Address Detection messages. Query.Index = 0; if ((dwError = ElGuidFromString (&(Query.Guid), pwszInterface)) != NO_ERROR) { TRACE1 (ANY, "Ip6RenewInterface: ElGuidFromString failed with error %ld", dwError); break; } if (!DeviceIoControl( hIp6Device, IOCTL_IPV6_RENEW_INTERFACE, &Query, sizeof Query, NULL, 0, &BytesReturned, NULL)) { dwError = GetLastError(); TRACE1 (ANY, "Ip6RenewInterface: DeviceIoControl failed with error %ld", dwError); break; } } while (FALSE); if (hIp6Device != INVALID_HANDLE_VALUE) { CloseHandle(hIp6Device); } return dwError; }