- DHCP extcode BOOTPOPT_IP_ADDRESS_LEASE_TIME now supported
- DHCP reply parameter BOOTPOPT_ROUTER_OPTION implemented - vnet host name for DHCP added - more accurate send / receive timing - improved error messages - vnet description in bochsrc sample added (SF patch #888426)
This commit is contained in:
parent
11c81a46eb
commit
f1816bb226
@ -569,6 +569,15 @@ private_colormap: enabled=0
|
|||||||
# This is mainly useful for the tun/tap devices that only exist during
|
# This is mainly useful for the tun/tap devices that only exist during
|
||||||
# Bochs execution. The network interface name is supplied to the script
|
# Bochs execution. The network interface name is supplied to the script
|
||||||
# as first parameter
|
# as first parameter
|
||||||
|
#
|
||||||
|
# If you don't want to make connections to any physical networks,
|
||||||
|
# you can use the following 'ethmod's to simulate a virtual network.
|
||||||
|
# null: All packets are discarded, but logged to a few files.
|
||||||
|
# arpback: ARP is simulated. Disabled by default.
|
||||||
|
# vnet: ARP, ICMP-echo(ping) and DHCP are simulated.
|
||||||
|
# The virtual host uses 192.168.10.1.
|
||||||
|
# DHCP assignes 192.168.10.2 to the guest.
|
||||||
|
#
|
||||||
#=======================================================================
|
#=======================================================================
|
||||||
# ne2k: ioaddr=0x240, irq=9, mac=fe:fd:00:00:00:01, ethmod=fbsd, ethdev=en0 #macosx
|
# ne2k: ioaddr=0x240, irq=9, mac=fe:fd:00:00:00:01, ethmod=fbsd, ethdev=en0 #macosx
|
||||||
# ne2k: ioaddr=0x240, irq=9, mac=b0:c4:20:00:00:00, ethmod=fbsd, ethdev=xl0
|
# ne2k: ioaddr=0x240, irq=9, mac=b0:c4:20:00:00:00, ethmod=fbsd, ethdev=xl0
|
||||||
@ -576,6 +585,8 @@ private_colormap: enabled=0
|
|||||||
# ne2k: ioaddr=0x240, irq=9, mac=b0:c4:20:00:00:01, ethmod=win32, ethdev=MYCARD
|
# ne2k: ioaddr=0x240, irq=9, mac=b0:c4:20:00:00:01, ethmod=win32, ethdev=MYCARD
|
||||||
# ne2k: ioaddr=0x240, irq=9, mac=fe:fd:00:00:00:01, ethmod=tap, ethdev=tap0
|
# ne2k: ioaddr=0x240, irq=9, mac=fe:fd:00:00:00:01, ethmod=tap, ethdev=tap0
|
||||||
# ne2k: ioaddr=0x240, irq=9, mac=fe:fd:00:00:00:01, ethmod=tuntap, ethdev=/dev/net/tun0, script=./tunconfig
|
# ne2k: ioaddr=0x240, irq=9, mac=fe:fd:00:00:00:01, ethmod=tuntap, ethdev=/dev/net/tun0, script=./tunconfig
|
||||||
|
# ne2k: ioaddr=0x240, irq=9, mac=b0:c4:20:00:00:01, ethmod=null, ethdev=eth0
|
||||||
|
# ne2k: ioaddr=0x240, irq=9, mac=b0:c4:20:00:00:01, ethmod=vnet, ethdev=eth0
|
||||||
|
|
||||||
#=======================================================================
|
#=======================================================================
|
||||||
# KEYBOARD_MAPPING:
|
# KEYBOARD_MAPPING:
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
// $Id: eth_vnet.cc,v 1.5 2004-09-05 10:30:18 vruppert Exp $
|
// $Id: eth_vnet.cc,v 1.6 2004-09-11 11:26:41 vruppert Exp $
|
||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// virtual Ethernet locator
|
// virtual Ethernet locator
|
||||||
@ -8,6 +8,7 @@
|
|||||||
// Virtual host acts as a DHCP server for guest.
|
// Virtual host acts as a DHCP server for guest.
|
||||||
// There are no connections between the virtual host and real ethernets.
|
// There are no connections between the virtual host and real ethernets.
|
||||||
//
|
//
|
||||||
|
// Virtual host name: vnet
|
||||||
// Virtual host IP: 192.168.10.1
|
// Virtual host IP: 192.168.10.1
|
||||||
// Guest IP: 192.168.10.2
|
// Guest IP: 192.168.10.2
|
||||||
// Guest netmask: 255.255.255.0
|
// Guest netmask: 255.255.255.0
|
||||||
@ -25,8 +26,6 @@
|
|||||||
|
|
||||||
#define BX_ETH_VNET_LOGGING 1
|
#define BX_ETH_VNET_LOGGING 1
|
||||||
|
|
||||||
#define BX_PACKET_POLL 1000 // Poll for a frame every 1000 usecs
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
// handler to send/receive packets
|
// handler to send/receive packets
|
||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
@ -171,6 +170,7 @@ private:
|
|||||||
static void rx_timer_handler(void *);
|
static void rx_timer_handler(void *);
|
||||||
void rx_timer(void);
|
void rx_timer(void);
|
||||||
int rx_timer_index;
|
int rx_timer_index;
|
||||||
|
unsigned tx_time;
|
||||||
|
|
||||||
#if BX_ETH_VNET_LOGGING
|
#if BX_ETH_VNET_LOGGING
|
||||||
FILE *pktlog_txt;
|
FILE *pktlog_txt;
|
||||||
@ -265,7 +265,7 @@ bx_vnet_pktmover_c::pktmover_init(
|
|||||||
register_layer4_handler(0x11,INET_PORT_BOOTP_SERVER,udpipv4_dhcp_handler);
|
register_layer4_handler(0x11,INET_PORT_BOOTP_SERVER,udpipv4_dhcp_handler);
|
||||||
|
|
||||||
this->rx_timer_index =
|
this->rx_timer_index =
|
||||||
bx_pc_system.register_timer(this, this->rx_timer_handler, BX_PACKET_POLL,
|
bx_pc_system.register_timer(this, this->rx_timer_handler, 1000,
|
||||||
0, 0, "eth_vnet");
|
0, 0, "eth_vnet");
|
||||||
|
|
||||||
#if BX_ETH_VNET_LOGGING
|
#if BX_ETH_VNET_LOGGING
|
||||||
@ -306,6 +306,7 @@ bx_vnet_pktmover_c::guest_to_host(const Bit8u *buf, unsigned io_len)
|
|||||||
fflush (pktlog_txt);
|
fflush (pktlog_txt);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
this->tx_time = (64 + 96 + 4 * 8 + io_len * 8) / 10;
|
||||||
if ((io_len >= 14) &&
|
if ((io_len >= 14) &&
|
||||||
(!memcmp(&buf[6],&this->guest_macaddr[0],6)) &&
|
(!memcmp(&buf[6],&this->guest_macaddr[0],6)) &&
|
||||||
(!memcmp(&buf[0],&this->host_macaddr[0],6) ||
|
(!memcmp(&buf[0],&this->host_macaddr[0],6) ||
|
||||||
@ -369,7 +370,8 @@ bx_vnet_pktmover_c::host_to_guest(Bit8u *buf, unsigned io_len)
|
|||||||
|
|
||||||
packet_len = io_len;
|
packet_len = io_len;
|
||||||
memcpy(&packet_buffer, &buf[0], io_len);
|
memcpy(&packet_buffer, &buf[0], io_len);
|
||||||
bx_pc_system.activate_timer(this->rx_timer_index, BX_PACKET_POLL, 0);
|
unsigned rx_time = (64 + 96 + 4 * 8 + io_len * 8) / 10;
|
||||||
|
bx_pc_system.activate_timer(this->rx_timer_index, this->tx_time + rx_time + 100, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
@ -766,10 +768,13 @@ bx_vnet_pktmover_c::udpipv4_dhcp_handler_ns(
|
|||||||
const Bit8u *extdata;
|
const Bit8u *extdata;
|
||||||
unsigned dhcpmsgtype = 0;
|
unsigned dhcpmsgtype = 0;
|
||||||
bx_bool found_serverid = false;
|
bx_bool found_serverid = false;
|
||||||
|
bx_bool found_leasetime = false;
|
||||||
|
Bit32u leasetime = BX_MAX_BIT32U;
|
||||||
const Bit8u *dhcpreqparams = NULL;
|
const Bit8u *dhcpreqparams = NULL;
|
||||||
unsigned dhcpreqparams_len = 0;
|
unsigned dhcpreqparams_len = 0;
|
||||||
Bit8u dhcpreqparam_default[8];
|
Bit8u dhcpreqparam_default[8];
|
||||||
bx_bool dhcpreqparam_default_validflag = false;
|
bx_bool dhcpreqparam_default_validflag = false;
|
||||||
|
unsigned dhcpreqparams_default_len = 0;
|
||||||
Bit8u *replyopts;
|
Bit8u *replyopts;
|
||||||
Bit8u replybuf[576];
|
Bit8u replybuf[576];
|
||||||
|
|
||||||
@ -829,7 +834,14 @@ bx_vnet_pktmover_c::udpipv4_dhcp_handler_ns(
|
|||||||
}
|
}
|
||||||
found_serverid = true;
|
found_serverid = true;
|
||||||
break;
|
break;
|
||||||
|
case BOOTPOPT_IP_ADDRESS_LEASE_TIME:
|
||||||
|
if (extlen != 4)
|
||||||
|
break;
|
||||||
|
leasetime = get_net4(&extdata[0]);
|
||||||
|
found_leasetime = true;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
|
BX_ERROR(("extcode %d not supported yet", extcode));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -842,6 +854,10 @@ bx_vnet_pktmover_c::udpipv4_dhcp_handler_ns(
|
|||||||
memcpy(&replybuf[4],&data[4],4);
|
memcpy(&replybuf[4],&data[4],4);
|
||||||
memcpy(&replybuf[16],default_guest_ipv4addr,4);
|
memcpy(&replybuf[16],default_guest_ipv4addr,4);
|
||||||
memcpy(&replybuf[28],&data[28],6);
|
memcpy(&replybuf[28],&data[28],6);
|
||||||
|
replybuf[44] = 'v';
|
||||||
|
replybuf[45] = 'n';
|
||||||
|
replybuf[46] = 'e';
|
||||||
|
replybuf[47] = 't';
|
||||||
replybuf[236] = 0x63;
|
replybuf[236] = 0x63;
|
||||||
replybuf[237] = 0x82;
|
replybuf[237] = 0x82;
|
||||||
replybuf[238] = 0x53;
|
replybuf[238] = 0x53;
|
||||||
@ -878,14 +894,18 @@ bx_vnet_pktmover_c::udpipv4_dhcp_handler_ns(
|
|||||||
*replyopts ++ = 1;
|
*replyopts ++ = 1;
|
||||||
*replyopts ++ = DHCPNAK;
|
*replyopts ++ = DHCPNAK;
|
||||||
opts_len -= 3;
|
opts_len -= 3;
|
||||||
|
if (found_leasetime) {
|
||||||
|
dhcpreqparam_default[dhcpreqparams_default_len++] = BOOTPOPT_IP_ADDRESS_LEASE_TIME;
|
||||||
|
dhcpreqparam_default_validflag = true;
|
||||||
|
}
|
||||||
if (!found_serverid) {
|
if (!found_serverid) {
|
||||||
dhcpreqparam_default[0] = BOOTPOPT_SERVER_IDENTIFIER;
|
dhcpreqparam_default[dhcpreqparams_default_len++] = BOOTPOPT_SERVER_IDENTIFIER;
|
||||||
dhcpreqparam_default_validflag = true;
|
dhcpreqparam_default_validflag = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
BX_INFO(("dhcp server: unknown message type %u",dhcpmsgtype));
|
BX_ERROR(("dhcp server: unsupported message type %u",dhcpmsgtype));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -904,6 +924,18 @@ bx_vnet_pktmover_c::udpipv4_dhcp_handler_ns(
|
|||||||
memcpy(replyopts,subnetmask_ipv4addr,4);
|
memcpy(replyopts,subnetmask_ipv4addr,4);
|
||||||
replyopts += 4;
|
replyopts += 4;
|
||||||
break;
|
break;
|
||||||
|
case BOOTPOPT_ROUTER_OPTION:
|
||||||
|
BX_INFO(("provide BOOTPOPT_ROUTER_OPTION"));
|
||||||
|
if (opts_len < 6) {
|
||||||
|
BX_ERROR(("option buffer is insufficient"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
opts_len -= 6;
|
||||||
|
*replyopts ++ = BOOTPOPT_ROUTER_OPTION;
|
||||||
|
*replyopts ++ = 4;
|
||||||
|
memcpy(replyopts,host_ipv4addr,4);
|
||||||
|
replyopts += 4;
|
||||||
|
break;
|
||||||
#if 0 // DNS is not implemented.
|
#if 0 // DNS is not implemented.
|
||||||
case BOOTPOPT_DOMAIN_NAMESERVER:
|
case BOOTPOPT_DOMAIN_NAMESERVER:
|
||||||
BX_INFO(("provide BOOTPOPT_DOMAIN_NAMESERVER"));
|
BX_INFO(("provide BOOTPOPT_DOMAIN_NAMESERVER"));
|
||||||
@ -939,7 +971,11 @@ bx_vnet_pktmover_c::udpipv4_dhcp_handler_ns(
|
|||||||
opts_len -= 6;
|
opts_len -= 6;
|
||||||
*replyopts ++ = BOOTPOPT_IP_ADDRESS_LEASE_TIME;
|
*replyopts ++ = BOOTPOPT_IP_ADDRESS_LEASE_TIME;
|
||||||
*replyopts ++ = 4;
|
*replyopts ++ = 4;
|
||||||
put_net4(replyopts, 900);
|
if (leasetime < 900) {
|
||||||
|
put_net4(replyopts, leasetime);
|
||||||
|
} else {
|
||||||
|
put_net4(replyopts, 900);
|
||||||
|
}
|
||||||
replyopts += 4;
|
replyopts += 4;
|
||||||
break;
|
break;
|
||||||
case BOOTPOPT_SERVER_IDENTIFIER:
|
case BOOTPOPT_SERVER_IDENTIFIER:
|
||||||
@ -979,6 +1015,9 @@ bx_vnet_pktmover_c::udpipv4_dhcp_handler_ns(
|
|||||||
replyopts += 4;
|
replyopts += 4;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
if (*(dhcpreqparams-1) != 0) {
|
||||||
|
BX_ERROR(("dhcp server: requested parameter %u not supported yet",*(dhcpreqparams-1)));
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user