From 978865da2f5d5a587c2f8accf3e1bb3b0193e1fd Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Sun, 23 Mar 2008 22:20:47 +0000 Subject: [IPv4] Use default netmasks when no subnet mask is specified. --- src/net/ipv4.c | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) (limited to 'src/net') 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; -- cgit