[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH] Fix vlan networking on little-endian systems
From: |
Daniel Kiper |
Subject: |
Re: [PATCH] Fix vlan networking on little-endian systems |
Date: |
Wed, 2 Mar 2022 19:39:11 +0100 |
User-agent: |
NeoMutt/20170113 (1.7.2) |
On Tue, Mar 01, 2022 at 11:18:52AM -0500, Chad Kimes via Grub-devel wrote:
> 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.
Please add your Signed-off-by tag here.
> ---
> 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..e49ccc940 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 (VLANTAG_IDENTIFIER);
s/grub_cpu_to_be16/grub_cpu_to_be16_compile_time/
> 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 (VLANTAG_IDENTIFIER))
Ditto.
> {
> - 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,
Daniel