Skip to content

Commit

Permalink
net: improve VLAN header type alignment
Browse files Browse the repository at this point in the history
Ethernet packets can be VLAN tagged, i.e. an Ethernet header can have a
VLAN tag (a.k.a. VLAN header) embedded.
Since the Ethernet header is 2 byte aligned, and the VLAN tag is directly
related to the Ethernet header, the VLAN tag is also 2 byte aligned, so
packing the VLAN tag structure is not necessary.

Furthermore, the Ethernet header type is implicitly 2 byte aligned, so
removed the superfluous explicit 2 byte alignment.

Added static_asserts to verify the size and alignment of the various
Ethernet types.

Signed-off-by: Morten Brørup <mb@smartsharesystems.com>
Acked-by: Chengwen Feng <fengchengwen@huawei.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
  • Loading branch information
MortenBroerup authored and tmonjalo committed Oct 18, 2024
1 parent bf26e6f commit e214d58
Showing 1 changed file with 19 additions and 2 deletions.
21 changes: 19 additions & 2 deletions lib/net/rte_ether.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
* Ethernet Helpers in RTE
*/

#include <assert.h>
#include <stdalign.h>
#include <stdint.h>
#include <stdio.h>

Expand Down Expand Up @@ -75,6 +77,11 @@ struct __rte_aligned(2) rte_ether_addr {
uint8_t addr_bytes[RTE_ETHER_ADDR_LEN]; /**< Addr bytes in tx order */
};

static_assert(sizeof(struct rte_ether_addr) == 6,
"sizeof(struct rte_ether_addr) == 6");
static_assert(alignof(struct rte_ether_addr) == 2,
"alignof(struct rte_ether_addr) == 2");

#define RTE_ETHER_LOCAL_ADMIN_ADDR 0x02 /**< Locally assigned Eth. address. */
#define RTE_ETHER_GROUP_ADDR 0x01 /**< Multicast or broadcast Eth. address. */

Expand Down Expand Up @@ -290,12 +297,17 @@ rte_ether_unformat_addr(const char *str, struct rte_ether_addr *eth_addr);
* Ethernet header: Contains the destination address, source address
* and frame type.
*/
struct __rte_aligned(2) rte_ether_hdr {
struct rte_ether_hdr {
struct rte_ether_addr dst_addr; /**< Destination address. */
struct rte_ether_addr src_addr; /**< Source address. */
rte_be16_t ether_type; /**< Frame type. */
};

static_assert(sizeof(struct rte_ether_hdr) == 14,
"sizeof(struct rte_ether_hdr) == 14");
static_assert(alignof(struct rte_ether_hdr) == 2,
"alignof(struct rte_ether_hdr) == 2");

/**
* Ethernet VLAN Header.
* Contains the 16-bit VLAN Tag Control Identifier and the Ethernet type
Expand All @@ -304,7 +316,12 @@ struct __rte_aligned(2) rte_ether_hdr {
struct rte_vlan_hdr {
rte_be16_t vlan_tci; /**< Priority (3) + CFI (1) + Identifier Code (12) */
rte_be16_t eth_proto; /**< Ethernet type of encapsulated frame. */
} __rte_packed;
};

static_assert(sizeof(struct rte_vlan_hdr) == 4,
"sizeof(struct rte_vlan_hdr) == 4");
static_assert(alignof(struct rte_vlan_hdr) == 2,
"alignof(struct rte_vlan_hdr) == 2");



Expand Down

0 comments on commit e214d58

Please sign in to comment.