|
|
1.1 ! root 1: /* ! 2: * N E T U T I L ! 3: * ! 4: * Utility routines used by various network kernel code. ! 5: * ! 6: * ! 7: * Written by Kurt Gollhardt (Nirvonics, Inc.) ! 8: * Last update Fri Apr 5 16:36:40 1985 ! 9: * ! 10: */ ! 11: ! 12: #include "../h/param.h" ! 13: #include "../h/stream.h" ! 14: ! 15: #define BLEN(bp) ((bp)->wptr - (bp)->rptr) ! 16: #define BSZ(bp) ((bp)->lim - (bp)->base) ! 17: #undef MIN ! 18: #define MIN(a,b) ((a) > (b) ? (b) : (a)) ! 19: ! 20: extern int bsize[]; ! 21: ! 22: ! 23: struct block *block_pullup(q, len) ! 24: register struct queue *q; ! 25: { ! 26: register struct block *bp, *m; ! 27: int count, ps = spl6(); ! 28: ! 29: if ((bp = q->first) == 0) ! 30: goto bad; ! 31: if (BLEN(bp) >= len) { ! 32: splx(ps); ! 33: return bp; ! 34: } ! 35: ! 36: m = allocb(len); ! 37: if (m == 0 || BSZ(m) < len) ! 38: goto bad; ! 39: m->next = bp; ! 40: q->first = m; ! 41: q->count += bsize[m->class]; ! 42: ! 43: while (bp && bp->type == M_DATA) { ! 44: count = BSZ(m) - BLEN(m); ! 45: count = MIN(count, len); ! 46: count = MIN(count, BLEN(bp)); ! 47: bcopy(bp->rptr, m->wptr, (unsigned)count); ! 48: len -= count; ! 49: m->wptr += count; ! 50: bp->rptr += count; ! 51: if (BLEN(bp) > 0) ! 52: break; ! 53: if (q->last == bp) ! 54: q->last = m; ! 55: q->count -= bsize[bp->class]; ! 56: m->next = bp->next; ! 57: freeb(bp); ! 58: bp = m->next; ! 59: } ! 60: ! 61: if (len == 0) { ! 62: splx(ps); ! 63: return m; ! 64: } ! 65: bad: ! 66: splx(ps); ! 67: printf("block_pullup bad\n"); ! 68: return 0; ! 69: } ! 70: ! 71: ! 72: /* Removes blocks through first delim; returns true if delim found */ ! 73: flush_packet(q) ! 74: register struct queue *q; ! 75: { ! 76: register struct block *bp; ! 77: register int isdelim; ! 78: ! 79: while (bp = getq(q)) { ! 80: isdelim = (bp->type == M_DELIM); ! 81: freeb(bp); ! 82: if (isdelim) ! 83: return 1; ! 84: } ! 85: return 0; ! 86: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.