summaryrefslogtreecommitdiffstats
path: root/private/ntos/nbt/vxd/nbtinfo.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/ntos/nbt/vxd/nbtinfo.c')
-rw-r--r--private/ntos/nbt/vxd/nbtinfo.c227
1 files changed, 227 insertions, 0 deletions
diff --git a/private/ntos/nbt/vxd/nbtinfo.c b/private/ntos/nbt/vxd/nbtinfo.c
new file mode 100644
index 000000000..ad267685f
--- /dev/null
+++ b/private/ntos/nbt/vxd/nbtinfo.c
@@ -0,0 +1,227 @@
+/**********************************************************************/
+/** 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 <nbtprocs.h>
+#include <dhcpinfo.h>
+#include <nbtinfo.h>
+
+/*******************************************************************
+
+ 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 ;
+}
+
+