数据包处理的并行化

时间:2016-07-20 08:37:09

标签: c++ openmp packets

由于大型PCAP文件的数据包处理(统计计算,如IP分配,TTL分配等)相对较慢,我想将其并行化。

我使用C ++库libtins进行数据包读取和处理:

数据包读取

FileSniffer sniffer(pcap_path);
for (const auto &pkt : sniffer) {
    this->process_packets(pkt);
}

数据包处理(摘录)

void PcapProcessor::process_packets(const Packet &pkt) {
  // packet count
  packetCount++;
  const PDU *pdu = pkt.pdu();

  if (pdu->find_pdu<IP>()) {
      const IP &ipLayer = pdu->rfind_pdu<IP>();
      // IP distribution
      ip_distribution[ipLayer.src_addr()]++;
      ip_distribution[ipLayer.dst_addr()]++;

      // TTL distribution
      ttl_distribution[ipLayer.ttl()]++;

      // Protocol distribution - layer 3
      protocol_distribution["IP"]++;
  }

 // Protocol distribution - layer 4
 PDU::PDUType p = pdu->inner_pdu()->pdu_type();
 if (p == PDU::PDUType::TCP) {
    protocol_distribution["TCP"]++;
 }
 if (p == PDU::PDUType::UDP) {
    protocol_distribution["UDP"]++;
 }
}

process_packets消耗大部分处理时间。如果可以并行调用多个数据包,那将非常节省时间。这通常是否可行,因为sniffer中的数据包数量尚不清楚?如果是这样,std::unordered_map中使用的intprocess_packets变量是否必须更改为线程安全?

我尝试使用OpenMP,只需在循环之前添加#pragma openmp parallel for,然后导致error: ‘pkt’ implicitly determined as ‘firstprivate’ has reference type #pragma omp task。这根本不可并行吗?

0 个答案:

没有答案