/*
* stil - Internet link protocol
*/
#include "u.h"
#include "lib.h"
#include "mem.h"
#include "dat.h"
#include "fns.h"
#include "io.h"
#include "errno.h"
#include "arp.h"
#include "ipdat.h"
#define DPRINT if(pip)print
void ilrcvmsg(Ipconv *, Block *);
void
ilopen(Queue *q, Stream *s)
{
Ipconv *ipc;
ipc = &ipconv[s->dev][s->id];
ipc->ipinterface = newipifc(IP_ILPROTO, ilrcvmsg, ipconv[s->dev],
1500, 512, ETHER_HDR, "IL");
qlock(ipc);
ipc->ref++;
qunlock(ipc);
ipc->readq = RD(q);
RD(q)->ptr = (void *)ipc;
WR(q)->next->ptr = (void *)ipc->ipinterface;
WR(q)->ptr = (void *)ipc;
}
void
ilclose(Queue *q)
{
}
void
iloput(Queue *q, Block *bp)
{
Ipconv *ipc;
Ilhdr *ih;
int dlen;
/* Prepend udp header to packet and pass on to ip layer */
ipc = (Ipconv *)(q->ptr);
if(ipc->psrc == 0)
error(Enoport);
if(bp->type != M_DATA) {
freeb(bp);
error(Ebadctl);
}
/* Only allow atomic Il writes to form datagrams */
if(!(bp->flags & S_DELIM)) {
freeb(bp);
error(Emsgsize);
}
dlen = blen(bp);
if(dlen > IL_DATMAX) {
freeb(bp);
error(Emsgsize);
}
/* Make space to fit il & ip & ethernet header */
bp = padb(bp, IL_EHSIZE+IL_HDRSIZE);
ih = (Ilhdr *)(bp->rptr);
hnputs(ih->illen, dlen+IL_EHSIZE+IL_HDRSIZE);
hnputs(ih->ilsrc, ipc->psrc);
hnputs(ih->ildst, ipc->pdst);
ih->iltype = Ildata;
ih->ilspec = 0;
hnputl(ih->ilid, ipc->ilctl.sent++);
hnputl(ih->ilack, ipc->ilctl.recvd);
ih->ilsum[0] = 0;
ih->ilsum[1] = 0;
PUTNEXT(q, bp);
}
void
iliput(Queue *q, Block *bp)
{
}