- 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:
Volker Ruppert 2004-09-11 11:26:41 +00:00
parent 11c81a46eb
commit f1816bb226
2 changed files with 58 additions and 8 deletions

View File

@ -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:

View File

@ -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;
} }
} }