david/ipxe
david
/
ipxe
Archived
1
0
Fork 0

[IPv4] Use default netmasks when no subnet mask is specified.

This commit is contained in:
Michael Brown 2008-03-23 22:20:47 +00:00
parent 2af6c8d130
commit 978865da2f
2 changed files with 27 additions and 8 deletions

View File

@ -18,7 +18,13 @@
#define INADDR_BROADCAST 0xffffffff
#define IN_MULTICAST(addr) ( ( (addr) & 0xf0000000 ) == 0xe0000000 )
#define IN_CLASSA(addr) ( ( (addr) & 0x80000000 ) == 0x00000000 )
#define IN_CLASSA_NET 0xff000000
#define IN_CLASSB(addr) ( ( (addr) & 0xc0000000 ) == 0x80000000 )
#define IN_CLASSB_NET 0xffff0000
#define IN_CLASSC(addr) ( ( (addr) & 0xe0000000 ) == 0xc0000000 )
#define IN_CLASSC_NET 0xffffff00
#define IN_MULTICAST(addr) ( ( (addr) & 0xf0000000 ) == 0xe0000000 )
/**
* IP address structure

View File

@ -116,18 +116,31 @@ static int ipv4_create_routes ( void ) {
/* Create a route for each configured network device */
for_each_netdev ( netdev ) {
settings = netdev_settings ( netdev );
/* Get IPv4 address */
address.s_addr = 0;
fetch_ipv4_setting ( settings, DHCP_EB_YIADDR, &address );
netmask.s_addr = 0;
if ( ! address.s_addr )
continue;
/* Calculate default netmask */
if ( IN_CLASSA ( ntohl ( address.s_addr ) ) ) {
netmask.s_addr = htonl ( IN_CLASSA_NET );
} else if ( IN_CLASSB ( ntohl ( address.s_addr ) ) ) {
netmask.s_addr = htonl ( IN_CLASSB_NET );
} else if ( IN_CLASSC ( ntohl ( address.s_addr ) ) ) {
netmask.s_addr = htonl ( IN_CLASSC_NET );
} else {
netmask.s_addr = 0;
}
/* Override with subnet mask, if present */
fetch_ipv4_setting ( settings, DHCP_SUBNET_MASK, &netmask );
/* Get default gateway, if present */
gateway.s_addr = INADDR_NONE;
fetch_ipv4_setting ( settings, DHCP_ROUTERS, &gateway );
if ( address.s_addr ) {
miniroute = add_ipv4_miniroute ( netdev, address,
netmask, gateway );
if ( ! miniroute )
return -ENOMEM;
}
/* Configure route */
miniroute = add_ipv4_miniroute ( netdev, address,
netmask, gateway );
if ( ! miniroute )
return -ENOMEM;
}
return 0;