mbuf.c revision 37210
16059Samurai/* 26059Samurai * PPP Memory handling module 36059Samurai * 46059Samurai * Written by Toshiharu OHNO (tony-o@iij.ad.jp) 56059Samurai * 66059Samurai * Copyright (C) 1993, Internet Initiative Japan, Inc. All rights reserverd. 76059Samurai * 86059Samurai * Redistribution and use in source and binary forms are permitted 96059Samurai * provided that the above copyright notice and this paragraph are 106059Samurai * duplicated in all such forms and that any documentation, 116059Samurai * advertising materials, and other materials related to such 126059Samurai * distribution and use acknowledge that the software was developed 136059Samurai * by the Internet Initiative Japan, Inc. The name of the 146059Samurai * IIJ may not be used to endorse or promote products derived 156059Samurai * from this software without specific prior written permission. 166059Samurai * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 176059Samurai * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 186059Samurai * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 196059Samurai * 2037210Sbrian * $Id: mbuf.c,v 1.17 1998/06/16 19:40:20 brian Exp $ 218857Srgrimes * 226059Samurai */ 2336285Sbrian#include <sys/types.h> 2430715Sbrian 2530715Sbrian#include <stdio.h> 2630715Sbrian#include <stdlib.h> 2730715Sbrian#include <string.h> 2836285Sbrian#include <sysexits.h> 2936285Sbrian#include <termios.h> 3030715Sbrian 3137009Sbrian#include "defs.h" 3231343Sbrian#include "command.h" 3330715Sbrian#include "mbuf.h" 3430715Sbrian#include "log.h" 3536285Sbrian#include "descriptor.h" 3636285Sbrian#include "prompt.h" 3736285Sbrian#include "main.h" 386059Samurai 3932663Sbrianstatic struct memmap { 406059Samurai struct mbuf *queue; 4128679Sbrian int count; 4236285Sbrian} MemMap[MB_MAX + 2]; 436059Samurai 446059Samuraistatic int totalalloced; 456059Samurai 466059Samuraiint 4736285Sbrianmbuf_Length(struct mbuf * bp) 486059Samurai{ 496059Samurai int len; 506059Samurai 516059Samurai for (len = 0; bp; bp = bp->next) 526059Samurai len += bp->cnt; 5328679Sbrian return (len); 546059Samurai} 556059Samurai 566059Samuraistruct mbuf * 5736285Sbrianmbuf_Alloc(int cnt, int type) 586059Samurai{ 596059Samurai u_char *p; 606059Samurai struct mbuf *bp; 616059Samurai 626059Samurai if (type > MB_MAX) 6336285Sbrian log_Printf(LogERROR, "Bad mbuf type %d\n", type); 6428679Sbrian bp = (struct mbuf *) malloc(sizeof(struct mbuf)); 6525630Sbrian if (bp == NULL) { 6637210Sbrian log_Printf(LogALERT, "failed to allocate memory: %ld\n", 6737210Sbrian (long)sizeof(struct mbuf)); 6836285Sbrian AbortProgram(EX_OSERR); 6925630Sbrian } 7030715Sbrian memset(bp, '\0', sizeof(struct mbuf)); 7128679Sbrian p = (u_char *) malloc(cnt); 7225630Sbrian if (p == NULL) { 7336285Sbrian log_Printf(LogALERT, "failed to allocate memory: %d\n", cnt); 7436285Sbrian AbortProgram(EX_OSERR); 7525630Sbrian } 766059Samurai MemMap[type].count += cnt; 776059Samurai totalalloced += cnt; 786059Samurai bp->base = p; 796059Samurai bp->size = bp->cnt = cnt; 806059Samurai bp->type = type; 8132040Sbrian bp->pnext = NULL; 8228679Sbrian return (bp); 836059Samurai} 846059Samurai 856059Samuraistruct mbuf * 8636285Sbrianmbuf_FreeSeg(struct mbuf * bp) 876059Samurai{ 886059Samurai struct mbuf *nbp; 896059Samurai 906059Samurai if (bp) { 916059Samurai nbp = bp->next; 926059Samurai MemMap[bp->type].count -= bp->size; 936059Samurai totalalloced -= bp->size; 946059Samurai free(bp->base); 956059Samurai free(bp); 9628679Sbrian return (nbp); 976059Samurai } 9828679Sbrian return (bp); 996059Samurai} 1006059Samurai 1016059Samuraivoid 10236285Sbrianmbuf_Free(struct mbuf * bp) 1036059Samurai{ 1046059Samurai while (bp) 10536285Sbrian bp = mbuf_FreeSeg(bp); 1066059Samurai} 1076059Samurai 1086059Samuraistruct mbuf * 10936285Sbrianmbuf_Read(struct mbuf * bp, u_char * ptr, int len) 1106059Samurai{ 1116059Samurai int nb; 1126059Samurai 1136059Samurai while (bp && len > 0) { 1146059Samurai if (len > bp->cnt) 1156059Samurai nb = bp->cnt; 1166059Samurai else 1176059Samurai nb = len; 11830715Sbrian memcpy(ptr, MBUF_CTOP(bp), nb); 1196059Samurai ptr += nb; 1206059Samurai bp->cnt -= nb; 1216059Samurai len -= nb; 1226059Samurai bp->offset += nb; 1236059Samurai if (bp->cnt == 0) { 1246059Samurai#ifdef notdef 1256059Samurai bp = bp->next; 1266059Samurai#else 12736285Sbrian bp = mbuf_FreeSeg(bp); 1286059Samurai#endif 1296059Samurai } 1306059Samurai } 13128679Sbrian return (bp); 1326059Samurai} 1338857Srgrimes 1346059Samuraivoid 13536285Sbrianmbuf_Write(struct mbuf * bp, u_char * ptr, int cnt) 1366059Samurai{ 1376059Samurai int plen; 1386059Samurai int nb; 1396059Samurai 14036285Sbrian plen = mbuf_Length(bp); 1416059Samurai if (plen < cnt) 1426059Samurai cnt = plen; 1436059Samurai 1446059Samurai while (cnt > 0) { 14528679Sbrian nb = (cnt < bp->cnt) ? cnt : bp->cnt; 14630715Sbrian memcpy(MBUF_CTOP(bp), ptr, nb); 1476059Samurai cnt -= bp->cnt; 1486059Samurai bp = bp->next; 1496059Samurai } 1506059Samurai} 1516059Samurai 1526059Samuraiint 15336285Sbrianmbuf_Show(struct cmdargs const *arg) 1546059Samurai{ 1556059Samurai int i; 15636285Sbrian static const char *mbuftype[] = { 15736285Sbrian "async", "fsm", "hdlcout", "ipin", "echo", "lqr", "link", "vjcomp", 15836285Sbrian "ipq", "mp" }; 1596059Samurai 16036285Sbrian for (i = 1; i < MB_MAX; i += 2) 16136285Sbrian prompt_Printf(arg->prompt, "%10.10s: %04d\t%10.10s: %04d\n", 16236285Sbrian mbuftype[i-1], MemMap[i].count, mbuftype[i], MemMap[i+1].count); 16326516Sbrian 16436285Sbrian if (i == MB_MAX) 16536285Sbrian prompt_Printf(arg->prompt, "%10.10s: %04d\n", 16636285Sbrian mbuftype[i-1], MemMap[i].count); 16726516Sbrian 16826516Sbrian return 0; 1696059Samurai} 1706059Samurai 1716059Samuraivoid 17236285Sbrianmbuf_Log() 1736059Samurai{ 17436285Sbrian log_Printf(LogDEBUG, "mbuf_Log: mem alloced: %d\n", totalalloced); 17536285Sbrian log_Printf(LogDEBUG, "mbuf_Log: 1: %d 2: %d 3: %d 4: %d\n", 1766059Samurai MemMap[1].count, MemMap[2].count, MemMap[3].count, MemMap[4].count); 17736285Sbrian log_Printf(LogDEBUG, "mbuf_Log: 5: %d 6: %d 7: %d 8: %d\n", 1786059Samurai MemMap[5].count, MemMap[6].count, MemMap[7].count, MemMap[8].count); 17936285Sbrian log_Printf(LogDEBUG, "mbuf_Log: 9: %d 10: %d\n", 18036285Sbrian MemMap[9].count, MemMap[10].count); 1816059Samurai} 18236285Sbrian 18336285Sbrianstruct mbuf * 18436285Sbrianmbuf_Dequeue(struct mqueue *q) 18536285Sbrian{ 18636285Sbrian struct mbuf *bp; 18736285Sbrian 18836285Sbrian log_Printf(LogDEBUG, "mbuf_Dequeue: queue len = %d\n", q->qlen); 18936285Sbrian bp = q->top; 19036285Sbrian if (bp) { 19136285Sbrian q->top = q->top->pnext; 19236285Sbrian q->qlen--; 19336285Sbrian if (q->top == NULL) { 19436285Sbrian q->last = q->top; 19536285Sbrian if (q->qlen) 19636285Sbrian log_Printf(LogERROR, "mbuf_Dequeue: Not zero (%d)!!!\n", q->qlen); 19736285Sbrian } 19837017Sbrian bp->pnext = NULL; 19936285Sbrian } 20036285Sbrian 20136285Sbrian return bp; 20236285Sbrian} 20336285Sbrian 20436285Sbrianvoid 20536285Sbrianmbuf_Enqueue(struct mqueue *queue, struct mbuf *bp) 20636285Sbrian{ 20736285Sbrian if (queue->last) { 20836285Sbrian queue->last->pnext = bp; 20936285Sbrian queue->last = bp; 21036285Sbrian } else 21136285Sbrian queue->last = queue->top = bp; 21236285Sbrian queue->qlen++; 21336285Sbrian log_Printf(LogDEBUG, "mbuf_Enqueue: len = %d\n", queue->qlen); 21436285Sbrian} 215