Exemple #1
0
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));
}
Exemple #2
0
// 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);
}
Exemple #3
0
void toAppend(IPAddressV4 addr, fbstring* result) {
  result->append(addr.str());
}
Exemple #4
0
// free functions
size_t hash_value(const IPAddressV4& addr) {
  return addr.hash();
}