| plan 9 kernel history: overview | file list | diff list |
1997/0904/ip/udp.c (diff list | history)
| 1997/0327/sys/src/9/ip/udp.c:80,89 – 1997/0403/sys/src/9/ip/udp.c:80,91 (short | long) | ||
| 1997/0327 | return 1; } | |
| 1997/0403 | static char* udpannounce(Conv *c, char**, int) | |
| 1997/0327 | { Fsconnected(&fs, c, nil); | |
| 1997/0403 | return nil; | |
| 1997/0327 | } static void | |
| 1997/0403/sys/src/9/ip/udp.c:81,88 – 1997/0411/sys/src/9/ip/udp.c:81,93 (short | long) | ||
| 1997/0327 | } | |
| 1997/0403 | static char* | |
| 1997/0411 | udpannounce(Conv *c, char** argv, int argc) | |
| 1997/0327 | { | |
| 1997/0411 | char *e; e = Fsstdannounce(c, argv, argc); if(e != nil) return e; | |
| 1997/0327 | Fsconnected(&fs, c, nil); | |
| 1997/0403 | return nil; | |
| 1997/0411/sys/src/9/ip/udp.c:200,206 – 1997/0423/sys/src/9/ip/udp.c:200,206 (short | long) | ||
| 1997/0327 | } void | |
| 1997/0423 | udpiput(Media *m, Block *bp) | |
| 1997/0327 | { int len; Udphdr *uh; | |
| 1997/0411/sys/src/9/ip/udp.c:209,214 – 1997/0423/sys/src/9/ip/udp.c:209,215 | ||
| 1997/0327 | Udpcb *ucb; ushort dport, sport; | |
| 1997/0423 | USED(m); | |
| 1997/0327 | uh = (Udphdr*)(bp->rp); /* Put back pseudo header for checksum */ | |
| 1997/0423/sys/src/9/ip/udp.c:15,22 – 1997/0530/sys/src/9/ip/udp.c:15,21 (short | long) | ||
| 1997/0327 | UDP_HDRSIZE = 20, UDP_IPHDR = 8, IP_UDPPROTO = 17, | |
| 1997/0530 | UDP_USEAD = 12, | |
| 1997/0327 | Udprxms = 200, Udptickms = 100, | |
| 1997/0423/sys/src/9/ip/udp.c:123,130 – 1997/0530/sys/src/9/ip/udp.c:122,129 | ||
| 1997/0327 | udpkick(Conv *c, int l) { Udphdr *uh; | |
| 1997/0530 | ushort rport; Ipaddr laddr, raddr; | |
| 1997/0327 | Block *bp, *f; Udpcb *ucb; int dlen, ptcllen; | |
| 1997/0423/sys/src/9/ip/udp.c:143,155 – 1997/0530/sys/src/9/ip/udp.c:142,161 | ||
| 1997/0327 | freeblist(bp); return; } | |
| 1997/0530 | raddr = nhgetl(bp->rp); | |
| 1997/0327 | bp->rp += 4; | |
| 1997/0530 | laddr = nhgetl(bp->rp); if(laddr != 0 && Mediaforme(bp->rp) <= 0) laddr = 0; bp->rp += 4; rport = nhgets(bp->rp); | |
| 1997/0327 | bp->rp += 2; | |
| 1997/0530 | /* ignore local port number */ bp->rp += 2; | |
| 1997/0327 | } else { | |
| 1997/0530 | raddr = 0; rport = 0; laddr = 0; | |
| 1997/0327 | } /* Round packet up to even number of bytes */ | |
| 1997/0423/sys/src/9/ip/udp.c:179,189 – 1997/0530/sys/src/9/ip/udp.c:185,196 | ||
| 1997/0327 | uh->frag[1] = 0; hnputs(uh->udpplen, ptcllen); if(ucb->headers) { | |
| 1997/0530 | hnputl(uh->udpdst, raddr); hnputs(uh->udpdport, rport); if(laddr) hnputl(uh->udpsrc, laddr); else hnputl(uh->udpsrc, Mediagetsrc(uh->udpdst)); | |
| 1997/0327 | } else { hnputl(uh->udpdst, c->raddr); hnputs(uh->udpdport, c->rport); | |
| 1997/0423/sys/src/9/ip/udp.c:204,213 – 1997/0530/sys/src/9/ip/udp.c:211,220 | ||
| 1997/0327 | { int len; Udphdr *uh; | |
| 1997/0530 | Ipaddr raddr, laddr; ushort rport, lport; | |
| 1997/0327 | ||
| 1997/0423 | USED(m); | |
| 1997/0327 | uh = (Udphdr*)(bp->rp); | |
| 1997/0423/sys/src/9/ip/udp.c:217,223 – 1997/0530/sys/src/9/ip/udp.c:224,231 | ||
| 1997/0327 | len = nhgets(uh->udplen); hnputs(uh->udpplen, len); | |
| 1997/0530 | raddr = nhgetl(uh->udpsrc); laddr = nhgetl(uh->udpdst); | |
| 1997/0327 | if(udpsum && nhgets(uh->udpcksum)) { if(ptclcsum(bp, UDP_IPHDR, len+UDP_PHDRSIZE)) { | |
| 1997/0423/sys/src/9/ip/udp.c:228,235 – 1997/0530/sys/src/9/ip/udp.c:236,243 | ||
| 1997/0327 | } } | |
| 1997/0530 | lport = nhgets(uh->udpdport); rport = nhgets(uh->udpsport); | |
| 1997/0327 | /* Look for a conversation structure for this port */ c = nil; | |
| 1997/0423/sys/src/9/ip/udp.c:237,243 – 1997/0530/sys/src/9/ip/udp.c:245,251 | ||
| 1997/0327 | c = *p; if(c->inuse == 0) continue; | |
| 1997/0530 | if(c->lport == lport && (c->rport == 0 || c->rport == rport)) | |
| 1997/0327 | break; } | |
| 1997/0423/sys/src/9/ip/udp.c:261,274 – 1997/0530/sys/src/9/ip/udp.c:269,284 | ||
| 1997/0327 | if(ucb->headers) { /* pass the src address */ bp = padblock(bp, UDP_USEAD); | |
| 1997/0530 | hnputl(bp->rp, raddr); hnputl(bp->rp+4, laddr); hnputs(bp->rp+8, rport); hnputs(bp->rp+10, lport); | |
| 1997/0327 | } else { /* connection oriented udp */ if(c->raddr == 0){ /* save the src address in the conversation */ | |
| 1997/0530 | c->raddr = raddr; c->rport = rport; | |
| 1997/0327 | /* reply with the same ip address (if not broadcast) */ if(Mediaforme(uh->udpdst) > 0) | |
| 1997/0530/sys/src/9/ip/udp.c:270,276 – 1997/0708/sys/src/9/ip/udp.c:270,279 (short | long) | ||
| 1997/0327 | /* pass the src address */ bp = padblock(bp, UDP_USEAD); | |
| 1997/0530 | hnputl(bp->rp, raddr); | |
| 1997/0708 | if(Mediaforme(uh->udpdst) > 0) hnputl(bp->rp+4, laddr); else hnputl(bp->rp+4, m->myip[0]); | |
| 1997/0530 | hnputs(bp->rp+8, rport); hnputs(bp->rp+10, lport); | |
| 1997/0327 | } else { | |
| 1997/0530/sys/src/9/ip/udp.c:282,288 – 1997/0708/sys/src/9/ip/udp.c:285,293 | ||
| 1997/0327 | /* reply with the same ip address (if not broadcast) */ if(Mediaforme(uh->udpdst) > 0) | |
| 1997/0708 | c->laddr = laddr; else c->laddr = m->myip[0]; | |
| 1997/0327 | } } if(bp->next) | |
| 1997/0708/sys/src/9/ip/udp.c:226,231 – 1997/0725/sys/src/9/ip/udp.c:226,233 (short | long) | ||
| 1997/0327 | ||
| 1997/0530 | raddr = nhgetl(uh->udpsrc); laddr = nhgetl(uh->udpdst); | |
| 1997/0725 | lport = nhgets(uh->udpdport); rport = nhgets(uh->udpsport); | |
| 1997/0327 | if(udpsum && nhgets(uh->udpcksum)) { if(ptclcsum(bp, UDP_IPHDR, len+UDP_PHDRSIZE)) { | |
| 1997/0708/sys/src/9/ip/udp.c:236,244 – 1997/0725/sys/src/9/ip/udp.c:238,243 | ||
| 1997/0327 | } } | |
| 1997/0530 |
| |
| 1997/0327 |
| |
| 1997/0708/sys/src/9/ip/udp.c:250,255 – 1997/0725/sys/src/9/ip/udp.c:249,256 | ||
| 1997/0327 | } if(*p == nil) { | |
| 1997/0725 | netlog(Logudp, "udp: no conv %I.%d -> %I.%d\n", uh->udpsrc, rport, uh->udpdst, lport); | |
| 1997/0327 | freeblist(bp); return; } | |
| 1997/0708/sys/src/9/ip/udp.c:260,265 – 1997/0725/sys/src/9/ip/udp.c:261,268 | ||
| 1997/0327 | len -= (UDP_HDRSIZE-UDP_PHDRSIZE); bp = trimblock(bp, UDP_IPHDR+UDP_HDRSIZE, len); if(bp == nil){ | |
| 1997/0725 | netlog(Logudp, "udp: len err %I.%d -> %I.%d\n", uh->udpsrc, rport, uh->udpdst, lport); | |
| 1997/0327 | udp.lenerr++; return; } | |
| 1997/0708/sys/src/9/ip/udp.c:293,301 – 1997/0725/sys/src/9/ip/udp.c:296,306 | ||
| 1997/0327 | if(bp->next) bp = concatblock(bp); | |
| 1997/0725 | if(qfull(c->rq)){ netlog(Logudp, "udp: qfull %I.%d -> %I.%d\n", uh->udpsrc, rport, uh->udpdst, lport); | |
| 1997/0327 | freeblist(bp); | |
| 1997/0725 | }else | |
| 1997/0327 | qpass(c->rq, bp); } | |
| 1997/0725/sys/src/9/ip/udp.c:95,102 – 1997/0806/sys/src/9/ip/udp.c:95,102 (short | long) | ||
| 1997/0327 | static void udpcreate(Conv *c) { | |
| 1997/0806 | c->rq = qopen(64*1024, 1, 0, 0); c->wq = qopen(64*1024, 0, 0, 0); | |
| 1997/0327 | } static void | |
| 1997/0725/sys/src/9/ip/udp.c:124,130 – 1997/0806/sys/src/9/ip/udp.c:124,130 | ||
| 1997/0327 | Udphdr *uh; | |
| 1997/0530 | ushort rport; Ipaddr laddr, raddr; | |
| 1997/0327 |
| |
| 1997/0806 | Block *bp; | |
| 1997/0327 | Udpcb *ucb; int dlen, ptcllen; | |
| 1997/0725/sys/src/9/ip/udp.c:158,175 – 1997/0806/sys/src/9/ip/udp.c:158,164 | ||
| 1997/0530 | laddr = 0; | |
| 1997/0327 | } | |
| 1997/0725/sys/src/9/ip/udp.c:266,271 – 1997/0806/sys/src/9/ip/udp.c:255,263 | ||
| 1997/0327 | udp.lenerr++; return; } | |
| 1997/0806 | netlog(Logudpmsg, "udp: %I.%d -> %I.%d l %d\n", uh->udpsrc, rport, uh->udpdst, lport, len); | |
| 1997/0327 | ucb = (Udpcb*)c->ptcl; | |
| 1997/0806/sys/src/9/ip/udp.c:204,209 – 1997/0815/sys/src/9/ip/udp.c:204,211 (short | long) | ||
| 1997/0327 | Udpcb *ucb; | |
| 1997/0530 | Ipaddr raddr, laddr; ushort rport, lport; | |
| 1997/0815 | uchar dst[IPaddrlen]; uchar src[IPaddrlen]; | |
| 1997/0327 | ||
| 1997/0423 | USED(m); | |
| 1997/0327 | uh = (Udphdr*)(bp->rp); | |
| 1997/0806/sys/src/9/ip/udp.c:217,227 – 1997/0815/sys/src/9/ip/udp.c:219,231 | ||
| 1997/0530 | laddr = nhgetl(uh->udpdst); | |
| 1997/0725 | lport = nhgets(uh->udpdport); rport = nhgets(uh->udpsport); | |
| 1997/0815 | memmove(src, uh->udpsrc, IPaddrlen); memmove(dst, uh->udpdst, IPaddrlen); | |
| 1997/0327 | if(udpsum && nhgets(uh->udpcksum)) { if(ptclcsum(bp, UDP_IPHDR, len+UDP_PHDRSIZE)) { udp.csumerr++; | |
| 1997/0815 | netlog(Logudp, "udp: checksum error %I\n", src); | |
| 1997/0327 | freeblist(bp); return; } | |
| 1997/0806/sys/src/9/ip/udp.c:238,245 – 1997/0815/sys/src/9/ip/udp.c:242,249 | ||
| 1997/0327 | } if(*p == nil) { | |
| 1997/0725 |
| |
| 1997/0815 | netlog(Logudp, "udp: no conv %I.%d -> %I.%d\n", src, rport, dst, lport); | |
| 1997/0327 | freeblist(bp); return; } | |
| 1997/0806/sys/src/9/ip/udp.c:250,263 – 1997/0815/sys/src/9/ip/udp.c:254,267 | ||
| 1997/0327 | len -= (UDP_HDRSIZE-UDP_PHDRSIZE); bp = trimblock(bp, UDP_IPHDR+UDP_HDRSIZE, len); if(bp == nil){ | |
| 1997/0725 |
| |
| 1997/0815 | netlog(Logudp, "udp: len err %I.%d -> %I.%d\n", src, rport, dst, lport); | |
| 1997/0327 | udp.lenerr++; return; } | |
| 1997/0806 |
| |
| 1997/0815 | netlog(Logudpmsg, "udp: %I.%d -> %I.%d l %d\n", src, rport, dst, lport, len); | |
| 1997/0327 | ucb = (Udpcb*)c->ptcl; | |
| 1997/0806/sys/src/9/ip/udp.c:265,271 – 1997/0815/sys/src/9/ip/udp.c:269,275 | ||
| 1997/0327 | /* pass the src address */ bp = padblock(bp, UDP_USEAD); | |
| 1997/0530 | hnputl(bp->rp, raddr); | |
| 1997/0708 |
| |
| 1997/0815 | if(Mediaforme(dst) > 0) | |
| 1997/0708 | hnputl(bp->rp+4, laddr); else hnputl(bp->rp+4, m->myip[0]); | |
| 1997/0806/sys/src/9/ip/udp.c:279,285 – 1997/0815/sys/src/9/ip/udp.c:283,289 | ||
| 1997/0530 | c->rport = rport; | |
| 1997/0327 | /* reply with the same ip address (if not broadcast) */ | |
| 1997/0815 | if(Mediaforme(dst) > 0) | |
| 1997/0708 | c->laddr = laddr; else c->laddr = m->myip[0]; | |
| 1997/0806/sys/src/9/ip/udp.c:289,296 – 1997/0815/sys/src/9/ip/udp.c:293,300 | ||
| 1997/0327 | bp = concatblock(bp); | |
| 1997/0725 | if(qfull(c->rq)){ | |
| 1997/0815 | netlog(Logudp, "udp: qfull %I.%d -> %I.%d\n", src, rport, dst, lport); | |
| 1997/0327 | freeblist(bp); | |
| 1997/0725 | }else | |
| 1997/0327 | qpass(c->rq, bp); | |
| 1997/0815/sys/src/9/ip/udp.c:318,323 – 1997/0829/sys/src/9/ip/udp.c:318,351 (short | long) | ||
| 1997/0327 | } void | |
| 1997/0829 | udpadvise(Block *bp, char *msg) { Udphdr *h; Ipaddr source, dest; ushort psource, pdest; Conv *s, **p; h = (Udphdr*)(bp->rp); dest = nhgetl(h->udpdst); source = nhgetl(h->udpsrc); psource = nhgets(h->udpsport); pdest = nhgets(h->udpdport); /* Look for a connection */ for(p = udp.conv; *p; p++) { s = *p; if(s->rport == pdest && s->lport == psource) if(s->raddr == dest && s->laddr == source){ qhangup(s->rq, msg); qhangup(s->wq, msg); break; } } freeblist(bp); } void | |
| 1997/0327 | udpinit(Fs *fs) { udp.name = "udp"; | |
| 1997/0815/sys/src/9/ip/udp.c:329,334 – 1997/0829/sys/src/9/ip/udp.c:357,363 | ||
| 1997/0327 | udp.create = udpcreate; udp.close = udpclose; udp.rcv = udpiput; | |
| 1997/0829 | udp.advise = udpadvise; | |
| 1997/0327 | udp.ipproto = IP_UDPPROTO; udp.nc = 16; udp.ptclsize = sizeof(Udpcb); | |
| 1997/0829/sys/src/9/ip/udp.c:271,278 – 1997/0901/sys/src/9/ip/udp.c:271,282 (short | long) | ||
| 1997/0530 | hnputl(bp->rp, raddr); | |
| 1997/0815 | if(Mediaforme(dst) > 0) | |
| 1997/0708 | hnputl(bp->rp+4, laddr); | |
| 1997/0901 | else if(m != 0) | |
| 1997/0708 | hnputl(bp->rp+4, m->myip[0]); | |
| 1997/0901 | else if(media != 0) hnputl(bp->rp+4, media->myip[0]); else hnputl(bp->rp+4, laddr); | |
| 1997/0530 | hnputs(bp->rp+8, rport); hnputs(bp->rp+10, lport); | |
| 1997/0327 | } else { | |
| 1997/0901/sys/src/9/ip/udp.c:244,249 – 1997/0903/sys/src/9/ip/udp.c:244,250 (short | long) | ||
| 1997/0327 | if(*p == nil) { | |
| 1997/0815 | netlog(Logudp, "udp: no conv %I.%d -> %I.%d\n", src, rport, dst, lport); | |
| 1997/0903 | icmpnoconv(bp); | |
| 1997/0327 | freeblist(bp); return; } | |
| 1997/0903/sys/src/9/ip/udp.c:198,204 – 1997/0904/sys/src/9/ip/udp.c:198,204 (short | long) | ||
| 1997/0327 | void | |
| 1997/0423 | udpiput(Media *m, Block *bp) | |
| 1997/0327 | { | |
| 1997/0904 | int len, olen, ottl; | |
| 1997/0327 | Udphdr *uh; Conv *c, **p; Udpcb *ucb; | |
| 1997/0903/sys/src/9/ip/udp.c:210,218 – 1997/0904/sys/src/9/ip/udp.c:210,220 | ||
| 1997/0423 | USED(m); | |
| 1997/0327 | uh = (Udphdr*)(bp->rp); | |
| 1997/0904 | /* Put back pseudo header for checksum (remember old values for icmpnoconv()) */ ottl = uh->Unused; | |
| 1997/0327 | uh->Unused = 0; len = nhgets(uh->udplen); | |
| 1997/0904 | olen = nhgets(uh->udpplen); | |
| 1997/0327 | hnputs(uh->udpplen, len); | |
| 1997/0530 | raddr = nhgetl(uh->udpsrc); | |
| 1997/0903/sys/src/9/ip/udp.c:244,250 – 1997/0904/sys/src/9/ip/udp.c:246,257 | ||
| 1997/0327 | if(*p == nil) { | |
| 1997/0815 | netlog(Logudp, "udp: no conv %I.%d -> %I.%d\n", src, rport, dst, lport); | |
| 1997/0903 |
| |
| 1997/0904 | /* don't complain about broadcasts... */ if(Mediaforme(dst) > 0){ uh->Unused = ottl; hnputs(uh->udpplen, olen); icmpnoconv(bp); } | |
| 1997/0327 | freeblist(bp); return; } | |
| 1997/0904/sys/src/9/ip/udp.c:15,21 – 1998/0306/sys/src/9/ip/udp.c:15,21 (short | long) | ||
| 1997/0327 | UDP_HDRSIZE = 20, UDP_IPHDR = 8, IP_UDPPROTO = 17, | |
| 1997/0530 |
| |
| 1998/0306 | UDP_USEAD = 36, | |
| 1997/0327 | Udprxms = 200, Udptickms = 100, | |
| 1997/0904/sys/src/9/ip/udp.c:26,47 – 1998/0306/sys/src/9/ip/udp.c:26,47 | ||
| 1997/0327 | struct Udphdr { /* ip header */ | |
| 1998/0306 | uchar vihl; /* Version and header length */ uchar tos; /* Type of service */ uchar length[2]; /* packet length */ uchar id[2]; /* Identification */ uchar frag[2]; /* Fragment information */ uchar Unused; uchar udpproto; /* Protocol */ uchar udpplen[2]; /* Header plus data length */ uchar udpsrc[4]; /* Ip source */ uchar udpdst[4]; /* Ip destination */ | |
| 1997/0327 | /* udp header */ | |
| 1998/0306 | uchar udpsport[2]; /* Source port */ uchar udpdport[2]; /* Destination port */ uchar udplen[2]; /* data length */ uchar udpcksum[2]; /* Checksum */ | |
| 1997/0327 | }; /* | |
| 1997/0904/sys/src/9/ip/udp.c:51,57 – 1998/0306/sys/src/9/ip/udp.c:51,57 | ||
| 1997/0327 | struct Udpcb { QLock; | |
| 1998/0306 | uchar headers; | |
| 1997/0327 | }; Proto udp; | |
| 1997/0904/sys/src/9/ip/udp.c:71,82 – 1998/0306/sys/src/9/ip/udp.c:71,81 | ||
| 1997/0327 | return e; } | |
| 1998/0306 | static int udpstate(Conv *c, char *state, int n) | |
| 1997/0327 | { USED(c); | |
| 1998/0306 | return snprint(state, n, "%s", "Datagram"); | |
| 1997/0327 | } | |
| 1997/0403 | static char* | |
| 1997/0904/sys/src/9/ip/udp.c:107,114 – 1998/0306/sys/src/9/ip/udp.c:106,113 | ||
| 1997/0327 | qclose(c->rq); qclose(c->wq); qclose(c->eq); | |
| 1998/0306 | ipmove(c->laddr, IPnoaddr); ipmove(c->raddr, IPnoaddr); | |
| 1997/0327 | c->lport = 0; c->rport = 0; | |
| 1997/0904/sys/src/9/ip/udp.c:119,135 – 1998/0306/sys/src/9/ip/udp.c:118,133 | ||
| 1997/0327 | } void | |
| 1998/0306 | udpkick(Conv *c, int) | |
| 1997/0327 | { Udphdr *uh; | |
| 1997/0530 | ushort rport; | |
| 1998/0306 | uchar laddr[IPaddrlen], raddr[IPaddrlen]; | |
| 1997/0806 | Block *bp; | |
| 1997/0327 | Udpcb *ucb; int dlen, ptcllen; | |
| 1998/0306 | netlog(Logudp, "udp: kick\n"); | |
| 1997/0327 | bp = qget(c->wq); if(bp == nil) return; | |
| 1997/0904/sys/src/9/ip/udp.c:138,161 – 1998/0306/sys/src/9/ip/udp.c:136,155 | ||
| 1997/0327 | if(ucb->headers) { /* get user specified addresses */ bp = pullupblock(bp, UDP_USEAD); | |
| 1998/0306 | if(bp == nil) | |
| 1997/0327 | return; | |
| 1997/0530 |
| |
| 1997/0327 |
| |
| 1997/0530 |
| |
| 1998/0306 | ipmove(raddr, bp->rp); bp->rp += IPaddrlen; ipmove(laddr, bp->rp); bp->rp += IPaddrlen; if(ipforme(laddr) != Runi) findlocalip(laddr, raddr); /* pick interface closest to dest */ | |
| 1997/0530 | rport = nhgets(bp->rp); | |
| 1997/0327 | bp->rp += 2; | |
| 1997/0530 | /* ignore local port number */ bp->rp += 2; | |
| 1997/0327 | } else { | |
| 1997/0530 |
| |
| 1997/0327 | } dlen = blocklen(bp); | |
| 1997/0904/sys/src/9/ip/udp.c:174,189 – 1998/0306/sys/src/9/ip/udp.c:168,182 | ||
| 1997/0327 | uh->frag[1] = 0; hnputs(uh->udpplen, ptcllen); if(ucb->headers) { | |
| 1997/0530 |
| |
| 1998/0306 | v6tov4(uh->udpdst, raddr); | |
| 1997/0530 | hnputs(uh->udpdport, rport); | |
| 1998/0306 | v6tov4(uh->udpsrc, laddr); | |
| 1997/0327 | } else { | |
| 1998/0306 | v6tov4(uh->udpdst, c->raddr); | |
| 1997/0327 | hnputs(uh->udpdport, c->rport); | |
| 1998/0306 | if(ipcmp(c->laddr, IPnoaddr) == 0) findlocalip(c->laddr, c->raddr); /* pick interface closest to dest */ v6tov4(uh->udpsrc, c->laddr); | |
| 1997/0327 | } hnputs(uh->udpsport, c->lport); hnputs(uh->udplen, ptcllen); | |
| 1997/0904/sys/src/9/ip/udp.c:196,213 – 1998/0306/sys/src/9/ip/udp.c:189,203 | ||
| 1997/0327 | } void | |
| 1997/0423 |
| |
| 1998/0306 | udpiput(uchar *ia, Block *bp) | |
| 1997/0327 | { | |
| 1997/0904 | int len, olen, ottl; | |
| 1997/0327 | Udphdr *uh; Conv *c, **p; Udpcb *ucb; | |
| 1997/0530 |
| |
| 1998/0306 | uchar raddr[IPaddrlen], laddr[IPaddrlen]; | |
| 1997/0530 | ushort rport, lport; | |
| 1997/0815 |
| |
| 1997/0327 | ||
| 1997/0423 |
| |
| 1997/0327 | uh = (Udphdr*)(bp->rp); | |
| 1997/0904 | /* Put back pseudo header for checksum (remember old values for icmpnoconv()) */ | |
| 1997/0904/sys/src/9/ip/udp.c:217,233 – 1998/0306/sys/src/9/ip/udp.c:207,221 | ||
| 1997/0904 | olen = nhgets(uh->udpplen); | |
| 1997/0327 | hnputs(uh->udpplen, len); | |
| 1997/0530 |
| |
| 1998/0306 | v4tov6(raddr, uh->udpsrc); v4tov6(laddr, uh->udpdst); | |
| 1997/0725 | lport = nhgets(uh->udpdport); rport = nhgets(uh->udpsport); | |
| 1997/0815 |
| |
| 1997/0327 | if(udpsum && nhgets(uh->udpcksum)) { if(ptclcsum(bp, UDP_IPHDR, len+UDP_PHDRSIZE)) { udp.csumerr++; | |
| 1997/0815 |
| |
| 1998/0306 | netlog(Logudp, "udp: checksum error %I\n", raddr); | |
| 1997/0327 | freeblist(bp); return; } | |
| 1997/0904/sys/src/9/ip/udp.c:244,253 – 1998/0306/sys/src/9/ip/udp.c:232,241 | ||
| 1997/0327 | } if(*p == nil) { | |
| 1997/0815 |
| |
| 1998/0306 | netlog(Logudp, "udp: no conv %I.%d -> %I.%d\n", raddr, rport, laddr, lport); | |
| 1997/0904 | /* don't complain about broadcasts... */ | |
| 1998/0306 | if(ipforme(raddr) == 0){ | |
| 1997/0904 | uh->Unused = ottl; hnputs(uh->udpplen, olen); icmpnoconv(bp); | |
| 1997/0904/sys/src/9/ip/udp.c:262,275 – 1998/0306/sys/src/9/ip/udp.c:250,263 | ||
| 1997/0327 | len -= (UDP_HDRSIZE-UDP_PHDRSIZE); bp = trimblock(bp, UDP_IPHDR+UDP_HDRSIZE, len); if(bp == nil){ | |
| 1997/0815 |
| |
| 1998/0306 | netlog(Logudp, "udp: len err %I.%d -> %I.%d\n", raddr, rport, laddr, lport); | |
| 1997/0327 | udp.lenerr++; return; } | |
| 1997/0806 | ||
| 1997/0815 |
| |
| 1998/0306 | netlog(Logudpmsg, "udp: %I.%d -> %I.%d l %d\n", raddr, rport, laddr, lport, len); | |
| 1997/0327 | ucb = (Udpcb*)c->ptcl; | |
| 1997/0904/sys/src/9/ip/udp.c:276,304 – 1998/0306/sys/src/9/ip/udp.c:264,288 | ||
| 1997/0327 | if(ucb->headers) { /* pass the src address */ bp = padblock(bp, UDP_USEAD); | |
| 1997/0530 |
| |
| 1997/0815 |
| |
| 1997/0708 |
| |
| 1997/0901 |
| |
| 1997/0708 |
| |
| 1997/0901 |
| |
| 1998/0306 | ipmove(bp->rp, raddr); if(ipforme(laddr) == Runi) ipmove(bp->rp+IPaddrlen, laddr); | |
| 1997/0901 | else | |
| 1997/0530 |
| |
| 1998/0306 | ipmove(bp->rp+IPaddrlen, ia); hnputs(bp->rp+2*IPaddrlen, rport); hnputs(bp->rp+2*IPaddrlen+2, lport); | |
| 1997/0327 | } else { /* connection oriented udp */ if(c->raddr == 0){ /* save the src address in the conversation */ | |
| 1997/0530 |
| |
| 1998/0306 | ipmove(c->raddr, raddr); | |
| 1997/0530 | c->rport = rport; | |
| 1997/0327 | /* reply with the same ip address (if not broadcast) */ | |
| 1997/0815 |
| |
| 1997/0708 |
| |
| 1998/0306 | if(ipforme(laddr) == Runi) ipmove(c->laddr, laddr); | |
| 1997/0708 | else | |
| 1998/0306 | ipmove(c->laddr, ia); | |
| 1997/0327 | } } if(bp->next) | |
| 1997/0904/sys/src/9/ip/udp.c:305,312 – 1998/0306/sys/src/9/ip/udp.c:289,296 | ||
| 1997/0327 | bp = concatblock(bp); | |
| 1997/0725 | if(qfull(c->rq)){ | |
| 1997/0815 |
| |
| 1998/0306 | netlog(Logudp, "udp: qfull %I.%d -> %I.%d\n", raddr, rport, laddr, lport); | |
| 1997/0327 | freeblist(bp); | |
| 1997/0725 | }else | |
| 1997/0327 | qpass(c->rq, bp); | |
| 1997/0904/sys/src/9/ip/udp.c:333,346 – 1998/0306/sys/src/9/ip/udp.c:317,330 | ||
| 1997/0829 | udpadvise(Block *bp, char *msg) { Udphdr *h; | |
| 1998/0306 | uchar source[IPaddrlen], dest[IPaddrlen]; | |
| 1997/0829 | ushort psource, pdest; Conv *s, **p; h = (Udphdr*)(bp->rp); | |
| 1998/0306 | v4tov6(dest, h->udpdst); v4tov6(source, h->udpsrc); | |
| 1997/0829 | psource = nhgets(h->udpsport); pdest = nhgets(h->udpdport); | |
| 1997/0904/sys/src/9/ip/udp.c:347,354 – 1998/0306/sys/src/9/ip/udp.c:331,340 | ||
| 1997/0829 | /* Look for a connection */ for(p = udp.conv; *p; p++) { s = *p; | |
| 1998/0306 | if(s->rport == pdest) if(s->lport == psource) if(ipcmp(s->raddr, dest) == 0) if(ipcmp(s->laddr, source) == 0){ | |
| 1997/0829 | qhangup(s->rq, msg); qhangup(s->wq, msg); break; | |
| 1997/0904/sys/src/9/ip/udp.c:357,362 – 1998/0306/sys/src/9/ip/udp.c:343,356 | ||
| 1997/0829 | freeblist(bp); } | |
| 1998/0306 | int udpstats(char *buf, int len) { return snprint(buf, len, "udp: csum %d hlen %d len %d order %d rexmit %d\n", udp.csumerr, udp.hlenerr, udp.lenerr, udp.order, udp.rexmit); } | |
| 1997/0829 | void | |
| 1997/0327 | udpinit(Fs *fs) { | |
| 1997/0904/sys/src/9/ip/udp.c:370,375 – 1998/0306/sys/src/9/ip/udp.c:364,370 | ||
| 1997/0327 | udp.close = udpclose; udp.rcv = udpiput; | |
| 1997/0829 | udp.advise = udpadvise; | |
| 1998/0306 | udp.stats = udpstats; | |
| 1997/0327 | udp.ipproto = IP_UDPPROTO; udp.nc = 16; udp.ptclsize = sizeof(Udpcb); | |
| 1998/0306/sys/src/9/ip/udp.c:15,21 – 1998/0311/sys/src/9/ip/udp.c:15,21 (short | long) | ||
| 1997/0327 | UDP_HDRSIZE = 20, UDP_IPHDR = 8, IP_UDPPROTO = 17, | |
| 1998/0306 |
| |
| 1998/0311 | UDP_USEAD = 12, | |
| 1997/0327 | Udprxms = 200, Udptickms = 100, | |
| 1998/0311/sys/src/9/ip/udp.c:15,21 – 1998/0313/sys/src/9/ip/udp.c:15,22 (short | long) | ||
| 1997/0327 | UDP_HDRSIZE = 20, UDP_IPHDR = 8, IP_UDPPROTO = 17, | |
| 1998/0311 |
| |
| 1998/0313 | UDP_USEAD6 = 36, UDP_USEAD4 = 12, | |
| 1997/0327 | Udprxms = 200, Udptickms = 100, | |
| 1998/0311/sys/src/9/ip/udp.c:44,49 – 1998/0313/sys/src/9/ip/udp.c:45,71 | ||
| 1998/0306 | uchar udpcksum[2]; /* Checksum */ | |
| 1997/0327 | }; | |
| 1998/0313 | /* MIB II counters */ typedef struct Udpstats Udpstats; struct Udpstats { ulong udpInDatagrams; ulong udpNoPorts; ulong udpInErrors; ulong udpOutDatagrams; }; typedef struct Udppriv Udppriv; struct Udppriv { /* MIB counters */ Udpstats ustats; /* non-MIB stats */ ulong csumerr; /* checksum errors */ ulong lenerr; /* short packet */ }; | |
| 1997/0327 | /* * protocol specific part of Conv */ | |
| 1998/0311/sys/src/9/ip/udp.c:54,65 – 1998/0313/sys/src/9/ip/udp.c:76,81 | ||
| 1998/0306 | uchar headers; | |
| 1997/0327 | }; | |
| 1998/0311/sys/src/9/ip/udp.c:66,76 – 1998/0313/sys/src/9/ip/udp.c:82,93 | ||
| 1997/0327 | char *e; e = Fsstdconnect(c, argv, argc); | |
| 1998/0313 | Fsconnected(c, e); | |
| 1997/0327 | return e; } | |
| 1998/0313 | ||
| 1998/0306 | static int udpstate(Conv *c, char *state, int n) | |
| 1997/0327 | { | |
| 1998/0311/sys/src/9/ip/udp.c:86,92 – 1998/0313/sys/src/9/ip/udp.c:103,109 | ||
| 1997/0411 | e = Fsstdannounce(c, argv, argc); if(e != nil) return e; | |
| 1997/0327 |
| |
| 1998/0313 | Fsconnected(c, nil); | |
| 1997/0403 | return nil; | |
| 1997/0327 | } | |
| 1998/0311/sys/src/9/ip/udp.c:126,141 – 1998/0313/sys/src/9/ip/udp.c:143,164 | ||
| 1997/0806 | Block *bp; | |
| 1997/0327 | Udpcb *ucb; int dlen, ptcllen; | |
| 1998/0313 | Udppriv *upriv; Fs *f; | |
| 1997/0327 | ||
| 1998/0306 |
| |
| 1998/0313 | upriv = c->p->priv; f = c->p->f; netlog(c->p->f, Logudp, "udp: kick\n"); | |
| 1997/0327 | bp = qget(c->wq); if(bp == nil) return; ucb = (Udpcb*)c->ptcl; | |
| 1998/0313 | switch(ucb->headers) { case 6: | |
| 1997/0327 | /* get user specified addresses */ | |
| 1998/0313 | bp = pullupblock(bp, UDP_USEAD6); | |
| 1998/0306 | if(bp == nil) | |
| 1997/0327 | return; | |
| 1998/0306 | ipmove(raddr, bp->rp); | |
| 1998/0311/sys/src/9/ip/udp.c:142,155 – 1998/0313/sys/src/9/ip/udp.c:165,196 | ||
| 1998/0306 | bp->rp += IPaddrlen; ipmove(laddr, bp->rp); bp->rp += IPaddrlen; | |
| 1998/0313 | if(ipforme(f, laddr) != Runi) findlocalip(f, laddr, raddr); /* pick interface closest to dest */ | |
| 1997/0530 | rport = nhgets(bp->rp); | |
| 1997/0327 | bp->rp += 2; | |
| 1997/0530 | /* ignore local port number */ bp->rp += 2; | |
| 1997/0327 |
| |
| 1998/0313 | break; case 4: /* get user specified addresses */ bp = pullupblock(bp, UDP_USEAD4); if(bp == nil) return; v4tov6(raddr, bp->rp); bp->rp += IPv4addrlen; v4tov6(laddr, bp->rp); bp->rp += IPv4addrlen; if(ipforme(f, laddr) != Runi) findlocalip(f, laddr, raddr); /* pick interface closest to dest */ rport = nhgets(bp->rp); bp->rp += 2; /* ignore local port number */ bp->rp += 2; break; default: | |
| 1997/0530 | rport = 0; | |
| 1998/0313 | break; | |
| 1997/0327 | } dlen = blocklen(bp); | |
| 1998/0311/sys/src/9/ip/udp.c:167,182 – 1998/0313/sys/src/9/ip/udp.c:208,231 | ||
| 1997/0327 | uh->frag[0] = 0; uh->frag[1] = 0; hnputs(uh->udpplen, ptcllen); | |
| 1998/0313 | switch(ucb->headers){ case 6: | |
| 1998/0306 | v6tov4(uh->udpdst, raddr); | |
| 1997/0530 | hnputs(uh->udpdport, rport); | |
| 1998/0306 | v6tov4(uh->udpsrc, laddr); | |
| 1997/0327 |
| |
| 1998/0313 | break; case 4: memmove(uh->udpdst, raddr, IPv4addrlen); hnputs(uh->udpdport, rport); memmove(uh->udpsrc, laddr, IPv4addrlen); break; default: | |
| 1998/0306 | v6tov4(uh->udpdst, c->raddr); | |
| 1997/0327 | hnputs(uh->udpdport, c->rport); | |
| 1998/0306 | if(ipcmp(c->laddr, IPnoaddr) == 0) | |
| 1998/0313 | findlocalip(f, c->laddr, c->raddr); /* pick interface closest to dest */ | |
| 1998/0306 | v6tov4(uh->udpsrc, c->laddr); | |
| 1998/0313 | break; | |
| 1997/0327 | } hnputs(uh->udpsport, c->lport); hnputs(uh->udplen, ptcllen); | |
| 1998/0311/sys/src/9/ip/udp.c:185,195 – 1998/0313/sys/src/9/ip/udp.c:234,245 | ||
| 1997/0327 | hnputs(uh->udpcksum, ptclcsum(bp, UDP_IPHDR, dlen+UDP_HDRSIZE)); | |
| 1998/0313 | upriv->ustats.udpOutDatagrams++; ipoput(f, bp, 0, c->ttl); | |
| 1997/0327 | } void | |
| 1998/0306 |
| |
| 1998/0313 | udpiput(Proto *udp, uchar *ia, Block *bp) | |
| 1997/0327 | { | |
| 1997/0904 | int len, olen, ottl; | |
| 1997/0327 | Udphdr *uh; | |
| 1998/0311/sys/src/9/ip/udp.c:197,203 – 1998/0313/sys/src/9/ip/udp.c:247,260 | ||
| 1997/0327 | Udpcb *ucb; | |
| 1998/0306 | uchar raddr[IPaddrlen], laddr[IPaddrlen]; | |
| 1997/0530 | ushort rport, lport; | |
| 1998/0313 | Udppriv *upriv; Fs *f; | |
| 1997/0327 | ||
| 1998/0313 | upriv = udp->priv; f = udp->f; upriv->ustats.udpInDatagrams++; | |
| 1997/0327 | uh = (Udphdr*)(bp->rp); | |
| 1997/0904 | /* Put back pseudo header for checksum (remember old values for icmpnoconv()) */ | |
| 1998/0311/sys/src/9/ip/udp.c:212,221 – 1998/0313/sys/src/9/ip/udp.c:269,278 | ||
| 1997/0725 | lport = nhgets(uh->udpdport); rport = nhgets(uh->udpsport); | |
| 1997/0327 |
| |
| 1998/0313 | if(nhgets(uh->udpcksum)) { | |
| 1997/0327 | if(ptclcsum(bp, UDP_IPHDR, len+UDP_PHDRSIZE)) { | |
| 1998/0306 |
| |
| 1998/0313 | upriv->ustats.udpInErrors++; netlog(f, Logudp, "udp: checksum error %I\n", raddr); | |
| 1997/0327 | freeblist(bp); return; } | |
| 1998/0311/sys/src/9/ip/udp.c:223,229 – 1998/0313/sys/src/9/ip/udp.c:280,286 | ||
| 1997/0327 | /* Look for a conversation structure for this port */ c = nil; | |
| 1998/0313 | for(p = udp->conv; *p; p++) { | |
| 1997/0327 | c = *p; if(c->inuse == 0) continue; | |
| 1998/0311/sys/src/9/ip/udp.c:232,244 – 1998/0313/sys/src/9/ip/udp.c:289,302 | ||
| 1997/0327 | } if(*p == nil) { | |
| 1998/0306 |
| |
| 1998/0313 | upriv->ustats.udpNoPorts++; netlog(f, Logudp, "udp: no conv %I.%d -> %I.%d\n", raddr, rport, | |
| 1998/0306 | laddr, lport); | |
| 1997/0904 | /* don't complain about broadcasts... */ | |
| 1998/0306 |
| |
| 1998/0313 | if(ipforme(f, raddr) == 0){ | |
| 1997/0904 | uh->Unused = ottl; hnputs(uh->udpplen, olen); | |
| 1998/0313 | icmpnoconv(f, bp); | |
| 1997/0904 | } | |
| 1997/0327 | freeblist(bp); return; | |
| 1998/0311/sys/src/9/ip/udp.c:250,277 – 1998/0313/sys/src/9/ip/udp.c:308,348 | ||
| 1997/0327 | len -= (UDP_HDRSIZE-UDP_PHDRSIZE); bp = trimblock(bp, UDP_IPHDR+UDP_HDRSIZE, len); if(bp == nil){ | |
| 1998/0306 |
| |
| 1998/0313 | netlog(f, Logudp, "udp: len err %I.%d -> %I.%d\n", raddr, rport, | |
| 1998/0306 | laddr, lport); | |
| 1997/0327 |
| |
| 1998/0313 | upriv->lenerr++; | |
| 1997/0327 | return; } | |
| 1997/0806 | ||
| 1998/0306 |
| |
| 1998/0313 | netlog(f, Logudpmsg, "udp: %I.%d -> %I.%d l %d\n", raddr, rport, | |
| 1998/0306 | laddr, lport, len); | |
| 1997/0327 | ucb = (Udpcb*)c->ptcl; | |
| 1998/0313 | switch(ucb->headers){ case 6: | |
| 1997/0327 | /* pass the src address */ | |
| 1998/0313 | bp = padblock(bp, UDP_USEAD6); | |
| 1998/0306 | ipmove(bp->rp, raddr); | |
| 1998/0313 | if(ipforme(f, laddr) == Runi) | |
| 1998/0306 | ipmove(bp->rp+IPaddrlen, laddr); | |
| 1997/0901 | else | |
| 1998/0306 | ipmove(bp->rp+IPaddrlen, ia); hnputs(bp->rp+2*IPaddrlen, rport); hnputs(bp->rp+2*IPaddrlen+2, lport); | |
| 1997/0327 |
| |
| 1998/0313 | break; case 4: /* pass the src address */ bp = padblock(bp, UDP_USEAD4); memmove(bp->rp, raddr, IPv4addrlen); if(ipforme(f, laddr) == Runi) memmove(bp->rp+IPv4addrlen, laddr, IPv4addrlen); else memmove(bp->rp+IPv4addrlen, ia, IPv4addrlen); hnputs(bp->rp + 2*IPv4addrlen, rport); hnputs(bp->rp + 2*IPv4addrlen + 2, lport); break; default: | |
| 1997/0327 | /* connection oriented udp */ if(c->raddr == 0){ /* save the src address in the conversation */ | |
| 1998/0311/sys/src/9/ip/udp.c:279,295 – 1998/0313/sys/src/9/ip/udp.c:350,367 | ||
| 1997/0530 | c->rport = rport; | |
| 1997/0327 | /* reply with the same ip address (if not broadcast) */ | |
| 1998/0306 |
| |
| 1998/0313 | if(ipforme(f, laddr) == Runi) | |
| 1998/0306 | ipmove(c->laddr, laddr); | |
| 1997/0708 | else | |
| 1998/0306 |
| |
| 1998/0313 | v4tov6(c->laddr, ia); | |
| 1997/0327 | } | |
| 1998/0313 | break; | |
| 1997/0327 | } if(bp->next) bp = concatblock(bp); | |
| 1997/0725 | if(qfull(c->rq)){ | |
| 1998/0306 |
| |
| 1998/0313 | netlog(f, Logudp, "udp: qfull %I.%d -> %I.%d\n", raddr, rport, | |
| 1998/0306 | laddr, lport); | |
| 1997/0327 | freeblist(bp); | |
| 1997/0725 | }else | |
| 1998/0311/sys/src/9/ip/udp.c:302,320 – 1998/0313/sys/src/9/ip/udp.c:374,393 | ||
| 1997/0327 | Udpcb *ucb; ucb = (Udpcb*)c->ptcl; | |
| 1998/0313 | if(n == 1){ if(strcmp(f[0], "headers4") == 0){ ucb->headers = 4; return nil; } else if(strcmp(f[0], "headers") == 0){ ucb->headers = 6; return nil; } | |
| 1997/0327 | } | |
| 1997/0829 |
| |
| 1998/0313 | udpadvise(Proto *udp, Block *bp, char *msg) | |
| 1997/0829 | { Udphdr *h; | |
| 1998/0306 | uchar source[IPaddrlen], dest[IPaddrlen]; | |
| 1998/0311/sys/src/9/ip/udp.c:329,335 – 1998/0313/sys/src/9/ip/udp.c:402,408 | ||
| 1997/0829 | pdest = nhgets(h->udpdport); /* Look for a connection */ | |
| 1998/0313 | for(p = udp->conv; *p; p++) { | |
| 1997/0829 | s = *p; | |
| 1998/0306 | if(s->rport == pdest) if(s->lport == psource) | |
| 1998/0311/sys/src/9/ip/udp.c:344,373 – 1998/0313/sys/src/9/ip/udp.c:417,455 | ||
| 1997/0829 | } | |
| 1998/0306 | int | |
| 1998/0313 | udpstats(Proto *udp, char *buf, int len) | |
| 1998/0306 | { | |
| 1998/0313 | Udppriv *upriv; upriv = udp->priv; return snprint(buf, len, "%d %d %d %d", upriv->ustats.udpInDatagrams, upriv->ustats.udpNoPorts, upriv->ustats.udpInErrors, upriv->ustats.udpOutDatagrams); | |
| 1998/0306 | } | |
| 1997/0829 | void | |
| 1997/0327 | udpinit(Fs *fs) { | |
| 1997/0829 |
| |
| 1998/0306 |
| |
| 1997/0327 |
| |
| 1998/0313 | Proto *udp; | |
| 1997/0327 |
| |
| 1998/0313 | udp = smalloc(sizeof(Proto)); udp->priv = smalloc(sizeof(Udppriv)); udp->name = "udp"; udp->kick = udpkick; udp->connect = udpconnect; udp->announce = udpannounce; udp->ctl = udpctl; udp->state = udpstate; udp->create = udpcreate; udp->close = udpclose; udp->rcv = udpiput; udp->advise = udpadvise; udp->stats = udpstats; udp->ipproto = IP_UDPPROTO; udp->nc = 16; udp->ptclsize = sizeof(Udpcb); Fsproto(fs, udp); | |
| 1997/0327 | } | |
| 1998/0313/sys/src/9/ip/udp.c:165,179 – 1998/0414/sys/src/9/ip/udp.c:165,177 (short | long) | ||
|
Reformatting. XXX confused by udp->headers switch.
rsc Fri Mar 4 12:44:25 2005 | ||
| 1998/0306 | bp->rp += IPaddrlen; ipmove(laddr, bp->rp); bp->rp += IPaddrlen; | |
| 1998/0414 | /* pick interface closest to dest */ | |
| 1998/0313 | if(ipforme(f, laddr) != Runi) | |
| 1998/0414 | findlocalip(f, laddr, raddr); | |
| 1997/0530 | rport = nhgets(bp->rp); | |
| 1997/0327 |
| |
| 1997/0530 |
| |
| 1998/0414 | bp->rp += 2+2; /* Igonore local port */ | |
| 1998/0313 | break; case 4: | |
| 1998/0313/sys/src/9/ip/udp.c:182,192 – 1998/0414/sys/src/9/ip/udp.c:180,188 | ||
| 1998/0313 | v4tov6(laddr, bp->rp); bp->rp += IPv4addrlen; if(ipforme(f, laddr) != Runi) | |
| 1998/0414 | findlocalip(f, laddr, raddr); | |
| 1998/0313 | rport = nhgets(bp->rp); | |
| 1998/0414 | bp->rp += 2+2; | |
| 1998/0313 | break; default: | |
| 1997/0530 | rport = 0; | |
| 1998/0313/sys/src/9/ip/udp.c:209,229 – 1998/0414/sys/src/9/ip/udp.c:205,221 | ||
| 1997/0327 | uh->frag[1] = 0; hnputs(uh->udpplen, ptcllen); | |
| 1998/0313 | switch(ucb->headers){ | |
| 1998/0414 | case 4: | |
| 1998/0313 | case 6: | |
| 1998/0306 | v6tov4(uh->udpdst, raddr); | |
| 1997/0530 | hnputs(uh->udpdport, rport); | |
| 1998/0306 | v6tov4(uh->udpsrc, laddr); | |
| 1998/0313 | break; | |
| 1998/0306 | v6tov4(uh->udpdst, c->raddr); | |
| 1997/0327 | hnputs(uh->udpdport, c->rport); | |
| 1998/0306 | if(ipcmp(c->laddr, IPnoaddr) == 0) | |
| 1998/0313 |
| |
| 1998/0414 | findlocalip(f, c->laddr, c->raddr); | |
| 1998/0306 | v6tov4(uh->udpsrc, c->laddr); | |
| 1998/0313 | break; | |
| 1997/0327 | } | |
| 1998/0313/sys/src/9/ip/udp.c:290,296 – 1998/0414/sys/src/9/ip/udp.c:282,288 | ||
| 1997/0327 | if(*p == nil) { | |
| 1998/0313 | upriv->ustats.udpNoPorts++; | |
| 1998/0414 | netlog(f, Logudp, "udp: no conv %I!%d -> %I!%d\n", raddr, rport, | |
| 1998/0306 | laddr, lport); | |
| 1997/0904 | /* don't complain about broadcasts... */ | |
| 1998/0313 | if(ipforme(f, raddr) == 0){ | |
| 1998/0313/sys/src/9/ip/udp.c:334,342 – 1998/0414/sys/src/9/ip/udp.c:326,334 | ||
| 1998/0313 | case 4: /* pass the src address */ bp = padblock(bp, UDP_USEAD4); | |
| 1998/0414 | v6tov4(bp->rp, raddr); | |
| 1998/0313 | if(ipforme(f, laddr) == Runi) | |
| 1998/0414 | v6tov4(bp->rp+IPv4addrlen, laddr); | |
| 1998/0313 | else memmove(bp->rp+IPv4addrlen, ia, IPv4addrlen); hnputs(bp->rp + 2*IPv4addrlen, rport); | |
| 1998/0313/sys/src/9/ip/udp.c:422,428 – 1998/0414/sys/src/9/ip/udp.c:414,420 | ||
| 1998/0313 | Udppriv *upriv; upriv = udp->priv; | |
| 1998/0414 | return snprint(buf, len, "%d %d %d %d\n", | |
| 1998/0313 | upriv->ustats.udpInDatagrams, upriv->ustats.udpNoPorts, upriv->ustats.udpInErrors, | |
| 1998/0414/sys/src/9/ip/udp.c:284,295 – 1998/0509/sys/src/9/ip/udp.c:284,292 (short | long) | ||
| 1998/0313 | upriv->ustats.udpNoPorts++; | |
| 1998/0414 | netlog(f, Logudp, "udp: no conv %I!%d -> %I!%d\n", raddr, rport, | |
| 1998/0306 | laddr, lport); | |
| 1997/0904 |
| |
| 1998/0313 |
| |
| 1997/0904 |
| |
| 1998/0313 |
| |
| 1997/0904 |
| |
| 1998/0509 | uh->Unused = ottl; hnputs(uh->udpplen, olen); icmpnoconv(f, bp); | |
| 1997/0327 | freeblist(bp); return; } | |
| 1998/0509/sys/src/9/ip/udp.c:327,333 – 1998/0604/sys/src/9/ip/udp.c:327,333 (short | long) | ||
| 1998/0313 | if(ipforme(f, laddr) == Runi) | |
| 1998/0414 | v6tov4(bp->rp+IPv4addrlen, laddr); | |
| 1998/0313 | else | |
| 1998/0604 | v6tov4(bp->rp+IPv4addrlen, ia); | |
| 1998/0313 | hnputs(bp->rp + 2*IPv4addrlen, rport); hnputs(bp->rp + 2*IPv4addrlen + 2, lport); break; | |
| 1998/0604/sys/src/9/ip/udp.c:265,270 – 1998/0630/sys/src/9/ip/udp.c:265,271 (short | long) | ||
| 1997/0327 | if(ptclcsum(bp, UDP_IPHDR, len+UDP_PHDRSIZE)) { | |
| 1998/0313 | upriv->ustats.udpInErrors++; netlog(f, Logudp, "udp: checksum error %I\n", raddr); | |
| 1998/0630 | DPRINT("udp: checksum error %I\n", raddr); | |
| 1997/0327 | freeblist(bp); return; } | |
| 1998/0630/sys/src/9/ip/udp.c:277,284 – 1998/0728/sys/src/9/ip/udp.c:277,295 (short | long) | ||
| 1997/0327 | c = *p; if(c->inuse == 0) continue; | |
| 1997/0530 |
| |
| 1997/0327 |
| |
| 1998/0728 | if(c->lport == lport){ ucb = (Udpcb*)c->ptcl; /* with headers turned on, descriminate only on local port */ if(ucb->headers) break; /* otherwise discriminate on lport, rport, and raddr */ if(c->rport == 0 || c->rport == rport) if(ipisbm(c->raddr) || ipcmp(c->raddr, IPnoaddr) == 0 || ipcmp(c->raddr, raddr) == 0) break; } | |
| 1997/0327 | } if(*p == nil) { | |
| 1998/0728/sys/src/9/ip/udp.c:345,351 – 1998/0731/sys/src/9/ip/udp.c:345,351 (short | long) | ||
| 1998/0313 | break; default: | |
| 1997/0327 | /* connection oriented udp */ | |
| 1998/0731 | if(ipcmp(c->raddr, IPnoaddr) == 0){ | |
| 1997/0327 | /* save the src address in the conversation */ | |
| 1998/0306 | ipmove(c->raddr, raddr); | |
| 1997/0530 | c->rport = rport; | |
| 1998/0731/sys/src/9/ip/udp.c:91,98 – 1998/0801/sys/src/9/ip/udp.c:91,97 (short | long) | ||
| 1998/0306 | static int udpstate(Conv *c, char *state, int n) | |
| 1997/0327 | { | |
| 1998/0306 |
| |
| 1998/0801 | return snprint(state, n, "%s", c->inuse?"Open":"Closed"); | |
| 1997/0327 | } | |
| 1997/0403 | static char* | |
| 1998/0801/sys/src/9/ip/udp.c:422,428 – 1998/0813/sys/src/9/ip/udp.c:422,428 (short | long) | ||
| 1998/0313 | Udppriv *upriv; upriv = udp->priv; | |
| 1998/0414 |
| |
| 1998/0813 | return snprint(buf, len, "%d %d %d %d", | |
| 1998/0313 | upriv->ustats.udpInDatagrams, upriv->ustats.udpNoPorts, upriv->ustats.udpInErrors, | |
| 1998/0813/sys/src/9/ip/udp.c:422,428 – 1998/0825/sys/src/9/ip/udp.c:422,428 (short | long) | ||
|
Bug fix: print format.
rsc Fri Mar 4 12:44:25 2005 | ||
| 1998/0313 | Udppriv *upriv; upriv = udp->priv; | |
| 1998/0813 |
| |
| 1998/0825 | return snprint(buf, len, "%lud %lud %lud %lud", | |
| 1998/0313 | upriv->ustats.udpInDatagrams, upriv->ustats.udpNoPorts, upriv->ustats.udpInErrors, | |
| 1998/0825/sys/src/9/ip/udp.c:130,136 – 1999/0302/sys/src/9/ip/udp.c:130,136 (short | long) | ||
| 1997/0327 | ucb = (Udpcb*)c->ptcl; ucb->headers = 0; | |
| 1999/0302 | qunlock(c); | |
| 1997/0327 | } void | |
| 1998/0825/sys/src/9/ip/udp.c:270,275 – 1999/0302/sys/src/9/ip/udp.c:270,277 | ||
| 1997/0327 | } } | |
| 1999/0302 | qlock(udp); | |
| 1997/0327 | /* Look for a conversation structure for this port */ c = nil; | |
| 1998/0313 | for(p = udp->conv; *p; p++) { | |
| 1998/0825/sys/src/9/ip/udp.c:293,298 – 1999/0302/sys/src/9/ip/udp.c:295,301 | ||
| 1997/0327 | if(*p == nil) { | |
| 1998/0313 | upriv->ustats.udpNoPorts++; | |
| 1999/0302 | qunlock(udp); | |
| 1998/0414 | netlog(f, Logudp, "udp: no conv %I!%d -> %I!%d\n", raddr, rport, | |
| 1998/0306 | laddr, lport); | |
| 1998/0509 | uh->Unused = ottl; | |
| 1998/0825/sys/src/9/ip/udp.c:302,307 – 1999/0302/sys/src/9/ip/udp.c:305,314 | ||
| 1997/0327 | return; } | |
| 1999/0302 | ucb = (Udpcb*)c->ptcl; qlock(c); qunlock(udp); | |
| 1997/0327 | /* * Trim the packet down to data size */ | |
| 1998/0825/sys/src/9/ip/udp.c:308,313 – 1999/0302/sys/src/9/ip/udp.c:315,321 | ||
| 1997/0327 | len -= (UDP_HDRSIZE-UDP_PHDRSIZE); bp = trimblock(bp, UDP_IPHDR+UDP_HDRSIZE, len); if(bp == nil){ | |
| 1999/0302 | qunlock(c); | |
| 1998/0313 | netlog(f, Logudp, "udp: len err %I.%d -> %I.%d\n", raddr, rport, | |
| 1998/0306 | laddr, lport); | |
| 1998/0313 | upriv->lenerr++; | |
| 1998/0825/sys/src/9/ip/udp.c:317,324 – 1999/0302/sys/src/9/ip/udp.c:325,330 | ||
| 1998/0313 | netlog(f, Logudpmsg, "udp: %I.%d -> %I.%d l %d\n", raddr, rport, | |
| 1998/0306 | laddr, lport, len); | |
| 1997/0327 |
| |
| 1998/0313 | switch(ucb->headers){ case 6: | |
| 1997/0327 | /* pass the src address */ | |
| 1998/0825/sys/src/9/ip/udp.c:361,371 – 1999/0302/sys/src/9/ip/udp.c:367,382 | ||
| 1997/0327 | bp = concatblock(bp); | |
| 1997/0725 | if(qfull(c->rq)){ | |
| 1999/0302 | qunlock(c); | |
| 1998/0313 | netlog(f, Logudp, "udp: qfull %I.%d -> %I.%d\n", raddr, rport, | |
| 1998/0306 | laddr, lport); | |
| 1997/0327 | freeblist(bp); | |
| 1997/0725 |
| |
| 1997/0327 |
| |
| 1999/0302 | return; } qpass(c->rq, bp); qunlock(c); | |
| 1997/0327 | } char* | |
| 1998/0825/sys/src/9/ip/udp.c:402,407 – 1999/0302/sys/src/9/ip/udp.c:413,419 | ||
| 1997/0829 | pdest = nhgets(h->udpdport); /* Look for a connection */ | |
| 1999/0302 | qlock(udp); | |
| 1998/0313 | for(p = udp->conv; *p; p++) { | |
| 1997/0829 | s = *p; | |
| 1998/0306 | if(s->rport == pdest) | |
| 1998/0825/sys/src/9/ip/udp.c:408,418 – 1999/0302/sys/src/9/ip/udp.c:420,435 | ||
| 1998/0306 | if(s->lport == psource) if(ipcmp(s->raddr, dest) == 0) if(ipcmp(s->laddr, source) == 0){ | |
| 1999/0302 | qlock(s); qunlock(udp); | |
| 1997/0829 | qhangup(s->rq, msg); qhangup(s->wq, msg); | |
| 1999/0302 | qunlock(s); freeblist(bp); return; | |
| 1997/0829 | } } | |
| 1999/0302 | qunlock(udp); | |
| 1997/0829 | freeblist(bp); } | |
| Too many diffs (26 > 25). Stopping. | ||