summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorharti <harti@FreeBSD.org>2004-02-21 12:55:07 +0000
committerharti <harti@FreeBSD.org>2004-02-21 12:55:07 +0000
commita2c86ff9f2c313e81667a1b60883e7c9c6b248de (patch)
tree1adec56b8d416c89363ee45eb38b4270acc7b6a1
parent3325da8ccdc7f58de4150a0632cfb3907766a3f9 (diff)
downloadFreeBSD-src-a2c86ff9f2c313e81667a1b60883e7c9c6b248de.zip
FreeBSD-src-a2c86ff9f2c313e81667a1b60883e7c9c6b248de.tar.gz
Don't remove the first mbuf in the chain if it got empty.
This removes the packet header in certain cases which later on will give panic. Clarify what the atm_intr expects in the comment and de-obscurify the code a little bit by replacing the portability macros with the BSD names. The code isn't maintained externally anymore so there's no point in keeping the extra level of obscurity.
-rw-r--r--sys/netatm/atm_subr.c13
1 files changed, 6 insertions, 7 deletions
diff --git a/sys/netatm/atm_subr.c b/sys/netatm/atm_subr.c
index a2768f3..d816dfd 100644
--- a/sys/netatm/atm_subr.c
+++ b/sys/netatm/atm_subr.c
@@ -542,6 +542,8 @@ atm_stack_drain()
* and a token (typically a driver/stack control block) at the front of the
* queued buffer. We assume that the function pointer and token values are
* both contained (and properly aligned) in the first buffer of the chain.
+ * The size of these two fields is not accounted for in the packet header
+ * length field. The packet header itself must be in the first mbuf.
*
* Arguments:
* none
@@ -562,16 +564,13 @@ atm_intr(struct mbuf *m)
/*
* Get function to call and token value
*/
- KB_DATASTART(m, cp, caddr_t);
+ cp = mtod(m, caddr_t);
func = *(atm_intr_func_t *)cp;
cp += sizeof(func);
token = *(void **)cp;
- KB_HEADADJ(m, -(sizeof(func) + sizeof(token)));
- if (KB_LEN(m) == 0) {
- KBuffer *m1;
- KB_UNLINKHEAD(m, m1);
- m = m1;
- }
+
+ m->m_len -= sizeof(func) + sizeof(token);
+ m->m_data += sizeof(func) + sizeof(token);
/*
* Call processing function
OpenPOWER on IntegriCloud