1*9ef1f84bSDavid du Colombier #include "u.h"
2*9ef1f84bSDavid du Colombier #include "../port/lib.h"
3*9ef1f84bSDavid du Colombier #include "mem.h"
4*9ef1f84bSDavid du Colombier #include "dat.h"
5*9ef1f84bSDavid du Colombier #include "fns.h"
6*9ef1f84bSDavid du Colombier #include "../port/error.h"
7*9ef1f84bSDavid du Colombier
8*9ef1f84bSDavid du Colombier #include "ip.h"
9*9ef1f84bSDavid du Colombier
10*9ef1f84bSDavid du Colombier
11*9ef1f84bSDavid du Colombier static void pktbind(Ipifc*, int, char**);
12*9ef1f84bSDavid du Colombier static void pktunbind(Ipifc*);
13*9ef1f84bSDavid du Colombier static void pktbwrite(Ipifc*, Block*, int, uchar*);
14*9ef1f84bSDavid du Colombier static void pktin(Fs*, Ipifc*, Block*);
15*9ef1f84bSDavid du Colombier
16*9ef1f84bSDavid du Colombier Medium pktmedium =
17*9ef1f84bSDavid du Colombier {
18*9ef1f84bSDavid du Colombier .name= "pkt",
19*9ef1f84bSDavid du Colombier .hsize= 14,
20*9ef1f84bSDavid du Colombier .mintu= 40,
21*9ef1f84bSDavid du Colombier .maxtu= 4*1024,
22*9ef1f84bSDavid du Colombier .maclen= 6,
23*9ef1f84bSDavid du Colombier .bind= pktbind,
24*9ef1f84bSDavid du Colombier .unbind= pktunbind,
25*9ef1f84bSDavid du Colombier .bwrite= pktbwrite,
26*9ef1f84bSDavid du Colombier .pktin= pktin,
27*9ef1f84bSDavid du Colombier };
28*9ef1f84bSDavid du Colombier
29*9ef1f84bSDavid du Colombier /*
30*9ef1f84bSDavid du Colombier * called to bind an IP ifc to an ethernet device
31*9ef1f84bSDavid du Colombier * called with ifc wlock'd
32*9ef1f84bSDavid du Colombier */
33*9ef1f84bSDavid du Colombier static void
pktbind(Ipifc *,int argc,char ** argv)34*9ef1f84bSDavid du Colombier pktbind(Ipifc*, int argc, char **argv)
35*9ef1f84bSDavid du Colombier {
36*9ef1f84bSDavid du Colombier USED(argc, argv);
37*9ef1f84bSDavid du Colombier }
38*9ef1f84bSDavid du Colombier
39*9ef1f84bSDavid du Colombier /*
40*9ef1f84bSDavid du Colombier * called with ifc wlock'd
41*9ef1f84bSDavid du Colombier */
42*9ef1f84bSDavid du Colombier static void
pktunbind(Ipifc *)43*9ef1f84bSDavid du Colombier pktunbind(Ipifc*)
44*9ef1f84bSDavid du Colombier {
45*9ef1f84bSDavid du Colombier }
46*9ef1f84bSDavid du Colombier
47*9ef1f84bSDavid du Colombier /*
48*9ef1f84bSDavid du Colombier * called by ipoput with a single packet to write
49*9ef1f84bSDavid du Colombier */
50*9ef1f84bSDavid du Colombier static void
pktbwrite(Ipifc * ifc,Block * bp,int,uchar *)51*9ef1f84bSDavid du Colombier pktbwrite(Ipifc *ifc, Block *bp, int, uchar*)
52*9ef1f84bSDavid du Colombier {
53*9ef1f84bSDavid du Colombier /* enqueue onto the conversation's rq */
54*9ef1f84bSDavid du Colombier bp = concatblock(bp);
55*9ef1f84bSDavid du Colombier if(ifc->conv->snoopers.ref > 0)
56*9ef1f84bSDavid du Colombier qpass(ifc->conv->sq, copyblock(bp, BLEN(bp)));
57*9ef1f84bSDavid du Colombier qpass(ifc->conv->rq, bp);
58*9ef1f84bSDavid du Colombier }
59*9ef1f84bSDavid du Colombier
60*9ef1f84bSDavid du Colombier /*
61*9ef1f84bSDavid du Colombier * called with ifc rlocked when someone write's to 'data'
62*9ef1f84bSDavid du Colombier */
63*9ef1f84bSDavid du Colombier static void
pktin(Fs * f,Ipifc * ifc,Block * bp)64*9ef1f84bSDavid du Colombier pktin(Fs *f, Ipifc *ifc, Block *bp)
65*9ef1f84bSDavid du Colombier {
66*9ef1f84bSDavid du Colombier if(ifc->lifc == nil)
67*9ef1f84bSDavid du Colombier freeb(bp);
68*9ef1f84bSDavid du Colombier else {
69*9ef1f84bSDavid du Colombier if(ifc->conv->snoopers.ref > 0)
70*9ef1f84bSDavid du Colombier qpass(ifc->conv->sq, copyblock(bp, BLEN(bp)));
71*9ef1f84bSDavid du Colombier ipiput4(f, ifc, bp);
72*9ef1f84bSDavid du Colombier }
73*9ef1f84bSDavid du Colombier }
74*9ef1f84bSDavid du Colombier
75*9ef1f84bSDavid du Colombier void
pktmediumlink(void)76*9ef1f84bSDavid du Colombier pktmediumlink(void)
77*9ef1f84bSDavid du Colombier {
78*9ef1f84bSDavid du Colombier addipmedium(&pktmedium);
79*9ef1f84bSDavid du Colombier }
80