⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mbuf.h

📁 基于组件方式开发操作系统的OSKIT源代码
💻 H
📖 第 1 页 / 共 2 页
字号:
/* * Macros for mbuf external storage. * * MCLGET allocates and adds an mbuf cluster to a normal mbuf; * the flag M_EXT is set upon success. * * MEXTMALLOC allocates external storage and adds it to * a normal mbuf; the flag M_EXT is set upon success. * * MEXTADD adds pre-allocated external storage to * a normal mbuf; the flag M_EXT is set upon success. */#define	MCLGET(m, how) do { \	MBUFLOCK( \		(m)->m_ext.ext_buf = \		    pool_get(&mclpool, (how) == M_WAIT ? \			(PR_WAITOK|PR_LIMITFAIL) : 0); \		if ((m)->m_ext.ext_buf == NULL) { \			m_reclaim((how)); \			(m)->m_ext.ext_buf = \			    pool_get(&mclpool, \			     (how) == M_WAIT ? PR_WAITOK : 0); \		} \	); \	if ((m)->m_ext.ext_buf != NULL) { \		(m)->m_data = (m)->m_ext.ext_buf; \		(m)->m_flags |= M_EXT|M_CLUSTER; \		(m)->m_ext.ext_size = MCLBYTES;  \		(m)->m_ext.ext_free = NULL;  \		(m)->m_ext.ext_arg = NULL;  \		MCLINITREFERENCE(m); \	} \} while (0)#define	MEXTMALLOC(m, size, how) do { \	(m)->m_ext.ext_buf = \	    (caddr_t)malloc((size), mbtypes[(m)->m_type], (how)); \	if ((m)->m_ext.ext_buf != NULL) { \		(m)->m_data = (m)->m_ext.ext_buf; \		(m)->m_flags |= M_EXT; \		(m)->m_flags &= ~M_CLUSTER; \		(m)->m_ext.ext_size = (size); \		(m)->m_ext.ext_free = NULL; \		(m)->m_ext.ext_arg = NULL; \		(m)->m_ext.ext_type = mbtypes[(m)->m_type]; \		MCLINITREFERENCE(m); \	} \} while (0)#define	MEXTADD(m, buf, size, type, free, arg) do { \	(m)->m_data = (m)->m_ext.ext_buf = (caddr_t)(buf); \	(m)->m_flags |= M_EXT; \	(m)->m_flags &= ~M_CLUSTER; \	(m)->m_ext.ext_size = (size); \	(m)->m_ext.ext_free = (free); \	(m)->m_ext.ext_arg = (arg); \	(m)->m_ext.ext_type = (type); \	MCLINITREFERENCE(m); \} while (0)#define	_MEXTREMOVE(m) do { \	if (MCLISREFERENCED(m)) { \		_MCLDEREFERENCE(m); \	} else if ((m)->m_flags & M_CLUSTER) { \		pool_put(&mclpool, (m)->m_ext.ext_buf); \	} else if ((m)->m_ext.ext_free) { \		(*((m)->m_ext.ext_free))((m)->m_ext.ext_buf, \		    (m)->m_ext.ext_size, (m)->m_ext.ext_arg); \	} else { \		free((m)->m_ext.ext_buf,(m)->m_ext.ext_type); \	} \	(m)->m_flags &= ~(M_CLUSTER|M_EXT); \	(m)->m_ext.ext_size = 0;	/* why ??? */ \} while (0)#define	MEXTREMOVE(m) \	MBUFLOCK(_MEXTREMOVE((m));)/* * Reset the data pointer on an mbuf. */#define	MRESETDATA(m)							\do {									\	if ((m)->m_flags & M_EXT)					\		(m)->m_data = (m)->m_ext.ext_buf;			\	else if ((m)->m_flags & M_PKTHDR)				\		(m)->m_data = (m)->m_pktdat;				\	else								\		(m)->m_data = (m)->m_dat;				\} while (0)/* * MFREE(struct mbuf *m, struct mbuf *n) * Free a single mbuf and associated external storage. * Place the successor, if any, in n. * * we do need to check non-first mbuf for m_aux, since some of existing * code does not call M_PREPEND properly. * (example: call to bpf_mtap from drivers) */#define	MFREE(m, n) \	MBUFLOCK( \		mbstat.m_mtypes[(m)->m_type]--; \		if (((m)->m_flags & M_PKTHDR) != 0 && (m)->m_pkthdr.aux) { \			m_freem((m)->m_pkthdr.aux); \			(m)->m_pkthdr.aux = NULL; \		} \		if ((m)->m_flags & M_EXT) { \			_MEXTREMOVE((m)); \		} \		(n) = (m)->m_next; \		pool_put(&mbpool, (m)); \	)/* * Copy mbuf pkthdr from `from' to `to'. * `from' must have M_PKTHDR set, and `to' must be empty. * aux pointer will be moved to `to'. */#define	M_COPY_PKTHDR(to, from) do { \	(to)->m_pkthdr = (from)->m_pkthdr; \	(from)->m_pkthdr.aux = (struct mbuf *)NULL; \	(to)->m_flags = (from)->m_flags & M_COPYFLAGS; \	(to)->m_data = (to)->m_pktdat; \} while (0)/* * Set the m_data pointer of a newly-allocated mbuf (m_get/MGET) to place * an object of the specified size at the end of the mbuf, longword aligned. */#define	M_ALIGN(m, len) \	do { (m)->m_data += (MLEN - (len)) &~ (sizeof(long) - 1); } while (0)/* * As above, for mbufs allocated with m_gethdr/MGETHDR * or initialized by M_COPY_PKTHDR. */#define	MH_ALIGN(m, len) \	do { (m)->m_data += (MHLEN - (len)) &~ (sizeof(long) - 1); } while (0)/* * Compute the amount of space available * before the current start of data in an mbuf. */#define	M_LEADINGSPACE(m) \	((m)->m_flags & M_EXT ? /* (m)->m_data - (m)->m_ext.ext_buf */ 0 : \	    (m)->m_flags & M_PKTHDR ? (m)->m_data - (m)->m_pktdat : \	    (m)->m_data - (m)->m_dat)/* * Compute the amount of space available * after the end of data in an mbuf. */#define	M_TRAILINGSPACE(m) \	((m)->m_flags & M_EXT ? (m)->m_ext.ext_buf + (m)->m_ext.ext_size - \	    ((m)->m_data + (m)->m_len) : \	    &(m)->m_dat[MLEN] - ((m)->m_data + (m)->m_len))/* * Arrange to prepend space of size plen to mbuf m. * If a new mbuf must be allocated, how specifies whether to wait. * If how is M_DONTWAIT and allocation fails, the original mbuf chain * is freed and m is set to NULL. */#define	M_PREPEND(m, plen, how) do { \	if (M_LEADINGSPACE(m) >= (plen)) { \		(m)->m_data -= (plen); \		(m)->m_len += (plen); \	} else \		(m) = m_prepend((m), (plen), (how)); \	if ((m) && (m)->m_flags & M_PKTHDR) \		(m)->m_pkthdr.len += (plen); \} while (0)/* change mbuf to new type */#define MCHTYPE(m, t) do { \	MBUFLOCK(mbstat.m_mtypes[(m)->m_type]--; mbstat.m_mtypes[t]++;); \	(m)->m_type = t; \} while (0)/* length to m_copy to copy all */#define	M_COPYALL	1000000000/* compatibility with 4.3 */#define  m_copy(m, o, l)	m_copym((m), (o), (l), M_DONTWAIT)/* * Allow drivers and/or protocols to use the rcvif member of * PKTHDR mbufs to store private context information. */#define	M_GETCTX(m, t)		((t) (m)->m_pkthdr.rcvif + 0)#define	M_SETCTX(m, c)		((void) ((m)->m_pkthdr.rcvif = (void *) (c)))/* * pkthdr.aux type tags. */struct mauxtag {	int af;	int type;};/* * Mbuf statistics. * For statistics related to mbuf and cluster allocations, see also the * pool headers (mbpool and mclpool). */struct mbstat {	u_long	_m_spare;	/* formerly m_mbufs */	u_long	_m_spare1;	/* formerly m_clusters */	u_long	_m_spare2;	/* spare field */	u_long	_m_spare3;	/* formely m_clfree - free clusters */	u_long	m_drops;	/* times failed to find space */	u_long	m_wait;		/* times waited for space */	u_long	m_drain;	/* times drained protocols for space */	u_short	m_mtypes[256];	/* type specific mbuf allocations */};/* * Mbuf sysctl variables. */#define	MBUF_MSIZE		1	/* int: mbuf base size */#define	MBUF_MCLBYTES		2	/* int: mbuf cluster size */#define	MBUF_NMBCLUSTERS	3	/* int: limit on the # of clusters */#define	MBUF_MBLOWAT		4	/* int: mbuf low water mark */#define	MBUF_MCLLOWAT		5	/* int: mbuf cluster low water mark */#define	MBUF_MAXID		6	/* number of valid MBUF ids */#define	CTL_MBUF_NAMES { \	{ 0, 0 }, \	{ "msize", CTLTYPE_INT }, \	{ "mclbytes", CTLTYPE_INT }, \	{ "nmbclusters", CTLTYPE_INT }, \	{ "mblowat", CTLTYPE_INT }, \	{ "mcllowat", CTLTYPE_INT }, \}#ifdef	_KERNEL/* always use m_pulldown codepath for KAME IPv6/IPsec */#define PULLDOWN_TESTextern struct mbstat mbstat;extern int	nmbclusters;		/* limit on the # of clusters */extern int	mblowat;		/* mbuf low water mark */extern int	mcllowat;		/* mbuf cluster low water mark */extern int	max_linkhdr;		/* largest link-level header */extern int	max_protohdr;		/* largest protocol header */extern int	max_hdr;		/* largest link+protocol header */extern int	max_datalen;		/* MHLEN - max_hdr */extern const int msize;			/* mbuf base size */extern const int mclbytes;		/* mbuf cluster size */extern const int mbtypes[];		/* XXX */extern struct pool mbpool;extern struct pool mclpool;struct	mbuf *m_copym __P((struct mbuf *, int, int, int));struct	mbuf *m_copypacket __P((struct mbuf *, int));struct	mbuf *m_devget __P((char *, int, int, struct ifnet *,			    void (*copy)(const void *, void *, size_t)));struct	mbuf *m_dup __P((struct mbuf *, int, int, int));struct	mbuf *m_free __P((struct mbuf *));struct	mbuf *m_get __P((int, int));struct	mbuf *m_getclr __P((int, int));struct	mbuf *m_gethdr __P((int, int));struct	mbuf *m_prepend __P((struct mbuf *,int,int));struct	mbuf *m_pulldown __P((struct mbuf *, int, int, int *));struct	mbuf *m_pullup __P((struct mbuf *, int));struct	mbuf *m_retry __P((int, int));struct	mbuf *m_retryhdr __P((int, int));struct	mbuf *m_split __P((struct mbuf *,int,int));void	m_adj __P((struct mbuf *, int));void	m_cat __P((struct mbuf *,struct mbuf *));int	m_mballoc __P((int, int));void	m_copyback __P((struct mbuf *, int, int, caddr_t));void	m_copydata __P((struct mbuf *,int,int,caddr_t));void	m_freem __P((struct mbuf *));void	m_reclaim __P((int));void	mbinit __P((void));struct mbuf *m_aux_add __P((struct mbuf *, int, int));struct mbuf *m_aux_find __P((struct mbuf *, int, int));void m_aux_delete __P((struct mbuf *, struct mbuf *));#ifdef MBTYPESconst int mbtypes[] = {				/* XXX */	M_FREE,		/* MT_FREE	0	should be on free list */	M_MBUF,		/* MT_DATA	1	dynamic (data) allocation */	M_MBUF,		/* MT_HEADER	2	packet header */	M_MBUF,		/* MT_SONAME	3	socket name */	M_SOOPTS,	/* MT_SOOPTS	4	socket options */	M_FTABLE,	/* MT_FTABLE	5	fragment reassembly header */	M_MBUF,		/* MT_CONTROL	6	extra-data protocol message */	M_MBUF,		/* MT_OOBDATA	7	expedited data  */};#endif /* MBTYPES */#endif /* _KERNEL */#endif /* !_SYS_MBUF_H_ */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -