Added a mini networking stack to the boot loader. It speaks basic ARP,
IP, and UDP, as well as a home brewn UDP based protocol, "remote disk",
which provides random access to a single remote file/device. The Open
Firmware flavored boot loader automatically initializes the net stack,
searches for a remote disk, and tries to boot from it, if the boot
device is a network device (e.g. when loading the boot loader via
TFTP).
This is quite nice for developing with a two-machine setup, since one
doesn't even need to install Haiku on the test machine anymore, but can
serve it directly from the development machine. When the networking
support in the kernel is working, this method could even be used to
fully boot, not just for loading kernel and initial modules.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15689 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-12-28 01:01:33 +03:00
|
|
|
/*
|
|
|
|
* Copyright 2005, Ingo Weinhold <bonefish@cs.tu-berlin.de>.
|
|
|
|
* All rights reserved. Distributed under the terms of the MIT License.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _BOOT_IP_H
|
|
|
|
#define _BOOT_IP_H
|
|
|
|
|
|
|
|
#include <boot/net/Ethernet.h>
|
|
|
|
|
|
|
|
class ARPService;
|
|
|
|
class IPService;
|
|
|
|
|
|
|
|
// IPSubService
|
|
|
|
class IPSubService : public NetService {
|
|
|
|
public:
|
|
|
|
IPSubService(const char *serviceName);
|
|
|
|
virtual ~IPSubService();
|
|
|
|
|
|
|
|
virtual uint8 IPProtocol() const = 0;
|
|
|
|
|
|
|
|
virtual void HandleIPPacket(IPService *ipService, ip_addr_t sourceIP,
|
|
|
|
ip_addr_t destinationIP, const void *data, size_t size) = 0;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// IPService
|
|
|
|
class IPService : public EthernetSubService {
|
|
|
|
// actually IP over ethernet
|
|
|
|
public:
|
|
|
|
IPService(EthernetService *ethernet, ARPService *arpService);
|
|
|
|
virtual ~IPService();
|
|
|
|
|
|
|
|
status_t Init();
|
|
|
|
|
|
|
|
ip_addr_t IPAddress() const;
|
|
|
|
|
|
|
|
virtual uint16 EthernetProtocol() const;
|
|
|
|
|
|
|
|
virtual void HandleEthernetPacket(EthernetService *ethernet,
|
|
|
|
const mac_addr_t &targetAddress, const void *data, size_t size);
|
|
|
|
|
|
|
|
status_t Send(ip_addr_t destination, uint8 protocol, ChainBuffer *buffer);
|
|
|
|
|
|
|
|
void ProcessIncomingPackets();
|
|
|
|
|
|
|
|
bool RegisterIPSubService(IPSubService *service);
|
|
|
|
bool UnregisterIPSubService(IPSubService *service);
|
|
|
|
|
|
|
|
virtual int CountSubNetServices() const;
|
|
|
|
virtual NetService *SubNetServiceAt(int index) const;
|
|
|
|
|
|
|
|
private:
|
|
|
|
uint16 _Checksum(const ip_header &header);
|
|
|
|
|
|
|
|
EthernetService *fEthernet;
|
|
|
|
ARPService *fARPService;
|
|
|
|
Vector<IPSubService*> fServices;
|
|
|
|
};
|
|
|
|
|
|
|
|
uint16 ip_checksum(ChainBuffer *buffer);
|
2010-02-19 19:44:55 +03:00
|
|
|
ip_addr_t ip_parse_address(const char* address);
|
Added a mini networking stack to the boot loader. It speaks basic ARP,
IP, and UDP, as well as a home brewn UDP based protocol, "remote disk",
which provides random access to a single remote file/device. The Open
Firmware flavored boot loader automatically initializes the net stack,
searches for a remote disk, and tries to boot from it, if the boot
device is a network device (e.g. when loading the boot loader via
TFTP).
This is quite nice for developing with a two-machine setup, since one
doesn't even need to install Haiku on the test machine anymore, but can
serve it directly from the development machine. When the networking
support in the kernel is working, this method could even be used to
fully boot, not just for loading kernel and initial modules.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15689 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-12-28 01:01:33 +03:00
|
|
|
|
|
|
|
|
|
|
|
#endif // _BOOT_IP_H
|