The Pedigree Project 0.1
modules/drivers/common/virtio-net/main.cc
1/* Copyright (c) 2026, Pedigree Developers. SPDX-License-Identifier: ISC */
2#include "pedigree/kernel/machine/Device.h"
3#include "pedigree/kernel/utilities/List.h"
4#include "pedigree/kernel/utilities/new"
5
6#include "VirtioNet.h"
7#include "modules/Module.h"
8
9namespace {
10List<Device*> candidates;
12
13void collect(Device* pci) {
14 for (size_t i = 0; i < pci->getNumChildren(); ++i) {
15 if (pci->getChild(i)->getSpecificType() == String("virtio-net-card")) {
16 return;
17 }
18 }
19 candidates.pushBack(pci);
20}
21
22bool entry() {
23 Device::searchByVendorIdAndDeviceId(0x1af4, 0x1041, collect);
24 Device::searchByVendorIdAndDeviceId(0x1af4, 0x1000, collect);
25 while (candidates.count()) {
26 Device* pci = candidates.popFront();
27 auto* card = new VirtioNet(pci);
28 if (!card->initialise()) {
29 delete card;
30 continue;
31 }
32 {
34 card->setParent(pci);
35 pci->addChild(card);
36 }
37 cards.pushBack(card);
38 }
39 return cards.count() != 0;
40}
41
42void exit() {
43 while (cards.count()) {
44 auto* card = cards.popFront();
45 {
47 card->getParent()->removeChild(card);
48 card->setParent(nullptr);
49 }
50 delete card;
51 }
52}
53} // namespace
54
55MODULE_INFO("virtio-net", &entry, &exit, "virtio-pci", "network-stack");
size_t getNumChildren()
Definition Device.cc:143
Device * getChild(size_t n)
Definition Device.cc:139
void addChild(Device *pDevice)
Definition Device.cc:135
virtual const String & getSpecificType()
Definition Device.h:183
Definition List.h:61
T popFront()
Definition List.h:330
size_t count() const
Definition List.h:212
void pushBack(const T &value)
Definition List.h:216