O definição de estrutura mostra que h_proto
é um inteiro de 16 bits big-endian:
struct ethhdr {
unsigned char h_dest[ETH_ALEN]; /* destination eth addr */
unsigned char h_source[ETH_ALEN]; /* source ether addr */
__be16 h_proto; /* packet type ID field */
} __attribute__((packed));
Portanto, você precisa processá-lo com ntohs
antes de lê-lo. Depois disso, você verá o valor correto, 0x0800.