void IPv4Handler::sendICMPTimeExceeded(VlanID srcVlan, MacAddress dst, MacAddress src, IPv4Hdr& v4Hdr, Cursor cursor) { auto state = sw_->getState(); // payload serialization function // 4 bytes unused + ipv4 header + 8 bytes payload auto bodyLength = ICMPHdr::ICMPV4_UNUSED_LEN + v4Hdr.size() + ICMPHdr::ICMPV4_SENDER_BYTES; auto serializeBody = [&](RWPrivateCursor* sendCursor) { sendCursor->writeBE<uint32_t>(0); // unused bytes v4Hdr.write(sendCursor); sendCursor->push(cursor.data(), ICMPHdr::ICMPV4_SENDER_BYTES); }; IPAddressV4 srcIp = getSwitchVlanIP(state, srcVlan); auto icmpPkt = createICMPv4Pkt(sw_, dst, src, srcVlan, v4Hdr.srcAddr, srcIp, ICMPV4_TYPE_TIME_EXCEEDED, ICMPV4_CODE_TIME_EXCEEDED_TTL_EXCEEDED, bodyLength, serializeBody); VLOG(4) << "sending ICMP Time Exceeded with srcMac " << src << " dstMac: " << dst << " vlan: " << srcVlan << " dstIp: " << v4Hdr.srcAddr.str() << " srcIp: " << srcIp.str() << " bodyLength: " << bodyLength; sw_->sendPacketSwitched(std::move(icmpPkt)); }
// public bool IPAddressV4::inSubnetWithMask(const IPAddressV4& subnet, const ByteArray4 cidrMask) const { const ByteArray4 mask = detail::Bytes::mask(toByteArray(), cidrMask); const ByteArray4 subMask = detail::Bytes::mask(subnet.toByteArray(), cidrMask); return (mask == subMask); }
void toAppend(IPAddressV4 addr, fbstring* result) { result->append(addr.str()); }
// free functions size_t hash_value(const IPAddressV4& addr) { return addr.hash(); }