Vanetza
 
Loading...
Searching...
No Matches
ethernet_header.hpp
1#ifndef ETHERNET_HEADER_HPP_
2#define ETHERNET_HEADER_HPP_
3
4#include <vanetza/common/byte_buffer.hpp>
5#include <vanetza/common/byte_order.hpp>
6#include <vanetza/net/mac_address.hpp>
7#include <cstddef>
8
9namespace vanetza
10{
11
12/**
13 * Get length of ethernet header in bytes
14 * \param header length in bytes
15 */
16constexpr std::size_t ethernet_header_length()
17{
18 return 2 * sizeof(MacAddress::octets) + sizeof(uint16_t);
19}
20
21/**
22 * Link-level header of type Ethernet II
23 *
24 * EthernetHeader is suitable for Linux raw packet sockets, see man 7 packet
25 */
27{
28public:
29 using EtherType = uint16be_t;
30 static constexpr std::size_t length_bytes = ethernet_header_length();
31
32 MacAddress destination;
33 MacAddress source;
34 EtherType type;
35};
36
37/**
38 * Create a byte buffer containing an ethernet header
39 * \param dest Destination MAC address
40 * \param src Source MAC address
41 * \param proto EtherType number
42 */
43ByteBuffer create_ethernet_header(const MacAddress& dest, const MacAddress& src, uint16be_t proto);
44ByteBuffer create_ethernet_header(const EthernetHeader&);
45
46/**
47 * Parse ethernet header from byte buffer
48 * \param buffer byte buffer (throws exception if too short)
49 * \return ethernet header
50 */
51EthernetHeader decode_ethernet_header(const ByteBuffer&);
52EthernetHeader decode_ethernet_header(ByteBuffer::const_iterator, ByteBuffer::const_iterator);
53
54} // namespace vanetza
55
56#endif // ETHERNET_HEADER_HPP_
57