blob: 1674370e5645e3f317378a0dbc0a856d4796b1d9 [file] [log] [blame]
#include <vfs.h>
#include <kfs.h>
#include <slab.h>
#include <kmalloc.h>
#include <kref.h>
#include <string.h>
#include <stdio.h>
#include <assert.h>
#include <error.h>
#include <cpio.h>
#include <pmap.h>
#include <smp.h>
static void pktbind(struct ipifc *unused_ipifc, int unused_int, char **);
static void pktunbind(struct ipifc *unused_ipifc);
static void pktbwrite(struct ipifc *unused_ipifc, struct block *,
int unused_int, uint8_t * unused_uint8_p_t);
static void pktin(struct fs *, struct ipifc *unused_ipifc, struct block *);
struct medium pktmedium = {
.name = "pkt",
.hsize = 14,
.mintu = 40,
.maxtu = 4 * 1024,
.maclen = 6,
.bind = pktbind,
.unbind = pktunbind,
.bwrite = pktbwrite,
.pktin = pktin,
};
/*
* called to bind an IP ifc to an ethernet device
* called with ifc wlock'd
*/
static void pktbind(struct ipifc *unused_ipifc, int argc, char **argv)
{
}
/*
* called with ifc wlock'd
*/
static void pktunbind(struct ipifc *unused_ipifc)
{
}
/*
* called by ipoput with a single packet to write
*/
static void
pktbwrite(struct ipifc *ifc, struct block *bp, int unused_int,
uint8_t * unused_uint8_p_t)
{
/* enqueue onto the conversation's rq */
bp = concatblock(bp);
if (kref_refcnt(&ifc->conv->snoopers) > 0)
qpass(ifc->conv->sq, copyblock(bp, BLEN(bp)));
qpass(ifc->conv->rq, bp);
}
/*
* called with ifc rlocked when someone write's to 'data'
*/
static void pktin(struct fs *f, struct ipifc *ifc, struct block *bp)
{
if (ifc->lifc == NULL)
freeb(bp);
else {
if (kref_refcnt(&ifc->conv->snoopers) > 0)
qpass(ifc->conv->sq, copyblock(bp, BLEN(bp)));
ipiput4(f, ifc, bp);
}
}
void pktmediumlink(void)
{
addipmedium(&pktmedium);
}