mbuf.c revision 25630
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 * 2025630Sbrian * $Id: mbuf.c,v 1.5 1997/02/22 16:10:34 peter Exp $ 218857Srgrimes * 226059Samurai */ 236059Samurai#include "defs.h" 246059Samurai 256059Samuraistruct memmap { 266059Samurai struct mbuf *queue; 276059Samurai int count; 286059Samurai} MemMap[MB_MAX+2]; 296059Samurai 306059Samuraistatic int totalalloced; 316059Samurai 326059Samuraiint 336059Samuraiplength(bp) 346059Samuraistruct mbuf *bp; 356059Samurai{ 366059Samurai int len; 376059Samurai 386059Samurai for (len = 0; bp; bp = bp->next) 396059Samurai len += bp->cnt; 406059Samurai return(len); 416059Samurai} 426059Samurai 436059Samuraistruct mbuf * 446059Samuraimballoc(cnt, type) 456059Samuraiint cnt; 466059Samuraiint type; 476059Samurai{ 486059Samurai u_char *p; 496059Samurai struct mbuf *bp; 506059Samurai 516059Samurai if (type > MB_MAX) 526059Samurai logprintf("bad type %d\n", type); 536059Samurai bp = (struct mbuf *)malloc(sizeof(struct mbuf)); 5425630Sbrian if (bp == NULL) { 5525630Sbrian logprintf("failed to allocate memory: %u\n", sizeof(struct mbuf)); 5625630Sbrian fprintf(stderr,"failed to allocate memory: %u\n", sizeof(struct mbuf)); 5725630Sbrian exit(0); 5825630Sbrian } 596059Samurai bzero(bp, sizeof(struct mbuf)); 606059Samurai p = (u_char *)malloc(cnt); 6125630Sbrian if (p == NULL) { 6225630Sbrian logprintf("failed to allocate memory: %d\n", cnt); 6325630Sbrian fprintf(stderr,"failed to allocate memory: %d\n", cnt); 6425630Sbrian exit(0); 6525630Sbrian } 666059Samurai MemMap[type].count += cnt; 676059Samurai totalalloced += cnt; 686059Samurai bp->base = p; 696059Samurai bp->size = bp->cnt = cnt; 706059Samurai bp->type = type; 716059Samurai return(bp); 726059Samurai} 736059Samurai 746059Samuraistruct mbuf * 756059Samuraimbfree(struct mbuf *bp) 766059Samurai{ 776059Samurai struct mbuf *nbp; 786059Samurai 796059Samurai if (bp) { 806059Samurai nbp = bp->next; 816059Samurai MemMap[bp->type].count -= bp->size; 826059Samurai totalalloced -= bp->size; 836059Samurai free(bp->base); 846059Samurai free(bp); 856059Samurai return(nbp); 866059Samurai } 876059Samurai return(bp); 886059Samurai} 896059Samurai 906059Samuraivoid 916059Samuraipfree(struct mbuf *bp) 926059Samurai{ 936059Samurai while (bp) 946059Samurai bp = mbfree(bp); 956059Samurai} 966059Samurai 976059Samuraistruct mbuf * 986059Samuraimbread(bp, ptr, len) 996059Samuraistruct mbuf *bp; 1006059Samuraiu_char *ptr; 1016059Samuraiint len; 1026059Samurai{ 1036059Samurai int nb; 1046059Samurai 1056059Samurai while (bp && len > 0) { 1066059Samurai if (len > bp->cnt) 1076059Samurai nb = bp->cnt; 1086059Samurai else 1096059Samurai nb = len; 1106059Samurai bcopy(MBUF_CTOP(bp), ptr, nb); 1116059Samurai ptr += nb; 1126059Samurai bp->cnt -= nb; 1136059Samurai len -= nb; 1146059Samurai bp->offset += nb; 1156059Samurai if (bp->cnt == 0) { 1166059Samurai#ifdef notdef 1176059Samurai bp = bp->next; 1186059Samurai#else 1196059Samurai bp = mbfree(bp); 1206059Samurai#endif 1216059Samurai } 1226059Samurai } 1236059Samurai return(bp); 1246059Samurai} 1258857Srgrimes 1266059Samuraivoid 1276059Samuraimbwrite(bp, ptr, cnt) 1286059Samuraistruct mbuf *bp; 1296059Samuraiu_char *ptr; 1306059Samuraiint cnt; 1316059Samurai{ 1326059Samurai int plen; 1336059Samurai int nb; 1346059Samurai 1356059Samurai plen = plength(bp); 1366059Samurai if (plen < cnt) 1376059Samurai cnt = plen; 1386059Samurai 1396059Samurai while (cnt > 0) { 1406059Samurai nb = (cnt < bp->cnt)? cnt : bp->cnt; 1416059Samurai bcopy(ptr, MBUF_CTOP(bp), nb); 1426059Samurai cnt -= bp->cnt; 1436059Samurai bp = bp->next; 1446059Samurai } 1456059Samurai} 1466059Samurai 1476059Samuraivoid 1486059SamuraiDumpBp(bp) 1496059Samuraistruct mbuf *bp; 1506059Samurai{ 1516059Samurai u_char *cp; 1526059Samurai int cnt, loc; 1536059Samurai 1546059Samurai logprintf("dump bp = %x (%d)\n", bp, plength(bp)); 1556059Samurai loc = 0; 1566059Samurai while (bp) { 1576059Samurai cp = MBUF_CTOP(bp); 1586059Samurai cnt = bp->cnt; 1596059Samurai while (cnt > 0) { 1606059Samurai logprintf("%02x", *cp++); 1616059Samurai loc++; 1626059Samurai if (loc == 16) { 1636059Samurai loc = 0; 1646059Samurai logprintf("\n"); 1656059Samurai } else 1666059Samurai logprintf(" "); 1676059Samurai cnt--; 1686059Samurai } 1696059Samurai bp = bp->next; 1706059Samurai } 1716059Samurai if (loc) logprintf("\n"); 1726059Samurai} 1736059Samurai 1746059Samuraiint 1756059SamuraiShowMemMap() 1766059Samurai{ 1776059Samurai int i; 1786059Samurai 1796059Samurai for (i = 0; i <= MB_MAX; i += 2) { 1806059Samurai printf("%d: %d %d: %d\r\n", 1816059Samurai i, MemMap[i].count, i+1, MemMap[i+1].count); 1826059Samurai } 1836059Samurai return(1); 1846059Samurai} 1856059Samurai 1866059Samuraivoid 1876059SamuraiLogMemory() 1886059Samurai{ 1896059Samurai#ifdef DEBUG 1906059Samurai logprintf("mem alloced: %d\n", totalalloced); 1916059Samurai logprintf(" 1: %d 2: %d 3: %d 4: %d\n", 1926059Samurai MemMap[1].count, MemMap[2].count, MemMap[3].count, MemMap[4].count); 1936059Samurai logprintf(" 5: %d 6: %d 7: %d 8: %d\n", 1946059Samurai MemMap[5].count, MemMap[6].count, MemMap[7].count, MemMap[8].count); 1956059Samurai#endif 1966059Samurai} 197