| plan 9 kernel history: overview | file list | diff list |
2001/0922/ip/devip.c (diff list | history)
| 1997/0327/sys/src/9/ip/devip.c:648,663 – 1997/0403/sys/src/9/ip/devip.c:648,658 (short | long) | ||
| 1997/0327 | qunlock(&c->car); nexterror(); } | |
| 1997/0403 | p = x->announce(c, fields, nfield); if(p != nil) error(p); | |
| 1997/0327 | sleep(&c->cr, announced, c); if(c->cerr[0] != '\0') error(c->cerr); | |
| 1997/0327/sys/src/9/ip/devip.c:934,939 – 1997/0403/sys/src/9/ip/devip.c:929,947 | ||
| 1997/0327 | return p; setladdr(c); c->lport = atoi(argv[2]); | |
| 1997/0403 | break; } return nil; } char* Fsstdannounce(Conv* c, char* argv[], int argc) { switch(argc){ default: return "bad args to announce"; case 2: setladdrport(c, argv[1]); | |
| 1997/0327 | break; } return nil; | |
| 1997/0403/sys/src/9/ip/devip.c:712,717 – 1997/0408/sys/src/9/ip/devip.c:712,720 (short | long) | ||
| 1997/0327 | } Dev ipdevtab = { | |
| 1997/0408 | 'I', "ip", | |
| 1997/0327 | ipreset, ipinit, ipattach, | |
| 1997/0408/sys/src/9/ip/devip.c:137,142 – 1997/0423/sys/src/9/ip/devip.c:137,144 (short | long) | ||
| 1997/0327 | switch(TYPE(c->qid)) { case Qtopdir: if(s < fs.np) { | |
| 1997/0423 | if(fs.p[s]->connect == nil) return 0; /* protocol with no user interface */ | |
| 1997/0327 | q = (Qid){QID(s, 0, Qprotodir)|CHDIR, 0}; devdir(c, q, fs.p[s]->name, 0, network, CHDIR|0555, dp); return 1; | |
| 1997/0408/sys/src/9/ip/devip.c:270,275 – 1997/0423/sys/src/9/ip/devip.c:272,280 | ||
| 1997/0327 | switch(TYPE(c->qid)) { default: break; | |
| 1997/0423 | case Qipifc: c->aux = newifcconv(); break; | |
| 1997/0327 | case Qlog: netlogopen(); break; | |
| 1997/0408/sys/src/9/ip/devip.c:402,407 – 1997/0423/sys/src/9/ip/devip.c:407,416 | ||
| 1997/0327 | switch(TYPE(c->qid)) { default: break; | |
| 1997/0423 | case Qipifc: closeifcconv(c->aux); c->aux = nil; break; | |
| 1997/0327 | case Qlog: netlogclose(); break; | |
| 1997/0408/sys/src/9/ip/devip.c:530,536 – 1997/0423/sys/src/9/ip/devip.c:539,546 | ||
| 1997/0327 | static void setladdrport(Conv* c, char* str) { | |
| 1997/0423 | char *p; uchar addr[Ipaddrlen]; | |
| 1997/0327 | p = strchr(str, '!'); if(p == nil) { | |
| 1997/0408/sys/src/9/ip/devip.c:540,546 – 1997/0423/sys/src/9/ip/devip.c:550,556 | ||
| 1997/0327 | else { *p++ = 0; parseip(addr, str); | |
| 1997/0423 | c->laddr = nhgetl(addr); | |
| 1997/0327 | } if(*p == '*') c->lport = 0; | |
| 1997/0408/sys/src/9/ip/devip.c:554,560 – 1997/0423/sys/src/9/ip/devip.c:564,571 | ||
| 1997/0327 | static char* setraddrport(Conv* c, char* str) { | |
| 1997/0423 | char *p; uchar addr[Ipaddrlen]; | |
| 1997/0327 | p = strchr(str, '!'); if(p == nil) | |
| 1997/0408/sys/src/9/ip/devip.c:561,567 – 1997/0423/sys/src/9/ip/devip.c:572,578 | ||
| 1997/0327 | return "malformed address"; *p++ = 0; parseip(addr, str); | |
| 1997/0423 | c->raddr = nhgetl(addr); | |
| 1997/0327 | c->rport = atoi(p); p = strchr(p, '!'); if(p){ | |
| 1997/0408/sys/src/9/ip/devip.c:600,606 – 1997/0423/sys/src/9/ip/devip.c:611,617 | ||
| 1997/0327 | error(p); return n; case Qipifc: | |
| 1997/0423 | p = Mediaifcwrite(ch->aux, a, n); | |
| 1997/0327 | if(p != nil) error(p); return n; | |
| 1997/0423/sys/src/9/ip/devip.c:500,513 – 1997/0508/sys/src/9/ip/devip.c:500,505 (short | long) | ||
| 1997/0327 | int x, found; p = c->p; | |
| 1997/0423/sys/src/9/ip/devip.c:514,525 – 1997/0508/sys/src/9/ip/devip.c:506,526 | ||
| 1997/0327 | pp = &p->nextport; lock(p); for(;;(*pp)++){ | |
| 1997/0508 | /* * Fsproto initialises p->nextport to 0 and the restricted * ports (p->nextrport) to 600. * Restricted ports must lie between 600 and 1024. * For the initial condition or if the unrestricted port number * has wrapped round, select a random port between 5000 and 1<<16 * to start at. */ if(c->restricted){ if(*pp >= 1024) | |
| 1997/0327 | *pp = 600; | |
| 1997/0508 | else while(*pp < 5000) *pp = nrand(1<<16); | |
| 1997/0327 | found = 0; for(x = 0; x < p->nc; x++){ if(p->conv[x] == nil) | |
| 1997/0508/sys/src/9/ip/devip.c:408,414 – 1997/0531/sys/src/9/ip/devip.c:408,415 (short | long) | ||
| 1997/0327 | default: break; | |
| 1997/0423 | case Qipifc: | |
| 1997/0531 | if(c->flag & COPEN) closeifcconv(c->aux); | |
| 1997/0423 | c->aux = nil; break; | |
| 1997/0327 | case Qlog: | |
| 1997/0531/sys/src/9/ip/devip.c:918,926 – 1997/0806/sys/src/9/ip/devip.c:918,926 (short | long) | ||
| 1997/0327 | n = 0; for(p = fs.p; *p; p++) n += snprint(buf + n, len - n, | |
| 1997/0806 | "%s: csum %d hlen %d len %d order %d rexmit %d wc %d\n", | |
| 1997/0327 | (*p)->name, (*p)->csumerr, (*p)->hlenerr, (*p)->lenerr, | |
| 1997/0806 | (*p)->order, (*p)->rexmit, (*p)->wclosed); | |
| 1997/0327 | return n; } | |
| 1997/0806/sys/src/9/ip/devip.c:512,518 – 1997/0811/sys/src/9/ip/devip.c:512,518 (short | long) | ||
| 1997/0508 | * ports (p->nextrport) to 600. * Restricted ports must lie between 600 and 1024. * For the initial condition or if the unrestricted port number | |
| 1997/0811 | * has wrapped round, select a random port between 5000 and 1<<15 | |
| 1997/0508 | * to start at. */ if(c->restricted){ | |
| 1997/0806/sys/src/9/ip/devip.c:520,526 – 1997/0811/sys/src/9/ip/devip.c:520,526 | ||
| 1997/0327 | *pp = 600; } | |
| 1997/0508 | else while(*pp < 5000) | |
| 1997/0811 | *pp = nrand(1<<15); | |
| 1997/0508 | ||
| 1997/0327 | found = 0; for(x = 0; x < p->nc; x++){ | |
| 1997/0811/sys/src/9/ip/devip.c:542,548 – 1997/0815/sys/src/9/ip/devip.c:542,548 (short | long) | ||
| 1997/0327 | setladdrport(Conv* c, char* str) { | |
| 1997/0423 | char *p; | |
| 1997/0815 | uchar addr[IPaddrlen]; | |
| 1997/0327 | p = strchr(str, '!'); if(p == nil) { | |
| 1997/0811/sys/src/9/ip/devip.c:567,573 – 1997/0815/sys/src/9/ip/devip.c:567,573 | ||
| 1997/0327 | setraddrport(Conv* c, char* str) { | |
| 1997/0423 | char *p; | |
| 1997/0815 | uchar addr[IPaddrlen]; | |
| 1997/0327 | p = strchr(str, '!'); if(p == nil) | |
| 1997/0815/sys/src/9/ip/devip.c:224,230 – 1997/0823/sys/src/9/ip/devip.c:224,230 (short | long) | ||
| 1997/0327 | c->qid = (Qid){QID(0, 0, Qtopdir)|CHDIR, 0}; break; case Qconvdir: | |
| 1997/0823 | c->qid = (Qid){QID(PROTO(c->qid), 0, Qprotodir)|CHDIR, 0}; | |
| 1997/0327 | break; default: panic("ipwalk %lux", c->qid.path); | |
| 1997/0823/sys/src/9/ip/devip.c:916,926 – 1997/0916/sys/src/9/ip/devip.c:916,929 (short | long) | ||
| 1997/0327 | int n; n = 0; | |
| 1997/0916 | for(p = fs.p; *p; p++){ | |
| 1997/0327 | n += snprint(buf + n, len - n, | |
| 1997/0806 |
| |
| 1997/0916 | "%s: csum %d hlen %d len %d order %d rexmit %d\n", | |
| 1997/0327 | (*p)->name, (*p)->csumerr, (*p)->hlenerr, (*p)->lenerr, | |
| 1997/0806 |
| |
| 1997/0916 | (*p)->order, (*p)->rexmit); if((*p)->stats) n += (*(*p)->stats)(buf + n, len - n); } | |
| 1997/0327 | return n; } | |
| 1997/0916/sys/src/9/ip/devip.c:539,545 – 1997/1030/sys/src/9/ip/devip.c:539,545 (short | long) | ||
| 1997/0327 | } static void | |
| 1997/1030 | setladdrport(Conv* c, char* str, int nodefault) | |
| 1997/0327 | { | |
| 1997/0423 | char *p; | |
| 1997/0815 | uchar addr[IPaddrlen]; | |
| 1997/0916/sys/src/9/ip/devip.c:547,553 – 1997/1030/sys/src/9/ip/devip.c:547,556 | ||
| 1997/0327 | p = strchr(str, '!'); if(p == nil) { p = str; | |
| 1997/1030 | if(nodefault) setladdr(c); else c->laddr = 0; | |
| 1997/0327 | } else { *p++ = 0; | |
| 1997/0916/sys/src/9/ip/devip.c:946,953 – 1997/1030/sys/src/9/ip/devip.c:949,955 | ||
| 1997/0327 | p = setraddrport(c, argv[1]); if(p != nil) return p; | |
| 1997/1030 | setladdrport(c, argv[2], 1); | |
| 1997/0403 | break; } return nil; | |
| 1997/0916/sys/src/9/ip/devip.c:960,966 – 1997/1030/sys/src/9/ip/devip.c:962,968 | ||
| 1997/0403 | default: return "bad args to announce"; case 2: | |
| 1997/1030 | setladdrport(c, argv[1], 0); | |
| 1997/0327 | break; } return nil; | |
| 1997/1030/sys/src/9/ip/devip.c:470,477 – 1997/1104/sys/src/9/ip/devip.c:470,483 (short | long) | ||
| 1997/0327 | sprint(buf, "%s/%d %d %s \n", c->p->name, c->x, c->inuse, statename); return readstr(offset, p, n, buf); case Qdata: | |
| 1997/1104 | {int xxx; poot("ipread 1", 0); | |
| 1997/0327 | c = fs.p[PROTO(ch->qid)]->conv[CONV(ch->qid)]; | |
| 1997/1104 | // return qread(c->rq, a, n); xxx = qread(c->rq, a, n); poot("ipread 2", 0); return xxx; } | |
| 1997/0327 | case Qerr: c = fs.p[PROTO(ch->qid)]->conv[CONV(ch->qid)]; return qread(c->eq, a, n); | |
| 1997/1030/sys/src/9/ip/devip.c:807,812 – 1997/1104/sys/src/9/ip/devip.c:813,819 | ||
| 1997/0327 | c->x = pp - p->conv; c->ptcl = malloc(p->ptclsize); if(c->ptcl == nil) { | |
| 1997/1104 | unlock(c); | |
| 1997/0327 | free(c); error(Enomem); } | |
| 1997/1104/sys/src/9/ip/devip.c:470,483 – 1997/1105/sys/src/9/ip/devip.c:470,478 (short | long) | ||
| 1997/0327 | sprint(buf, "%s/%d %d %s \n", c->p->name, c->x, c->inuse, statename); return readstr(offset, p, n, buf); case Qdata: | |
| 1997/1104 |
| |
| 1997/0327 | c = fs.p[PROTO(ch->qid)]->conv[CONV(ch->qid)]; | |
| 1997/1104 |
| |
| 1997/1105 | return qread(c->rq, a, n); | |
| 1997/0327 | case Qerr: c = fs.p[PROTO(ch->qid)]->conv[CONV(ch->qid)]; return qread(c->eq, a, n); | |
| 1997/1105/sys/src/9/ip/devip.c:545,552 – 1997/1128/sys/src/9/ip/devip.c:545,556 (short | long) | ||
| 1997/0423 | char *p; | |
| 1997/0815 | uchar addr[IPaddrlen]; | |
| 1997/0327 | ||
| 1997/1128 | /* * ignore restricted part if it exists. it's * meaningless on local ports. */ | |
| 1997/0327 | p = strchr(str, '!'); | |
| 1997/1128 | if(p == nil || strcmp(p, "!r") == 0) { | |
| 1997/0327 | p = str; | |
| 1997/1030 | if(nodefault) setladdr(c); | |
| 1997/1128/sys/src/9/ip/devip.c:14,26 – 1998/0306/sys/src/9/ip/devip.c:14,27 (short | long) | ||
| 1997/0327 | Qtopdir= 1, /* top level directory */ Qtopbase, Qarp= Qtopbase, | |
| 1998/0306 | Qiprouter, | |
| 1997/0327 | Qlog, Qprotodir, /* directory for a protocol */ Qprotobase, Qclone= Qprotobase, | |
| 1998/0306 | Qstats, | |
| 1997/0327 | Qconvdir, /* directory for a conversation */ Qconvbase, | |
| 1997/1128/sys/src/9/ip/devip.c:79,85 – 1998/0306/sys/src/9/ip/devip.c:80,86 | ||
| 1997/0327 | q = (Qid){QID(PROTO(c->qid), CONV(c->qid), Qstatus), 0}; break; } | |
| 1998/0306 | devdir(c, q, p, 0, cv->owner, 0666, dp); | |
| 1997/0327 | return 1; } | |
| 1997/1128/sys/src/9/ip/devip.c:91,98 – 1998/0306/sys/src/9/ip/devip.c:92,103 | ||
| 1997/0327 | switch(i) { case Qclone: q = (Qid){QID(PROTO(c->qid), 0, Qclone), 0}; | |
| 1998/0306 | devdir(c, q, "clone", 0, network, 0666, dp); | |
| 1997/0327 | return 1; | |
| 1998/0306 | case Qstats: q = (Qid){QID(PROTO(c->qid), 0, Qstats), 0}; devdir(c, q, "stats", 0, network, 0444, dp); return 1; | |
| 1997/0327 | } return -1; } | |
| 1997/1128/sys/src/9/ip/devip.c:110,129 – 1998/0306/sys/src/9/ip/devip.c:115,134 | ||
| 1997/0327 | p = "arp"; q = (Qid){QID(0, 0, Qarp), 0}; break; | |
| 1998/0306 | case Qiprouter: p = "iprouter"; q = (Qid){QID(0, 0, Qiprouter), 0}; break; | |
| 1997/0327 | case Qlog: p = "log"; q = (Qid){QID(0, 0, Qlog), 0}; break; } | |
| 1998/0306 | devdir(c, q, p, 0, network, 0666, dp); | |
| 1997/0327 | return 1; } | |
| 1997/1128/sys/src/9/ip/devip.c:146,154 – 1998/0306/sys/src/9/ip/devip.c:151,159 | ||
| 1997/0327 | s -= fs.np; return ip1gen(c, s+Qtopbase, dp); case Qarp: | |
| 1998/0306 | case Qiprouter: | |
| 1997/0327 | return ip1gen(c, TYPE(c->qid), dp); case Qprotodir: if(s < fs.p[PROTO(c->qid)]->ac) { | |
| 1997/1128/sys/src/9/ip/devip.c:161,166 – 1998/0306/sys/src/9/ip/devip.c:166,172 | ||
| 1997/0327 | s -= fs.p[PROTO(c->qid)]->ac; return ip2gen(c, s+Qprotobase, dp); case Qclone: | |
| 1998/0306 | case Qstats: | |
| 1997/0327 | return ip2gen(c, TYPE(c->qid), dp); case Qconvdir: return ip3gen(c, s+Qconvbase, dp); | |
| 1997/1128/sys/src/9/ip/devip.c:193,198 – 1998/0306/sys/src/9/ip/devip.c:199,206 | ||
| 1997/0327 | fmtinstall('i', eipconv); fmtinstall('I', eipconv); fmtinstall('E', eipconv); | |
| 1998/0306 | fmtinstall('V', eipconv); fmtinstall('M', eipconv); | |
| 1997/0327 | } static Chan* | |
| 1997/1128/sys/src/9/ip/devip.c:217,241 – 1998/0306/sys/src/9/ip/devip.c:225,248 | ||
| 1997/0327 | { Path *op; | |
| 1997/0823 |
| |
| 1997/0327 |
| |
| 1998/0306 | if(strcmp(name, "..") != 0) return devwalk(c, name, nil, 0, ipgen); | |
| 1997/0327 |
| |
| 1998/0306 | switch(TYPE(c->qid)){ case Qtopdir: case Qprotodir: c->qid = (Qid){QID(0, 0, Qtopdir)|CHDIR, 0}; break; case Qconvdir: c->qid = (Qid){QID(PROTO(c->qid), 0, Qprotodir)|CHDIR, 0}; break; default: panic("ipwalk %lux", c->qid.path); } op = c->path; c->path = ptenter(&syspt, op, name); decref(op); return 1; | |
| 1997/0327 | } static void | |
| 1997/1128/sys/src/9/ip/devip.c:272,283 – 1998/0306/sys/src/9/ip/devip.c:279,293 | ||
| 1997/0327 | switch(TYPE(c->qid)) { default: break; | |
| 1997/0423 |
| |
| 1997/0327 | case Qlog: netlogopen(); break; | |
| 1998/0306 | case Qiprouter: iprouteropen(); break; case Qiproute: memmove(c->tag, "none", sizeof(c->tag)); break; | |
| 1997/0327 | case Qtopdir: case Qprotodir: case Qconvdir: | |
| 1997/1128/sys/src/9/ip/devip.c:284,289 – 1998/0306/sys/src/9/ip/devip.c:294,300 | ||
| 1997/0327 | case Qstatus: case Qremote: case Qlocal: | |
| 1998/0306 | case Qstats: | |
| 1997/0327 | if(omode != OREAD) error(Eperm); break; | |
| 1997/1128/sys/src/9/ip/devip.c:300,311 – 1998/0306/sys/src/9/ip/devip.c:311,322 | ||
| 1997/0327 | case Qctl: case Qerr: p = fs.p[PROTO(c->qid)]; | |
| 1998/0306 | qlock(p); | |
| 1997/0327 | cv = p->conv[CONV(c->qid)]; lock(cv); if(waserror()) { unlock(cv); | |
| 1998/0306 | qunlock(p); | |
| 1997/0327 | nexterror(); } if((perm & (cv->perm>>6)) != perm) { | |
| 1997/1128/sys/src/9/ip/devip.c:321,327 – 1998/0306/sys/src/9/ip/devip.c:332,338 | ||
| 1997/0327 | cv->perm = 0660; } unlock(cv); | |
| 1998/0306 | qunlock(p); | |
| 1997/0327 | poperror(); break; case Qlisten: | |
| 1997/1128/sys/src/9/ip/devip.c:381,388 – 1998/0306/sys/src/9/ip/devip.c:392,401 | ||
| 1997/0327 | closeconv(Conv *cv) { Conv *nc; | |
| 1998/0306 | Ipmulti *mp; | |
| 1997/0327 | lock(cv); | |
| 1998/0306 | ||
| 1997/0327 | if(--cv->inuse > 0) { unlock(cv); return; | |
| 1997/1128/sys/src/9/ip/devip.c:397,402 – 1998/0306/sys/src/9/ip/devip.c:410,418 | ||
| 1997/0327 | strcpy(cv->owner, network); cv->perm = 0660; | |
| 1998/0306 | while((mp = cv->multi) != nil) ipifcremmulti(cv, mp->ma, mp->ia); | |
| 1997/0327 | /* The close routine will unlock the conv */ cv->p->close(cv); } | |
| 1997/1128/sys/src/9/ip/devip.c:407,419 – 1998/0306/sys/src/9/ip/devip.c:423,435 | ||
| 1997/0327 | switch(TYPE(c->qid)) { default: break; | |
| 1997/0423 |
| |
| 1998/0306 | case Qlog: | |
| 1997/0531 | if(c->flag & COPEN) | |
| 1997/0423 |
| |
| 1998/0306 | netlogclose(); | |
| 1997/0423 | break; | |
| 1997/0327 |
| |
| 1998/0306 | case Qiprouter: if(c->flag & COPEN) iprouterclose(); | |
| 1997/0327 | break; case Qdata: case Qctl: | |
| 1997/1128/sys/src/9/ip/devip.c:423,435 – 1998/0306/sys/src/9/ip/devip.c:439,456 | ||
| 1997/0327 | } } | |
| 1998/0306 | enum { Statelen= 1024, }; | |
| 1997/0327 | static long ipread(Chan *ch, void *a, long n, ulong offset) { Conv *c; Proto *x; | |
| 1998/0306 | char *buf, *p; long m, rv; | |
| 1997/0327 | p = a; switch(TYPE(ch->qid)) { | |
| 1997/1128/sys/src/9/ip/devip.c:441,481 – 1998/0306/sys/src/9/ip/devip.c:462,522 | ||
| 1997/0327 | return devdirread(ch, a, n, 0, 0, ipgen); case Qarp: return arpread(a, offset, n); | |
| 1998/0306 | case Qiprouter: return iprouterread(a, n); | |
| 1997/0327 | case Qlog: return netlogread(a, offset, n); case Qctl: | |
| 1998/0306 | buf = smalloc(16); | |
| 1997/0327 | sprint(buf, "%d", CONV(ch->qid)); | |
| 1998/0306 | rv = readstr(offset, p, n, buf); free(buf); return rv; | |
| 1997/0327 | case Qremote: | |
| 1998/0306 | buf = smalloc(Statelen); | |
| 1997/0327 | c = fs.p[PROTO(ch->qid)]->conv[CONV(ch->qid)]; | |
| 1998/0306 | sprint(buf, "%I!%d\n", c->raddr, c->rport); rv = readstr(offset, p, n, buf); free(buf); return rv; | |
| 1997/0327 | case Qlocal: | |
| 1998/0306 | buf = smalloc(Statelen); x = fs.p[PROTO(ch->qid)]; c = x->conv[CONV(ch->qid)]; if(x->local == nil) { sprint(buf, "%I!%d\n", c->laddr, c->lport); } else { (*x->local)(c, buf, Statelen-2); } rv = readstr(offset, p, n, buf); free(buf); return rv; | |
| 1997/0327 | case Qstatus: | |
| 1998/0306 | buf = smalloc(Statelen); | |
| 1997/0327 | x = fs.p[PROTO(ch->qid)]; c = x->conv[CONV(ch->qid)]; | |
| 1998/0306 | m = sprint(buf, "%s/%d %d ", c->p->name, c->x, c->inuse); (*x->state)(c, buf, Statelen-m-2); rv = readstr(offset, p, n, buf); free(buf); return rv; | |
| 1997/0327 | case Qdata: c = fs.p[PROTO(ch->qid)]->conv[CONV(ch->qid)]; | |
| 1997/1105 | return qread(c->rq, a, n); | |
| 1997/0327 | case Qerr: c = fs.p[PROTO(ch->qid)]->conv[CONV(ch->qid)]; return qread(c->eq, a, n); | |
| 1998/0306 | case Qstats: x = fs.p[PROTO(ch->qid)]; if(x->stats == nil) error("stats not implemented"); buf = smalloc(Statelen); (*x->stats)(buf, Statelen); rv = readstr(offset, p, n, buf); free(buf); return rv; | |
| 1997/0327 | } } | |
| 1997/1128/sys/src/9/ip/devip.c:485,499 – 1998/0306/sys/src/9/ip/devip.c:526,543 | ||
| 1997/0327 | return devbread(c, n, offset); } | |
| 1998/0306 | /* * set local address to be that of the ifc closest to remote address */ | |
| 1997/0327 | static void setladdr(Conv* c) { | |
| 1998/0306 | findlocalip(c->laddr, c->raddr); | |
| 1997/0327 | } | |
| 1998/0306 | /* * pick a local port and set it */ | |
| 1997/0327 | static void setlport(Conv* c) { | |
| 1997/1128/sys/src/9/ip/devip.c:506,512 – 1998/0306/sys/src/9/ip/devip.c:550,556 | ||
| 1997/0327 | pp = &p->nextrport; else pp = &p->nextport; | |
| 1998/0306 | qlock(p); | |
| 1997/0327 | for(;;(*pp)++){ | |
| 1997/0508 | /* * Fsproto initialises p->nextport to 0 and the restricted | |
| 1997/1128/sys/src/9/ip/devip.c:536,549 – 1998/0306/sys/src/9/ip/devip.c:580,600 | ||
| 1997/0327 | break; } c->lport = (*pp)++; | |
| 1998/0306 | qunlock(p); | |
| 1997/0327 | } | |
| 1998/0306 | /* * set a local address and port from a string of the form * address!port * if address is missing and not announcing, pick one * if address is missing and announcing, leave address as zero (i.e. matches anything) * if port is 0, pick a free one * if port is '*', leave port as zero (i.e. matches anything) */ | |
| 1997/0327 | static void | |
| 1997/1030 |
| |
| 1998/0306 | setladdrport(Conv* c, char* str, int announcing) | |
| 1997/0327 | { | |
| 1997/0423 | char *p; | |
| 1997/0815 |
| |
| 1997/0327 | ||
| 1997/1128 | /* * ignore restricted part if it exists. it's | |
| 1997/1128/sys/src/9/ip/devip.c:552,570 – 1998/0306/sys/src/9/ip/devip.c:603,618 | ||
| 1997/0327 | p = strchr(str, '!'); | |
| 1997/1128 | if(p == nil || strcmp(p, "!r") == 0) { | |
| 1997/0327 | p = str; | |
| 1997/1030 |
| |
| 1998/0306 | memset(c->laddr, 0, sizeof(c->laddr)); if(!announcing) | |
| 1997/1030 | setladdr(c); | |
| 1997/0327 |
| |
| 1998/0306 | } else { | |
| 1997/0327 | *p++ = 0; | |
| 1997/0423 |
| |
| 1998/0306 | parseip(c->laddr, str); | |
| 1997/0327 | } | |
| 1998/0306 | c->lport = 0; if(*p != '*'){ | |
| 1997/0327 | c->lport = atoi(p); if(c->lport == 0) setlport(c); | |
| 1997/1128/sys/src/9/ip/devip.c:575,588 – 1998/0306/sys/src/9/ip/devip.c:623,634 | ||
| 1997/0327 | setraddrport(Conv* c, char* str) { | |
| 1997/0423 | char *p; | |
| 1997/0815 |
| |
| 1997/0327 | p = strchr(str, '!'); if(p == nil) return "malformed address"; *p++ = 0; | |
| 1997/0423 |
| |
| 1998/0306 | parseip(c->raddr, str); | |
| 1997/0327 | c->rport = atoi(p); p = strchr(p, '!'); if(p){ | |
| 1997/1128/sys/src/9/ip/devip.c:592,635 – 1998/0306/sys/src/9/ip/devip.c:638,800 | ||
| 1997/0327 | return nil; } | |
| 1998/0306 | /* * called by protocol connect routine to set addresses */ char* Fsstdconnect(Conv *c, char *argv[], int argc) { char *p; switch(argc) { default: return "bad args to connect"; case 2: p = setraddrport(c, argv[1]); if(p != nil) return p; setladdr(c); setlport(c); break; case 3: p = setraddrport(c, argv[1]); if(p != nil) return p; setladdrport(c, argv[2], 0); break; } return nil; } /* * initiate connection and sleep till its set up */ | |
| 1997/0327 | static int connected(void* a) { return ((Conv*)a)->state == Connected; } | |
| 1998/0306 | static void connectctlmsg(Proto *x, Conv *c, Cmdbuf *cb) { char *p; | |
| 1997/0327 | ||
| 1998/0306 | c->state = Connecting; c->cerr[0] = '\0'; if(x->connect == nil) error("connect not supported"); p = x->connect(c, cb->f, cb->nf); if(p != nil) error(p); sleep(&c->cr, connected, c); if(c->cerr[0] != '\0') error(c->cerr); } /* * called by protocol announce routine to set addresses */ char* Fsstdannounce(Conv* c, char* argv[], int argc) { switch(argc){ default: return "bad args to announce"; case 2: setladdrport(c, argv[1], 1); break; } return nil; } /* * initiate announcement and sleep till its set up */ | |
| 1997/0327 | static int announced(void* a) { return ((Conv*)a)->state == Announced; } | |
| 1998/0306 | static void announcectlmsg(Proto *x, Conv *c, Cmdbuf *cb) { char *p; | |
| 1997/0327 | ||
| 1998/0306 | c->state = Announcing; c->cerr[0] = '\0'; if(x->announce == nil) error("announce not supported"); p = x->announce(c, cb->f, cb->nf); if(p != nil) error(p); sleep(&c->cr, announced, c); if(c->cerr[0] != '\0') error(c->cerr); } /* * called by protocol bide routine to set addresses */ char* Fsstdbind(Conv* c, char* argv[], int argc) { switch(argc){ default: return "bad args to bind"; case 2: setladdrport(c, argv[1], 0); break; } return nil; } static void bindctlmsg(Proto *x, Conv *c, Cmdbuf *cb) { char *p; if(x->bind == nil) p = Fsstdbind(c, cb->f, cb->nf); else p = x->bind(c, cb->f, cb->nf); if(p != nil) error(p); } static void ttlctlmsg(Conv *c, Cmdbuf *cb) { if(cb->nf < 2) c->ttl = MAXTTL; else c->ttl = atoi(cb->f[1]); } | |
| 1997/0327 | static long ipwrite(Chan* ch, char* a, long n, ulong) { Conv *c; Proto *x; | |
| 1998/0306 | char *p; Cmdbuf *cb; uchar ia[IPaddrlen]; | |
| 1997/0327 | switch(TYPE(ch->qid)){ default: error(Eperm); | |
| 1998/0306 | case Qdata: x = fs.p[PROTO(ch->qid)]; c = x->conv[CONV(ch->qid)]; if(c->wq == nil) error(Eperm); qwrite(c->wq, a, n); x->kick(c, n); break; | |
| 1997/0327 | case Qarp: | |
| 1997/0423 |
| |
| 1997/0327 |
| |
| 1998/0306 | return arpwrite(a, n); | |
| 1997/0327 | case Qiproute: | |
| 1998/0306 | return routewrite(ch, a, n); | |
| 1997/0327 | case Qlog: p = netlogctl(a, n); if(p != nil) | |
| 1997/1128/sys/src/9/ip/devip.c:638,727 – 1998/0306/sys/src/9/ip/devip.c:803,850 | ||
| 1997/0327 | case Qctl: x = fs.p[PROTO(ch->qid)]; c = x->conv[CONV(ch->qid)]; | |
| 1998/0306 | cb = parsecmd(a, n); if(canqlock(&c->car) == 0){ free(cb); error("connect/announce in progress"); | |
| 1997/0327 | } | |
| 1997/0403 |
| |
| 1997/0327 |
| |
| 1998/0306 | if(waserror()) { | |
| 1997/0327 | qunlock(&c->car); | |
| 1998/0306 | free(cb); nexterror(); | |
| 1997/0327 | } | |
| 1998/0306 | if(strcmp(cb->f[0], "connect") == 0) connectctlmsg(x, c, cb); else if(strcmp(cb->f[0], "announce") == 0) announcectlmsg(x, c, cb); else if(strcmp(cb->f[0], "bind") == 0) bindctlmsg(x, c, cb); else if(strcmp(cb->f[0], "ttl") == 0) ttlctlmsg(c, cb); else if(strcmp(cb->f[0], "addmulti") == 0){ if(cb->nf < 2) error("addmulti needs interface address"); if(!ipismulticast(c->raddr)) error("addmulti for a non multicast address"); parseip(ia, cb->f[1]); ipifcaddmulti(c, c->raddr, ia); } else if(strcmp(cb->f[0], "remmulti") == 0){ if(cb->nf < 2) error("remmulti needs interface address"); if(!ipismulticast(c->raddr)) error("remmulti for a non multicast address"); parseip(ia, cb->f[1]); ipifcremmulti(c, c->raddr, ia); } else if(x->ctl != nil) { p = x->ctl(c, cb->f, cb->nf); | |
| 1997/0327 | if(p != nil) error(p); | |
| 1998/0306 | } else error("unknown control request"); qunlock(&c->car); free(cb); poperror(); | |
| 1997/0327 | } return n; } | |
| 1997/1128/sys/src/9/ip/devip.c:782,788 – 1998/0306/sys/src/9/ip/devip.c:905,911 | ||
| 1997/0327 | * built in */ int | |
| 1998/0306 | Fsbuiltinproto(Fs* fs, uchar proto) | |
| 1997/0327 | { return fs->t2p[proto] != nil; } | |
| 1997/1128/sys/src/9/ip/devip.c:790,803 – 1998/0306/sys/src/9/ip/devip.c:913,924 | ||
| 1997/0327 | Conv* Fsprotoclone(Proto *p, char *user) { | |
| 1998/0306 | qlock(p); | |
| 1997/0327 | if(waserror()) { | |
| 1998/0306 | qunlock(p); | |
| 1997/0327 | nexterror(); } ep = &p->conv[p->nc]; | |
| 1997/1128/sys/src/9/ip/devip.c:812,818 – 1998/0306/sys/src/9/ip/devip.c:933,938 | ||
| 1997/0327 | c->x = pp - p->conv; c->ptcl = malloc(p->ptclsize); if(c->ptcl == nil) { | |
| 1997/1104 |
| |
| 1997/0327 | free(c); error(Enomem); } | |
| 1997/1128/sys/src/9/ip/devip.c:823,830 – 1998/0306/sys/src/9/ip/devip.c:943,953 | ||
| 1997/0327 | break; } if(canlock(c)){ | |
| 1998/0306 | /* * make sure both processes and protocol * are done with this Conv */ if(c->inuse == 0 && (p->inuse == nil || (*p->inuse)(c) == 0)) | |
| 1997/0327 | break; unlock(c); | |
| 1997/1128/sys/src/9/ip/devip.c:831,837 – 1998/0306/sys/src/9/ip/devip.c:954,960 | ||
| 1997/0327 | } } if(pp >= ep) { | |
| 1998/0306 | qunlock(p); | |
| 1997/0327 | poperror(); return nil; } | |
| 1997/1128/sys/src/9/ip/devip.c:840,847 – 1998/0306/sys/src/9/ip/devip.c:963,970 | ||
| 1997/0327 | strcpy(c->owner, user); c->perm = 0660; c->state = 0; | |
| 1998/0306 | ipmove(c->laddr, IPnoaddr); ipmove(c->raddr, IPnoaddr); | |
| 1997/0327 | c->lport = 0; c->rport = 0; c->restricted = 0; | |
| 1997/1128/sys/src/9/ip/devip.c:851,857 – 1998/0306/sys/src/9/ip/devip.c:974,980 | ||
| 1997/0327 | qreopen(c->eq); unlock(c); | |
| 1998/0306 | qunlock(p); | |
| 1997/0327 | poperror(); return c; } | |
| 1997/1128/sys/src/9/ip/devip.c:878,890 – 1998/0306/sys/src/9/ip/devip.c:1001,1013 | ||
| 1997/0327 | } Proto* | |
| 1998/0306 | Fsrcvpcol(Fs* fs, uchar proto) | |
| 1997/0327 | { return fs->t2p[proto]; } Conv* | |
| 1998/0306 | Fsnewcall(Fs*, Conv *c, uchar *raddr, ushort rport, uchar *laddr, ushort lport) | |
| 1997/0327 | { Conv *nc; Conv **l; | |
| 1997/1128/sys/src/9/ip/devip.c:905,913 – 1998/0306/sys/src/9/ip/devip.c:1028,1036 | ||
| 1997/0327 | unlock(c); return nil; } | |
| 1998/0306 | ipmove(nc->raddr, raddr); | |
| 1997/0327 | nc->rport = rport; | |
| 1998/0306 | ipmove(nc->laddr, laddr); | |
| 1997/0327 | nc->lport = lport; nc->next = nil; *l = nc; | |
| 1997/1128/sys/src/9/ip/devip.c:916,975 – 1998/0306/sys/src/9/ip/devip.c:1039,1042 | ||
| 1997/0327 | wakeup(&c->listenr); return nc; | |
| 1997/0916 |
| |
| 1997/0327 |
| |
| 1997/0916 |
| |
| 1997/0327 |
| |
| 1997/0916 |
| |
| 1997/0327 |
| |
| 1997/1030 |
| |
| 1997/0403 |
| |
| 1997/1030 |
| |
| 1997/0327 |
| |
| 1998/0306/sys/src/9/ip/devip.c:16,21 – 1998/0310/sys/src/9/ip/devip.c:16,22 (short | long) | ||
| 1997/0327 | Qarp= Qtopbase, Qiproute, | |
| 1998/0306 | Qiprouter, | |
| 1998/0310 | Qipselftab, | |
| 1997/0327 | Qlog, Qprotodir, /* directory for a protocol */ | |
| 1998/0306/sys/src/9/ip/devip.c:107,113 – 1998/0310/sys/src/9/ip/devip.c:108,116 | ||
| 1997/0327 | { Qid q; char *p; | |
| 1998/0310 | int prot; | |
| 1997/0327 | ||
| 1998/0310 | prot = 0666; | |
| 1997/0327 | switch(i) { default: return -1; | |
| 1998/0306/sys/src/9/ip/devip.c:119,124 – 1998/0310/sys/src/9/ip/devip.c:122,132 | ||
| 1997/0327 | p = "iproute"; q = (Qid){QID(0, 0, Qiproute), 0}; break; | |
| 1998/0310 | case Qipselftab: p = "ipselftab"; prot = 0444; q = (Qid){QID(0, 0, Qipselftab), 0}; break; | |
| 1998/0306 | case Qiprouter: p = "iprouter"; q = (Qid){QID(0, 0, Qiprouter), 0}; | |
| 1998/0306/sys/src/9/ip/devip.c:128,134 – 1998/0310/sys/src/9/ip/devip.c:136,142 | ||
| 1997/0327 | q = (Qid){QID(0, 0, Qlog), 0}; break; } | |
| 1998/0306 |
| |
| 1998/0310 | devdir(c, q, p, 0, network, prot, dp); | |
| 1997/0327 | return 1; } | |
| 1998/0306/sys/src/9/ip/devip.c:154,159 – 1998/0310/sys/src/9/ip/devip.c:162,168 | ||
| 1997/0327 | case Qlog: case Qiproute: | |
| 1998/0306 | case Qiprouter: | |
| 1998/0310 | case Qipselftab: | |
| 1997/0327 | return ip1gen(c, TYPE(c->qid), dp); case Qprotodir: if(s < fs.p[PROTO(c->qid)]->ac) { | |
| 1998/0306/sys/src/9/ip/devip.c:295,300 – 1998/0310/sys/src/9/ip/devip.c:304,310 | ||
| 1997/0327 | case Qremote: case Qlocal: | |
| 1998/0306 | case Qstats: | |
| 1998/0310 | case Qipselftab: | |
| 1997/0327 | if(omode != OREAD) error(Eperm); break; | |
| 1998/0306/sys/src/9/ip/devip.c:464,471 – 1998/0310/sys/src/9/ip/devip.c:474,481 | ||
| 1997/0327 | return arpread(a, offset, n); case Qiproute: return routeread(a, offset, n); | |
| 1998/0306 |
| |
| 1998/0310 | case Qipselftab: return ipselftabread(a, offset, n); | |
| 1997/0327 | case Qlog: return netlogread(a, offset, n); case Qctl: | |
| 1998/0310/sys/src/9/ip/devip.c:6,19 – 1998/0313/sys/src/9/ip/devip.c:6,17 (short | long) | ||
| 1997/0327 | #include "../port/error.h" #include "../ip/ip.h" | |
| 1998/0313 | Qbootp, | |
| 1997/0327 | Qiproute, | |
| 1998/0306 | Qiprouter, | |
| 1998/0310 | Qipselftab, | |
| 1998/0310/sys/src/9/ip/devip.c:33,46 – 1998/0313/sys/src/9/ip/devip.c:31,59 | ||
| 1997/0327 | Qlocal, Qremote, Qstatus, | |
| 1998/0313 | Logtype= 5, Masktype= (1<<Logtype)-1, Logconv= 12, Maskconv= (1<<Logconv)-1, Shiftconv= Logtype, Logproto= 8, Maskproto= (1<<Logproto)-1, Shiftproto= Logtype + Logconv, Nfs= 16, | |
| 1997/0327 | }; | |
| 1998/0313 | #define TYPE(x) ( (x).path & Masktype ) #define CONV(x) ( ((x).path >> Shiftconv) & Maskconv ) #define PROTO(x) ( ((x).path >> Shiftproto) & Maskproto ) #define QID(p, c, y) ( ((p)<<(Shiftproto)) | ((c)<<Shiftconv) | (y) ) | |
| 1997/0327 | static char network[] = "network"; | |
| 1998/0313 | QLock fslock; Fs *ipfs[Nfs]; /* attached fs's */ Queue *qlog; | |
| 1997/0327 | static int ip3gen(Chan *c, int i, Dir *dp) { | |
| 1998/0310/sys/src/9/ip/devip.c:48,54 – 1998/0313/sys/src/9/ip/devip.c:61,67 | ||
| 1997/0327 | Conv *cv; char *p; | |
| 1998/0313 | cv = ipfs[c->dev]->p[PROTO(c->qid)]->conv[CONV(c->qid)]; | |
| 1997/0327 | switch(i) { default: return -1; | |
| 1998/0310/sys/src/9/ip/devip.c:118,123 – 1998/0313/sys/src/9/ip/devip.c:131,140 | ||
| 1997/0327 | p = "arp"; q = (Qid){QID(0, 0, Qarp), 0}; break; | |
| 1998/0313 | case Qbootp: p = "bootp"; q = (Qid){QID(0, 0, Qbootp), 0}; break; | |
| 1997/0327 | case Qiproute: p = "iproute"; q = (Qid){QID(0, 0, Qiproute), 0}; | |
| 1998/0310/sys/src/9/ip/devip.c:146,164 – 1998/0313/sys/src/9/ip/devip.c:163,185 | ||
| 1997/0327 | Qid q; Conv *cv; char name[16]; | |
| 1998/0313 | Fs *f; | |
| 1997/0327 | ||
| 1998/0313 | f = ipfs[c->dev]; | |
| 1997/0327 | switch(TYPE(c->qid)) { case Qtopdir: | |
| 1997/0423 |
| |
| 1998/0313 | if(s < f->np) { if(f->p[s]->connect == nil) | |
| 1997/0423 | return 0; /* protocol with no user interface */ | |
| 1997/0327 | q = (Qid){QID(s, 0, Qprotodir)|CHDIR, 0}; | |
| 1998/0313 | devdir(c, q, f->p[s]->name, 0, network, CHDIR|0555, dp); | |
| 1997/0327 | return 1; } | |
| 1998/0313 | s -= f->np; | |
| 1997/0327 | return ip1gen(c, s+Qtopbase, dp); case Qarp: | |
| 1998/0313 | case Qbootp: | |
| 1997/0327 | case Qlog: case Qiproute: | |
| 1998/0306 | case Qiprouter: | |
| 1998/0310/sys/src/9/ip/devip.c:165,178 – 1998/0313/sys/src/9/ip/devip.c:186,199 | ||
| 1998/0310 | case Qipselftab: | |
| 1997/0327 | return ip1gen(c, TYPE(c->qid), dp); case Qprotodir: | |
| 1998/0313 | if(s < f->p[PROTO(c->qid)]->ac) { cv = f->p[PROTO(c->qid)]->conv[s]; | |
| 1997/0327 | sprint(name, "%d", s); q = (Qid){QID(PROTO(c->qid), s, Qconvdir)|CHDIR, 0}; devdir(c, q, name, 0, cv->owner, CHDIR|0555, dp); return 1; } | |
| 1998/0313 | s -= f->p[PROTO(c->qid)]->ac; | |
| 1997/0327 | return ip2gen(c, s+Qprotobase, dp); case Qclone: | |
| 1998/0306 | case Qstats: | |
| 1998/0310/sys/src/9/ip/devip.c:199,210 – 1998/0313/sys/src/9/ip/devip.c:220,225 | ||
| 1997/0327 | static void ipinit(void) { | |
| 1998/0310/sys/src/9/ip/devip.c:212,224 – 1998/0313/sys/src/9/ip/devip.c:227,271 | ||
| 1998/0306 | fmtinstall('M', eipconv); | |
| 1997/0327 | } | |
| 1998/0313 | static Fs* ipgetfs(int dev) { extern void (*ipprotoinit[])(Fs*); Fs *f; int i; if(dev >= Nfs) return nil; qlock(&fslock); if(ipfs[dev] == nil){ f = smalloc(sizeof(Fs)); ip_init(f); arpinit(f); netloginit(f); for(i = 0; ipprotoinit[i]; i++) ipprotoinit[i](f); ipfs[dev] = f; } qunlock(&fslock); return ipfs[dev]; } | |
| 1997/0327 | static Chan* ipattach(char* spec) { Chan *c; | |
| 1998/0313 | int dev; | |
| 1997/0327 | ||
| 1998/0313 | dev = atoi(spec); if(dev >= 16) error("bad specification"); ipgetfs(dev); | |
| 1997/0327 | c = devattach('I', spec); c->qid = (Qid){QID(0, 0, Qtopdir)|CHDIR, 0}; | |
| 1998/0313 | c->dev = dev; | |
| 1997/0327 | return c; } | |
| 1998/0310/sys/src/9/ip/devip.c:281,298 – 1998/0313/sys/src/9/ip/devip.c:328,348 | ||
| 1997/0327 | Conv *cv, *nc; Proto *p; int perm; | |
| 1998/0313 | Fs *f; | |
| 1997/0327 | omode &= 3; perm = m2p[omode]; | |
| 1998/0313 | f = ipfs[c->dev]; | |
| 1997/0327 | switch(TYPE(c->qid)) { default: break; case Qlog: | |
| 1998/0313 | netlogopen(f); | |
| 1997/0327 | break; | |
| 1998/0306 | case Qiprouter: | |
| 1998/0313 | iprouteropen(f); | |
| 1998/0306 | break; case Qiproute: memmove(c->tag, "none", sizeof(c->tag)); | |
| 1998/0310/sys/src/9/ip/devip.c:304,316 – 1998/0313/sys/src/9/ip/devip.c:354,367 | ||
| 1997/0327 | case Qremote: case Qlocal: | |
| 1998/0306 | case Qstats: | |
| 1998/0313 | case Qbootp: | |
| 1998/0310 | case Qipselftab: | |
| 1997/0327 | if(omode != OREAD) error(Eperm); break; case Qclone: | |
| 1998/0313 | p = f->p[PROTO(c->qid)]; cv = Fsprotoclone(p, commonuser()); | |
| 1997/0327 | if(cv == nil) { error(Enodev); break; | |
| 1998/0310/sys/src/9/ip/devip.c:320,326 – 1998/0313/sys/src/9/ip/devip.c:371,377 | ||
| 1997/0327 | case Qdata: case Qctl: case Qerr: | |
| 1998/0313 | p = f->p[PROTO(c->qid)]; | |
| 1998/0306 | qlock(p); | |
| 1997/0327 | cv = p->conv[CONV(c->qid)]; lock(cv); | |
| 1998/0310/sys/src/9/ip/devip.c:330,336 – 1998/0313/sys/src/9/ip/devip.c:381,387 | ||
| 1997/0327 | nexterror(); } if((perm & (cv->perm>>6)) != perm) { | |
| 1998/0313 | if(strcmp(commonuser(), cv->owner) != 0) | |
| 1997/0327 | error(Eperm); if((perm & cv->perm) != perm) error(Eperm); | |
| 1998/0310/sys/src/9/ip/devip.c:338,344 – 1998/0313/sys/src/9/ip/devip.c:389,395 | ||
| 1997/0327 | } cv->inuse++; if(cv->inuse == 1){ | |
| 1998/0313 | memmove(cv->owner, commonuser(), NAMELEN); | |
| 1997/0327 | cv->perm = 0660; } unlock(cv); | |
| 1998/0310/sys/src/9/ip/devip.c:346,352 – 1998/0313/sys/src/9/ip/devip.c:397,403 | ||
| 1997/0327 | poperror(); break; case Qlisten: | |
| 1998/0313 | cv = f->p[PROTO(c->qid)]->conv[CONV(c->qid)]; | |
| 1997/0327 | if(cv->state != Announced) error("not announced"); | |
| 1998/0310/sys/src/9/ip/devip.c:365,371 – 1998/0313/sys/src/9/ip/devip.c:416,422 | ||
| 1997/0327 | if(nc != nil){ cv->incall = nc->next; c->qid = (Qid){QID(PROTO(c->qid), nc->x, Qctl), 0}; | |
| 1998/0313 | memmove(cv->owner, commonuser(), NAMELEN); | |
| 1997/0327 | } unlock(cv); | |
| 1998/0310/sys/src/9/ip/devip.c:430,451 – 1998/0313/sys/src/9/ip/devip.c:481,505 | ||
| 1997/0327 | static void ipclose(Chan* c) { | |
| 1998/0313 | Fs *f; f = ipfs[c->dev]; | |
| 1997/0327 | switch(TYPE(c->qid)) { default: break; | |
| 1998/0306 | case Qlog: | |
| 1997/0531 | if(c->flag & COPEN) | |
| 1998/0306 |
| |
| 1998/0313 | netlogclose(f); | |
| 1997/0423 | break; | |
| 1998/0306 | case Qiprouter: if(c->flag & COPEN) | |
| 1998/0313 | iprouterclose(f); | |
| 1997/0327 | break; case Qdata: case Qctl: case Qerr: if(c->flag & COPEN) | |
| 1998/0313 | closeconv(f->p[PROTO(c->qid)]->conv[CONV(c->qid)]); | |
| 1997/0327 | } } | |
| 1998/0310/sys/src/9/ip/devip.c:461,467 – 1998/0313/sys/src/9/ip/devip.c:515,524 | ||
| 1997/0327 | Proto *x; | |
| 1998/0306 | char *buf, *p; long m, rv; | |
| 1998/0313 | Fs *f; | |
| 1997/0327 | ||
| 1998/0313 | f = ipfs[ch->dev]; | |
| 1997/0327 | p = a; switch(TYPE(ch->qid)) { default: | |
| 1998/0310/sys/src/9/ip/devip.c:471,483 – 1998/0313/sys/src/9/ip/devip.c:528,542 | ||
| 1997/0327 | case Qconvdir: return devdirread(ch, a, n, 0, 0, ipgen); case Qarp: | |
| 1998/0313 | return arpread(f->arp, a, offset, n); case Qbootp: return bootpread(a, offset, n); | |
| 1997/0327 | case Qiproute: | |
| 1998/0313 | return routeread(f, a, offset, n); | |
| 1998/0310 | case Qipselftab: | |
| 1998/0313 | return ipselftabread(f, a, offset, n); | |
| 1997/0327 | case Qlog: | |
| 1998/0313 | return netlogread(f, a, offset, n); | |
| 1997/0327 | case Qctl: | |
| 1998/0306 | buf = smalloc(16); | |
| 1997/0327 | sprint(buf, "%d", CONV(ch->qid)); | |
| 1998/0310/sys/src/9/ip/devip.c:486,492 – 1998/0313/sys/src/9/ip/devip.c:545,551 | ||
| 1998/0306 | return rv; | |
| 1997/0327 | case Qremote: | |
| 1998/0306 | buf = smalloc(Statelen); | |
| 1997/0327 |
| |
| 1998/0313 | c = f->p[PROTO(ch->qid)]->conv[CONV(ch->qid)]; | |
| 1998/0306 | sprint(buf, "%I!%d\n", c->raddr, c->rport); rv = readstr(offset, p, n, buf); free(buf); | |
| 1998/0310/sys/src/9/ip/devip.c:493,499 – 1998/0313/sys/src/9/ip/devip.c:552,558 | ||
| 1998/0306 | return rv; | |
| 1997/0327 | case Qlocal: | |
| 1998/0306 | buf = smalloc(Statelen); | |
| 1998/0313 | x = f->p[PROTO(ch->qid)]; | |
| 1998/0306 | c = x->conv[CONV(ch->qid)]; if(x->local == nil) { sprint(buf, "%I!%d\n", c->laddr, c->lport); | |
| 1998/0310/sys/src/9/ip/devip.c:505,511 – 1998/0313/sys/src/9/ip/devip.c:564,570 | ||
| 1998/0306 | return rv; | |
| 1997/0327 | case Qstatus: | |
| 1998/0306 | buf = smalloc(Statelen); | |
| 1997/0327 |
| |
| 1998/0313 | x = f->p[PROTO(ch->qid)]; | |
| 1997/0327 | c = x->conv[CONV(ch->qid)]; | |
| 1998/0306 | m = sprint(buf, "%s/%d %d ", c->p->name, c->x, c->inuse); (*x->state)(c, buf, Statelen-m-2); | |
| 1998/0310/sys/src/9/ip/devip.c:513,529 – 1998/0313/sys/src/9/ip/devip.c:572,588 | ||
| 1998/0306 | free(buf); return rv; | |
| 1997/0327 | case Qdata: | |
| 1998/0313 | c = f->p[PROTO(ch->qid)]->conv[CONV(ch->qid)]; | |
| 1997/1105 | return qread(c->rq, a, n); | |
| 1997/0327 | case Qerr: | |
| 1998/0313 | c = f->p[PROTO(ch->qid)]->conv[CONV(ch->qid)]; | |
| 1997/0327 | return qread(c->eq, a, n); | |
| 1998/0306 | case Qstats: | |
| 1998/0313 | x = f->p[PROTO(ch->qid)]; | |
| 1998/0306 | if(x->stats == nil) error("stats not implemented"); buf = smalloc(Statelen); | |
| 1998/0313 | (*x->stats)(x, buf, Statelen); | |
| 1998/0306 | rv = readstr(offset, p, n, buf); free(buf); return rv; | |
| 1998/0310/sys/src/9/ip/devip.c:542,548 – 1998/0313/sys/src/9/ip/devip.c:601,607 | ||
| 1997/0327 | static void setladdr(Conv* c) { | |
| 1998/0306 |
| |
| 1998/0313 | findlocalip(c->p->f, c->laddr, c->raddr); | |
| 1997/0327 | } | |
| 1998/0306 | /* | |
| 1998/0310/sys/src/9/ip/devip.c:787,798 – 1998/0313/sys/src/9/ip/devip.c:846,860 | ||
| 1998/0306 | char *p; Cmdbuf *cb; uchar ia[IPaddrlen]; | |
| 1998/0313 | Fs *f; | |
| 1997/0327 | ||
| 1998/0313 | f = ipfs[ch->dev]; | |
| 1997/0327 | switch(TYPE(ch->qid)){ default: error(Eperm); | |
| 1998/0306 | case Qdata: | |
| 1998/0313 | x = f->p[PROTO(ch->qid)]; | |
| 1998/0306 | c = x->conv[CONV(ch->qid)]; if(c->wq == nil) | |
| 1998/0310/sys/src/9/ip/devip.c:802,817 – 1998/0313/sys/src/9/ip/devip.c:864,879 | ||
| 1998/0306 | x->kick(c, n); break; | |
| 1997/0327 | case Qarp: | |
| 1998/0306 |
| |
| 1998/0313 | return arpwrite(f->arp, a, n); | |
| 1997/0327 | case Qiproute: | |
| 1998/0306 |
| |
| 1998/0313 | return routewrite(f, ch, a, n); | |
| 1997/0327 | case Qlog: | |
| 1998/0313 | p = netlogctl(f, a, n); | |
| 1997/0327 | if(p != nil) error(p); return n; case Qctl: | |
| 1998/0313 | x = f->p[PROTO(ch->qid)]; | |
| 1997/0327 | c = x->conv[CONV(ch->qid)]; | |
| 1998/0306 | cb = parsecmd(a, n); | |
| 1998/0310/sys/src/9/ip/devip.c:887,912 – 1998/0313/sys/src/9/ip/devip.c:949,977 | ||
| 1997/0327 | }; int | |
| 1998/0313 | Fsproto(Fs *f, Proto *p) | |
| 1997/0327 | { | |
| 1998/0313 | if(f->np >= Maxproto) | |
| 1997/0327 | return -1; | |
| 1998/0313 | p->f = f; | |
| 1997/0327 | if(p->ipproto > 0){ | |
| 1998/0313 | if(f->t2p[p->ipproto] != nil) | |
| 1997/0327 | return -1; | |
| 1998/0313 | f->t2p[p->ipproto] = p; | |
| 1997/0327 | } | |
| 1998/0313 | p->qid.path = CHDIR|QID(f->np, 0, Qprotodir); | |
| 1997/0327 | p->conv = malloc(sizeof(Conv*)*(p->nc+1)); if(p->conv == nil) panic("Fsproto"); | |
| 1998/0313 | p->x = f->np; | |
| 1997/0327 | p->nextport = 0; p->nextrport = 600; | |
| 1998/0313 | f->p[f->np++] = p; | |
| 1997/0327 | return 0; } | |
| 1998/0310/sys/src/9/ip/devip.c:915,923 – 1998/0313/sys/src/9/ip/devip.c:980,988 | ||
| 1997/0327 | * built in */ int | |
| 1998/0306 |
| |
| 1998/0313 | Fsbuiltinproto(Fs* f, uchar proto) | |
| 1997/0327 | { | |
| 1998/0313 | return f->t2p[proto] != nil; | |
| 1997/0327 | } Conv* | |
| 1998/0310/sys/src/9/ip/devip.c:990,996 – 1998/0313/sys/src/9/ip/devip.c:1055,1061 | ||
| 1997/0327 | } int | |
| 1998/0313 | Fsconnected(Conv* c, char* msg) | |
| 1997/0327 | { if(msg != nil && *msg != '\0') strncpy(c->cerr, msg, ERRLEN-1); | |
| 1998/0310/sys/src/9/ip/devip.c:1011,1023 – 1998/0313/sys/src/9/ip/devip.c:1076,1088 | ||
| 1997/0327 | } Proto* | |
| 1998/0306 |
| |
| 1998/0313 | Fsrcvpcol(Fs* f, uchar proto) | |
| 1997/0327 | { | |
| 1998/0313 | return f->t2p[proto]; | |
| 1997/0327 | } Conv* | |
| 1998/0306 |
| |
| 1998/0313 | Fsnewcall(Conv *c, uchar *raddr, ushort rport, uchar *laddr, ushort lport) | |
| 1997/0327 | { Conv *nc; Conv **l; | |
| 1998/0313/sys/src/9/ip/devip.c:509,515 – 1998/0319/sys/src/9/ip/devip.c:509,515 (short | long) | ||
|
Change dev read and write to use vlong offset.
rsc Fri Mar 4 12:44:25 2005 | ||
| 1998/0306 | }; | |
| 1997/0327 | static long | |
| 1998/0319 | ipread(Chan *ch, void *a, long n, vlong off) | |
| 1997/0327 | { Conv *c; Proto *x; | |
| 1998/0313/sys/src/9/ip/devip.c:516,521 – 1998/0319/sys/src/9/ip/devip.c:516,522 | ||
| 1998/0306 | char *buf, *p; long m, rv; | |
| 1998/0313 | Fs *f; | |
| 1998/0319 | ulong offset = off; | |
| 1997/0327 | ||
| 1998/0313 | f = ipfs[ch->dev]; | |
| 1998/0313/sys/src/9/ip/devip.c:839,845 – 1998/0319/sys/src/9/ip/devip.c:840,846 | ||
| 1998/0306 | } | |
| 1997/0327 | static long | |
| 1998/0319 | ipwrite(Chan* ch, char* a, long n, vlong) | |
| 1997/0327 | { Conv *c; Proto *x; | |
| 1998/0319/sys/src/9/ip/devip.c:467,472 – 1998/0321/sys/src/9/ip/devip.c:467,473 (short | long) | ||
|
Bug fix?: zero cv->incall on close.
rsc Fri Mar 4 12:44:25 2005 | ||
| 1997/0327 | cv->incall = nc->next; closeconv(nc); } | |
| 1998/0321 | cv->incall = nil; | |
| 1997/0327 | strcpy(cv->owner, network); cv->perm = 0660; | |
| 1998/0321/sys/src/9/ip/devip.c:1080,1086 – 1998/0324/sys/src/9/ip/devip.c:1080,1089 (short | long) | ||
|
Let Fsrcvpcol defer to f->ipmux.
rsc Fri Mar 4 12:44:25 2005 | ||
| 1997/0327 | Proto* | |
| 1998/0313 | Fsrcvpcol(Fs* f, uchar proto) | |
| 1997/0327 | { | |
| 1998/0313 |
| |
| 1998/0324 | if(f->t2m[proto] && f->ipmux) return f->ipmux; else return f->t2p[proto]; | |
| 1997/0327 | } Conv* | |
| 1998/0324/sys/src/9/ip/devip.c:1080,1086 – 1998/0327/sys/src/9/ip/devip.c:1080,1086 (short | long) | ||
|
Defer to f->ipmux even wehn f->t2m[proto] isn't there. Bug fix? XXX
rsc Fri Mar 4 12:44:25 2005 | ||
| 1997/0327 | Proto* | |
| 1998/0313 | Fsrcvpcol(Fs* f, uchar proto) | |
| 1997/0327 | { | |
| 1998/0324 |
| |
| 1998/0327 | if(f->ipmux) | |
| 1998/0324 | return f->ipmux; else return f->t2p[proto]; | |
| 1998/0327/sys/src/9/ip/devip.c:54,59 – 1998/0423/sys/src/9/ip/devip.c:54,62 (short | long) | ||
|
Call nullmediumlink and pktmediumlink so they can register with addipmedium.
rsc Fri Mar 4 12:44:25 2005 | ||
| 1998/0313 | Fs *ipfs[Nfs]; /* attached fs's */ Queue *qlog; | |
| 1998/0423 | extern void nullmediumlink(void); extern void pktmediumlink(void); | |
| 1997/0327 | static int ip3gen(Chan *c, int i, Dir *dp) { | |
| 1998/0327/sys/src/9/ip/devip.c:215,220 – 1998/0423/sys/src/9/ip/devip.c:218,225 | ||
| 1997/0327 | static void ipreset(void) { | |
| 1998/0423 | nullmediumlink(); pktmediumlink(); | |
| 1997/0327 | } static void | |
| 1998/0423/sys/src/9/ip/devip.c:852,858 – 1998/0502/sys/src/9/ip/devip.c:852,858 (short | long) | ||
|
Add optional multicast address argument to addmulti control message.
rsc Fri Mar 4 12:44:25 2005 | ||
| 1997/0327 | Proto *x; | |
| 1998/0306 | char *p; Cmdbuf *cb; | |
| 1998/0502 | uchar ia[IPaddrlen], ma[IPaddrlen]; | |
| 1998/0313 | Fs *f; | |
| 1997/0327 | ||
| 1998/0313 | f = ipfs[ch->dev]; | |
| 1998/0423/sys/src/9/ip/devip.c:904,913 – 1998/0502/sys/src/9/ip/devip.c:904,921 | ||
| 1998/0306 | else if(strcmp(cb->f[0], "addmulti") == 0){ if(cb->nf < 2) error("addmulti needs interface address"); | |
| 1998/0502 | if(cb->nf == 2){ if(!ipismulticast(c->raddr)) error("addmulti for a non multicast address"); parseip(ia, cb->f[1]); ipifcaddmulti(c, c->raddr, ia); } else { parseip(ma, cb->f[2]); if(!ipismulticast(ma)) error("addmulti for a non multicast address"); parseip(ia, cb->f[1]); ipifcaddmulti(c, ma, ia); } | |
| 1998/0306 | } else if(strcmp(cb->f[0], "remmulti") == 0){ if(cb->nf < 2) error("remmulti needs interface address"); | |
| 1998/0502/sys/src/9/ip/devip.c:1099,1104 – 1998/0509/sys/src/9/ip/devip.c:1099,1110 (short | long) | ||
|
Add Fsrcvpcolx, which is Fsrcvpcol but ignores f->ipmux.
rsc Fri Mar 4 12:44:25 2005 | ||
| 1998/0324 | return f->t2p[proto]; | |
| 1997/0327 | } | |
| 1998/0509 | Proto* Fsrcvpcolx(Fs *f, uchar proto) { return f->t2p[proto]; } | |
| 1997/0327 | Conv* | |
| 1998/0313 | Fsnewcall(Conv *c, uchar *raddr, ushort rport, uchar *laddr, ushort lport) | |
| 1997/0327 | { | |
| 1998/0509/sys/src/9/ip/devip.c:871,877 – 1998/0630/sys/src/9/ip/devip.c:871,877 (short | long) | ||
| 1998/0306 | x->kick(c, n); break; | |
| 1997/0327 | case Qarp: | |
| 1998/0313 |
| |
| 1998/0630 | return arpwrite(f, a, n); | |
| 1997/0327 | case Qiproute: | |
| 1998/0313 | return routewrite(f, ch, a, n); | |
| 1997/0327 | case Qlog: | |
| Too many diffs (26 > 25). Stopping. | ||