xref: /original-bsd/sys/sys/mbuf.h (revision f0fd5f8a)
1 /*	mbuf.h	4.16	82/12/14	*/
2 
3 /*
4  * Constants related to memory allocator.
5  */
6 #define	MSIZE		128			/* size of an mbuf */
7 #define	MMINOFF		12			/* mbuf header length */
8 #define	MTAIL		4
9 #define	MMAXOFF		(MSIZE-MTAIL)		/* offset where data ends */
10 #define	MLEN		(MSIZE-MMINOFF-MTAIL)	/* mbuf data length */
11 #define	NMBCLUSTERS	256
12 #define	NMBPCL		(CLBYTES/MSIZE)		/* # mbufs per cluster */
13 
14 /*
15  * Macros for type conversion
16  */
17 
18 /* network cluster number to virtual address, and back */
19 #define	cltom(x) ((struct mbuf *)((int)mbutl + ((x) << CLSHIFT)))
20 #define	mtocl(x) (((int)x - (int)mbutl) >> CLSHIFT)
21 
22 /* address in mbuf to mbuf head */
23 #define	dtom(x)		((struct mbuf *)((int)x & ~(MSIZE-1)))
24 
25 /* mbuf head, to typed data */
26 #define	mtod(x,t)	((t)((int)(x) + (x)->m_off))
27 
28 struct mbuf {
29 	struct	mbuf *m_next;		/* next buffer in chain */
30 	u_long	m_off;			/* offset of data */
31 	short	m_len;			/* amount of data in this mbuf */
32 	short	m_type;			/* mbuf type (0 == free) */
33 	u_char	m_dat[MLEN];		/* data storage */
34 	struct	mbuf *m_act;		/* link in higher-level mbuf list */
35 };
36 
37 /* mbuf types */
38 #define	MT_FREE		0	/* should be on free list */
39 #define	MT_DATA		1	/* dynamic (data) allocation */
40 #define	MT_HEADER	2	/* packet header */
41 #define	MT_SOCKET	3	/* socket structure */
42 #define	MT_PCB		4	/* protocol control block */
43 #define	MT_RTABLE	5	/* routing tables */
44 #define	MT_HTABLE	6	/* IMP host tables */
45 #define	MT_ATABLE	7	/* address resolution tables */
46 #define	MT_SONAME	8	/* socket name */
47 #define	MT_ZOMBIE	9	/* zombie proc status */
48 #define	MT_SOOPTS	10	/* socket options */
49 #define	MT_FTABLE	11	/* fragment reassembly header */
50 
51 /* flags to m_get */
52 #define	M_DONTWAIT	0
53 #define	M_WAIT		1
54 
55 /* flags to m_pgalloc */
56 #define	MPG_MBUFS	0		/* put new mbufs on free list */
57 #define	MPG_CLUSTERS	1		/* put new clusters on free list */
58 #define	MPG_SPACE	2		/* don't free; caller wants space */
59 
60 /* length to m_copy to copy all */
61 #define	M_COPYALL	1000000000
62 
63 #define	MGET(m, i, t) \
64 	{ int ms = splimp(); \
65 	  if ((m)=mfree) \
66 		{ if ((m)->m_type != MT_FREE) panic("mget"); (m)->m_type = t; \
67 		  mbstat.m_mbfree--; mbstat.m_mtypes[t]++; \
68 		  mfree = (m)->m_next; (m)->m_next = 0; \
69 		  (m)->m_off = MMINOFF; } \
70 	  else \
71 		(m) = m_more(i, t); \
72 	  splx(ms); }
73 #define	MCLGET(m, i) \
74 	{ int ms = splimp(); \
75 	  if ((m)=mclfree) \
76 	     {++mclrefcnt[mtocl(m)];mbstat.m_clfree--;mclfree = (m)->m_next;} \
77 	  splx(ms); }
78 #define	MFREE(m, n) \
79 	{ int ms = splimp(); \
80 	  if ((m)->m_type == MT_FREE) panic("mfree"); \
81 	  mbstat.m_mtypes[(m)->m_type]--; (m)->m_type = MT_FREE; \
82 	  if ((m)->m_off > MSIZE) { \
83 		(n) = (struct mbuf *)(mtod(m, int)&~0x3ff); \
84 		if (--mclrefcnt[mtocl(n)] == 0) \
85 		    { (n)->m_next = mclfree;mclfree = (n);mbstat.m_clfree++;} \
86 	  } \
87 	  (n) = (m)->m_next; (m)->m_next = mfree; \
88 	  (m)->m_off = 0; (m)->m_act = 0; mfree = (m); mbstat.m_mbfree++; \
89 	  splx(ms); }
90 
91 /*
92  * Mbuf statistics.
93  */
94 struct mbstat {
95 	short	m_mbufs;	/* mbufs obtained from page pool */
96 	short	m_mbfree;	/* mbufs on our free list */
97 	short	m_clusters;	/* clusters obtained from page pool */
98 	short	m_clfree;	/* free clusters */
99 	short	m_drops;	/* times failed to find space */
100 	short	m_mtypes[32];	/* type specific mbuf allocations */
101 };
102 
103 #ifdef	KERNEL
104 extern	struct mbuf mbutl[];		/* virtual address of net free mem */
105 extern	struct pte Mbmap[];		/* page tables to map Netutl */
106 struct	mbstat mbstat;
107 int	nmbclusters;
108 struct	mbuf *mfree, *mclfree;
109 char	mclrefcnt[NMBCLUSTERS];
110 struct	mbuf *m_get(),*m_getclr(),*m_free(),*m_more(),*m_copy(),*m_pullup();
111 caddr_t	m_clalloc();
112 #endif
113