AquilaOS documentation
How it works, and its code
Toggle main menu visibility
Loading...
Searching...
No Matches
netbuf.c
Go to the documentation of this file.
1
9
10
#include <
core/system.h
>
11
#include <
core/arch.h
>
12
#include <
mm/mm.h
>
13
#include <
net/netbuf.h
>
14
15
/* The free netbufs, and how many there are. Once more than NETBUF_KEEP
16
* are free, a page whose netbufs are all free goes back to the page
17
* allocator (keeping fewer would only make the next packets take a page
18
* again at once). */
19
#define NETBUF_KEEP 64
20
#define NETBUF_PER_PAGE (PAGE_SIZE / NETBUF_SIZE)
21
22
static
struct
netbuf
*
free_netbufs
;
23
static
size_t
free_count
;
24
26
static
void
free_push
(
struct
netbuf
*nb)
27
{
28
nb->
free_prev
=
NULL
;
29
nb->
next
=
free_netbufs
;
30
31
if
(
free_netbufs
)
32
free_netbufs
->
free_prev
= nb;
33
34
free_netbufs
= nb;
35
free_count
++;
36
}
37
39
static
void
free_remove
(
struct
netbuf
*nb)
40
{
41
if
(nb->
free_prev
)
42
nb->
free_prev
->
next
= nb->
next
;
43
else
44
free_netbufs
= nb->
next
;
45
46
if
(nb->
next
)
47
nb->
next
->
free_prev
= nb->
free_prev
;
48
49
free_count
--;
50
}
51
58
struct
netbuf
*
netbuf_alloc
(
void
)
59
{
60
if
(!
free_netbufs
) {
61
struct
vm_page
*
vm_page
=
mm_page_alloc
();
62
63
if
(!
vm_page
)
64
return
NULL
;
65
66
uint8_t
*page =
arch_phys_map
(
vm_page
->
paddr
,
PAGE_SIZE
);
67
68
if
(!page) {
69
mm_page_dealloc
(
vm_page
->
paddr
);
70
return
NULL
;
71
}
72
73
for
(
size_t
off
= 0;
off
<
PAGE_SIZE
;
off
+=
NETBUF_SIZE
) {
74
struct
netbuf
*nb = (
struct
netbuf
*) (
page
+ off);
75
nb->
page
=
vm_page
->
paddr
;
76
free_push
(nb);
77
}
78
}
79
80
struct
netbuf
*nb =
free_netbufs
;
81
free_remove
(nb);
82
83
/* the page's reference count is how many of its netbufs are in use */
84
mm_page_incref
(nb->
page
);
85
86
nb->
next
=
NULL
;
87
nb->
netif
=
NULL
;
88
nb->
data
= (
uint8_t
*) (nb + 1) +
NETBUF_HEADROOM
;
89
nb->
len
= 0;
90
91
return
nb;
92
}
93
99
void
netbuf_free
(
struct
netbuf
*nb)
100
{
101
free_push
(nb);
102
mm_page_decref
(nb->
page
);
103
104
if
(
mm_page_ref
(nb->
page
) ||
free_count
<=
NETBUF_KEEP
)
105
return
;
106
107
/* all the page's netbufs are free: take them off the list, and give
108
* the page back */
109
uint8_t
*
page
= (
uint8_t
*) ((
uintptr_t
) nb & ~(
uintptr_t
)
PAGE_MASK
);
110
111
for
(
size_t
i = 0; i <
NETBUF_PER_PAGE
; ++i)
112
free_remove
((
struct
netbuf
*) (
page
+ i *
NETBUF_SIZE
));
113
114
mm_page_dealloc
(nb->
page
);
115
}
PAGE_SIZE
#define PAGE_SIZE
Definition
system.h:7
PAGE_MASK
#define PAGE_MASK
Definition
system.h:8
arch.h
system.h
mm.h
mm_page_decref
void mm_page_decref(paddr_t paddr)
Drops a reference to a page of RAM.
Definition
mm.c:50
mm_page_alloc
struct vm_page * mm_page_alloc(void)
Allocates a free page of physical memory.
Definition
mm.c:78
mm_page_ref
size_t mm_page_ref(paddr_t paddr)
Returns how many references a page of RAM has.
Definition
mm.c:62
mm_page_dealloc
void mm_page_dealloc(paddr_t paddr)
Frees a page of physical memory, back to the zone it came from.
Definition
mm.c:103
mm_page_incref
void mm_page_incref(paddr_t paddr)
Adds a reference to a page of RAM.
Definition
mm.c:39
free_netbufs
static struct netbuf * free_netbufs
Definition
netbuf.c:22
free_count
static size_t free_count
Definition
netbuf.c:23
NETBUF_KEEP
#define NETBUF_KEEP
Definition
netbuf.c:19
NETBUF_PER_PAGE
#define NETBUF_PER_PAGE
Definition
netbuf.c:20
free_remove
static void free_remove(struct netbuf *nb)
Takes a netbuf off the free list.
Definition
netbuf.c:39
free_push
static void free_push(struct netbuf *nb)
Puts a netbuf on the free list.
Definition
netbuf.c:26
netbuf.h
NETBUF_SIZE
#define NETBUF_SIZE
Definition
netbuf.h:40
netbuf_free
void netbuf_free(struct netbuf *nb)
Frees a netbuf.
Definition
netbuf.c:99
netbuf_alloc
struct netbuf * netbuf_alloc(void)
Allocates a netbuf, empty, with room for the headers that will be put in front of its data.
Definition
netbuf.c:58
NETBUF_HEADROOM
#define NETBUF_HEADROOM
Definition
netbuf.h:41
arch_phys_map
void * arch_phys_map(uintptr_t paddr, size_t size)
Returns a kernel address for a range of physical memory: its address in the direct map if it's there,...
Definition
pmap.c:497
NULL
#define NULL
Definition
stddef.h:27
uintptr_t
__SIZE_TYPE__ uintptr_t
Definition
stddef.h:12
uint8_t
unsigned char uint8_t
Definition
stddef.h:20
netbuf
A packet (net/netbuf.c).
Definition
netbuf.h:16
netbuf::netif
struct netif * netif
Definition
netbuf.h:18
netbuf::next
struct netbuf * next
Definition
netbuf.h:17
netbuf::data
uint8_t * data
Definition
netbuf.h:19
netbuf::page
paddr_t page
Definition
netbuf.h:34
netbuf::free_prev
struct netbuf * free_prev
Definition
netbuf.h:35
netbuf::len
size_t len
Definition
netbuf.h:20
vm_page
A page of physical memory (pages[] has one for every page of RAM).
Definition
vm.h:150
vm_page::off
size_t off
its offset in its object or anon
Definition
vm.h:155
vm_page::paddr
paddr_t paddr
its physical address
Definition
vm.h:151
kernel
net
netbuf.c
Generated by
1.18.0