40 lines
1.1 KiB
C
40 lines
1.1 KiB
C
#pragma once
|
|
#include "sys/types.h"
|
|
#include "sys/spin.h"
|
|
|
|
#define PACKET_SIZE_L3INET (sizeof(struct eth_frame) + sizeof(struct inet_frame))
|
|
#define PACKET_SIZE_L3ARP (sizeof(struct eth_frame) + sizeof(struct arp_frame))
|
|
#define PACKET_L2(p) ((void *) ((p)->data))
|
|
// TODO: Only works with ethernet
|
|
#define PACKET_L3(p) ((void *) ((p)->data + sizeof(struct eth_frame)))
|
|
// TODO: Only works for TCP/IP stack
|
|
#define PACKET_L4(p) ((void *) ((p)->data + PACKET_SIZE_L3INET))
|
|
|
|
struct netdev;
|
|
// Takes up a single page
|
|
#define PACKET_DATA_MAX (4056)
|
|
struct packet {
|
|
size_t size;
|
|
struct netdev *dev;
|
|
size_t refcount;
|
|
char data[PACKET_DATA_MAX];
|
|
};
|
|
|
|
struct packet_qh {
|
|
struct packet *packet;
|
|
struct packet_qh *prev, *next;
|
|
};
|
|
|
|
struct packet_queue {
|
|
spin_t lock;
|
|
struct packet_qh *head, *tail;
|
|
};
|
|
|
|
struct packet *packet_create(size_t size);
|
|
void packet_ref(struct packet *p);
|
|
void packet_unref(struct packet *p);
|
|
|
|
void packet_queue_init(struct packet_queue *q);
|
|
void packet_queue_push(struct packet_queue *q, struct packet *p);
|
|
struct packet *packet_queue_pop(struct packet_queue *q);
|