92 lines
2.0 KiB
C
92 lines
2.0 KiB
C
/*
|
|
* lkminit_bsdcomp.c
|
|
*
|
|
* written by Iain Hibbert <plunky@rya-online.net>
|
|
*/
|
|
|
|
#include <sys/cdefs.h>
|
|
__KERNEL_RCSID(0, "$NetBSD: lkminit_bsdcomp.c,v 1.2 2003/07/14 15:47:31 lukem Exp $");
|
|
|
|
#include <sys/param.h>
|
|
#include <sys/systm.h>
|
|
#include <sys/conf.h>
|
|
#include <sys/exec.h>
|
|
#include <sys/lkm.h>
|
|
#include <sys/file.h>
|
|
#include <sys/errno.h>
|
|
#include <sys/mbuf.h>
|
|
|
|
#define PACKETPTR struct mbuf *
|
|
#include <net/ppp_defs.h>
|
|
#include <net/ppp-comp.h>
|
|
|
|
extern struct compressor *ppp_compressors[];
|
|
extern struct compressor ppp_bsd_compress;
|
|
|
|
static int bsdcomp_handle(struct lkm_table *lkmtp, int cmd);
|
|
int bsdcomp_lkmentry(struct lkm_table *lkmtp, int cmd, int ver);
|
|
|
|
MOD_MISC("bsdcomp")
|
|
static int
|
|
bsdcomp_handle(struct lkm_table *lkmtp, int cmd)
|
|
{
|
|
int i = 0;
|
|
|
|
switch (cmd) {
|
|
case LKM_E_LOAD:
|
|
/*
|
|
* Load the compressor into the master table in the first
|
|
* available slot, unless we already have a CI_BSD_COMPRESS
|
|
* type listed. Leave a space at the end, its a NULL
|
|
* terminated list.
|
|
*/
|
|
while (ppp_compressors[i]) {
|
|
if (ppp_compressors[i]->compress_proto
|
|
== CI_BSD_COMPRESS)
|
|
return EEXIST; /* either me, or the
|
|
* in-kernel version */
|
|
|
|
if (++i == PPP_COMPRESSORS_MAX - 1)
|
|
return ENFILE; /* no room */
|
|
}
|
|
|
|
ppp_compressors[i] = &ppp_bsd_compress;
|
|
break;
|
|
|
|
case LKM_E_UNLOAD:
|
|
|
|
/*
|
|
* Find the first instance of CI_BSD_COMPRESS in the table,
|
|
* and * unload it. If this instance was not mine, Somebody has
|
|
* been Playing With Fire, and will likely Get Burnt.
|
|
*/
|
|
while (ppp_compressors[i]->compress_proto != CI_BSD_COMPRESS)
|
|
i++;
|
|
|
|
while (ppp_compressors[i] && i < (PPP_COMPRESSORS_MAX - 1)) {
|
|
ppp_compressors[i] = ppp_compressors[i + 1];
|
|
i++;
|
|
}
|
|
ppp_compressors[i] = NULL;
|
|
break;
|
|
|
|
case LKM_E_STAT:
|
|
break;
|
|
|
|
default:
|
|
return EINVAL;
|
|
}
|
|
|
|
return 0; /* success */
|
|
}
|
|
|
|
/*
|
|
* the module entry point.
|
|
*/
|
|
int
|
|
bsdcomp_lkmentry(struct lkm_table *lkmtp, int cmd, int ver)
|
|
{
|
|
DISPATCH(lkmtp, cmd, ver, bsdcomp_handle, bsdcomp_handle,
|
|
bsdcomp_handle)
|
|
}
|