mbuf.c revision 37017
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 * 2037017Sbrian * $Id: mbuf.c,v 1.16 1998/06/16 07:15:11 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) { 6636285Sbrian log_Printf(LogALERT, "failed to allocate memory: %u\n", sizeof(struct mbuf)); 6736285Sbrian AbortProgram(EX_OSERR); 6825630Sbrian } 6930715Sbrian memset(bp, '\0', sizeof(struct mbuf)); 7028679Sbrian p = (u_char *) malloc(cnt); 7125630Sbrian if (p == NULL) { 7236285Sbrian log_Printf(LogALERT, "failed to allocate memory: %d\n", cnt); 7336285Sbrian AbortProgram(EX_OSERR); 7425630Sbrian } 756059Samurai MemMap[type].count += cnt; 766059Samurai totalalloced += cnt; 776059Samurai bp->base = p; 786059Samurai bp->size = bp->cnt = cnt; 796059Samurai bp->type = type; 8032040Sbrian bp->pnext = NULL; 8128679Sbrian return (bp); 826059Samurai} 836059Samurai 846059Samuraistruct mbuf * 8536285Sbrianmbuf_FreeSeg(struct mbuf * bp) 866059Samurai{ 876059Samurai struct mbuf *nbp; 886059Samurai 896059Samurai if (bp) { 906059Samurai nbp = bp->next; 916059Samurai MemMap[bp->type].count -= bp->size; 926059Samurai totalalloced -= bp->size; 936059Samurai free(bp->base); 946059Samurai free(bp); 9528679Sbrian return (nbp); 966059Samurai } 9728679Sbrian return (bp); 986059Samurai} 996059Samurai 1006059Samuraivoid 10136285Sbrianmbuf_Free(struct mbuf * bp) 1026059Samurai{ 1036059Samurai while (bp) 10436285Sbrian bp = mbuf_FreeSeg(bp); 1056059Samurai} 1066059Samurai 1076059Samuraistruct mbuf * 10836285Sbrianmbuf_Read(struct mbuf * bp, u_char * ptr, int len) 1096059Samurai{ 1106059Samurai int nb; 1116059Samurai 1126059Samurai while (bp && len > 0) { 1136059Samurai if (len > bp->cnt) 1146059Samurai nb = bp->cnt; 1156059Samurai else 1166059Samurai nb = len; 11730715Sbrian memcpy(ptr, MBUF_CTOP(bp), nb); 1186059Samurai ptr += nb; 1196059Samurai bp->cnt -= nb; 1206059Samurai len -= nb; 1216059Samurai bp->offset += nb; 1226059Samurai if (bp->cnt == 0) { 1236059Samurai#ifdef notdef 1246059Samurai bp = bp->next; 1256059Samurai#else 12636285Sbrian bp = mbuf_FreeSeg(bp); 1276059Samurai#endif 1286059Samurai } 1296059Samurai } 13028679Sbrian return (bp); 1316059Samurai} 1328857Srgrimes 1336059Samuraivoid 13436285Sbrianmbuf_Write(struct mbuf * bp, u_char * ptr, int cnt) 1356059Samurai{ 1366059Samurai int plen; 1376059Samurai int nb; 1386059Samurai 13936285Sbrian plen = mbuf_Length(bp); 1406059Samurai if (plen < cnt) 1416059Samurai cnt = plen; 1426059Samurai 1436059Samurai while (cnt > 0) { 14428679Sbrian nb = (cnt < bp->cnt) ? cnt : bp->cnt; 14530715Sbrian memcpy(MBUF_CTOP(bp), ptr, nb); 1466059Samurai cnt -= bp->cnt; 1476059Samurai bp = bp->next; 1486059Samurai } 1496059Samurai} 1506059Samurai 1516059Samuraiint 15236285Sbrianmbuf_Show(struct cmdargs const *arg) 1536059Samurai{ 1546059Samurai int i; 15536285Sbrian static const char *mbuftype[] = { 15636285Sbrian "async", "fsm", "hdlcout", "ipin", "echo", "lqr", "link", "vjcomp", 15736285Sbrian "ipq", "mp" }; 1586059Samurai 15936285Sbrian for (i = 1; i < MB_MAX; i += 2) 16036285Sbrian prompt_Printf(arg->prompt, "%10.10s: %04d\t%10.10s: %04d\n", 16136285Sbrian mbuftype[i-1], MemMap[i].count, mbuftype[i], MemMap[i+1].count); 16226516Sbrian 16336285Sbrian if (i == MB_MAX) 16436285Sbrian prompt_Printf(arg->prompt, "%10.10s: %04d\n", 16536285Sbrian mbuftype[i-1], MemMap[i].count); 16626516Sbrian 16726516Sbrian return 0; 1686059Samurai} 1696059Samurai 1706059Samuraivoid 17136285Sbrianmbuf_Log() 1726059Samurai{ 17336285Sbrian log_Printf(LogDEBUG, "mbuf_Log: mem alloced: %d\n", totalalloced); 17436285Sbrian log_Printf(LogDEBUG, "mbuf_Log: 1: %d 2: %d 3: %d 4: %d\n", 1756059Samurai MemMap[1].count, MemMap[2].count, MemMap[3].count, MemMap[4].count); 17636285Sbrian log_Printf(LogDEBUG, "mbuf_Log: 5: %d 6: %d 7: %d 8: %d\n", 1776059Samurai MemMap[5].count, MemMap[6].count, MemMap[7].count, MemMap[8].count); 17836285Sbrian log_Printf(LogDEBUG, "mbuf_Log: 9: %d 10: %d\n", 17936285Sbrian MemMap[9].count, MemMap[10].count); 1806059Samurai} 18136285Sbrian 18236285Sbrianstruct mbuf * 18336285Sbrianmbuf_Dequeue(struct mqueue *q) 18436285Sbrian{ 18536285Sbrian struct mbuf *bp; 18636285Sbrian 18736285Sbrian log_Printf(LogDEBUG, "mbuf_Dequeue: queue len = %d\n", q->qlen); 18836285Sbrian bp = q->top; 18936285Sbrian if (bp) { 19036285Sbrian q->top = q->top->pnext; 19136285Sbrian q->qlen--; 19236285Sbrian if (q->top == NULL) { 19336285Sbrian q->last = q->top; 19436285Sbrian if (q->qlen) 19536285Sbrian log_Printf(LogERROR, "mbuf_Dequeue: Not zero (%d)!!!\n", q->qlen); 19636285Sbrian } 19737017Sbrian bp->pnext = NULL; 19836285Sbrian } 19936285Sbrian 20036285Sbrian return bp; 20136285Sbrian} 20236285Sbrian 20336285Sbrianvoid 20436285Sbrianmbuf_Enqueue(struct mqueue *queue, struct mbuf *bp) 20536285Sbrian{ 20636285Sbrian if (queue->last) { 20736285Sbrian queue->last->pnext = bp; 20836285Sbrian queue->last = bp; 20936285Sbrian } else 21036285Sbrian queue->last = queue->top = bp; 21136285Sbrian queue->qlen++; 21236285Sbrian log_Printf(LogDEBUG, "mbuf_Enqueue: len = %d\n", queue->qlen); 21336285Sbrian} 214