M ip/devip.c => ip/devip.c +5 -0
@@ 54,6 54,9 @@ QLock fslock;
Fs *ipfs[Nfs]; /* attached fs's */
Queue *qlog;
+extern void nullmediumlink(void);
+extern void pktmediumlink(void);
+
static int
ip3gen(Chan *c, int i, Dir *dp)
{
@@ 215,6 218,8 @@ ipgen(Chan *c, Dirtab*, int, int s, Dir *dp)
static void
ipreset(void)
{
+ nullmediumlink();
+ pktmediumlink();
}
static void
M ip/ethermedium.c => ip/ethermedium.c +6 -0
@@ 515,3 515,9 @@ multicastarp(Fs *f, Arpent *a, uchar *mac)
/* let arp take care of it */
return nil;
}
+
+void
+ethermediumlink(void)
+{
+ addipmedium(ðermedium);
+}
M ip/ip.h => ip/ip.h +1 -0
@@ 446,6 446,7 @@ extern Medium tripmedium;
* ipifc.c
*/
extern Medium* ipfindmedium(char *name);
+extern void addipmedium(Medium *med);
extern int ipforme(Fs*, uchar *addr);
extern int ipismulticast(uchar *);
extern Ipifc* findipifc(Fs*, uchar *remote, int type);
M ip/ipifc.c => ip/ipifc.c +16 -5
@@ 17,12 17,8 @@ enum {
QMAX = 64*1024-1,
};
-Medium *media[] =
+Medium *media[32] =
{
- ðermedium,
- &pktmedium,
- &nullmedium,
- &tripmedium,
0
};
@@ 72,6 68,21 @@ static char* ipifcjoinmulti(Ipifc *ifc, char **argv, int argc);
static char* ipifcleavemulti(Ipifc *ifc, char **argv, int argc);
/*
+ * link in a new medium
+ */
+void
+addipmedium(Medium *med)
+{
+ int i;
+
+ for(i = 0; i < nelem(media)-1; i++)
+ if(media[i] == nil){
+ media[i] = med;
+ break;
+ }
+}
+
+/*
* find the medium with this name
*/
Medium*
M ip/nullmedium.c => ip/nullmedium.c +6 -0
@@ 45,3 45,9 @@ Medium nullmedium =
nil, /* leave multi */
0, /* don't unbind on last close */
};
+
+void
+nullmediumlink(void)
+{
+ addipmedium(&nullmedium);
+}
M ip/pktmedium.c => ip/pktmedium.c +6 -0
@@ 74,3 74,9 @@ pktin(Fs *f, Ipifc *ifc, Block *bp)
else
ipiput(f, ifc->lifc->local, bp);
}
+
+void
+pktmediumlink(void)
+{
+ addipmedium(&pktmedium);
+}
M pc/etherif.h => pc/etherif.h +1 -0
@@ 6,6 6,7 @@ enum {
typedef struct Ether Ether;
struct Ether {
ISAConf; /* hardware info */
+
int ctlrno;
int tbdf; /* type+busno+devno+funcno */
int mbps; /* Mbps */