mbuf.c revision 43693
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 * 2043693Sbrian * $Id: mbuf.c,v 1.22 1998/08/25 17:48:42 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; 4138471Sbrian int fragments, octets; 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 struct mbuf *bp; 606059Samurai 616059Samurai if (type > MB_MAX) 6236285Sbrian log_Printf(LogERROR, "Bad mbuf type %d\n", type); 6338472Sbrian bp = malloc(sizeof(struct mbuf) + cnt); 6425630Sbrian if (bp == NULL) { 6537210Sbrian log_Printf(LogALERT, "failed to allocate memory: %ld\n", 6637210Sbrian (long)sizeof(struct mbuf)); 6736285Sbrian AbortProgram(EX_OSERR); 6825630Sbrian } 6930715Sbrian memset(bp, '\0', sizeof(struct mbuf)); 7038471Sbrian MemMap[type].fragments++; 7138471Sbrian MemMap[type].octets += cnt; 726059Samurai totalalloced += cnt; 736059Samurai bp->size = bp->cnt = cnt; 746059Samurai bp->type = type; 7532040Sbrian bp->pnext = NULL; 7628679Sbrian return (bp); 776059Samurai} 786059Samurai 796059Samuraistruct mbuf * 8036285Sbrianmbuf_FreeSeg(struct mbuf * bp) 816059Samurai{ 826059Samurai struct mbuf *nbp; 836059Samurai 846059Samurai if (bp) { 856059Samurai nbp = bp->next; 8638471Sbrian MemMap[bp->type].fragments--; 8738471Sbrian MemMap[bp->type].octets -= bp->size; 886059Samurai totalalloced -= bp->size; 896059Samurai free(bp); 9028679Sbrian return (nbp); 916059Samurai } 9228679Sbrian return (bp); 936059Samurai} 946059Samurai 956059Samuraivoid 9636285Sbrianmbuf_Free(struct mbuf * bp) 976059Samurai{ 986059Samurai while (bp) 9936285Sbrian bp = mbuf_FreeSeg(bp); 1006059Samurai} 1016059Samurai 1026059Samuraistruct mbuf * 10336285Sbrianmbuf_Read(struct mbuf * bp, u_char * ptr, int len) 1046059Samurai{ 1056059Samurai int nb; 1066059Samurai 1076059Samurai while (bp && len > 0) { 1086059Samurai if (len > bp->cnt) 1096059Samurai nb = bp->cnt; 1106059Samurai else 1116059Samurai nb = len; 11230715Sbrian memcpy(ptr, MBUF_CTOP(bp), nb); 1136059Samurai ptr += nb; 1146059Samurai bp->cnt -= nb; 1156059Samurai len -= nb; 1166059Samurai bp->offset += nb; 11743693Sbrian if (bp->cnt == 0) 11836285Sbrian bp = mbuf_FreeSeg(bp); 1196059Samurai } 12028679Sbrian return (bp); 1216059Samurai} 1228857Srgrimes 1236059Samuraivoid 12436285Sbrianmbuf_Write(struct mbuf * bp, u_char * ptr, int cnt) 1256059Samurai{ 1266059Samurai int plen; 1276059Samurai int nb; 1286059Samurai 12936285Sbrian plen = mbuf_Length(bp); 1306059Samurai if (plen < cnt) 1316059Samurai cnt = plen; 1326059Samurai 1336059Samurai while (cnt > 0) { 13428679Sbrian nb = (cnt < bp->cnt) ? cnt : bp->cnt; 13530715Sbrian memcpy(MBUF_CTOP(bp), ptr, nb); 1366059Samurai cnt -= bp->cnt; 1376059Samurai bp = bp->next; 1386059Samurai } 1396059Samurai} 1406059Samurai 1416059Samuraiint 14236285Sbrianmbuf_Show(struct cmdargs const *arg) 1436059Samurai{ 1446059Samurai int i; 14536285Sbrian static const char *mbuftype[] = { 14638174Sbrian "async", "fsm", "cbcp", "hdlcout", "ipin", "echo", "lqr", "link", 14738174Sbrian "vjcomp", "ipq", "mp" }; 1486059Samurai 14938471Sbrian prompt_Printf(arg->prompt, "Fragments (octets) in use:\n"); 15036285Sbrian for (i = 1; i < MB_MAX; i += 2) 15138471Sbrian prompt_Printf(arg->prompt, "%10.10s: %04d (%06d)\t%10.10s: %04d (%06d)\n", 15238471Sbrian mbuftype[i-1], MemMap[i].fragments, MemMap[i].octets, mbuftype[i], 15338471Sbrian MemMap[i+1].fragments, MemMap[i+1].octets); 15426516Sbrian 15536285Sbrian if (i == MB_MAX) 15638471Sbrian prompt_Printf(arg->prompt, "%10.10s: %04d (%06d)\n", 15738471Sbrian mbuftype[i-1], MemMap[i].fragments, MemMap[i].octets); 15826516Sbrian 15926516Sbrian return 0; 1606059Samurai} 1616059Samurai 1626059Samuraivoid 16336285Sbrianmbuf_Log() 1646059Samurai{ 16536285Sbrian log_Printf(LogDEBUG, "mbuf_Log: mem alloced: %d\n", totalalloced); 16636285Sbrian log_Printf(LogDEBUG, "mbuf_Log: 1: %d 2: %d 3: %d 4: %d\n", 16738471Sbrian MemMap[1].octets, MemMap[2].octets, MemMap[3].octets, MemMap[4].octets); 16836285Sbrian log_Printf(LogDEBUG, "mbuf_Log: 5: %d 6: %d 7: %d 8: %d\n", 16938471Sbrian MemMap[5].octets, MemMap[6].octets, MemMap[7].octets, MemMap[8].octets); 17038174Sbrian log_Printf(LogDEBUG, "mbuf_Log: 9: %d 10: %d 11: %d\n", 17138471Sbrian MemMap[9].octets, MemMap[10].octets, MemMap[11].octets); 1726059Samurai} 17336285Sbrian 17436285Sbrianstruct mbuf * 17536285Sbrianmbuf_Dequeue(struct mqueue *q) 17636285Sbrian{ 17736285Sbrian struct mbuf *bp; 17836285Sbrian 17936285Sbrian log_Printf(LogDEBUG, "mbuf_Dequeue: queue len = %d\n", q->qlen); 18036285Sbrian bp = q->top; 18136285Sbrian if (bp) { 18236285Sbrian q->top = q->top->pnext; 18336285Sbrian q->qlen--; 18436285Sbrian if (q->top == NULL) { 18536285Sbrian q->last = q->top; 18636285Sbrian if (q->qlen) 18736285Sbrian log_Printf(LogERROR, "mbuf_Dequeue: Not zero (%d)!!!\n", q->qlen); 18836285Sbrian } 18937017Sbrian bp->pnext = NULL; 19036285Sbrian } 19136285Sbrian 19236285Sbrian return bp; 19336285Sbrian} 19436285Sbrian 19538544Sbrian 19636285Sbrianvoid 19736285Sbrianmbuf_Enqueue(struct mqueue *queue, struct mbuf *bp) 19836285Sbrian{ 19936285Sbrian if (queue->last) { 20036285Sbrian queue->last->pnext = bp; 20136285Sbrian queue->last = bp; 20236285Sbrian } else 20336285Sbrian queue->last = queue->top = bp; 20436285Sbrian queue->qlen++; 20536285Sbrian log_Printf(LogDEBUG, "mbuf_Enqueue: len = %d\n", queue->qlen); 20636285Sbrian} 207