11 #include <boost/static_assert.hpp>
15 #include <netinet/in_systm.h>
16 #include <netinet/ip.h>
30 <<
"packet is invalid, expected at least "
31 << ETHERNET_HEADER_LEN <<
" bytes, received "
44 BOOST_STATIC_ASSERT(ETHERNET_HEADER_LEN > HWAddr::ETHERNET_HWADDR_LEN);
50 std::vector<uint8_t> dest_addr;
51 buf.
readVector(dest_addr, HWAddr::ETHERNET_HWADDR_LEN);
52 pkt->setLocalHWAddr(HWTYPE_ETHERNET, HWAddr::ETHERNET_HWADDR_LEN, dest_addr);
54 std::vector<uint8_t> src_addr;
55 buf.
readVector(src_addr, HWAddr::ETHERNET_HWADDR_LEN);
56 pkt->setRemoteHWAddr(HWTYPE_ETHERNET, HWAddr::ETHERNET_HWADDR_LEN, src_addr);
67 <<
"received packet is invalid, expected at least "
68 << MIN_IP_HEADER_LEN + UDP_HEADER_LEN
79 BOOST_STATIC_ASSERT(IP_SRC_ADDR_OFFSET < MIN_IP_HEADER_LEN);
90 <<
" lower than 5 words. The length of the received header is "
112 buf.
setPosition(start_pos + ip_len * 4 + UDP_HEADER_LEN);
118 HWAddrPtr remote_addr = pkt->getRemoteHWAddr();
120 if (remote_addr->hwaddr_.size() == HWAddr::ETHERNET_HWADDR_LEN) {
121 out_buf.
writeData(&remote_addr->hwaddr_[0],
122 HWAddr::ETHERNET_HWADDR_LEN);
125 << remote_addr->hwaddr_.size() <<
" when constructing"
126 <<
" an ethernet frame header; expected size is"
127 <<
" " << HWAddr::ETHERNET_HWADDR_LEN);
134 out_buf.
writeData(&std::vector<uint8_t>(HWAddr::ETHERNET_HWADDR_LEN)[0],
135 HWAddr::ETHERNET_HWADDR_LEN);
139 HWAddrPtr local_addr = pkt->getLocalHWAddr();
141 if (local_addr->hwaddr_.size() == HWAddr::ETHERNET_HWADDR_LEN) {
142 out_buf.
writeData(&local_addr->hwaddr_[0],
143 HWAddr::ETHERNET_HWADDR_LEN);
146 << local_addr->hwaddr_.size() <<
" when constructing"
147 <<
" an ethernet frame header; expected size is"
148 <<
" " << HWAddr::ETHERNET_HWADDR_LEN);
152 out_buf.
writeData(&std::vector<uint8_t>(HWAddr::ETHERNET_HWADDR_LEN)[0],
153 HWAddr::ETHERNET_HWADDR_LEN);
165 out_buf.
writeUint16(28 + pkt->getBuffer().getLength());
171 out_buf.
writeUint32(pkt->getLocalAddr().toUint32());
172 out_buf.
writeUint32(pkt->getRemoteAddr().toUint32());
177 uint32_t udp_len = 8 + pkt->getBuffer().getLength();
184 uint16_t pseudo_hdr_checksum =
186 8, IPPROTO_UDP + udp_len);
204 uint16_t udp_checksum =
206 calcChecksum(
static_cast<const uint8_t*
>(pkt->getBuffer().getData()),
207 pkt->getBuffer().getLength(),
208 pseudo_hdr_checksum));
214 calcChecksum(
const uint8_t* buf,
const uint32_t buf_size, uint32_t sum) {
216 for (i = 0; i < (buf_size & ~1U); i += 2) {
217 uint16_t chunk = buf[i] << 8 | buf[i + 1];