📄 mbuf.h
字号:
/* * 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 + -