Beispiel #1
0
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);
      }
    }
  }
};
Beispiel #2
0
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));
}
Beispiel #3
0
IPv4Layer::IPv4Layer(const IPv4Address& srcIP, const IPv4Address& dstIP)
{
	initLayer();
	iphdr* ipHdr = getIPv4Header();
	ipHdr->ipSrc = srcIP.toInt();
	ipHdr->ipDst = dstIP.toInt();
}
Beispiel #4
0
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;
	}
}