/*++ Copyright (c) 1997 Microsoft Corporation Module Name: netfs.h Abstract: This module defines globally used procedure and data structures used by net boot. Author: Chuck Lenzmeier (chuckl) 09-Jan-1997 Revision History: --*/ #ifndef _NETFS_ #define _NETFS_ #include // // Progress bar update function // VOID BlUpdateProgressBar( ULONG fPercentage ); ////////////////////////////////////////////////////////////////////////////// // // ROM layer definitions. // ////////////////////////////////////////////////////////////////////////////// extern UCHAR NetLocalHardwareAddress[16]; extern USHORT NetUnicastUdpDestinationPort; #if 0 extern USHORT NetMulticastUdpDestinationPort; extern ULONG NetMulticastUdpDestinationAddress; extern USHORT NetMulticastUdpSourcePort; extern ULONG NetMulticastUdpSourceAddress; #endif VOID RomSetBroadcastStatus( BOOLEAN Enable ); VOID RomSetReceiveStatus ( IN USHORT UnicastUdpDestinationPort #if 0 , IN USHORT MulticastUdpDestinationPort, IN ULONG MulticastUdpDestinationAddress, IN USHORT MulticastUdpSourcePort, IN ULONG MulticastUdpSourceAddress #endif ); ULONG RomSendUdpPacket ( IN PVOID Buffer, IN ULONG Length, IN ULONG RemoteHost, IN USHORT RemotePort ); ULONG RomReceiveUdpPacket ( IN PVOID Buffer, IN ULONG Length, IN ULONG Timeout, OUT PULONG RemoteHost, OUT PUSHORT RemotePort ); ULONG RomGetNicType ( OUT t_PXENV_UNDI_GET_NIC_TYPE *NicType ); ULONG RomMtftpReadFile ( IN PUCHAR FileName, IN PVOID Buffer, IN ULONG BufferLength, IN ULONG ServerIPAddress, // network byte order IN ULONG MCastIPAddress, // network byte order IN USHORT MCastCPort, // network byte order IN USHORT MCastSPort, // network byte order IN USHORT Timeout, IN USHORT Delay, OUT PULONG DownloadSize ); ////////////////////////////////////////////////////////////////////////////// // // TFTP layer definitions. // ////////////////////////////////////////////////////////////////////////////// typedef struct _TFTP_REQUEST { PUCHAR RemoteFileName; ULONG ServerIpAddress; PUCHAR MemoryAddress; ULONG MaximumLength; ULONG BytesTransferred; USHORT Operation; #if defined(REMOTE_BOOT_SECURITY) ULONG SecurityHandle; #endif // defined(REMOTE_BOOT_SECURITY) TYPE_OF_MEMORY MemoryType; // If TRUE will update the progress bar BOOLEAN ShowProgress; } TFTP_REQUEST, *PTFTP_REQUEST; NTSTATUS TftpInit ( VOID ); NTSTATUS TftpGetPut ( IN PTFTP_REQUEST Request ); #if defined(REMOTE_BOOT_SECURITY) NTSTATUS TftpLogin ( IN PUCHAR Domain, IN PUCHAR Name, IN PUCHAR OwfPassword, IN ULONG ServerIpAddress, OUT PULONG LoginHandle ); NTSTATUS TftpLogoff ( IN ULONG ServerIpAddress, IN ULONG LoginHandle ); NTSTATUS TftpSignString ( IN PUCHAR String, OUT PUCHAR * Sign, OUT ULONG * SignLength ); #endif // defined(REMOTE_BOOT_SECURITY) // // This file contains the definitions for the TFTP connection control // block, which contains all the information pertaining to a connection. // A conn structure is allocated at connection open time and retained // until the connection is closed. The routines in the file conn.c // are sufficient for dealing with connections. // It also contains the structure definition for tftp packets. // // // Connection control block. // typedef struct _CONNECTION { ULONG BlockSize; // block size for transfer PVOID LastSentPacket; // previous packet sent ULONG LastSentLength; // size of previous packet ULONG NextRetransmit; // when to retransmit ULONG Retransmissions; // number of retransmits ULONG Timeout; // retransmit timeout PVOID CurrentPacket; // current packet (send or rcv) ULONG CurrentLength; // current packet len PVOID LastReceivedPacket; // last received packet ULONG LastReceivedLength; // size of last rcvd. packet ULONG RemoteHost; // remote host IP address USHORT RemotePort; // remote port for connection USHORT LocalPort; // local port for connection USHORT Operation; // direction of transfer USHORT BlockNumber; // next block number BOOLEAN Synced; // conn synchronized flag } CONNECTION, *PCONNECTION; #include #define ETHERNET_ADDRESS_LENGTH 6 #define COPY_ETHERNET_ADDRESS(_d,_s) RtlCopyMemory( (_d), (_s), ETHERNET_ADDRESS_LENGTH ); #define COPY_IP_ADDRESS(_d,_s) RtlCopyMemory( (_d), (_s), sizeof(ULONG) ) #define COMPARE_IP_ADDRESSES(_a,_b) RtlEqualMemory( (_a), (_b), sizeof(ULONG) ) typedef struct _TFTP_HEADER { USHORT Opcode; // packet type USHORT BlockNumber; // block number } TFTP_HEADER, *PTFTP_HEADER; typedef struct _TFTP_PACKET { TFTP_HEADER ; UCHAR Data[1]; } TFTP_PACKET, *PTFTP_PACKET; #include // // Connection constants. // #define TFTP_PORT 0x4500 // big-endian 69 #define TIMEOUT 1 // initial retransmit timeout #define INITIAL_TIMEOUT 1 // initial connection timeout #define MAX_TIMEOUT 8 // max. retransmit timeout #define MAX_RETRANS 8 // max. no. of retransmits #define DEFAULT_BLOCK_SIZE 1432 // size of data portion of tftp pkt // // ideally this should be the commented out size. But we overload the // use of this constant to also be the size we use for udp receives. // Since we can receive larger packets than this when we get the driver // info packet, we need to bump up this buffer size. ideally we would // allocate enough space at runtime, but this is a safer fix at this point // in the product. // //#define MAXIMUM_TFTP_PACKET_LENGTH (sizeof(TFTP_HEADER) + DEFAULT_BLOCK_SIZE) #define MAXIMUM_TFTP_PACKET_LENGTH (4096) #define SWAP_WORD(_w) (USHORT)((((_w) << 8) & 0xff00) | (((_w) >> 8) & 0x00ff)) #define SWAP_DWORD(_dw) (ULONG)((((_dw) << 24) & 0xff000000) | \ (((_dw) << 8) & 0x00ff0000) | \ (((_dw) >> 8) & 0x0000ff00) | \ (((_dw) >> 24) & 0x000000ff)) // // Packet types. // // N.B. The constants below are defined as big-endian USHORTs. // #define TFTP_RRQ 0x0100 // Read Request #define TFTP_WRQ 0x0200 // Write Request #define TFTP_DATA 0x0300 // Data block #define TFTP_DACK 0x0400 // Data Acknowledge #define TFTP_ERROR 0x0500 // Error #define TFTP_OACK 0x0600 // Options Acknowledge // // Values for error codes in ERROR packets. // // N.B. The constants below are defined as big-endian USHORTs. // #define TFTP_ERROR_UNDEFINED 0x0000 #define TFTP_ERROR_FILE_NOT_FOUND 0x0100 #define TFTP_ERROR_ACCESS_VIOLATION 0x0200 #define TFTP_ERROR_DISK_FULL 0x0300 #define TFTP_ERROR_ILLEGAL_OPERATION 0x0400 #define TFTP_ERROR_UNKNOWN_TRANSFER_ID 0x0500 #define TFTP_ERROR_FILE_EXISTS 0x0600 #define TFTP_ERROR_NO_SUCH_USER 0x0700 #define TFTP_ERROR_OPTION_NEGOT_FAILED 0x0800 // // Global variables. // extern CONNECTION NetTftpConnection; extern UCHAR NetTftpPacket[3][MAXIMUM_TFTP_PACKET_LENGTH]; // // External declarations. // NTSTATUS ConnInitialize ( OUT PCONNECTION *Connection, IN USHORT Operation, IN ULONG RemoteHost, IN USHORT RemotePort, IN PUCHAR Filename, IN ULONG BlockSize, #if defined(REMOTE_BOOT_SECURITY) IN OUT PULONG SecurityHandle, #endif // defined(REMOTE_BOOT_SECURITY) IN OUT PULONG FileSize ); NTSTATUS ConnReceive ( IN PCONNECTION Connection, OUT PTFTP_PACKET *Packet ); PTFTP_PACKET ConnPrepareSend ( IN PCONNECTION Connection ); VOID ConnAck ( IN PCONNECTION Connection ); VOID ConnSendPacket ( IN PCONNECTION Connection, IN PVOID Packet, IN ULONG Length ); NTSTATUS ConnWait ( IN PCONNECTION Connection, IN USHORT Opcode, OUT PTFTP_PACKET *Packet OPTIONAL ); BOOLEAN ConnRetransmit ( IN PCONNECTION Connection, IN BOOLEAN Timeout ); NTSTATUS ConnSend ( IN PCONNECTION Connection, IN ULONG Length ); NTSTATUS ConnWaitForFinalAck ( IN PCONNECTION Connection ); VOID ConnError ( PCONNECTION Connection, ULONG RemoteHost, USHORT RemotePort, USHORT ErrorCode, PUCHAR ErrorMessage ); ULONG ConnSafeAtol ( IN PUCHAR Buffer, IN PUCHAR BufferEnd ); ULONG ConnItoa ( IN ULONG Value, OUT PUCHAR Buffer ); // // UDP definitions. // extern USHORT UdpUnicastDestinationPort; USHORT UdpAssignUnicastPort ( VOID ); #if 0 VOID UdpSetMulticastPort ( IN USHORT DestinationPort, IN ULONG DestinationAddress, IN USHORT SourcePort, IN ULONG SourceAddress ); #endif ULONG UdpReceive ( IN PVOID Buffer, IN ULONG BufferLength, OUT PULONG RemoteHost, OUT PUSHORT RemotePort, IN ULONG Timeout ); ULONG UdpSend ( IN PVOID Buffer, IN ULONG BufferLength, IN ULONG RemoteHost, IN USHORT RemotePort ); ULONG tcpxsum ( IN ULONG cksum, IN PUCHAR buf, IN ULONG len ); #define SysGetRelativeTime ArcGetRelativeTime ////////////////////////////////////////////////////////////////////////////// // // Debugging package definitions. // ////////////////////////////////////////////////////////////////////////////// #if DBG extern ULONG NetDebugFlag; #define DEBUG_ERROR 0x00000001 #define DEBUG_CONN_ERROR 0x00000002 #define DEBUG_LOUD 0x00000004 #define DEBUG_REAL_LOUD 0x00000008 #define DEBUG_STATISTICS 0x00000010 #define DEBUG_SEND_RECEIVE 0x00000020 #define DEBUG_TRACE 0x00000040 #define DEBUG_ARP 0x00000080 #define DEBUG_OSC 0x00000100 #define DEBUG_INITIAL_BREAK 0x80000000 #undef IF_DEBUG #define IF_DEBUG(_f) if ( (NetDebugFlag & DEBUG_ ## _f) != 0 ) #define DPRINT(_f,_a) IF_DEBUG(_f) DbgPrint _a #define DEBUG if ( TRUE ) #else // DBG #undef IF_DEBUG #define IF_DEBUG(_f) if ( FALSE ) #define DPRINT(_f,_a) #define DEBUG if ( FALSE ) #endif // else DBG #endif // _NETFS_