mbuf.c revision 28679
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 * 2028679Sbrian * $Id: mbuf.c,v 1.8 1997/06/25 19:30:02 brian Exp $ 218857Srgrimes * 226059Samurai */ 2326516Sbrian#include <sys/types.h> 2426516Sbrian#include <sys/socket.h> 2526516Sbrian#include <sys/param.h> 2626516Sbrian#include <netinet/in.h> 276059Samurai#include "defs.h" 2826516Sbrian#include "loadalias.h" 2926516Sbrian#include "vars.h" 3026940Sbrian#include "server.h" 316059Samurai 326059Samuraistruct memmap { 336059Samurai struct mbuf *queue; 3428679Sbrian int count; 3528679Sbrian} MemMap[MB_MAX + 2]; 366059Samurai 376059Samuraistatic int totalalloced; 386059Samurai 396059Samuraiint 4028679Sbrianplength(struct mbuf * bp) 416059Samurai{ 426059Samurai int len; 436059Samurai 446059Samurai for (len = 0; bp; bp = bp->next) 456059Samurai len += bp->cnt; 4628679Sbrian return (len); 476059Samurai} 486059Samurai 496059Samuraistruct mbuf * 5028679Sbrianmballoc(int cnt, int type) 516059Samurai{ 526059Samurai u_char *p; 536059Samurai struct mbuf *bp; 546059Samurai 556059Samurai if (type > MB_MAX) 5626516Sbrian LogPrintf(LogERROR, "Bad mbuf type %d\n", type); 5728679Sbrian bp = (struct mbuf *) malloc(sizeof(struct mbuf)); 5825630Sbrian if (bp == NULL) { 5926516Sbrian LogPrintf(LogALERT, "failed to allocate memory: %u\n", sizeof(struct mbuf)); 6026940Sbrian ServerClose(); 6126516Sbrian exit(1); 6225630Sbrian } 636059Samurai bzero(bp, sizeof(struct mbuf)); 6428679Sbrian p = (u_char *) malloc(cnt); 6525630Sbrian if (p == NULL) { 6626516Sbrian LogPrintf(LogALERT, "failed to allocate memory: %d\n", cnt); 6726940Sbrian ServerClose(); 6826516Sbrian exit(1); 6925630Sbrian } 706059Samurai MemMap[type].count += cnt; 716059Samurai totalalloced += cnt; 726059Samurai bp->base = p; 736059Samurai bp->size = bp->cnt = cnt; 746059Samurai bp->type = type; 7528679Sbrian return (bp); 766059Samurai} 776059Samurai 786059Samuraistruct mbuf * 7928679Sbrianmbfree(struct mbuf * bp) 806059Samurai{ 816059Samurai struct mbuf *nbp; 826059Samurai 836059Samurai if (bp) { 846059Samurai nbp = bp->next; 856059Samurai MemMap[bp->type].count -= bp->size; 866059Samurai totalalloced -= bp->size; 876059Samurai free(bp->base); 886059Samurai free(bp); 8928679Sbrian return (nbp); 906059Samurai } 9128679Sbrian return (bp); 926059Samurai} 936059Samurai 946059Samuraivoid 9528679Sbrianpfree(struct mbuf * bp) 966059Samurai{ 976059Samurai while (bp) 986059Samurai bp = mbfree(bp); 996059Samurai} 1006059Samurai 1016059Samuraistruct mbuf * 10228679Sbrianmbread(struct mbuf * bp, u_char * ptr, int len) 1036059Samurai{ 1046059Samurai int nb; 1056059Samurai 1066059Samurai while (bp && len > 0) { 1076059Samurai if (len > bp->cnt) 1086059Samurai nb = bp->cnt; 1096059Samurai else 1106059Samurai nb = len; 1116059Samurai bcopy(MBUF_CTOP(bp), ptr, nb); 1126059Samurai ptr += nb; 1136059Samurai bp->cnt -= nb; 1146059Samurai len -= nb; 1156059Samurai bp->offset += nb; 1166059Samurai if (bp->cnt == 0) { 1176059Samurai#ifdef notdef 1186059Samurai bp = bp->next; 1196059Samurai#else 1206059Samurai bp = mbfree(bp); 1216059Samurai#endif 1226059Samurai } 1236059Samurai } 12428679Sbrian return (bp); 1256059Samurai} 1268857Srgrimes 1276059Samuraivoid 12828679Sbrianmbwrite(struct mbuf * bp, u_char * ptr, int cnt) 1296059Samurai{ 1306059Samurai int plen; 1316059Samurai int nb; 1326059Samurai 1336059Samurai plen = plength(bp); 1346059Samurai if (plen < cnt) 1356059Samurai cnt = plen; 1366059Samurai 1376059Samurai while (cnt > 0) { 13828679Sbrian nb = (cnt < bp->cnt) ? cnt : bp->cnt; 1396059Samurai bcopy(ptr, MBUF_CTOP(bp), nb); 1406059Samurai cnt -= bp->cnt; 1416059Samurai bp = bp->next; 1426059Samurai } 1436059Samurai} 1446059Samurai 1456059Samuraiint 1466059SamuraiShowMemMap() 1476059Samurai{ 1486059Samurai int i; 1496059Samurai 15026516Sbrian if (!VarTerm) 15126516Sbrian return 1; 15226516Sbrian 15326516Sbrian for (i = 0; i <= MB_MAX; i += 2) 15426516Sbrian fprintf(VarTerm, "%d: %d %d: %d\n", 15528679Sbrian i, MemMap[i].count, i + 1, MemMap[i + 1].count); 15626516Sbrian 15726516Sbrian return 0; 1586059Samurai} 1596059Samurai 1606059Samuraivoid 1616059SamuraiLogMemory() 1626059Samurai{ 16326516Sbrian LogPrintf(LogDEBUG, "LogMemory: mem alloced: %d\n", totalalloced); 16426516Sbrian LogPrintf(LogDEBUG, "LogMemory: 1: %d 2: %d 3: %d 4: %d\n", 1656059Samurai MemMap[1].count, MemMap[2].count, MemMap[3].count, MemMap[4].count); 16626516Sbrian LogPrintf(LogDEBUG, "LogMemory: 5: %d 6: %d 7: %d 8: %d\n", 1676059Samurai MemMap[5].count, MemMap[6].count, MemMap[7].count, MemMap[8].count); 1686059Samurai} 169