summaryrefslogtreecommitdiffstats
path: root/src/net/ipv4.c
diff options
context:
space:
mode:
authorMichael Brown2008-03-23 23:20:47 +0100
committerMichael Brown2008-03-23 23:20:47 +0100
commit978865da2f5d5a587c2f8accf3e1bb3b0193e1fd (patch)
treead21610bd2d20f37b5cd4f98ba12800b7a275417 /src/net/ipv4.c
parent[IPv4] Tidy up some header files. (diff)
downloadipxe-978865da2f5d5a587c2f8accf3e1bb3b0193e1fd.tar.gz
ipxe-978865da2f5d5a587c2f8accf3e1bb3b0193e1fd.tar.xz
ipxe-978865da2f5d5a587c2f8accf3e1bb3b0193e1fd.zip
[IPv4] Use default netmasks when no subnet mask is specified.
Diffstat (limited to 'src/net/ipv4.c')
-rw-r--r--src/net/ipv4.c27
1 files changed, 20 insertions, 7 deletions
diff --git a/src/net/ipv4.c b/src/net/ipv4.c
index ee88dd82..67bfc2d6 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;