mbuf.h

来自「eCos操作系统源码」· C头文件 代码 · 共 477 行 · 第 1/2 页

H
477
字号
	}/* * mbuf allocation/deallocation macros: * *	MGET(struct mbuf *m, int how, int type) * allocates an mbuf and initializes it to contain internal data. * *	MGETHDR(struct mbuf *m, int how, int type) * allocates an mbuf and initializes it to contain a packet header * and internal data. */#define	MGET(m, how, type) { \	MBUF_ALLOC((m), struct mbuf *, MSIZE, mbtypes[type], (how)); \	if (m) { \		(m)->m_type = (type); \		MBUFLOCK(mbstat.m_mtypes[type]++;) \		(m)->m_next = (struct mbuf *)NULL; \		(m)->m_nextpkt = (struct mbuf *)NULL; \		(m)->m_data = (m)->m_dat; \		(m)->m_flags = 0; \	} else \		(m) = m_retry((how), (type)); \}#define	MGETHDR(m, how, type) { \	MBUF_ALLOC((m), struct mbuf *, MSIZE, mbtypes[type], (how)); \	if (m) { \		(m)->m_type = (type); \		MBUFLOCK(mbstat.m_mtypes[type]++;) \		(m)->m_next = (struct mbuf *)NULL; \		(m)->m_nextpkt = (struct mbuf *)NULL; \		(m)->m_data = (m)->m_pktdat; \		(m)->m_flags = M_PKTHDR; \	} else \		(m) = m_retryhdr((how), (type)); \}/* * Mbuf cluster macros. * MCLALLOC(caddr_t p, int how) allocates an mbuf cluster. * MCLGET adds such clusters to a normal mbuf; * the flag M_EXT is set upon success. * MCLFREE releases a reference to a cluster allocated by MCLALLOC, * freeing the cluster if the reference count has reached 0. * * Normal mbuf clusters are normally treated as character arrays * after allocation, but use the first word of the buffer as a free list * pointer while on the free list. */union mcluster {	union	mcluster *mcl_next;	char	mcl_buf[MCLBYTES];};#define	MCLALLOC(p, how) \	MBUFLOCK( \	  if (mclfree == 0) \		(void)m_clalloc(1, (how)); \	  if (((p) = (caddr_t)mclfree) != 0) { \		++mclrefcnt[mtocl(p)]; \		mbstat.m_clfree--; \		mclfree = ((union mcluster *)(p))->mcl_next; \	  } \	)#define	MCLGET(m, how) \	{ MCLALLOC((m)->m_ext.ext_buf, (how)); \	  if ((m)->m_ext.ext_buf != NULL) { \		(m)->m_data = (m)->m_ext.ext_buf; \		(m)->m_flags |= M_EXT; \		(m)->m_ext.ext_size = MCLBYTES;  \		(m)->m_ext.ext_free = NULL; \		(m)->m_ext.ext_ref = NULL; \		(m)->m_ext.ext_handle = NULL; \	  } \	}#define	MCLFREE(p) \	MBUFLOCK ( \	  if (--mclrefcnt[mtocl(p)] == 0) { \		((union mcluster *)(p))->mcl_next = mclfree; \		mclfree = (union mcluster *)(p); \		mbstat.m_clfree++; \	  } \	)/* * For cluster mbufs (regardless of header or not). */#define MCL_ALIGN(m, len) \	{ (m)->m_data += (MCLBYTES - (len)) &~ (sizeof(long) -1); }/* * MFREE(struct mbuf *m, struct mbuf *n) * Free a single mbuf and associated external storage. * Place the successor, if any, in n. */#define	MFREE(m, n) \	{ MBUFLOCK(mbstat.m_mtypes[(m)->m_type]--;) \	  if ((m)->m_flags & M_EXT) { \		if ((m)->m_ext.ext_free) \			(*((m)->m_ext.ext_free))(m); \		else \			MCLFREE((m)->m_ext.ext_buf); \	  } \	  (n) = (m)->m_next; \	  MBUF_FREE((m), mbtypes[(m)->m_type]); \	}/* * Copy mbuf pkthdr from from to to. * from must have M_PKTHDR set, and to must be empty. */#define	M_COPY_PKTHDR(to, from) { \	(to)->m_pkthdr = (from)->m_pkthdr; \	(to)->m_flags = (from)->m_flags & M_COPYFLAGS; \	(to)->m_data = (to)->m_pktdat; \}/* * 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) \	{ (m)->m_data += (MLEN - (len)) &~ (sizeof(long) - 1); }/* * As above, for mbufs allocated with m_gethdr/MGETHDR * or initialized by M_COPY_PKTHDR. */#define	MH_ALIGN(m, len) \	{ (m)->m_data += (MHLEN - (len)) &~ (sizeof(long) - 1); }/* * 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) { \	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); \}/* change mbuf to new type */#define MCHTYPE(m, t) { \	MBUFLOCK(mbstat.m_mtypes[(m)->m_type]--; mbstat.m_mtypes[t]++;) \	(m)->m_type = t;\}/* length to m_copy to copy all */#define	M_COPYALL	1000000000/* compatiblity with 4.3 */#define  m_copy(m, o, l)	m_copym((m), (o), (l), M_DONTWAIT)/* * Mbuf statistics. */struct mbstat {	u_long	m_mbufs;	/* mbufs obtained from page pool */	u_long	m_clusters;	/* clusters obtained from page pool */	u_long	m_spare;	/* spare field */	u_long	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 */};#ifdef	_KERNELextern	struct mbuf *mbutl;		/* virtual address of mclusters */extern	char *mclrefcnt;		/* cluster reference counts */extern  struct	mbstat mbstat;extern	int nmbclusters;union	mcluster *mclfree;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	int mbtypes[];			/* XXX */extern	int needqueuedrain;		/* True if allocation failed at */					/* interrupt level */void	mbinit __P((void));struct	mbuf *m_copym2 __P((struct mbuf *, int, int, int));struct	mbuf *m_copym __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_pullup __P((struct mbuf *, int));struct	mbuf *m_pullup2 __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));struct  mbuf *m_inject __P((struct mbuf *, int, int, int));void	m_adj __P((struct mbuf *, int));int	m_clalloc __P((int, int));void	m_copyback __P((struct mbuf *, int, int, caddr_t));void	m_freem __P((struct mbuf *));void	m_reclaim __P((void));void	m_copydata __P((struct mbuf *, int, int, caddr_t));void	m_cat __P((struct mbuf *, struct mbuf *));struct mbuf *m_devget __P((char *, int, int, struct ifnet *,			   void (*) __P((const void *, void *, size_t))));void	m_zero __P((struct mbuf *));int	m_apply __P((struct mbuf *, int, int,			int (*)(caddr_t, caddr_t, unsigned int), caddr_t));#endif#endif // _SYS_MBUF_H_

⌨️ 快捷键说明

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