home *** CD-ROM | disk | FTP | other *** search
- #include <stdlib.h>
- #include <string.h>
- #include "kernel.h"
- #include "global.h"
-
- static struct packet packet_list[MAXPACKET];
-
- void initialise_packet(void)
- {
- register int i;
-
- for (i = 0; i < MAXPACKET; i++)
- packet_list[i].status = PACKET_FREE;
- }
-
- int initialise_rx_mbuf(int n)
- {
- struct mbuf *nbp, *fbp, *pbp;
- register int i;
-
- for (i = 0; i < n; i++)
- {
- if ((nbp = (struct mbuf *)malloc(sizeof(struct mbuf))) == NULLMBUF)
- return(FALSE);
-
- nbp->m_next = NULLMBUF;
- nbp->m_off = MMINOFF;
- nbp->m_len = 0;
- nbp->m_type = MT_FREE;
- nbp->m_indir = FALSE;
- nbp->m_act = NULLMBUF;
-
- if (i > 0)
- pbp->m_next = nbp;
- else
- fbp = nbp;
-
- pbp = nbp;
- }
-
- rxfreeq_first = fbp;
- rxfreeq_last = pbp;
-
- return(TRUE);
- }
-
- int initialise_tx_mbuf(int n)
- {
- struct mbuf *nbp, *fbp, *pbp;
- register int i;
-
- for (i = 0; i < n; i++)
- {
- if ((nbp = (struct mbuf *)malloc(sizeof(struct mbuf))) == NULLMBUF)
- return(FALSE);
-
- nbp->m_next = NULLMBUF;
- nbp->m_off = MMINOFF;
- nbp->m_len = 0;
- nbp->m_type = MT_FREE;
- nbp->m_indir = FALSE;
- nbp->m_act = NULLMBUF;
-
- if (i > 0)
- pbp->m_next = nbp;
- else
- fbp = nbp;
-
- pbp = nbp;
- }
-
- txfreeq_first = fbp;
- txfreeq_last = pbp;
-
- return(TRUE);
- }
-
- struct packet *alloc_packet(void)
- {
- register int i;
- int state;
-
- state = ensure_irqs_off();
-
- for (i = 0; i < MAXPACKET; i++)
- {
- if (packet_list[i].status == PACKET_FREE)
- {
- packet_list[i].status = PACKET_USED;
- restore_irqs(state);
- return(packet_list + i);
- }
- }
-
- restore_irqs(state);
-
- return(NULLPACKET);
- }
-
- void free_packet(struct packet *p)
- {
- p->status = PACKET_FREE;
- }
-
- struct mbuf *alloc_tx_mbuf(register unsigned int n)
- {
- struct mbuf *nbp, *fbp, *pbp;
- int state;
-
- if (n == 0) return(NULLMBUF);
-
- state = ensure_irqs_off();
-
- for (fbp = nbp = txfreeq_first;
- n > 0 && nbp != NULLMBUF;
- nbp = nbp->m_next, n--)
- {
- nbp->m_off = MMINOFF;
- nbp->m_len = 0;
- nbp->m_type = MT_FREE;
- nbp->m_indir = FALSE;
- nbp->m_act = NULLMBUF;
-
- pbp = nbp;
- }
-
- txfreeq_first = pbp->m_next;
-
- pbp->m_next = NULLMBUF;
-
- restore_irqs(state);
-
- return(fbp);
- }
-
- void free_tx_mbuf(register struct mbuf *bp)
- {
- register struct mbuf *nbp, *pbp;
- int state;
-
- if (bp == NULLMBUF) return;
-
- for (nbp = bp; nbp != NULLMBUF; nbp = nbp->m_next)
- {
- nbp->m_off = MMINOFF;
- nbp->m_len = 0;
- nbp->m_type = MT_FREE;
- nbp->m_indir = FALSE;
- nbp->m_act = NULLMBUF;
-
- pbp = nbp;
- }
-
- state = ensure_irqs_off();
-
- txfreeq_last->m_next = bp;
- txfreeq_last = pbp;
-
- restore_irqs(state);
- }
-
- void free_rx_mbuf(register struct mbuf *bp)
- {
- register struct mbuf *nbp, *pbp;
- int state;
-
- if (bp == NULLMBUF) return;
-
- for (nbp = bp; nbp != NULLMBUF; nbp = nbp->m_next)
- {
- nbp->m_off = MMINOFF;
- nbp->m_len = 0;
- nbp->m_type = MT_FREE;
- nbp->m_indir = FALSE;
- nbp->m_act = NULLMBUF;
-
- pbp = nbp;
- }
-
- state = ensure_irqs_off();
-
- rxfreeq_last->m_next = bp;
- rxfreeq_last = pbp;
-
- restore_irqs(state);
- }
-
- int len_mbuf(register struct mbuf *bp)
- {
- register int size;
-
- for (size = 0; bp != NULLMBUF; size += bp->m_len, bp = bp->m_next);
-
- return(size);
- }
-
- struct mbuf *qdata(int size, register char *data)
- {
- register struct mbuf *bp, *tbp;
- register int length;
- register char *s;
-
- if ((bp = alloc_tx_mbuf(size / MLEN + 2)) == NULLMBUF)
- return(NULLMBUF);
-
- for (tbp = bp; size > 0; tbp = tbp->m_next)
- {
- length = (size > MLEN) ? MLEN : size;
-
- size -= length;
- tbp->m_len = length;
-
- s = tbp->m_dat;
-
- while (length-- > 0)
- *s++ = *data++;
-
- tbp->m_off = MMINOFF;
- tbp->m_type = MT_DATA;
- tbp->m_indir = FALSE;
- tbp->m_act = NULLMBUF;
- }
-
- return(bp);
- }
-
- int dqdata(struct mbuf *bp, int size, register char *data)
- {
- register struct mbuf *tbp;
- register int length;
- register char *s;
- int n = 0;
-
- /* The first mbuf contains control information */
- for (tbp = bp->m_next; tbp != NULLMBUF && size > 0; tbp = tbp->m_next)
- {
- length = tbp->m_len;
-
- n += length;
- size -= length;
-
- s = tbp->m_dat + tbp->m_off - MMINOFF;
-
- while (length-- > 0)
- *data++ = *s++;
- }
-
- return(n);
- }
-
- int len_q(register struct packet *p)
- {
- register int n;
-
- for (n = 0; p != NULLPACKET; n++, p = p->next);
-
- return(n);
- }
-