Respect netmask from bootp/dhcp.

* grub-core/net/bootp.c (parse_dhcp_vendor): Parse mask.
	(grub_net_configure_by_dhcp_ack): Use mask and grub_net_add_ipv4_local.
	* grub-core/net/net.c (grub_net_add_addr): Split creating local route
	into ...
	(grub_net_add_ipv4_local): ... this.
	(grub_cmd_addaddr): Use grub_net_add_ipv4_local.
	* include/grub/net.h (GRUB_NET_BOOTP_NETMASK): New enum value.
	(grub_net_add_ipv4_local): New proto.
This commit is contained in:
Vladimir 'phcoder' Serbinenko 2012-06-20 23:46:50 +02:00
parent 67caf9eb06
commit d6b7c7c986
4 changed files with 76 additions and 32 deletions

View file

@ -52,7 +52,7 @@ set_env_limn_ro (const char *intername, const char *suffix,
}
static void
parse_dhcp_vendor (const char *name, void *vend, int limit)
parse_dhcp_vendor (const char *name, void *vend, int limit, int *mask)
{
grub_uint8_t *ptr, *ptr0;
@ -83,6 +83,17 @@ parse_dhcp_vendor (const char *name, void *vend, int limit)
switch (tagtype)
{
case GRUB_NET_BOOTP_NETMASK:
if (taglength == 4)
{
int i;
for (i = 0; i < 32; i++)
if (!(ptr[i / 8] & (1 << (7 - (i % 8)))))
break;
*mask = i;
}
break;
case GRUB_NET_BOOTP_ROUTER:
if (taglength == 4)
{
@ -149,6 +160,7 @@ grub_net_configure_by_dhcp_ack (const char *name,
grub_net_network_level_address_t addr;
grub_net_link_level_address_t hwaddr;
struct grub_net_network_level_interface *inter;
int mask = -1;
addr.type = GRUB_NET_NETWORK_LEVEL_PROTOCOL_IPV4;
addr.ipv4 = bp->your_ip;
@ -242,8 +254,9 @@ grub_net_configure_by_dhcp_ack (const char *name,
}
}
if (size > OFFSET_OF (vendor, bp))
parse_dhcp_vendor (name, &bp->vendor, size - OFFSET_OF (vendor, bp));
parse_dhcp_vendor (name, &bp->vendor, size - OFFSET_OF (vendor, bp), &mask);
grub_net_add_ipv4_local (inter, mask);
inter->dhcp_ack = grub_malloc (size);
if (inter->dhcp_ack)
{