freebsd-nq/sys/i4b/layer2/i4b_mbuf.c
Poul-Henning Kamp 19c749625f Initial entry of ISDN4BSD into the FreeBSD tree.
ISDN4BSD is the work of our brand-new comitter: Hellmuth Michaelis,
who has done a tremendous amount of work to bring us this far.

There are still some outstanding issues and files to bring into
the tree, and for now it will be needed to pick up all the extra
docs from the isdn4bsd release.

It is probably also a very good idea to subscribe to the isdn@freebsd.org
mailing list before you try this out.

These files correspond to release "beta Version 0.70.00 / December
1998" from Hellmuth.
1998-12-27 21:47:14 +00:00

246 lines
5.4 KiB
C

/*
* Copyright (c) 1997, 1998 Hellmuth Michaelis. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
*---------------------------------------------------------------------------
*
* i4b - mbuf handling support routines
* ------------------------------------
*
* $Id: i4b_mbuf.c,v 1.10 1998/12/05 18:05:20 hm Exp $
*
* last edit-date: [Sat Dec 5 18:29:44 1998]
*
*---------------------------------------------------------------------------*/
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/mbuf.h>
#if defined(__FreeBSD__) && __FreeBSD__ >= 3
#include <sys/ioccom.h>
#else
#include <sys/ioctl.h>
#endif
#include <sys/tty.h>
#include <sys/proc.h>
#include <sys/uio.h>
#include <sys/kernel.h>
#include <sys/socket.h>
#include <net/if.h>
#include <i4b/include/i4b_mbuf.h>
#include <i4b/include/i4b_global.h>
#define I4B_MBUF_DEBUG
#undef I4B_MBUF_TYPE_DEBUG
#ifdef I4B_MBUF_TYPE_DEBUG
#ifdef __FreeBSD__
#define MT_DCHAN 42
#define MT_BCHAN 43
#else /* NetBSD */
#define MT_DCHAN MT_DATA
#define MT_BCHAN MT_DATA
#endif
#define MT_I4B_D MT_DCHAN
#define MT_I4B_B MT_BCHAN
#else /* ! I4B_MBUF_TYPE_DEBUG */
#define MT_I4B_D MT_DATA
#define MT_I4B_B MT_DATA
#endif /* I4B_MBUF_TYPE_DEBUG */
/*---------------------------------------------------------------------------*
* allocate D-channel mbuf space
*---------------------------------------------------------------------------*/
struct mbuf*
i4b_Dgetmbuf(int len)
{
struct mbuf *m;
if(len > MCLBYTES) /* if length > max extension size */
{
#ifdef I4B_MBUF_DEBUG
printf("i4b_getmbuf: error - len(%d) > MCLBYTES(%d)\n",
len, MCLBYTES);
#endif
return(NULL);
}
MGETHDR(m, M_DONTWAIT, MT_I4B_D); /* get mbuf with pkthdr */
/* did we actually get the mbuf ? */
if(!m)
{
#ifdef I4B_MBUF_DEBUG
printf("i4b_getbuf: error - MGETHDR failed!\n");
#endif
return(NULL);
}
if(len >= MHLEN)
{
MCLGET(m, M_DONTWAIT);
if(!(m->m_flags & M_EXT))
{
m_freem(m);
#ifdef I4B_MBUF_DEBUG
printf("i4b_getbuf: error - MCLGET failed, len(%d)\n", len);
#endif
return (NULL);
}
}
m->m_len = len;
return(m);
}
/*---------------------------------------------------------------------------*
* free a D-channel mbuf
*---------------------------------------------------------------------------*/
void
i4b_Dfreembuf(struct mbuf *m)
{
if(m)
m_freem(m);
}
/*---------------------------------------------------------------------------*
* clear a D-channel ifqueue from data
*---------------------------------------------------------------------------*/
void
i4b_Dcleanifq(struct ifqueue *ifq)
{
struct mbuf *m;
int x = splimp();
while(!IF_QEMPTY(ifq))
{
IF_DEQUEUE(ifq, m);
i4b_Dfreembuf(m);
}
splx(x);
}
/*---------------------------------------------------------------------------*
* allocate B-channel mbuf space
*---------------------------------------------------------------------------*/
struct mbuf*
i4b_Bgetmbuf(int len)
{
struct mbuf *m;
if(len > MCLBYTES) /* if length > max extension size */
{
#ifdef I4B_MBUF_DEBUG
printf("i4b_getmbuf: error - len(%d) > MCLBYTES(%d)\n",
len, MCLBYTES);
#endif
return(NULL);
}
MGETHDR(m, M_DONTWAIT, MT_I4B_B); /* get mbuf with pkthdr */
/* did we actually get the mbuf ? */
if(!m)
{
#ifdef I4B_MBUF_DEBUG
printf("i4b_getbuf: error - MGETHDR failed!\n");
#endif
return(NULL);
}
if(len >= MHLEN)
{
MCLGET(m, M_DONTWAIT);
if(!(m->m_flags & M_EXT))
{
m_freem(m);
#ifdef I4B_MBUF_DEBUG
printf("i4b_getbuf: error - MCLGET failed, len(%d)\n", len);
#endif
return (NULL);
}
}
m->m_len = len;
return(m);
}
/*---------------------------------------------------------------------------*
* free a B-channel mbuf
*---------------------------------------------------------------------------*/
void
i4b_Bfreembuf(struct mbuf *m)
{
if(m)
m_freem(m);
}
/*---------------------------------------------------------------------------*
* clear a B-channel ifqueue from data
*---------------------------------------------------------------------------*/
void
i4b_Bcleanifq(struct ifqueue *ifq)
{
struct mbuf *m;
int x = splimp();
while(!IF_QEMPTY(ifq))
{
IF_DEQUEUE(ifq, m);
i4b_Bfreembuf(m);
}
splx(x);
}
/* EOF */