diff options
author | Michael Brown <mcb30@etherboot.org> | 2008-03-23 22:20:47 +0000 |
---|---|---|
committer | Michael Brown <mcb30@etherboot.org> | 2008-03-23 22:20:47 +0000 |
commit | 978865da2f5d5a587c2f8accf3e1bb3b0193e1fd (patch) | |
tree | ad21610bd2d20f37b5cd4f98ba12800b7a275417 /src/net | |
parent | 2af6c8d130b6ada61f98fc02c7911aad51768ea3 (diff) | |
download | ipxe-978865da2f5d5a587c2f8accf3e1bb3b0193e1fd.tar.gz |
[IPv4] Use default netmasks when no subnet mask is specified.
Diffstat (limited to 'src/net')
-rw-r--r-- | src/net/ipv4.c | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/src/net/ipv4.c b/src/net/ipv4.c index ee88dd821..67bfc2d6c 100644 --- a/src/net/ipv4.c +++ b/src/net/ipv4.c @@ -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; |