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