diff options
author | amurai <amurai@FreeBSD.org> | 1995-01-31 06:29:58 +0000 |
---|---|---|
committer | amurai <amurai@FreeBSD.org> | 1995-01-31 06:29:58 +0000 |
commit | 21ef2761fd1e5a4beb483da8bddf767d36540dce (patch) | |
tree | 3aecd1251d1647032ad1455f304eaeeaab4987d0 /usr.sbin/ppp/mbuf.c | |
parent | 0487956fcf018d602bfe99b0e3398c6f4d55680a (diff) | |
download | FreeBSD-src-21ef2761fd1e5a4beb483da8bddf767d36540dce.zip FreeBSD-src-21ef2761fd1e5a4beb483da8bddf767d36540dce.tar.gz |
Diffstat (limited to 'usr.sbin/ppp/mbuf.c')
-rw-r--r-- | usr.sbin/ppp/mbuf.c | 187 |
1 files changed, 187 insertions, 0 deletions
diff --git a/usr.sbin/ppp/mbuf.c b/usr.sbin/ppp/mbuf.c new file mode 100644 index 0000000..2486569 --- /dev/null +++ b/usr.sbin/ppp/mbuf.c @@ -0,0 +1,187 @@ +/* + * PPP Memory handling module + * + * Written by Toshiharu OHNO (tony-o@iij.ad.jp) + * + * Copyright (C) 1993, Internet Initiative Japan, Inc. All rights reserverd. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by the Internet Initiative Japan, Inc. The name of the + * IIJ may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * + * $Id:$ + * + * TODO: + */ +#include "defs.h" + +struct memmap { + struct mbuf *queue; + int count; +} MemMap[MB_MAX+2]; + +static int totalalloced; + +int +plength(bp) +struct mbuf *bp; +{ + int len; + + for (len = 0; bp; bp = bp->next) + len += bp->cnt; + return(len); +} + +struct mbuf * +mballoc(cnt, type) +int cnt; +int type; +{ + u_char *p; + struct mbuf *bp; + + if (type > MB_MAX) + logprintf("bad type %d\n", type); + bp = (struct mbuf *)malloc(sizeof(struct mbuf)); + bzero(bp, sizeof(struct mbuf)); + p = (u_char *)malloc(cnt); + MemMap[type].count += cnt; + totalalloced += cnt; + bp->base = p; + bp->size = bp->cnt = cnt; + bp->type = type; + return(bp); +} + +struct mbuf * +mbfree(struct mbuf *bp) +{ + struct mbuf *nbp; + + if (bp) { + nbp = bp->next; + MemMap[bp->type].count -= bp->size; + totalalloced -= bp->size; + free(bp->base); + free(bp); + return(nbp); + } + return(bp); +} + +void +pfree(struct mbuf *bp) +{ + while (bp) + bp = mbfree(bp); +} + +struct mbuf * +mbread(bp, ptr, len) +struct mbuf *bp; +u_char *ptr; +int len; +{ + int nb; + + while (bp && len > 0) { + if (len > bp->cnt) + nb = bp->cnt; + else + nb = len; + bcopy(MBUF_CTOP(bp), ptr, nb); + ptr += nb; + bp->cnt -= nb; + len -= nb; + bp->offset += nb; + if (bp->cnt == 0) { +#ifdef notdef + bp = bp->next; +#else + bp = mbfree(bp); +#endif + } + } + return(bp); +} + +void +mbwrite(bp, ptr, cnt) +struct mbuf *bp; +u_char *ptr; +int cnt; +{ + int plen; + int nb; + + plen = plength(bp); + if (plen < cnt) + cnt = plen; + + while (cnt > 0) { + nb = (cnt < bp->cnt)? cnt : bp->cnt; + bcopy(ptr, MBUF_CTOP(bp), nb); + cnt -= bp->cnt; + bp = bp->next; + } +} + +void +DumpBp(bp) +struct mbuf *bp; +{ + u_char *cp; + int cnt, loc; + + logprintf("dump bp = %x (%d)\n", bp, plength(bp)); + loc = 0; + while (bp) { + cp = MBUF_CTOP(bp); + cnt = bp->cnt; + while (cnt > 0) { + logprintf("%02x", *cp++); + loc++; + if (loc == 16) { + loc = 0; + logprintf("\n"); + } else + logprintf(" "); + cnt--; + } + bp = bp->next; + } + if (loc) logprintf("\n"); +} + +int +ShowMemMap() +{ + int i; + + for (i = 0; i <= MB_MAX; i += 2) { + printf("%d: %d %d: %d\r\n", + i, MemMap[i].count, i+1, MemMap[i+1].count); + } + return(1); +} + +void +LogMemory() +{ +#ifdef DEBUG + logprintf("mem alloced: %d\n", totalalloced); + logprintf(" 1: %d 2: %d 3: %d 4: %d\n", + MemMap[1].count, MemMap[2].count, MemMap[3].count, MemMap[4].count); + logprintf(" 5: %d 6: %d 7: %d 8: %d\n", + MemMap[5].count, MemMap[6].count, MemMap[7].count, MemMap[8].count); +#endif +} |