|
|
researchv9-SUN3(old)
/*
* N E T U T I L
*
* Utility routines used by various network kernel code.
*
*
* Written by Kurt Gollhardt (Nirvonics, Inc.)
* Last update Fri Apr 5 16:36:40 1985
*
*/
#include "../h/param.h"
#include "../h/stream.h"
#define BLEN(bp) ((bp)->wptr - (bp)->rptr)
#define BSZ(bp) ((bp)->lim - (bp)->base)
#undef MIN
#define MIN(a,b) ((a) > (b) ? (b) : (a))
extern int bsize[];
struct block *block_pullup(q, len)
register struct queue *q;
{
register struct block *bp, *m;
int count, ps = spl6();
if ((bp = q->first) == 0)
goto bad;
if (BLEN(bp) >= len) {
splx(ps);
return bp;
}
m = allocb(len);
if (m == 0 || BSZ(m) < len)
goto bad;
m->next = bp;
q->first = m;
q->count += bsize[m->class];
while (bp && bp->type == M_DATA) {
count = BSZ(m) - BLEN(m);
count = MIN(count, len);
count = MIN(count, BLEN(bp));
bcopy(bp->rptr, m->wptr, (unsigned)count);
len -= count;
m->wptr += count;
bp->rptr += count;
if (BLEN(bp) > 0)
break;
if (q->last == bp)
q->last = m;
q->count -= bsize[bp->class];
m->next = bp->next;
freeb(bp);
bp = m->next;
}
if (len == 0) {
splx(ps);
return m;
}
bad:
splx(ps);
printf("block_pullup bad\n");
return 0;
}
/* Removes blocks through first delim; returns true if delim found */
flush_packet(q)
register struct queue *q;
{
register struct block *bp;
register int isdelim;
while (bp = getq(q)) {
isdelim = (bp->type == M_DELIM);
freeb(bp);
if (isdelim)
return 1;
}
return 0;
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.