20#include "pedigree/kernel/LockGuard.h"
21#include "pedigree/kernel/Log.h"
22#include "pedigree/kernel/compiler.h"
23#include "pedigree/kernel/machine/Machine.h"
24#include "pedigree/kernel/machine/Serial.h"
25#include "pedigree/kernel/process/Mutex.h"
26#include "pedigree/kernel/processor/types.h"
27#include "pedigree/kernel/time/Time.h"
29#include "modules/Module.h"
30#include "modules/system/network-stack/Filter.h"
32#define PCAP_MAGIC 0xa1b2c3d4
39static size_t g_FilterEntry = 0;
41static Mutex g_PcapMutex;
43static void writePcapUint16(
Serial* pSerial, uint16_t value) {
44 pSerial->write(
static_cast<char>(value & 0xff));
45 pSerial->write(
static_cast<char>((value >> 8) & 0xff));
48static void writePcapUint32(
Serial* pSerial, uint32_t value) {
49 pSerial->write(
static_cast<char>(value & 0xff));
50 pSerial->write(
static_cast<char>((value >> 8) & 0xff));
51 pSerial->write(
static_cast<char>((value >> 16) & 0xff));
52 pSerial->write(
static_cast<char>((value >> 24) & 0xff));
56static
Serial* getSerial() {
58 if (!Machine::instance().isInitialised()) {
63 if (Machine::instance().getNumSerial() < 3) {
70bool pcapLogPacket(uintptr_t packet,
size_t size) {
73 Serial* pSerial = getSerial();
80 ERROR(
"pcap: packet is way too big - size is " << size);
84 static uint64_t time = 0;
90 time += Time::Multiplier::Millisecond;
94 writePcapUint32(pSerial,
static_cast<uint32_t
>(time / Time::Multiplier::Second));
95 writePcapUint32(pSerial,
static_cast<uint32_t
>((time % Time::Multiplier::Second) /
96 Time::Multiplier::Microsecond));
97 writePcapUint32(pSerial,
static_cast<uint32_t
>(size));
98 writePcapUint32(pSerial,
static_cast<uint32_t
>(size));
101 const uint8_t* data =
reinterpret_cast<const uint8_t*
>(packet);
102 for (
size_t i = 0; i < size; ++i) {
103 pSerial->write(data[i]);
113 Serial* pSerial = getSerial();
115 NOTICE(
"pcap: could not find a useful serial port");
120 if (g_FilterEntry ==
static_cast<size_t>(-1)) {
121 NOTICE(
"pcap: could not install callback");
125 writePcapUint32(pSerial, PCAP_MAGIC);
126 writePcapUint16(pSerial, PCAP_MAJOR);
127 writePcapUint16(pSerial, PCAP_MINOR);
128 writePcapUint32(pSerial, 0);
129 writePcapUint32(pSerial, 0);
130 writePcapUint32(pSerial, 0xFFFF);
131 writePcapUint32(pSerial, PCAP_NETWORK);
140MODULE_INFO(
"pcap", &entry, &exit,
"network-stack");
virtual Serial * getSerial(size_t n)=0
size_t installCallback(size_t level, bool(*callback)(uintptr_t, size_t))
static NetworkFilter & instance()
bool removeCallback(size_t level, size_t id)