462 lines
10 KiB
C
462 lines
10 KiB
C
|
/*++
|
||
|
|
||
|
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_
|