#ifdef AURP_SUPPORT
#include <sys/errno.h>
#include <sys/types.h>
#include <sys/param.h>
#include <machine/spl.h>
#include <sys/systm.h>
#include <sys/kernel.h>
#include <sys/proc.h>
#include <sys/filedesc.h>
#include <sys/fcntl.h>
#include <sys/mbuf.h>
#include <sys/socket.h>
#include <sys/socketvar.h>
#include <net/if.h>
#include <netat/sysglue.h>
#include <netat/appletalk.h>
#include <netat/at_pcb.h>
#include <netat/at_var.h>
#include <netat/routing_tables.h>
#include <netat/aurp.h>
#include <netat/debug.h>
int
aurp_wput(gref, m)
gref_t *gref;
gbuf_t *m;
{
register ioc_t *iocbp;
register gbuf_t *mdata;
register int temp, error;
switch (gbuf_type(m)) {
case MSG_IOCTL:
iocbp = (ioc_t *)gbuf_rptr(m);
switch (iocbp->ioc_cmd) {
case AUC_CFGTNL:
mdata = gbuf_cont(m);
temp = (int)(*gbuf_rptr(mdata));
if (temp != dst_addr_cnt) {
AURPiocnak(gref, m, ENOSPC);
return 0;
}
if ((error = aurpd_start()) != 0) {
AURPiocnak(gref, m, error);
return 0;
}
if (AURPinit()) {
AURPiocnak(gref, m, ENOMEM);
return 0;
}
ddp_AURPfuncx(AURPCODE_AURPPROTO, 0, 0);
AURPaccess();
break;
case AUC_SHTDOWN:
AURPshutdown();
break;
case AUC_EXPNET:
case AUC_HIDENET:
mdata = gbuf_cont(m);
net_access_cnt = (gbuf_len(mdata))/sizeof(short);
if ((net_access_cnt==0) || (net_access_cnt>AURP_MaxNetAccess)) {
AURPiocnak(gref, m, EINVAL);
return 0;
}
bcopy(gbuf_rptr(mdata), net_access,
gbuf_len(mdata));
if (iocbp->ioc_cmd == AUC_EXPNET)
net_export = 1;
break;
case AUC_UDPPORT:
mdata = gbuf_cont(m);
aurp_global.udp_port = *(char *)gbuf_rptr(mdata);
break;
case AUC_NETLIST:
mdata = gbuf_cont(m);
dst_addr_cnt = ((gbuf_len(mdata)) >> 2)-1;
bcopy(gbuf_rptr(mdata), &aurp_global.dst_addr,
gbuf_len(mdata));
aurp_global.src_addr = aurp_global.dst_addr[0];
aurp_global.dst_addr[0] = 0;
break;
default:
AURPiocnak(gref, m, EINVAL);
return 0;
}
AURPiocack(gref, m);
break;
default:
dPrintf(D_M_AURP, D_L_WARNING,
("aurp_wput: bad msg type=%d\n", gbuf_type(m)));
gbuf_freem(m);
break;
}
return 0;
}
int
at_insert(m, type, node)
register gbuf_t *m;
register unsigned int type, node;
{
register aurp_hdr_t *hdrp;
register aurp_state_t *state;
if (type == AUD_Atalk)
ddp_AURPfuncx(AURPCODE_DATAPKT, m, node);
else
{
state = (aurp_state_t *)&aurp_state[node];
state->tickle_retry = 0;
hdrp = (aurp_hdr_t *)gbuf_rptr(m);
switch (hdrp->command_code) {
case AURPCMD_RIUpd:
AURPrcvRIUpd(state, m); break;
case AURPCMD_RIReq:
AURPrcvRIReq(state, m); break;
case AURPCMD_RIRsp:
AURPrcvRIRsp(state, m); break;
case AURPCMD_RIAck:
AURPrcvRIAck(state, m); break;
case AURPCMD_ZReq:
AURPrcvZReq(state, m); break;
case AURPCMD_ZRsp:
AURPrcvZRsp(state, m); break;
case AURPCMD_OpenReq:
AURPrcvOpenReq(state, m); break;
case AURPCMD_OpenRsp:
AURPrcvOpenRsp(state, m); break;
case AURPCMD_Tickle:
AURPrcvTickle(state, m); break;
case AURPCMD_TickleAck:
AURPrcvTickleAck(state, m); break;
case AURPCMD_RDReq:
AURPrcvRDReq(state, m); break;
default:
dPrintf(D_M_AURP, D_L_WARNING,
("at_insert: bad proto cmd=%d\n",
hdrp->command_code));
gbuf_freem(m);
}
}
return 0;
}
#endif