public void handleIPv4Packet(IPv4 ipv4, IPacketModuleContext ctx) {
    if (ipv4.getNextProtocol() != NetworkConstants.IPPROTO_TCP) {
      return;
    }

    TCP tcp = (TCP) ipv4.findHeader(TCP.class);

    if (tcp == null) {
      return;
    }
    if (foundAddresses.contains(ipv4.getSourceAddress())) {
      return;
    }

    Signature s = handleTCP(ipv4, tcp, ctx);
    if (s == null) return;

    log(
        ctx,
        "match! ["
            + ipv4.getSourceAddress()
            + "] --> "
            + ipv4.getDestinationAddress()
            + " is "
            + s.getOSGenre()
            + " "
            + s.getOSVersion());
    foundAddresses.add(ipv4.getSourceAddress());

    INetworkEntityFactory factory = Activator.getInstance().getNetworkEntityFactory();
    factory.setOperatingSystem(
        ctx.getRealm(),
        ctx.getSpaceId(),
        ipv4.getSourceAddress(),
        s.getOSGenre() + " " + s.getOSVersion());
  }