From: Michael Chang <mchang@suse.com>
To: grub-devel@gnu.org
Subject: [PATCH 3/3] Use UEFI MAC device as default configured by net_bootp6
Date: Wed, 15 Apr 2015 17:05:09 +0800 [thread overview]
Message-ID: <1429088709-924-4-git-send-email-mchang@suse.com> (raw)
In-Reply-To: <1429088709-924-1-git-send-email-mchang@suse.com>
The grub_efinet_findcards will register cards by checking if it can support EFI
Simple Netowork Protocol which create more than one device to a physical NIC
device.
If without specifying any device to be configured by net_bootp6, it should pick
up one from them but not all. In my case three firmware device are listed.
IPv4, IPv6 and MAC device. Both IPv4 and IPv6 are derived from MAC device for
providing PXE Base Code Protocol. I think we should use MAC device instead of
those two to avoid collision, because net_bootp6 command does not depend on PXE
Base Code but only Simple Network Protocol to work
---
grub-core/net/bootp.c | 8 +++++++
grub-core/net/drivers/efi/efinet.c | 40 ++++++++++++++++++++++++++++++++++++
include/grub/net.h | 1 +
3 files changed, 49 insertions(+), 0 deletions(-)
diff --git a/grub-core/net/bootp.c b/grub-core/net/bootp.c
index 477f205..c4963ca 100644
--- a/grub-core/net/bootp.c
+++ b/grub-core/net/bootp.c
@@ -1290,6 +1290,10 @@ grub_cmd_bootp6 (struct grub_command *cmd __attribute__ ((unused)),
{
if (argc > 0 && grub_strcmp (card->name, args[0]) != 0)
continue;
+#ifdef GRUB_MACHINE_EFI
+ else if (!card->is_efi_mac_device (card))
+ continue;
+#endif
ncards++;
}
@@ -1299,6 +1303,10 @@ grub_cmd_bootp6 (struct grub_command *cmd __attribute__ ((unused)),
if (argc > 0 && grub_strcmp (card->name, args[0]) != 0)
continue;
+#ifdef GRUB_MACHINE_EFI
+ else if (!card->is_efi_mac_device (card))
+ continue;
+#endif
ifaces = grub_net_ipv6_get_link_local (card, &card->default_address);
if (!ifaces)
diff --git a/grub-core/net/drivers/efi/efinet.c b/grub-core/net/drivers/efi/efinet.c
index b1837e3..900384f 100644
--- a/grub-core/net/drivers/efi/efinet.c
+++ b/grub-core/net/drivers/efi/efinet.c
@@ -157,6 +157,45 @@ grub_efinet_get_device_handle (struct grub_net_card *card)
return card->efi_handle;
}
+static int
+grub_efinet_is_mac_device (struct grub_net_card *card)
+{
+ grub_efi_handle_t efi_handle;
+ grub_efi_device_path_t *dp;
+ grub_efi_device_path_t *next, *p;
+ grub_efi_uint8_t type;
+ grub_efi_uint8_t subtype;
+
+ efi_handle = grub_efinet_get_device_handle (card);
+
+ if (!efi_handle)
+ return 0;
+
+ dp = grub_efi_get_device_path (efi_handle);
+
+ if (GRUB_EFI_END_ENTIRE_DEVICE_PATH (dp))
+ return 0;
+
+ for (p = (grub_efi_device_path_t *) dp, next = GRUB_EFI_NEXT_DEVICE_PATH (p);
+ ! GRUB_EFI_END_ENTIRE_DEVICE_PATH (next);
+ p = next, next = GRUB_EFI_NEXT_DEVICE_PATH (next))
+ ;
+
+ if (p)
+ {
+ type = GRUB_EFI_DEVICE_PATH_TYPE (p);
+ subtype = GRUB_EFI_DEVICE_PATH_SUBTYPE (p);
+
+ if (type == GRUB_EFI_MESSAGING_DEVICE_PATH_TYPE
+ && subtype == GRUB_EFI_MAC_ADDRESS_DEVICE_PATH_SUBTYPE)
+ {
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
static void
grub_efinet_findcards (void)
{
@@ -223,6 +262,7 @@ grub_efinet_findcards (void)
sizeof (card->default_address.mac));
card->efi_net = net;
card->efi_handle = *handle;
+ card->is_efi_mac_device = grub_efinet_is_mac_device;
grub_net_card_register (card);
}
diff --git a/include/grub/net.h b/include/grub/net.h
index 71dc243..4571b72 100644
--- a/include/grub/net.h
+++ b/include/grub/net.h
@@ -140,6 +140,7 @@ struct grub_net_card
struct grub_efi_simple_network *efi_net;
grub_efi_handle_t efi_handle;
grub_size_t last_pkt_size;
+ int (*is_efi_mac_device) (struct grub_net_card* card);
};
#endif
void *data;
--
1.7.3.4
next prev parent reply other threads:[~2015-04-15 9:14 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-04-15 9:05 [RFC] Support DHCPv6 and UEFI IPv6 PXE Michael Chang
2015-04-15 9:05 ` [PATCH 1/3] Added net_bootp6 command Michael Chang
2015-04-16 14:40 ` Andrei Borzenkov
2015-04-17 5:04 ` Michael Chang
2015-04-19 8:15 ` Andrei Borzenkov
2015-04-20 3:09 ` Michael Chang
2015-04-20 3:38 ` Andrei Borzenkov
2015-04-15 9:05 ` [PATCH 2/3] UEFI IPv6 PXE support Michael Chang
2015-04-15 9:05 ` Michael Chang [this message]
2015-04-16 19:58 ` [PATCH 3/3] Use UEFI MAC device as default configured by net_bootp6 Andrei Borzenkov
2015-04-17 6:41 ` Michael Chang
2015-04-17 9:01 ` Andrei Borzenkov
2015-04-17 9:48 ` [RFC] Support DHCPv6 and UEFI IPv6 PXE Andrei Borzenkov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1429088709-924-4-git-send-email-mchang@suse.com \
--to=mchang@suse.com \
--cc=grub-devel@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).