From: Chad Kimes <chkimes@github.com>
To: grub-devel@gnu.org
Cc: Chad Kimes <chkimes@github.com>
Subject: [PATCH v2] Fix vlan networking on little-endian systems
Date: Wed, 2 Mar 2022 14:21:22 -0500 [thread overview]
Message-ID: <20220302192122.263829-1-chkimes@github.com> (raw)
Vlan configuration seems to have never worked on little-endian systems. This is
likely because VLANTAG_IDENTIFIER is not byte-swapped before copying into the
net buffer, nor is vlantag. We can resolve this by using grub_cpu_to_be16 and
its inverse when copying vlan info to/from the net buffer.
Signed-off-by: Chad Kimes <chkimes@github.com>
---
grub-core/net/ethernet.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/grub-core/net/ethernet.c b/grub-core/net/ethernet.c
index 4d7ceed6f..a9906338c 100644
--- a/grub-core/net/ethernet.c
+++ b/grub-core/net/ethernet.c
@@ -58,7 +58,7 @@ send_ethernet_packet (struct grub_net_network_level_interface *inf,
struct etherhdr *eth;
grub_err_t err;
grub_uint8_t etherhdr_size;
- grub_uint16_t vlantag_id = VLANTAG_IDENTIFIER;
+ grub_uint16_t vlantag_id = grub_cpu_to_be16_compile_time (VLANTAG_IDENTIFIER);
etherhdr_size = sizeof (*eth);
COMPILE_TIME_ASSERT (sizeof (*eth) + 4 < GRUB_NET_MAX_LINK_HEADER_SIZE);
@@ -93,8 +93,9 @@ send_ethernet_packet (struct grub_net_network_level_interface *inf,
(char *) nb->data + etherhdr_size - 6, 2);
/* Add the tag in the middle */
+ grub_uint16_t vlan = grub_cpu_to_be16 (inf->vlantag);
grub_memcpy ((char *) nb->data + etherhdr_size - 6, &vlantag_id, 2);
- grub_memcpy ((char *) nb->data + etherhdr_size - 4, (char *) &(inf->vlantag), 2);
+ grub_memcpy ((char *) nb->data + etherhdr_size - 4, &vlan, 2);
}
return inf->card->driver->send (inf->card, nb);
@@ -118,9 +119,9 @@ grub_net_recv_ethernet_packet (struct grub_net_buff *nb,
/* Check if a vlan-tag is present. If so, the ethernet header is 4 bytes */
/* longer than the original one. The vlantag id is extracted and the header */
/* is reseted to the original size. */
- if (grub_get_unaligned16 (nb->data + etherhdr_size - 2) == VLANTAG_IDENTIFIER)
+ if (grub_get_unaligned16 (nb->data + etherhdr_size - 2) == grub_cpu_to_be16_compile_time (VLANTAG_IDENTIFIER))
{
- vlantag = grub_get_unaligned16 (nb->data + etherhdr_size);
+ vlantag = grub_be_to_cpu16 (grub_get_unaligned16 (nb->data + etherhdr_size));
etherhdr_size += 4;
/* Move eth type to the original position */
grub_memcpy((char *) nb->data + etherhdr_size - 6,
--
2.25.1
next reply other threads:[~2022-03-02 19:22 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-03-02 19:21 Chad Kimes [this message]
2022-03-02 20:57 ` [PATCH v2] Fix vlan networking on little-endian systems Daniel Kiper
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=20220302192122.263829-1-chkimes@github.com \
--to=chkimes@github.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.