void pcap_callback(evutil_socket_t fd, short what, void *arg) { struct module* mod = (struct module*) arg; struct pcap_pkthdr pkthdr; const unsigned char *packet = NULL; while ((packet = pcap_next(mod->pcap_handle, &pkthdr)) != NULL) { dispatchDatabases(); if (mod->rawpacket_callback) mod->rawpacket_callback(packet, pkthdr, mod->context); struct ethernet_header* ethernet_header = NULL; struct ipv4_header* ipv4 = NULL; if (mod->ipv4_callback) { ethernet_header = getEthernetHeader(packet); ipv4 = getIPv4Header(packet); if (ethernet_header && ipv4) mod->ipv4_callback(ethernet_header, ipv4, packet, pkthdr, mod->context); } if (mod->ipv4_udp_callback) { if (!ethernet_header) ethernet_header = getEthernetHeader(packet); if (!ipv4) ipv4 = getIPv4Header(packet); if (ethernet_header && ipv4) { struct udp_header* udp = getUDPHeaderFromIPv4(packet, ipv4); if (udp) mod->ipv4_udp_callback(ethernet_header, ipv4, udp, packet, pkthdr, mod->context); } } } };
void IPv4Layer::computeCalculateFields() { iphdr* ipHdr = getIPv4Header(); ipHdr->internetHeaderLength = (5 & 0xf); ipHdr->ipVersion = (4 & 0x0f); ipHdr->totalLength = htons(m_DataLen); ipHdr->headerChecksum = 0; if (m_NextLayer != NULL) { switch (m_NextLayer->getProtocol()) { case TCP: ipHdr->protocol = PACKETPP_IPPROTO_TCP; break; case UDP: ipHdr->protocol = PACKETPP_IPPROTO_UDP; break; case ICMP: ipHdr->protocol = PACKETPP_IPPROTO_ICMP; break; default: break; } } ScalarBuffer scalar = { (uint16_t*)ipHdr, ipHdr->internetHeaderLength*4 } ; ipHdr->headerChecksum = htons(compute_checksum(&scalar, 1)); }
IPv4Layer::IPv4Layer(const IPv4Address& srcIP, const IPv4Address& dstIP) { initLayer(); iphdr* ipHdr = getIPv4Header(); ipHdr->ipSrc = srcIP.toInt(); ipHdr->ipDst = dstIP.toInt(); }
void IPv4Layer::parseNextLayer() { if (m_DataLen <= sizeof(iphdr)) return; iphdr* ipHdr = getIPv4Header(); switch (ipHdr->protocol) { case PACKETPP_IPPROTO_UDP: m_NextLayer = new UdpLayer(m_Data + sizeof(iphdr), m_DataLen - sizeof(iphdr), this, m_Packet); break; case PACKETPP_IPPROTO_TCP: m_NextLayer = new TcpLayer(m_Data + sizeof(iphdr), m_DataLen - sizeof(iphdr), this, m_Packet); break; default: m_NextLayer = new PayloadLayer(m_Data + sizeof(iphdr), m_DataLen - sizeof(iphdr), this, m_Packet); return; } }