14#include <manux/errno.h>
18#ifdef MANUX_BUFFER_RESEAU
23#ifndef VIRTIO_TAILLE_TRAME_MAX
24# define VIRTIO_TAILLE_TRAME_MAX 2000
27#define VR_FILE_RECEPTION 0
28#define VR_FILE_EMISSION 1
33#define VIRTIO_NET_F_CSUM 0x00000001
34#define VIRTIO_NET_F_GUEST_CSUM 0x00000002
35#define VIRTIO_NET_F_CTRL_GUEST_OFFLOADS 0x00000004
36#define VIRTIO_NET_F_MAC 0x00000020
37#define VIRTIO_NET_F_GUEST_TSO4 0x00000080
38#define VIRTIO_NET_F_GUEST_TSO6 0x00000100
39#define VIRTIO_NET_F_GUEST_ECN 0x00000200
40#define VIRTIO_NET_F_GUEST_UFO 0x00000400
41#define VIRTIO_NET_F_HOST_TSO4 0x00000800
42#define VIRTIO_NET_F_HOST_TSO6 0x00001000
43#define VIRTIO_NET_F_HOST_ECN 0x00002000
44#define VIRTIO_NET_F_HOST_UFO 0x00004000
46#define VIRTIO_NET_F_MRG_RXBUF 0x00008000
47#define VIRTIO_NET_F_STATUS 0x00010000
48#define VIRTIO_NET_F_CTRL_VQ 0x00020000
49#define VIRTIO_NET_F_CTRL_RX 0x00040000
50#define VIRTIO_NET_F_CTRL_VLAN 0x00080000
51#define VIRTIO_NET_F_GUEST_ANNOUNCE 0x00200000
67typedef struct __attribute__((__packed__)) _VirtioReseauEntete {
88 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xff,
89 0xee, 0xde, 0xad, 0xbe, 0x08, 0x06, 0x00, 0x01,
90 0x08, 0x00, 0x06, 0x04, 0x00, 0x01, 0xc0, 0xff,
91 0xee, 0xde, 0xad, 0xbe, 0x0a, 0x00, 0x02, 0x0f,
92 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00,
96 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xff,
97 0xee, 0xde, 0xad, 0xbe, 0x08, 0x06, 0x00, 0x01,
98 0x08, 0x00, 0x06, 0x04, 0x00, 0x01, 0xc0, 0xff,
99 0xee, 0xde, 0xad, 0xbe, 0x0a, 0x00, 0x02, 0x0f,
100 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00,
114void netDumpPacket(
uint8_t * packet,
int lg)
117 for (i = 0; i < lg; i++) {
118 printk(
"%2x ", packet[i]);
119 if (i % 8 == 7)
printk(
" ");
120 if (i % 16 == 15)
printk(
"\n");
122 if (i % 16 != 15)
printk(
"\n");
167#ifdef MANUX_BUFFER_RESEAU
174 printk(
"on insere ...\n");
179 vr->
nbItRecues, nbLu, longueurs[0], longueurs[1]);
181 if (nbLu) {
printk(
"RECU : \n");
182 netDumpPacket(buffers[1], longueurs[1]);
193void virtioNetRecevoirTramePartieBasse(
void * _vr)
197 printk(
"C'est triste je ne fais rien avec %d!\n", vr);
212void virtioNetGestionInt(
void * pr)
228 virtioNetRecevoirTrame(vr);
241 .recevoirTrame = virtioNetRecevoirTramePartieBasse
251int virtioNetInitPeripherique(
int PCINumeroPeripherique)
268 PCINumeroPeripherique,
291 for (
int i = 0 ; i < fr->taille/2; i++) {
292 buffers[0] = pointeur;
295 buffers[1] = pointeur;
306 for (
int i = 0; i < 6; i++){
358 buffers[1] = (
void*)trame;
375 int PCINumeroPeripherique;
390 if (virtioNetInitPeripherique(PCINumeroPeripherique) == 0) {
Définition des buffers réseau et les fonctions associcées.
int listeBufferReseauInserer(ListeBufferReseau *l, BufferReseau *b)
Insertion d'un buffer réseau à la fin d'une liste.
BufferReseau * bufferReseauCreer(void *donnees, int taille)
Création (allocation et initialisation des champs de base) d'un buffer réseau.
typedef void(Handler(void))
void * allouerPages(uint32_t nombre)
void printk(char *format,...)
Fonction principale d'affichage dans le noyau.
int i8259aAjouterHandler(int numIRQ, void(*handler)(void *), void *private)
Ajout d'un handler.
void i8259aAutoriserIRQ(uint8_t numIRQ)
Masquage d'une IRQ.
void reseauEnregistrerPilote(ReseauPilote *p)
void reseauAjouterInterface(ReseauPilote *p, void *d)
Ajout d'une nouvelle interface réseau.
#define inb(port, adresseOctet)
Lecture d'un octet depuis un port.
#define paniqueNoyau(fmt, args...)
#define printk_debug(lvl, fmt, args...)
int PCIObtenirProchainEquipement(uint16_t vendeur, uint16_t equipement, int precedent)
: récuperer l'identifiant du prochain équipement PCI
PCIEquipement * PCIEquipementNumero(int n)
ListeBufferReseau * listeBuffersRecus
La liste des buffers qui ont été reçus mais non encore traités.
#define PCI_PERIPHERIQUE_VIRTIO_NET
int virtioInitPeripheriquePCI(VirtioPeripherique *vp, int PCINum, uint32_t masque)
#define VRING_DESC_F_WRITE
int virtioFournirBuffers(VirtioPeripherique *vp, uint16_t id, void *bu[], int lg[], int nb, uint16_t fl)
: Fournir un(e chaine de) buffer(s) au périphérique.
int virtioFileRecupererBuffers(VirtioFileVirtuelle *fv, void *bu[], int lg[], int nb)
on va récupérer des buffers
#define PCI_VENDEUR_VIRTIO
VirtioPeripherique virtioPeripherique
: structure permettant d'identifier un équipement PCI
Description d'un pilote d'interface réseau.
Défnition d'un buffer réseau.
#define VIRTIO_NET_F_GUEST_TSO4
void virtioReseauPoll(void)
struct VirtioReseau_t VirtioReseau
ReseauPilote virtioPiloteReseau
Description du pilote virtio.
#define VIRTIO_NET_F_GUEST_CSUM
#define VIRTIO_NET_F_GUEST_TSO6
#define VR_FILE_RECEPTION
#define VIRTIO_NET_F_MRG_RXBUF
#define VIRTIO_NET_F_CTRL_VQ
#define VIRTIO_TAILLE_TRAME_MAX
uint8_t unBufferALaCon[4096]
void virtioNetTestDeuxiemeEmission(void)
struct __attribute__((__packed__))
Description de l'entête ajouté par virtio net.
#define VIRTIO_NET_F_GUEST_UFO
int virtioNetInit(void)
Initialisation des périphériques.
VirtioReseau virtioReseau
VirtioReseauEntete virtioReseauEntete