summaryrefslogtreecommitdiffstats
path: root/sys
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 /sys
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.
Diffstat (limited to 'sys')
-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