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