/**********************************************************************/ /** Microsoft Windows/NT **/ /** Copyright(c) Microsoft Corp., 1993 **/ /**********************************************************************/ /* Nbtinfo.c This file contains the NBT Info APIs FILE HISTORY: Johnl 13-Dec-1993 Created */ #include #include #include /******************************************************************* NAME: AddrChngNotification SYNOPSIS: Notification handler called by Dhcp when an IpAddress lease has expired or changed. ENTRY: Context - Pointer to device context OldIpAddress - in network order NewIpAddress - in network order NewMask - in network order NOTES: HISTORY: Johnl 21-Dec-1993 Created ********************************************************************/ VOID AddrChngNotification( PVOID Context, ULONG OldIpAddress, ULONG NewIpAddress, ULONG NewMask ) { tDEVICECONTEXT * pDeviceContext = (tDEVICECONTEXT*) Context ; TDI_STATUS tdistatus ; NTSTATUS status ; ULONG IpBuff[4] ; UINT Size ; ULONG TmpNodeType; DbgPrint("DhcpNotification: Nbt being notified of IP Address change by DHCP\r\n") ; // // NBT assumes the address goes to zero then comes up on the new // address, so if the address is going to a new address (not to // zero first) then fake it. // if ( NewIpAddress && pDeviceContext->IpAddress ) { if ( status = NbtNewDhcpAddress( pDeviceContext, 0, 0 ) ) { CDbgPrint( DBGFLAG_ERROR, ("DhcpNotification: NbtSetNewDhcpAddress failed")) ; } } if ( NewIpAddress == 0 ) { if ( status = NbtNewDhcpAddress( pDeviceContext, 0, 0 ) ) { CDbgPrint( DBGFLAG_ERROR, ("DhcpNotification: NbtSetNewDhcpAddress failed")) ; } pDeviceContext->IpAddress = 0 ; return ; } // // Get all of the values that may change when the IP address changes. // Currently this is only NBNS (scope & broadcast address are global // NBT config parameters). // Size = sizeof( IpBuff ) ; tdistatus = DhcpQueryOption( NewIpAddress, 44, // NBNS IpBuff, &Size ) ; if ( tdistatus != TDI_SUCCESS && tdistatus != TDI_BUFFER_OVERFLOW ) { CDbgPrint( DBGFLAG_ERROR, ("DhcpNotification: Query on NBNS failed")) ; } else { if ( Size >= 4 ) pDeviceContext->lNameServerAddress = ntohl(IpBuff[0]) ; if ( Size >= 8 ) pDeviceContext->lBackupServer = ntohl(IpBuff[1]) ; } // // if the node type is set to Bnode by default then switch to Hnode if // there are any WINS servers configured. // TmpNodeType = NodeType; if ((NodeType & DEFAULT_NODE_TYPE) && (pDeviceContext->lNameServerAddress || pDeviceContext->lBackupServer)) { NodeType = MSNODE; if (TmpNodeType & PROXY) NodeType |= PROXY; } // // Now set the new IP address // status = NbtNewDhcpAddress( pDeviceContext, NewIpAddress, NewMask ) ; if ( NT_SUCCESS(status) ) { if (pDeviceContext->IpAddress) { // // Add the "permanent" name to the local name table. // status = NbtAddPermanentName(pDeviceContext); if (!(NodeType & BNODE)) { // the Ip address just changed and Dhcp may be informing // us of a new Wins Server addresses, so refresh all the // names to the new wins server // ReRegisterLocalNames(); } else { // // no need to refresh on a Bnode // LockedStopTimer(&NbtConfig.pRefreshTimer); } } } else { CDbgPrint( DBGFLAG_ERROR, ("DhcpNotification: NbtSetNewDhcpAddress failed")) ; } } /******************************************************************* NAME: CloseAddressesWithTransport SYNOPSIS: Closes address objects on the passed in device ENTRY: pDeviceContext - Device context to close NOTES: Used after an IP address loses its DHCP lease by OS independent code. HISTORY: Johnl 13-Dec-1993 Created ********************************************************************/ NTSTATUS CloseAddressesWithTransport( IN tDEVICECONTEXT *pDeviceContext ) { TDI_REQUEST Request ; NTSTATUS status; if (pDeviceContext->pDgramFileObject) { Request.Handle.AddressHandle = pDeviceContext->pDgramFileObject ; if ( TdiVxdCloseAddress( &Request )) CDbgPrint( DBGFLAG_ERROR, ("NbtSetInfo: Warning - CloseAddress Failed\r\n")) ; pDeviceContext->pDgramFileObject = NULL; } if (pDeviceContext->pNameServerFileObject) { Request.Handle.AddressHandle = pDeviceContext->pNameServerFileObject ; if ( TdiVxdCloseAddress( &Request )) CDbgPrint( DBGFLAG_ERROR, ("NbtSetInfo: Warning - CloseAddress Failed\r\n")) ; pDeviceContext->pNameServerFileObject = NULL; } if (pDeviceContext->pSessionFileObject) { Request.Handle.AddressHandle = pDeviceContext->pSessionFileObject ; if ( TdiVxdCloseAddress( &Request )) CDbgPrint( DBGFLAG_ERROR, ("NbtSetInfo: Warning - CloseAddress Failed\r\n")) ; pDeviceContext->pSessionFileObject = NULL; } if (pDeviceContext->hBroadcastAddress) { Request.Handle.ConnectionContext = pDeviceContext->hBroadcastAddress ; status = NbtCloseAddress( &Request, NULL, pDeviceContext, NULL ); if ( !NT_SUCCESS(status) ) { CDbgPrint( DBGFLAG_ERROR, ("NbtSetInfo: Warning - Close Broadcast Address Failed\r\n")) ; ASSERT(0); } } return STATUS_SUCCESS ; }