hc
2024-03-25 edb30157bad0c0001c32b854271ace01d3b9a16a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
/* Copyright (C) 1997-2021 Free Software Foundation, Inc.
   This file is part of the GNU C Library.
 
   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.
 
   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.
 
   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, see
   <https://www.gnu.org/licenses/>.  */
 
/* Based on the FreeBSD version of this file. Curiously, that file
   lacks a copyright in the header. */
 
#ifndef __NET_ETHERNET_H
#define __NET_ETHERNET_H 1
 
#include <sys/types.h>
#include <stdint.h>
 
#include <linux/if_ether.h>     /* IEEE 802.3 Ethernet constants */
 
__BEGIN_DECLS
 
/* This is a name for the 48 bit ethernet address available on many
   systems.  */
struct ether_addr
{
  uint8_t ether_addr_octet[ETH_ALEN];
} __attribute__ ((__packed__));
 
/* 10Mb/s ethernet header */
struct ether_header
{
  uint8_t  ether_dhost[ETH_ALEN];    /* destination eth addr    */
  uint8_t  ether_shost[ETH_ALEN];    /* source ether addr    */
  uint16_t ether_type;                /* packet type ID field    */
} __attribute__ ((__packed__));
 
/* Ethernet protocol ID's */
#define    ETHERTYPE_PUP        0x0200          /* Xerox PUP */
#define ETHERTYPE_SPRITE    0x0500        /* Sprite */
#define    ETHERTYPE_IP        0x0800        /* IP */
#define    ETHERTYPE_ARP        0x0806        /* Address resolution */
#define    ETHERTYPE_REVARP    0x8035        /* Reverse ARP */
#define ETHERTYPE_AT        0x809B        /* AppleTalk protocol */
#define ETHERTYPE_AARP        0x80F3        /* AppleTalk ARP */
#define    ETHERTYPE_VLAN        0x8100        /* IEEE 802.1Q VLAN tagging */
#define ETHERTYPE_IPX        0x8137        /* IPX */
#define    ETHERTYPE_IPV6        0x86dd        /* IP protocol version 6 */
#define ETHERTYPE_LOOPBACK    0x9000        /* used to test interfaces */
 
#define    ETHER_ADDR_LEN    ETH_ALEN                 /* size of ethernet addr */
#define    ETHER_TYPE_LEN    2                        /* bytes in type field */
#define    ETHER_CRC_LEN    4                        /* bytes in CRC field */
#define    ETHER_HDR_LEN    ETH_HLEN                 /* total octets in header */
#define    ETHER_MIN_LEN    (ETH_ZLEN + ETHER_CRC_LEN) /* min packet length */
#define    ETHER_MAX_LEN    (ETH_FRAME_LEN + ETHER_CRC_LEN) /* max packet length */
 
/* make sure ethernet length is valid */
#define    ETHER_IS_VALID_LEN(foo)    \
   ((foo) >= ETHER_MIN_LEN && (foo) <= ETHER_MAX_LEN)
 
/*
 * The ETHERTYPE_NTRAILER packet types starting at ETHERTYPE_TRAIL have
 * (type-ETHERTYPE_TRAIL)*512 bytes of data followed
 * by an ETHER type (as given above) and then the (variable-length) header.
 */
#define    ETHERTYPE_TRAIL        0x1000        /* Trailer packet */
#define    ETHERTYPE_NTRAILER    16
 
#define    ETHERMTU    ETH_DATA_LEN
#define    ETHERMIN    (ETHER_MIN_LEN - ETHER_HDR_LEN - ETHER_CRC_LEN)
 
__END_DECLS
 
#endif    /* net/ethernet.h */