Determine client IP address and make it known to the ethernet interface.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@19634 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -100,12 +100,32 @@ status_t
|
|||||||
UNDI::Init()
|
UNDI::Init()
|
||||||
{
|
{
|
||||||
TRACE("UNDI::Init\n");
|
TRACE("UNDI::Init\n");
|
||||||
|
|
||||||
|
PXENV_GET_CACHED_INFO cached_info;
|
||||||
PXENV_UNDI_GET_INFORMATION get_info;
|
PXENV_UNDI_GET_INFORMATION get_info;
|
||||||
PXENV_UNDI_GET_STATE get_state;
|
PXENV_UNDI_GET_STATE get_state;
|
||||||
PXENV_UNDI_OPEN undi_open;
|
PXENV_UNDI_OPEN undi_open;
|
||||||
uint16 res;
|
uint16 res;
|
||||||
|
|
||||||
|
cached_info.PacketType = PXENV_PACKET_TYPE_CACHED_REPLY;
|
||||||
|
cached_info.BufferSize = 0;
|
||||||
|
cached_info.BufferLimit = 0;
|
||||||
|
cached_info.Buffer.seg = 0;
|
||||||
|
cached_info.Buffer.ofs = 0;
|
||||||
|
res = call_pxe_bios(fPxeData, GET_CACHED_INFO, &cached_info);
|
||||||
|
if (res != 0 || get_state.Status != 0) {
|
||||||
|
TRACE("PXENV_GET_CACHED_INFO failed, res %x, status %x\n", res, undi_open.Status);
|
||||||
|
panic("Can't determine our IP address\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
char *buf = (char *)(cached_info.Buffer.seg * 16 + cached_info.Buffer.ofs);
|
||||||
|
ip_addr_t ipClient = ntohl(*(ip_addr_t *)(buf + 16));
|
||||||
|
ip_addr_t ipServer = ntohl(*(ip_addr_t *)(buf + 20));
|
||||||
|
|
||||||
|
TRACE("client-ip: %08x, server-ip: %08x\n", (int)ipClient, (int)ipServer);
|
||||||
|
|
||||||
|
SetIPAddress(ipClient);
|
||||||
|
|
||||||
undi_open.OpenFlag = 0;
|
undi_open.OpenFlag = 0;
|
||||||
undi_open.PktFilter = FLTR_DIRECTED | FLTR_BRDCST | FLTR_PRMSCS;
|
undi_open.PktFilter = FLTR_DIRECTED | FLTR_BRDCST | FLTR_PRMSCS;
|
||||||
undi_open.R_Mcast_Buf.MCastAddrCount = 0;
|
undi_open.R_Mcast_Buf.MCastAddrCount = 0;
|
||||||
|
|||||||
@@ -14,6 +14,8 @@ extern "C" uint16 call_pxe_bios(void *pxe, uint16 opcode, void *param);
|
|||||||
#define UNDI_ISR 0x0014
|
#define UNDI_ISR 0x0014
|
||||||
#define UNDI_GET_STATE 0x0015
|
#define UNDI_GET_STATE 0x0015
|
||||||
|
|
||||||
|
#define GET_CACHED_INFO 0x0071
|
||||||
|
|
||||||
#define SEG(ptr) ((uint16)(((uint32)(ptr)) >> 4))
|
#define SEG(ptr) ((uint16)(((uint32)(ptr)) >> 4))
|
||||||
#define OFS(ptr) (((uint16)(ptr)) & 15)
|
#define OFS(ptr) (((uint16)(ptr)) & 15)
|
||||||
|
|
||||||
@@ -60,6 +62,18 @@ struct PXE_STRUCT
|
|||||||
SEGDESC BC_CodeWrite;
|
SEGDESC BC_CodeWrite;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct PXENV_GET_CACHED_INFO
|
||||||
|
{
|
||||||
|
uint16 Status;
|
||||||
|
uint16 PacketType;
|
||||||
|
#define PXENV_PACKET_TYPE_DHCP_DISCOVER 1
|
||||||
|
#define PXENV_PACKET_TYPE_DHCP_ACK 2
|
||||||
|
#define PXENV_PACKET_TYPE_CACHED_REPLY 3
|
||||||
|
uint16 BufferSize;
|
||||||
|
SEGOFF16 Buffer;
|
||||||
|
uint16 BufferLimit;
|
||||||
|
};
|
||||||
|
|
||||||
struct PXENV_UNDI_MCAST_ADDRESS
|
struct PXENV_UNDI_MCAST_ADDRESS
|
||||||
{
|
{
|
||||||
#define MAXNUM_MCADDR 8
|
#define MAXNUM_MCADDR 8
|
||||||
|
|||||||
Reference in New Issue
Block a user