You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
65 lines
2.4 KiB
65 lines
2.4 KiB
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
|
From: Andrzej Kacprowski <andrzej.kacprowski@intel.com> |
|
Date: Fri, 21 Apr 2017 09:20:38 +0200 |
|
Subject: [PATCH] Use xid to match DHCP replies |
|
|
|
Transaction identifier (xid) from DHCP request |
|
packet is stored in network level interface and used |
|
to match request with the responses it generates. |
|
|
|
Resolves: rhbz#1370642 |
|
|
|
Signed-off-by: Andrzej Kacprowski <andrzej.kacprowski@intel.com> |
|
--- |
|
grub-core/net/bootp.c | 3 ++- |
|
grub-core/net/ip.c | 1 + |
|
include/grub/net.h | 3 ++- |
|
3 files changed, 5 insertions(+), 2 deletions(-) |
|
|
|
diff --git a/grub-core/net/bootp.c b/grub-core/net/bootp.c |
|
index 7df7f55110e..dfdf7e08d90 100644 |
|
--- a/grub-core/net/bootp.c |
|
+++ b/grub-core/net/bootp.c |
|
@@ -769,7 +769,8 @@ grub_cmd_bootp (struct grub_command *cmd __attribute__ ((unused)), |
|
grub_errno = GRUB_ERR_NONE; |
|
t = 0; |
|
} |
|
- pack->ident = grub_cpu_to_be32 (t); |
|
+ pack->xid = grub_cpu_to_be32 (t); |
|
+ ifaces[j].dhcp_xid = pack->xid; |
|
pack->seconds = grub_cpu_to_be16 (t); |
|
|
|
grub_memcpy (&pack->mac_addr, &ifaces[j].hwaddress.mac, 6); |
|
diff --git a/grub-core/net/ip.c b/grub-core/net/ip.c |
|
index 5a609544403..9e7930caa03 100644 |
|
--- a/grub-core/net/ip.c |
|
+++ b/grub-core/net/ip.c |
|
@@ -271,6 +271,7 @@ handle_dgram (struct grub_net_buff *nb, |
|
FOR_NET_NETWORK_LEVEL_INTERFACES (inf) |
|
if (inf->card == card |
|
&& inf->address.type == GRUB_NET_NETWORK_LEVEL_PROTOCOL_DHCP_RECV |
|
+ && inf->dhcp_xid == bootp->xid |
|
&& inf->hwaddress.type == GRUB_NET_LINK_LEVEL_PROTOCOL_ETHERNET |
|
&& grub_memcmp (inf->hwaddress.mac, &bootp->mac_addr, |
|
sizeof (inf->hwaddress.mac)) == 0) |
|
diff --git a/include/grub/net.h b/include/grub/net.h |
|
index bd930f4dd8c..b1bc23048f1 100644 |
|
--- a/include/grub/net.h |
|
+++ b/include/grub/net.h |
|
@@ -279,6 +279,7 @@ struct grub_net_network_level_interface |
|
grub_net_interface_flags_t flags; |
|
struct grub_net_bootp_packet *dhcp_ack; |
|
grub_size_t dhcp_acklen; |
|
+ grub_uint32_t dhcp_xid; |
|
void *data; |
|
}; |
|
|
|
@@ -405,7 +406,7 @@ struct grub_net_bootp_packet |
|
grub_uint8_t hw_type; /* hardware type. */ |
|
grub_uint8_t hw_len; /* hardware addr len. */ |
|
grub_uint8_t gate_hops; /* zero it. */ |
|
- grub_uint32_t ident; /* random number chosen by client. */ |
|
+ grub_uint32_t xid; /* transaction id chosen by client. */ |
|
grub_uint16_t seconds; /* seconds since did initial bootstrap. */ |
|
grub_uint16_t flags; |
|
grub_uint32_t client_ip;
|
|
|