9 static inline bool eth_addr_is_broadcast(const uint8_t ea[6])
11 return (ea[0] & ea[1] & ea[2] & ea[3] & ea[4] & ea[5]) == 0xff;
13 static inline bool eth_addr_is_multicast(const uint8_t ea[6])
17 static inline bool eth_addr_is_local(const uint8_t ea[6])
22 #define ETH_TYPE_IP 0x0800
23 #define ETH_TYPE_ARP 0x0806
24 #define ETH_TYPE_VLAN 0x8100
26 #define ETH_HEADER_LEN 14
27 #define ETH_PAYLOAD_MIN 46
28 #define ETH_TOTAL_MIN (ETH_HEADER_LEN + ETH_PAYLOAD_MIN)
29 #define ETH_TOTAL_MAX (ETH_HEADER_LEN + VLAN_HEADER_LEN + 1500)
31 uint8_t eth_dst[ETH_ADDR_LEN];
32 uint8_t eth_src[ETH_ADDR_LEN];
35 BUILD_ASSERT_DECL(ETH_HEADER_LEN == sizeof(struct eth_header));
37 #define LLC_DSAP_SNAP 0xaa
38 #define LLC_SSAP_SNAP 0xaa
39 #define LLC_CNTL_SNAP 3
41 #define LLC_HEADER_LEN 3
47 BUILD_ASSERT_DECL(LLC_HEADER_LEN == sizeof(struct llc_header));
49 #define SNAP_ORG_ETHERNET "\0\0" /* The compiler adds a null byte, so
50 sizeof(SNAP_ORG_ETHERNET) == 3. */
51 #define SNAP_HEADER_LEN 5
55 } __attribute__((packed));
56 BUILD_ASSERT_DECL(SNAP_HEADER_LEN == sizeof(struct snap_header));
58 #define LLC_SNAP_HEADER_LEN (LLC_HEADER_LEN + SNAP_HEADER_LEN)
59 struct llc_snap_header {
60 struct llc_header llc;
61 struct snap_header snap;
63 BUILD_ASSERT_DECL(LLC_SNAP_HEADER_LEN == sizeof(struct llc_snap_header));
65 #define VLAN_VID 0x0fff
67 #define VLAN_HEADER_LEN 4
69 uint16_t vlan_tci; /* Lowest 12 bits are VLAN ID. */
70 uint16_t vlan_next_type;
72 BUILD_ASSERT_DECL(VLAN_HEADER_LEN == sizeof(struct vlan_header));
74 #define VLAN_ETH_HEADER_LEN (ETH_HEADER_LEN + VLAN_HEADER_LEN)
75 struct vlan_eth_header {
76 uint8_t veth_dst[ETH_ADDR_LEN];
77 uint8_t veth_src[ETH_ADDR_LEN];
79 uint16_t veth_tci; /* Lowest 12 bits are VLAN ID. */
80 uint16_t veth_next_type;
82 BUILD_ASSERT_DECL(VLAN_ETH_HEADER_LEN == sizeof(struct vlan_eth_header));
84 #define IP_VER(ip_ihl_ver) ((ip_ihl_ver) >> 4)
85 #define IP_IHL(ip_ihl_ver) ((ip_ihl_ver) & 15)
88 #define IP_TYPE_UDP 17
90 #define IP_HEADER_LEN 20
103 BUILD_ASSERT_DECL(IP_HEADER_LEN == sizeof(struct ip_header));
105 #define UDP_HEADER_LEN 8
112 BUILD_ASSERT_DECL(UDP_HEADER_LEN == sizeof(struct udp_header));
121 #define TCP_FLAGS(tcp_ctl) (htons(tcp_ctl) & 0x003f)
122 #define TCP_OFFSET(tcp_ctl) (htons(tcp_ctl) >> 12)
124 #define TCP_HEADER_LEN 20
135 BUILD_ASSERT_DECL(TCP_HEADER_LEN == sizeof(struct tcp_header));
137 #define ARP_HRD_ETHERNET 1
138 #define ARP_PRO_IP 0x0800
139 #define ARP_OP_REQUEST 1
140 #define ARP_OP_REPLY 2
142 #define ARP_ETH_HEADER_LEN 28
143 struct arp_eth_header {
144 /* Generic members. */
145 uint16_t ar_hrd; /* Hardware type. */
146 uint16_t ar_pro; /* Protocol type. */
147 uint8_t ar_hln; /* Hardware address length. */
148 uint8_t ar_pln; /* Protocol address length. */
149 uint16_t ar_op; /* Opcode. */
151 /* Ethernet+IPv4 specific members. */
152 uint8_t ar_sha[ETH_ADDR_LEN]; /* Sender hardware address. */
153 uint32_t ar_spa; /* Sender protocol address. */
154 uint8_t ar_tha[ETH_ADDR_LEN]; /* Target hardware address. */
155 uint32_t ar_tpa; /* Target protocol address. */
156 } __attribute__((packed));
157 BUILD_ASSERT_DECL(ARP_ETH_HEADER_LEN == sizeof(struct arp_eth_header));
159 #endif /* packets.h */