EthLayer::EthLayer(MacAddress& sourceMac, MacAddress& destMac, uint16_t etherType) : Layer() { m_DataLen = sizeof(ether_header); m_Data = new uint8_t[m_DataLen]; memset(m_Data, 0, m_DataLen); ether_header* ethHdr = (ether_header*)m_Data; destMac.copyTo(ethHdr->dstMac); sourceMac.copyTo(ethHdr->srcMac); ethHdr->etherType = htons(etherType); m_Protocol = Ethernet; }
ArpLayer::ArpLayer(ArpOpcode opCode, const MacAddress& senderMacAddr, const MacAddress& targetMacAddr, const IPv4Address senderIpAddr, const IPv4Address& targetIpAddr) { m_DataLen = sizeof(arphdr); m_Data = new uint8_t[m_DataLen]; memset(m_Data, 0, sizeof(m_DataLen)); m_Protocol = ARP; arphdr* arpHeader = getArpHeader(); arpHeader->opcode = htons(opCode); targetMacAddr.copyTo(arpHeader->targetMacAddr); senderMacAddr.copyTo(arpHeader->senderMacAddr); arpHeader->targetIpAddr = targetIpAddr.toInt(); arpHeader->senderIpAddr = senderIpAddr.toInt(); }
int RawSocketDevice::sendPackets(const RawPacketVector& packetVec) { #if defined(WIN32) || defined(WINx64) || defined(PCAPPP_MINGW_ENV) LOG_ERROR("Sending packets with raw socket are not supported on Windows"); return false; #elif LINUX if (!isOpened()) { LOG_ERROR("Device is not open"); return 0; } int fd = ((SocketContainer*)m_Socket)->fd; sockaddr_ll addr; memset(&addr, 0, sizeof(struct sockaddr_ll)); addr.sll_family = htons(PF_PACKET); addr.sll_protocol = htons(ETH_P_ALL); addr.sll_halen = 6; addr.sll_ifindex = ((SocketContainer*)m_Socket)->interfaceIndex; int sendCount = 0; for (RawPacketVector::ConstVectorIterator iter = packetVec.begin(); iter != packetVec.end(); iter++) { Packet packet(*iter, OsiModelDataLinkLayer); if (!packet.isPacketOfType(pcpp::Ethernet)) { LOG_DEBUG("Can't send non-Ethernet packets"); continue; } EthLayer* ethLayer = packet.getLayerOfType<EthLayer>(); MacAddress dstMac = ethLayer->getDestMac(); dstMac.copyTo((uint8_t*)&(addr.sll_addr)); if (::sendto(fd, (*iter)->getRawData(), (*iter)->getRawDataLen(), 0, (struct sockaddr*)&addr, sizeof(addr)) == -1) { LOG_DEBUG("Failed to send packet. Error was: '%s'", strerror(errno)); continue; } sendCount++; } return sendCount; #else LOG_ERROR("Raw socket are not supported on this platform"); return false; #endif }
bool SllLayer::setMacAddressAsLinkLayer(MacAddress macAddr) { if (!macAddr.isValid()) { LOG_ERROR("MAC address is not valid"); return false; } uint8_t macAddrAsArr[6]; macAddr.copyTo(macAddrAsArr); return setLinkLayerAddr(macAddrAsArr, 6); }