windows-nt/Source/XPSP1/NT/base/boot/inc/netfs.h

462 lines
10 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
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 <undi_api.h>
//
// 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 <packon.h>
#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 <packoff.h>
//
// 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_