freebsd_network: Synchronize some mbuf routines with upstream FreeBSD.
Also delete an OpenBSD compatibility section that isn't used. This includes a fix to mbufq_full (made in 2019 in FreeBSD) to allow for mbufqs of unlimited size, apparently needed by some drivers, found by @smrobtzz while testing USB ethernet drivers.
This commit is contained in:
@@ -1,6 +1,9 @@
|
|||||||
/*-
|
/*-
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*
|
||||||
* Copyright (c) 1982, 1986, 1988, 1993
|
* Copyright (c) 1982, 1986, 1988, 1993
|
||||||
* The Regents of the University of California. All rights reserved.
|
* The Regents of the University of California.
|
||||||
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions
|
* modification, are permitted provided that the following conditions
|
||||||
@@ -98,6 +101,16 @@ m_align(struct mbuf *m, int len)
|
|||||||
#define M_LEADINGSPACE(m) \
|
#define M_LEADINGSPACE(m) \
|
||||||
(M_WRITABLE(m) ? ((m)->m_data - M_START(m)) : 0)
|
(M_WRITABLE(m) ? ((m)->m_data - M_START(m)) : 0)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* So M_TRAILINGROOM() is for when you want to know how much space
|
||||||
|
* would be there if it was writable. This can be used to
|
||||||
|
* detect changes in mbufs by knowing the value at one point
|
||||||
|
* and then being able to compare it later to the current M_TRAILINGROOM().
|
||||||
|
* The TRAILINGSPACE() macro is not suitable for this since an mbuf
|
||||||
|
* at one point might not be writable and then later it becomes writable
|
||||||
|
* even though the space at the back of it has not changed.
|
||||||
|
*/
|
||||||
|
#define M_TRAILINGROOM(m) ((M_START(m) + M_SIZE(m)) - ((m)->m_data + (m)->m_len))
|
||||||
/*
|
/*
|
||||||
* Compute the amount of space available after the end of data in an mbuf.
|
* Compute the amount of space available after the end of data in an mbuf.
|
||||||
*
|
*
|
||||||
@@ -108,15 +121,12 @@ m_align(struct mbuf *m, int len)
|
|||||||
* for mbufs with external storage. We now allow mbuf-embedded data to be
|
* for mbufs with external storage. We now allow mbuf-embedded data to be
|
||||||
* read-only as well.
|
* read-only as well.
|
||||||
*/
|
*/
|
||||||
#define M_TRAILINGSPACE(m) \
|
#define M_TRAILINGSPACE(m) (M_WRITABLE(m) ? M_TRAILINGROOM(m) : 0)
|
||||||
(M_WRITABLE(m) ? \
|
|
||||||
((M_START(m) + M_SIZE(m)) - ((m)->m_data + (m)->m_len)) : 0)
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Arrange to prepend space of size plen to mbuf m.
|
* Arrange to prepend space of size plen to mbuf m. If a new mbuf must be
|
||||||
* If a new mbuf must be allocated, how specifies whether to wait.
|
* allocated, how specifies whether to wait. If the allocation fails, the
|
||||||
* If the allocation fails, the original mbuf chain is freed and m is
|
* original mbuf chain is freed and m is set to NULL.
|
||||||
* set to NULL.
|
|
||||||
*/
|
*/
|
||||||
#define M_PREPEND(m, plen, how) do { \
|
#define M_PREPEND(m, plen, how) do { \
|
||||||
struct mbuf **_mmp = &(m); \
|
struct mbuf **_mmp = &(m); \
|
||||||
@@ -212,16 +222,6 @@ m_cljset(struct mbuf *m, void *cl, int type)
|
|||||||
m->m_flags |= M_EXT;
|
m->m_flags |= M_EXT;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* These are for OpenBSD compatibility. */
|
|
||||||
#define MTAG_ABI_COMPAT 0 /* compatibility ABI */
|
|
||||||
|
|
||||||
static __inline struct m_tag *
|
|
||||||
m_tag_find(struct mbuf *m, uint16_t type, struct m_tag *start)
|
|
||||||
{
|
|
||||||
return (SLIST_EMPTY(&m->m_pkthdr.tags) ? (struct m_tag *)NULL :
|
|
||||||
m_tag_locate(m, MTAG_ABI_COMPAT, type, start));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* mbufq */
|
/* mbufq */
|
||||||
|
|
||||||
struct mbufq {
|
struct mbufq {
|
||||||
@@ -233,6 +233,7 @@ struct mbufq {
|
|||||||
static inline void
|
static inline void
|
||||||
mbufq_init(struct mbufq *mq, int maxlen)
|
mbufq_init(struct mbufq *mq, int maxlen)
|
||||||
{
|
{
|
||||||
|
|
||||||
STAILQ_INIT(&mq->mq_head);
|
STAILQ_INIT(&mq->mq_head);
|
||||||
mq->mq_maxlen = maxlen;
|
mq->mq_maxlen = maxlen;
|
||||||
mq->mq_len = 0;
|
mq->mq_len = 0;
|
||||||
@@ -264,12 +265,14 @@ mbufq_drain(struct mbufq *mq)
|
|||||||
static inline struct mbuf *
|
static inline struct mbuf *
|
||||||
mbufq_first(const struct mbufq *mq)
|
mbufq_first(const struct mbufq *mq)
|
||||||
{
|
{
|
||||||
|
|
||||||
return (STAILQ_FIRST(&mq->mq_head));
|
return (STAILQ_FIRST(&mq->mq_head));
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline struct mbuf *
|
static inline struct mbuf *
|
||||||
mbufq_last(const struct mbufq *mq)
|
mbufq_last(const struct mbufq *mq)
|
||||||
{
|
{
|
||||||
|
|
||||||
return (STAILQ_LAST(&mq->mq_head, mbuf, m_stailqpkt));
|
return (STAILQ_LAST(&mq->mq_head, mbuf, m_stailqpkt));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -282,12 +285,14 @@ mbufq_empty(const struct mbufq *mq)
|
|||||||
static inline int
|
static inline int
|
||||||
mbufq_full(const struct mbufq *mq)
|
mbufq_full(const struct mbufq *mq)
|
||||||
{
|
{
|
||||||
return (mq->mq_len >= mq->mq_maxlen);
|
|
||||||
|
return (mq->mq_maxlen > 0 && mq->mq_len >= mq->mq_maxlen);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
mbufq_len(const struct mbufq *mq)
|
mbufq_len(const struct mbufq *mq)
|
||||||
{
|
{
|
||||||
|
|
||||||
return (mq->mq_len);
|
return (mq->mq_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -324,7 +329,6 @@ mbufq_prepend(struct mbufq *mq, struct mbuf *m)
|
|||||||
mq->mq_len++;
|
mq->mq_len++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Note: this doesn't enforce the maximum list size for dst.
|
* Note: this doesn't enforce the maximum list size for dst.
|
||||||
*/
|
*/
|
||||||
@@ -337,4 +341,5 @@ mbufq_concat(struct mbufq *mq_dst, struct mbufq *mq_src)
|
|||||||
mq_src->mq_len = 0;
|
mq_src->mq_len = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
#endif /* _FBSD_COMPAT_SYS_MBUF_FBSD_H_ */
|
||||||
|
|||||||
Reference in New Issue
Block a user