etherdump.cc
来自「M5,一个功能强大的多处理器系统模拟器.很多针对处理器架构,性能的研究都使用它作」· CC 代码 · 共 124 行
CC
124 行
/* * Copyright (c) 2002, 2003, 2004, 2005 * The Regents of The University of Michigan * All Rights Reserved * * This code is part of the M5 simulator. * * Permission is granted to use, copy, create derivative works and * redistribute this software and such derivative works for any * purpose, so long as the copyright notice above, this grant of * permission, and the disclaimer below appear in all copies made; and * so long as the name of The University of Michigan is not used in * any advertising or publicity pertaining to the use or distribution * of this software without specific, written prior authorization. * * THIS SOFTWARE IS PROVIDED AS IS, WITHOUT REPRESENTATION FROM THE * UNIVERSITY OF MICHIGAN AS TO ITS FITNESS FOR ANY PURPOSE, AND * WITHOUT WARRANTY BY THE UNIVERSITY OF MICHIGAN OF ANY KIND, EITHER * EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE. THE REGENTS OF THE UNIVERSITY OF MICHIGAN SHALL NOT BE * LIABLE FOR ANY DAMAGES, INCLUDING DIRECT, SPECIAL, INDIRECT, * INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WITH RESPECT TO ANY CLAIM * ARISING OUT OF OR IN CONNECTION WITH THE USE OF THE SOFTWARE, EVEN * IF IT HAS BEEN OR IS HEREAFTER ADVISED OF THE POSSIBILITY OF SUCH * DAMAGES. * * Authors: Nathan L. Binkert *//* @file * Simple object for creating a simple pcap style packet trace */#include <sys/time.h>#include <algorithm>#include <string>#include "base/misc.hh"#include "base/output.hh"#include "dev/etherdump.hh"#include "sim/core.hh"using std::string;EtherDump::EtherDump(const Params *p) : SimObject(p), stream(simout.resolve(p->file).c_str()), maxlen(p->maxlen){}#define DLT_EN10MB 1 // Ethernet (10Mb)#define TCPDUMP_MAGIC 0xa1b2c3d4#define PCAP_VERSION_MAJOR 2#define PCAP_VERSION_MINOR 4struct pcap_file_header { uint32_t magic; uint16_t version_major; uint16_t version_minor; int32_t thiszone; // gmt to local correction uint32_t sigfigs; // accuracy of timestamps uint32_t snaplen; // max length saved portion of each pkt uint32_t linktype; // data link type (DLT_*)};struct pcap_pkthdr { uint32_t seconds; uint32_t microseconds; uint32_t caplen; // length of portion present uint32_t len; // length this packet (off wire)};voidEtherDump::init(){ curtime = time(NULL); struct pcap_file_header hdr; hdr.magic = TCPDUMP_MAGIC; hdr.version_major = PCAP_VERSION_MAJOR; hdr.version_minor = PCAP_VERSION_MINOR; hdr.thiszone = -5 * 3600; hdr.snaplen = 1500; hdr.sigfigs = 0; hdr.linktype = DLT_EN10MB; stream.write(reinterpret_cast<char *>(&hdr), sizeof(hdr)); /* * output an empty packet with the current time so that we know * when the simulation began. This allows us to correlate packets * to sim_cycles. */ pcap_pkthdr pkthdr; pkthdr.seconds = curtime; pkthdr.microseconds = 0; pkthdr.caplen = 0; pkthdr.len = 0; stream.write(reinterpret_cast<char *>(&pkthdr), sizeof(pkthdr)); stream.flush();}voidEtherDump::dumpPacket(EthPacketPtr &packet){ pcap_pkthdr pkthdr; pkthdr.seconds = curtime + (curTick / Clock::Int::s); pkthdr.microseconds = (curTick / Clock::Int::us) % ULL(1000000); pkthdr.caplen = std::min(packet->length, maxlen); pkthdr.len = packet->length; stream.write(reinterpret_cast<char *>(&pkthdr), sizeof(pkthdr)); stream.write(reinterpret_cast<char *>(packet->data), pkthdr.caplen); stream.flush();}EtherDump *EtherDumpParams::create(){ return new EtherDump(this);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?