| plan 9 kernel history: overview | file list | diff list |
1991/1114/port/devip.c (diff list | history)
| 1991/1112/sys/src/9/port/devip.c:19,25 – 1991/1114/sys/src/9/port/devip.c:19,24 (short | long | prev | next) | ||
| 1991/1019 | Queue *Ipoutput; /* Control message stream for tcp/il */ | |
| 1991/0424 | Ipifc *ipifc; /* IP protocol interfaces for stip */ Ipconv *ipconv[Nrprotocol]; /* Connections for each protocol */ | |
| 1991/1112/sys/src/9/port/devip.c:44,79 – 1991/1114/sys/src/9/port/devip.c:43,81 | ||
| 1991/0424 | ||
| 1991/1012 | Qinfo *protocols[] = { &tcpinfo, &udpinfo, &ilinfo, 0 }; | |
| 1991/0424 | ||
| 1991/1012 |
| |
| 1991/1114 | void ipinitifc(Ipifc *ifc, Qinfo *stproto, Ipconv *cp) | |
| 1991/1012 | { | |
| 1991/0424 |
| |
| 1991/1114 | int j; | |
| 1991/0424 |
| |
| 1991/1114 | for(j = 0; j < conf.ip; j++, cp++) cp->stproto = stproto; ifc->net.name = stproto->name; ifc->net.nconv = conf.ip; ifc->net.devp = &ipinfo; ifc->net.protop = stproto; if(stproto != &udpinfo) ifc->net.listen = iplisten; ifc->net.clone = ipclonecon; ifc->net.ninfo = 3; ifc->net.info[0].name = "remote"; ifc->net.info[0].fill = ipremotefill; ifc->net.info[1].name = "local"; ifc->net.info[1].fill = iplocalfill; ifc->net.info[2].name = "status"; ifc->net.info[2].fill = ipstatusfill; } | |
| 1991/0424 |
| |
| 1991/1112 |
| |
| 1991/0424 |
| |
| 1991/1114 | int i, j; | |
| 1991/0424 | ipifc = (Ipifc *)ialloc(sizeof(Ipifc) * conf.ip, 0); | |
| 1991/1012 | for(i = 0; protocols[i]; i++) { | |
| 1991/0424 | ipconv[i] = (Ipconv *)ialloc(sizeof(Ipconv) * conf.ip, 0); | |
| 1991/1114 | ipinitifc(&ipifc[i], protocols[i], ipconv[i]); | |
| 1991/0424 | newqinfo(protocols[i]); } | |
| 1991/1112/sys/src/9/port/devip.c:82,111 – 1991/1114/sys/src/9/port/devip.c:84,89 | ||
| 1991/0424 | } void | |
| 1991/1112/sys/src/9/port/devip.c:137,225 – 1991/1114/sys/src/9/port/devip.c:115,136 | ||
| 1991/0424 | int ipwalk(Chan *c, char *name) { | |
| 1991/1114 | return netwalk(c, name, &ipifc[c->dev].net); | |
| 1991/0424 | } void ipstat(Chan *c, char *db) { | |
| 1991/1114 | netstat(c, db, &ipifc[c->dev].net); | |
| 1991/0424 | } Chan * ipopen(Chan *c, int omode) { | |
| 1991/1029 |
| |
| 1991/0424 |
| |
| 1991/1024 |
| |
| 1991/0424 |
| |
| 1991/1029 | ||
| 1991/0424 |
| |
| 1991/1014 |
| |
| 1991/0424 |
| |
| 1991/1029 | ||
| 1991/0424 |
| |
| 1991/1014 |
| |
| 1991/0424 |
| |
| 1991/1029 | ||
| 1991/0424 |
| |
| 1991/1114 | return netopen(c, omode, &ipifc[c->dev].net); | |
| 1991/0424 | } | |
| 1991/1114 | int | |
| 1991/0424 | ipclonecon(Chan *c) { | |
| 1991/1108 | Ipconv *new, *base; | |
| 1991/1112/sys/src/9/port/devip.c:228,241 – 1991/1114/sys/src/9/port/devip.c:139,145 | ||
| 1991/1108 | new = ipincoming(base); if(new == 0) error(Enodev); | |
| 1991/1023 | ||
| 1991/1108 |
| |
| 1991/1023 | ||
| 1991/1108 |
| |
| 1991/1114 | return new - base; | |
| 1991/1023 | } Ipconv * | |
| 1991/1112/sys/src/9/port/devip.c:252,258 – 1991/1114/sys/src/9/port/devip.c:156,162 | ||
| 1991/0424 | qunlock(new); continue; } | |
| 1991/1114 | new->ref = 1; | |
| 1991/0424 | qunlock(new); return new; } | |
| 1991/1112/sys/src/9/port/devip.c:281,287 – 1991/1114/sys/src/9/port/devip.c:185,191 | ||
| 1991/0424 | void ipclose(Chan *c) { | |
| 1991/1114 | if(c->stream) | |
| 1991/0424 | streamclose(c); } | |
| 1991/1112/sys/src/9/port/devip.c:288,329 – 1991/1114/sys/src/9/port/devip.c:192,198 | ||
| 1991/0424 | long ipread(Chan *c, void *a, long n, ulong offset) { | |
| 1991/1015 |
| |
| 1991/0424 |
| |
| 1991/1015 |
| |
| 1991/0424 |
| |
| 1991/1015 |
| |
| 1991/0424 |
| |
| 1991/0516 |
| |
| 1991/1114 | return netread(c, a, n, offset, &ipifc[c->dev].net); | |
| 1991/0424 | } long | |
| 1991/1112/sys/src/9/port/devip.c:382,387 – 1991/1114/sys/src/9/port/devip.c:251,261 | ||
| 1991/1024 | cp->psrc = nextport(ipconv[c->dev], base); qunlock(&ipalloc); | |
| 1991/0424 | ||
| 1991/1114 | if(cp->stproto == &tcpinfo) tcpstart(cp, TCP_ACTIVE, Streamhi, 0); else if(cp->stproto == &ilinfo) ilstart(cp, IL_ACTIVE, 10); | |
| 1991/1024 | } | |
| 1991/1104 | else if(strcmp(field[0], "announce") == 0) { | |
| 1991/1024 | if((cp->stproto == &tcpinfo && cp->tcpctl.state != CLOSED) || | |
| 1991/1112/sys/src/9/port/devip.c:400,405 – 1991/1114/sys/src/9/port/devip.c:274,287 | ||
| 1991/1024 | } cp->psrc = port; qunlock(&ipalloc); | |
| 1991/1114 | if(cp->stproto == &tcpinfo) tcpstart(cp, TCP_PASSIVE, Streamhi, 0); else if(cp->stproto == &ilinfo) ilstart(cp, IL_PASSIVE, 10); if(cp->backlog == 0) cp->backlog = 3; | |
| 1991/0424 | } | |
| 1991/1024 | else if(strcmp(field[0], "backlog") == 0) { if(m != 2) | |
| 1991/1112/sys/src/9/port/devip.c:544,556 – 1991/1114/sys/src/9/port/devip.c:426,435 | ||
| 1991/0424 | ipc = (Ipconv *)(q->ptr); | |
| 1991/1104 |
| |
| 1991/0424 |
| |
| 1991/1104 |
| |
| 1991/0424 |
| |
| 1991/1114 | ipc->psrc = 0; ipc->pdst = 0; ipc->dst = 0; ipc->ref = 0; | |
| 1991/0424 | closeipifc(ipc->ipinterface); } | |
| 1991/1112/sys/src/9/port/devip.c:564,572 – 1991/1114/sys/src/9/port/devip.c:443,449 | ||
| 1991/0424 | ipc->ipinterface = newipifc(IP_UDPPROTO, udprcvmsg, ipconv[s->dev], 1500, 512, ETHER_HDR, "UDP"); | |
| 1991/1114 | ipc->ref = 1; | |
| 1991/0424 | ipc->readq = RD(q); RD(q)->ptr = (void *)ipc; WR(q)->next->ptr = (void *)ipc->ipinterface; | |
| 1991/1112/sys/src/9/port/devip.c:649,657 – 1991/1114/sys/src/9/port/devip.c:526,532 | ||
| 1991/0424 | ipc->ipinterface = newipifc(IP_TCPPROTO, tcp_input, ipconv[s->dev], 1500, 512, ETHER_HDR, "TCP"); | |
| 1991/1114 | ipc->ref = 1; | |
| 1991/0424 | ipc->readq = RD(q); ipc->readq->rp = &tcpflowr; | |
| 1991/1112/sys/src/9/port/devip.c:661,666 – 1991/1114/sys/src/9/port/devip.c:536,580 | ||
| 1991/0424 | WR(q)->ptr = (void *)ipc; } | |
| 1991/1114 | void ipremotefill(Chan *c, char *buf, int len) { int connection; Ipconv *cp; connection = STREAMID(c->qid.path); cp = &ipconv[c->dev][connection]; sprint(buf, "%d.%d.%d.%d %d\n", fmtaddr(cp->dst), cp->pdst); } void iplocalfill(Chan *c, char *buf, int len) { int connection; Ipconv *cp; connection = STREAMID(c->qid.path); cp = &ipconv[c->dev][connection]; sprint(buf, "%d.%d.%d.%d %d\n", fmtaddr(Myip), cp->psrc); } void ipstatusfill(Chan *c, char *buf, int len) { int connection; Ipconv *cp; connection = STREAMID(c->qid.path); cp = &ipconv[c->dev][connection]; if(cp->stproto == &tcpinfo) sprint(buf, "tcp/%d %d %s %s\n", connection, cp->ref, tcpstate[cp->tcpctl.state], cp->tcpctl.flags & CLONE ? "listen" : "connect"); else if(cp->stproto == &ilinfo) sprint(buf, "il/%d %d %s\n", connection, cp->ref, ilstate[cp->ilctl.state]); else sprint(buf, "%s/%d %d\n", cp->stproto->name, connection, cp->ref); } | |
| 1991/0424 | int | |
| 1991/1023 | iphavecon(Ipconv *s) | |
| 1991/0424 | { | |
| 1991/1112/sys/src/9/port/devip.c:667,677 – 1991/1114/sys/src/9/port/devip.c:581,602 | ||
| 1991/0424 | return s->curlog; } | |
| 1991/1114 | int iplisten(Chan *c) | |
| 1991/0424 | { Ipconv *etab, *new; | |
| 1991/1114 | Ipconv *s, *base; int connection; Ipconv *cp; | |
| 1991/0424 | ||
| 1991/1114 | connection = STREAMID(c->qid.path); s = &ipconv[c->dev][connection]; base = ipconv[c->dev]; if((s->stproto == &tcpinfo && s->tcpctl.state != LISTEN) || (s->stproto == &ilinfo && s->ilctl.state != Illistening)) errors("not announced"); | |
| 1991/0424 | qlock(&s->listenq); | |
| 1991/1025 | if(waserror()) { qunlock(&s->listenq); | |
| 1991/1112/sys/src/9/port/devip.c:684,704 – 1991/1114/sys/src/9/port/devip.c:609,618 | ||
| 1991/1023 | new = base; for(etab = &base[conf.ip]; new < etab; new++) { if(new->newcon) { | |
| 1991/0424 |
| |
| 1991/1023 | ||
| 1991/0424 |
| |
| 1991/1023 | new->newcon = 0; | |
| 1991/0424 |
| |
| 1991/1029 | ||
| 1991/0424 |
| |
| 1991/1114 | return new - base; | |
| 1991/0424 | } } } | |
| 1991/1112/sys/src/9/port/devip.c:713,721 – 1991/1114/sys/src/9/port/devip.c:627,633 | ||
| 1991/0424 | s = (Ipconv *)(q->ptr); tcb = &s->tcpctl; | |
| 1991/1114 | s->ref = 0; | |
| 1991/0424 | /* Not interested in data anymore */ s->readq = 0; | |