mirror of https://github.com/ipxe/ipxe.git
[IPv4] Use default netmasks when no subnet mask is specified.
parent
2af6c8d130
commit
978865da2f
|
@ -18,7 +18,13 @@
|
||||||
|
|
||||||
#define INADDR_BROADCAST 0xffffffff
|
#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
|
* IP address structure
|
||||||
|
|
|
@ -116,18 +116,31 @@ static int ipv4_create_routes ( void ) {
|
||||||
/* Create a route for each configured network device */
|
/* Create a route for each configured network device */
|
||||||
for_each_netdev ( netdev ) {
|
for_each_netdev ( netdev ) {
|
||||||
settings = netdev_settings ( netdev );
|
settings = netdev_settings ( netdev );
|
||||||
|
/* Get IPv4 address */
|
||||||
address.s_addr = 0;
|
address.s_addr = 0;
|
||||||
fetch_ipv4_setting ( settings, DHCP_EB_YIADDR, &address );
|
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 );
|
fetch_ipv4_setting ( settings, DHCP_SUBNET_MASK, &netmask );
|
||||||
|
/* Get default gateway, if present */
|
||||||
gateway.s_addr = INADDR_NONE;
|
gateway.s_addr = INADDR_NONE;
|
||||||
fetch_ipv4_setting ( settings, DHCP_ROUTERS, &gateway );
|
fetch_ipv4_setting ( settings, DHCP_ROUTERS, &gateway );
|
||||||
if ( address.s_addr ) {
|
/* Configure route */
|
||||||
miniroute = add_ipv4_miniroute ( netdev, address,
|
miniroute = add_ipv4_miniroute ( netdev, address,
|
||||||
netmask, gateway );
|
netmask, gateway );
|
||||||
if ( ! miniroute )
|
if ( ! miniroute )
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue