## diffname ip/udp.c 1997/0327
## diff -e /dev/null /n/emeliedump/1997/0327/sys/src/brazil/ip/udp.c
0a
#include "u.h"
#include "../port/lib.h"
#include "mem.h"
#include "dat.h"
#include "fns.h"
#include "../port/error.h"
#include "ip.h"
#define DPRINT if(0)print
enum
{
UDP_PHDRSIZE = 12,
UDP_HDRSIZE = 20,
UDP_IPHDR = 8,
IP_UDPPROTO = 17,
UDP_USEAD = 6,
UDP_RELSIZE = 16,
Udprxms = 200,
Udptickms = 100,
Udpmaxxmit = 10,
};
typedef struct Udphdr Udphdr;
struct Udphdr
{
/* ip header */
byte vihl; /* Version and header length */
byte tos; /* Type of service */
byte length[2]; /* packet length */
byte id[2]; /* Identification */
byte frag[2]; /* Fragment information */
byte Unused;
byte udpproto; /* Protocol */
byte udpplen[2]; /* Header plus data length */
byte udpsrc[4]; /* Ip source */
byte udpdst[4]; /* Ip destination */
/* udp header */
byte udpsport[2]; /* Source port */
byte udpdport[2]; /* Destination port */
byte udplen[2]; /* data length */
byte udpcksum[2]; /* Checksum */
};
/*
* protocol specific part of Conv
*/
typedef struct Udpcb Udpcb;
struct Udpcb
{
QLock;
byte headers;
};
Proto udp;
int udpsum;
uint generation;
extern Fs fs;
int udpdebug;
static char*
udpconnect(Conv *c, char **argv, int argc)
{
char *e;
e = Fsstdconnect(c, argv, argc);
Fsconnected(&fs, c, e);
return e;
}
int
udpstate(char **s, Conv *c)
{
USED(c);
*s = "Datagram";
return 1;
}
static void
udpannounce(Conv *c)
{
Fsconnected(&fs, c, nil);
}
static void
udpcreate(Conv *c)
{
c->rq = qopen(16*1024, 1, 0, 0);
c->wq = qopen(16*1024, 0, 0, 0);
}
static void
udpclose(Conv *c)
{
Udpcb *ucb;
qclose(c->rq);
qclose(c->wq);
qclose(c->eq);
c->laddr = 0;
c->raddr = 0;
c->lport = 0;
c->rport = 0;
ucb = (Udpcb*)c->ptcl;
ucb->headers = 0;
unlock(c);
}
void
udpkick(Conv *c, int l)
{
Udphdr *uh;
ushort port;
Ipaddr addr;
Block *bp, *f;
Udpcb *ucb;
int dlen, ptcllen;
USED(l);
bp = qget(c->wq);
if(bp == nil)
return;
ucb = (Udpcb*)c->ptcl;
if(ucb->headers) {
/* get user specified addresses */
bp = pullupblock(bp, UDP_USEAD);
if(bp == nil) {
freeblist(bp);
return;
}
addr = nhgetl(bp->rp);
bp->rp += 4;
port = nhgets(bp->rp);
bp->rp += 2;
} else {
addr = 0;
port = 0;
}
/* Round packet up to even number of bytes */
dlen = blocklen(bp);
if(dlen & 1) {
for(f = bp; f->next; f = f->next)
;
if(f->wp >= f->lim) {
f->next = allocb(1);
f = f->next;
}
*f->wp++ = 0;
dlen++;
}
/* Make space to fit udp & ip header */
bp = padblock(bp, UDP_IPHDR+UDP_HDRSIZE);
if(bp == nil)
return;
uh = (Udphdr *)(bp->rp);
ptcllen = dlen + (UDP_HDRSIZE-UDP_PHDRSIZE);
uh->Unused = 0;
uh->udpproto = IP_UDPPROTO;
uh->frag[0] = 0;
uh->frag[1] = 0;
hnputs(uh->udpplen, ptcllen);
if(ucb->headers) {
hnputl(uh->udpdst, addr);
hnputs(uh->udpdport, port);
/* pick the closest source address (best we can do) */
hnputl(uh->udpsrc, Mediagetsrc(uh->udpdst));
} else {
hnputl(uh->udpdst, c->raddr);
hnputs(uh->udpdport, c->rport);
hnputl(uh->udpsrc, c->laddr);
}
hnputs(uh->udpsport, c->lport);
hnputs(uh->udplen, ptcllen);
uh->udpcksum[0] = 0;
uh->udpcksum[1] = 0;
hnputs(uh->udpcksum, ptclcsum(bp, UDP_IPHDR, dlen+UDP_HDRSIZE));
ipoput(bp, 0, c->ttl);
}
void
udpiput(Block *bp)
{
int len;
Udphdr *uh;
Ipaddr addr;
Conv *c, **p;
Udpcb *ucb;
ushort dport, sport;
uh = (Udphdr*)(bp->rp);
/* Put back pseudo header for checksum */
uh->Unused = 0;
len = nhgets(uh->udplen);
hnputs(uh->udpplen, len);
addr = nhgetl(uh->udpsrc);
if(udpsum && nhgets(uh->udpcksum)) {
if(ptclcsum(bp, UDP_IPHDR, len+UDP_PHDRSIZE)) {
udp.csumerr++;
netlog(Logudp, "udp: checksum error %I\n", uh->udpsrc);
freeblist(bp);
return;
}
}
dport = nhgets(uh->udpdport);
sport = nhgets(uh->udpsport);
/* Look for a conversation structure for this port */
c = nil;
for(p = udp.conv; *p; p++) {
c = *p;
if(c->inuse == 0)
continue;
if(c->lport == dport && (c->rport == 0 || c->rport == sport))
break;
}
if(*p == nil) {
freeblist(bp);
return;
}
/*
* Trim the packet down to data size
*/
len -= (UDP_HDRSIZE-UDP_PHDRSIZE);
bp = trimblock(bp, UDP_IPHDR+UDP_HDRSIZE, len);
if(bp == nil){
udp.lenerr++;
return;
}
ucb = (Udpcb*)c->ptcl;
if(ucb->headers) {
/* pass the src address */
bp = padblock(bp, UDP_USEAD);
hnputl(bp->rp, addr);
hnputs(bp->rp+4, sport);
} else {
/* connection oriented udp */
if(c->raddr == 0){
/* save the src address in the conversation */
c->raddr = addr;
c->rport = sport;
/* reply with the same ip address (if not broadcast) */
if(Mediaforme(uh->udpdst) > 0)
c->laddr = nhgetl(uh->udpdst);
}
}
if(bp->next)
bp = concatblock(bp);
if(qfull(c->rq))
freeblist(bp);
else
qpass(c->rq, bp);
}
char*
udpctl(Conv *c, char **f, int n)
{
Udpcb *ucb;
ucb = (Udpcb*)c->ptcl;
if(n == 1 && strcmp(f[0], "headers") == 0){
ucb->headers = 1;
return nil;
}
if(n == 1 && strcmp(f[0], "debug") == 0){
udpdebug = 1;
return nil;
}
return "unknown control request";
}
void
udpinit(Fs *fs)
{
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.ipproto = IP_UDPPROTO;
udp.nc = 16;
udp.ptclsize = sizeof(Udpcb);
Fsproto(fs, &udp);
}
.
## diffname ip/udp.c 1997/0403
## diff -e /n/emeliedump/1997/0327/sys/src/brazil/ip/udp.c /n/emeliedump/1997/0403/sys/src/brazil/ip/udp.c
86a
return nil;
.
83,84c
static char*
udpannounce(Conv *c, char**, int)
.
## diffname ip/udp.c 1997/0411
## diff -e /n/emeliedump/1997/0403/sys/src/brazil/ip/udp.c /n/emeliedump/1997/0411/sys/src/brazil/ip/udp.c
85a
char *e;
e = Fsstdannounce(c, argv, argc);
if(e != nil)
return e;
.
84c
udpannounce(Conv *c, char** argv, int argc)
.
## diffname ip/udp.c 1997/0423
## diff -e /n/emeliedump/1997/0411/sys/src/brazil/ip/udp.c /n/emeliedump/1997/0423/sys/src/brazil/ip/udp.c
211a
USED(m);
.
203c
udpiput(Media *m, Block *bp)
.
## diffname ip/udp.c 1997/0530
## diff -e /n/emeliedump/1997/0423/sys/src/brazil/ip/udp.c /n/emeliedump/1997/0530/sys/src/brazil/ip/udp.c
270,271c
c->raddr = raddr;
c->rport = rport;
.
264,265c
hnputl(bp->rp, raddr);
hnputl(bp->rp+4, laddr);
hnputs(bp->rp+8, rport);
hnputs(bp->rp+10, lport);
.
240c
if(c->lport == lport && (c->rport == 0 || c->rport == rport))
.
231,232c
lport = nhgets(uh->udpdport);
rport = nhgets(uh->udpsport);
.
220c
raddr = nhgetl(uh->udpsrc);
laddr = nhgetl(uh->udpdst);
.
210c
Ipaddr raddr, laddr;
ushort rport, lport;
.
207d
182,186c
hnputl(uh->udpdst, raddr);
hnputs(uh->udpdport, rport);
if(laddr)
hnputl(uh->udpsrc, laddr);
else
hnputl(uh->udpsrc, Mediagetsrc(uh->udpdst));
.
151,152c
raddr = 0;
rport = 0;
laddr = 0;
.
149a
/* ignore local port number */
bp->rp += 2;
.
148c
laddr = nhgetl(bp->rp);
if(laddr != 0 && Mediaforme(bp->rp) <= 0)
laddr = 0;
bp->rp += 4;
rport = nhgets(bp->rp);
.
146c
raddr = nhgetl(bp->rp);
.
126,127c
ushort rport;
Ipaddr laddr, raddr;
.
18,19c
UDP_USEAD = 12,
.
## diffname ip/udp.c 1997/0708
## diff -e /n/emeliedump/1997/0530/sys/src/brazil/ip/udp.c /n/emeliedump/1997/0708/sys/src/brazil/ip/udp.c
285c
c->laddr = laddr;
else
c->laddr = m->myip[0];
.
273c
if(Mediaforme(uh->udpdst) > 0)
hnputl(bp->rp+4, laddr);
else
hnputl(bp->rp+4, m->myip[0]);
.
## diffname ip/udp.c 1997/0725
## diff -e /n/emeliedump/1997/0708/sys/src/brazil/ip/udp.c /n/emeliedump/1997/0725/sys/src/brazil/ip/udp.c
298c
}else
.
296c
if(qfull(c->rq)){
netlog(Logudp, "udp: qfull %I.%d -> %I.%d\n", uh->udpsrc, rport,
uh->udpdst, lport);
.
262a
netlog(Logudp, "udp: len err %I.%d -> %I.%d\n", uh->udpsrc, rport,
uh->udpdst, lport);
.
252a
netlog(Logudp, "udp: no conv %I.%d -> %I.%d\n", uh->udpsrc, rport,
uh->udpdst, lport);
.
239,241d
228a
lport = nhgets(uh->udpdport);
rport = nhgets(uh->udpsport);
.
## diffname ip/udp.c 1997/0806
## diff -e /n/emeliedump/1997/0725/sys/src/brazil/ip/udp.c /n/emeliedump/1997/0806/sys/src/brazil/ip/udp.c
268a
netlog(Logudpmsg, "udp: %I.%d -> %I.%d l %d\n", uh->udpsrc, rport,
uh->udpdst, lport, len);
.
163,172d
161d
127c
Block *bp;
.
98,99c
c->rq = qopen(64*1024, 1, 0, 0);
c->wq = qopen(64*1024, 0, 0, 0);
.
## diffname ip/udp.c 1997/0815
## diff -e /n/emeliedump/1997/0806/sys/src/brazil/ip/udp.c /n/emeliedump/1997/0815/sys/src/brazil/ip/udp.c
292,293c
netlog(Logudp, "udp: qfull %I.%d -> %I.%d\n", src, rport,
dst, lport);
.
282c
if(Mediaforme(dst) > 0)
.
268c
if(Mediaforme(dst) > 0)
.
259,260c
netlog(Logudpmsg, "udp: %I.%d -> %I.%d l %d\n", src, rport,
dst, lport, len);
.
253,254c
netlog(Logudp, "udp: len err %I.%d -> %I.%d\n", src, rport,
dst, lport);
.
241,242c
netlog(Logudp, "udp: no conv %I.%d -> %I.%d\n", src, rport,
dst, lport);
.
224c
netlog(Logudp, "udp: checksum error %I\n", src);
.
219a
memmove(src, uh->udpsrc, IPaddrlen);
memmove(dst, uh->udpdst, IPaddrlen);
.
206a
uchar dst[IPaddrlen];
uchar src[IPaddrlen];
.
## diffname ip/udp.c 1997/0829
## diff -e /n/emeliedump/1997/0815/sys/src/brazil/ip/udp.c /n/emeliedump/1997/0829/sys/src/brazil/ip/udp.c
331a
udp.advise = udpadvise;
.
320a
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
.
## diffname ip/udp.c 1997/0901
## diff -e /n/emeliedump/1997/0829/sys/src/brazil/ip/udp.c /n/emeliedump/1997/0901/sys/src/brazil/ip/udp.c
275a
else if(media != 0)
hnputl(bp->rp+4, media->myip[0]);
else
hnputl(bp->rp+4, laddr);
.
274c
else if(m != 0)
.
## diffname ip/udp.c 1997/0903
## diff -e /n/emeliedump/1997/0901/sys/src/brazil/ip/udp.c /n/emeliedump/1997/0903/sys/src/brazil/ip/udp.c
246a
icmpnoconv(bp);
.
## diffname ip/udp.c 1997/0904
## diff -e /n/emeliedump/1997/0903/sys/src/brazil/ip/udp.c /n/emeliedump/1997/0904/sys/src/brazil/ip/udp.c
247c
/* don't complain about broadcasts... */
if(Mediaforme(dst) > 0){
uh->Unused = ottl;
hnputs(uh->udpplen, olen);
icmpnoconv(bp);
}
.
215a
olen = nhgets(uh->udpplen);
.
213c
/* Put back pseudo header for checksum (remember old values for icmpnoconv()) */
ottl = uh->Unused;
.
201c
int len, olen, ottl;
.
## diffname ip/udp.c 1998/0306
## diff -e /n/emeliedump/1997/0904/sys/src/brazil/ip/udp.c /n/emeliedump/1998/0306/sys/src/brazil/ip/udp.c
372a
udp.stats = udpstats;
.
359a
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);
}
.
350,351c
if(s->rport == pdest)
if(s->lport == psource)
if(ipcmp(s->raddr, dest) == 0)
if(ipcmp(s->laddr, source) == 0){
.
342,343c
v4tov6(dest, h->udpdst);
v4tov6(source, h->udpsrc);
.
336c
uchar source[IPaddrlen], dest[IPaddrlen];
.
308,309c
netlog(Logudp, "udp: qfull %I.%d -> %I.%d\n", raddr, rport,
laddr, lport);
.
301c
ipmove(c->laddr, ia);
.
298,299c
if(ipforme(laddr) == Runi)
ipmove(c->laddr, laddr);
.
294c
ipmove(c->raddr, raddr);
.
287,289c
ipmove(bp->rp+IPaddrlen, ia);
hnputs(bp->rp+2*IPaddrlen, rport);
hnputs(bp->rp+2*IPaddrlen+2, lport);
.
279,285c
ipmove(bp->rp, raddr);
if(ipforme(laddr) == Runi)
ipmove(bp->rp+IPaddrlen, laddr);
.
271,272c
netlog(Logudpmsg, "udp: %I.%d -> %I.%d l %d\n", raddr, rport,
laddr, lport, len);
.
265,266c
netlog(Logudp, "udp: len err %I.%d -> %I.%d\n", raddr, rport,
laddr, lport);
.
250c
if(ipforme(raddr) == 0){
.
247,248c
netlog(Logudp, "udp: no conv %I.%d -> %I.%d\n", raddr, rport,
laddr, lport);
.
230c
netlog(Logudp, "udp: checksum error %I\n", raddr);
.
224,225d
220,221c
v4tov6(raddr, uh->udpsrc);
v4tov6(laddr, uh->udpdst);
.
210d
207,208d
205c
uchar raddr[IPaddrlen], laddr[IPaddrlen];
.
199c
udpiput(uchar *ia, Block *bp)
.
186c
if(ipcmp(c->laddr, IPnoaddr) == 0)
findlocalip(c->laddr, c->raddr); /* pick interface closest to dest */
v6tov4(uh->udpsrc, c->laddr);
.
184c
v6tov4(uh->udpdst, c->raddr);
.
179,182c
v6tov4(uh->udpsrc, laddr);
.
177c
v6tov4(uh->udpdst, raddr);
.
158d
156d
144,150c
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 */
.
141,142c
if(bp == nil)
.
131,132c
netlog(Logudp, "udp: kick\n");
.
126c
uchar laddr[IPaddrlen], raddr[IPaddrlen];
.
122c
udpkick(Conv *c, int)
.
110,111c
ipmove(c->laddr, IPnoaddr);
ipmove(c->raddr, IPnoaddr);
.
78,79c
return snprint(state, n, "%s", "Datagram");
.
74,75c
static int
udpstate(Conv *c, char *state, int n)
.
54c
uchar headers;
.
41,44c
uchar udpsport[2]; /* Source port */
uchar udpdport[2]; /* Destination port */
uchar udplen[2]; /* data length */
uchar udpcksum[2]; /* Checksum */
.
29,38c
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 */
.
18c
UDP_USEAD = 36,
.
## diffname ip/udp.c 1998/0311
## diff -e /n/emeliedump/1998/0306/sys/src/brazil/ip/udp.c /n/emeliedump/1998/0311/sys/src/brazil/ip/udp.c
18c
UDP_USEAD = 12,
.
## diffname ip/udp.c 1998/0313
## diff -e /n/emeliedump/1998/0311/sys/src/brazil/ip/udp.c /n/emeliedump/1998/0313/sys/src/brazil/ip/udp.c
372c
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);
.
357,370c
Proto *udp;
.
349,351c
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);
.
347c
udpstats(Proto *udp, char *buf, int len)
.
332c
for(p = udp->conv; *p; p++) {
.
317c
udpadvise(Proto *udp, Block *bp, char *msg)
.
309,312d
305,307c
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;
}
.
292c
netlog(f, Logudp, "udp: qfull %I.%d -> %I.%d\n", raddr, rport,
.
286a
break;
.
285c
v4tov6(c->laddr, ia);
.
282c
if(ipforme(f, laddr) == Runi)
.
274c
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:
.
268c
if(ipforme(f, laddr) == Runi)
.
266c
bp = padblock(bp, UDP_USEAD6);
.
264c
switch(ucb->headers){
case 6:
.
259c
netlog(f, Logudpmsg, "udp: %I.%d -> %I.%d l %d\n", raddr, rport,
.
255c
upriv->lenerr++;
.
253c
netlog(f, Logudp, "udp: len err %I.%d -> %I.%d\n", raddr, rport,
.
241c
icmpnoconv(f, bp);
.
238c
if(ipforme(f, raddr) == 0){
.
235c
upriv->ustats.udpNoPorts++;
netlog(f, Logudp, "udp: no conv %I.%d -> %I.%d\n", raddr, rport,
.
226c
for(p = udp->conv; *p; p++) {
.
217,218c
upriv->ustats.udpInErrors++;
netlog(f, Logudp, "udp: checksum error %I\n", raddr);
.
215c
if(nhgets(uh->udpcksum)) {
.
200a
upriv = udp->priv;
f = udp->f;
upriv->ustats.udpInDatagrams++;
.
199a
Udppriv *upriv;
Fs *f;
.
192c
udpiput(Proto *udp, uchar *ia, Block *bp)
.
188c
upriv->ustats.udpOutDatagrams++;
ipoput(f, bp, 0, c->ttl);
.
179a
break;
.
178c
findlocalip(f, c->laddr, c->raddr); /* pick interface closest to dest */
.
174c
break;
case 4:
memmove(uh->udpdst, raddr, IPv4addrlen);
hnputs(uh->udpdport, rport);
memmove(uh->udpsrc, laddr, IPv4addrlen);
break;
default:
.
170c
switch(ucb->headers){
case 6:
.
152a
break;
.
151c
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:
.
145,146c
if(ipforme(f, laddr) != Runi)
findlocalip(f, laddr, raddr); /* pick interface closest to dest */
.
138c
bp = pullupblock(bp, UDP_USEAD6);
.
136c
switch(ucb->headers) {
case 6:
.
130c
upriv = c->p->priv;
f = c->p->f;
netlog(c->p->f, Logudp, "udp: kick\n");
.
128a
Udppriv *upriv;
Fs *f;
.
89c
Fsconnected(c, nil);
.
73a
.
69c
Fsconnected(c, e);
.
57,62d
46a
/* 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 */
};
.
18c
UDP_USEAD6 = 36,
UDP_USEAD4 = 12,
.
## diffname ip/udp.c 1998/0414
## diff -e /n/emeliedump/1998/0313/sys/src/brazil/ip/udp.c /n/emeliedump/1998/0414/sys/src/brazil/ip/udp.c
425c
return snprint(buf, len, "%d %d %d %d\n",
.
339c
v6tov4(bp->rp+IPv4addrlen, laddr);
.
337c
v6tov4(bp->rp, raddr);
.
293c
netlog(f, Logudp, "udp: no conv %I!%d -> %I!%d\n", raddr, rport,
.
226c
findlocalip(f, c->laddr, c->raddr);
.
217,221d
211a
case 4:
.
187,189c
bp->rp += 2+2;
.
185c
findlocalip(f, laddr, raddr);
.
176d
171,173c
bp->rp += 2+2; /* Igonore local port */
.
169c
findlocalip(f, laddr, raddr);
.
167a
/* pick interface closest to dest */
.
## diffname ip/udp.c 1998/0509
## diff -e /n/emeliedump/1998/0414/sys/src/brazil/ip/udp.c /n/emeliedump/1998/0509/sys/src/brazil/ip/udp.c
287,292c
uh->Unused = ottl;
hnputs(uh->udpplen, olen);
icmpnoconv(f, bp);
.
## diffname ip/udp.c 1998/0604
## diff -e /n/emeliedump/1998/0509/sys/src/brazil/ip/udp.c /n/emeliedump/1998/0604/sys/src/brazil/ip/udp.c
330c
v6tov4(bp->rp+IPv4addrlen, ia);
.
## diffname ip/udp.c 1998/0630
## diff -e /n/emeliedump/1998/0604/sys/src/brazil/ip/udp.c /n/emeliedump/1998/0630/sys/src/brazil/ip/udp.c
267a
DPRINT("udp: checksum error %I\n", raddr);
.
## diffname ip/udp.c 1998/0728
## diff -e /n/emeliedump/1998/0630/sys/src/brazil/ip/udp.c /n/emeliedump/1998/0728/sys/src/brazil/ip/udp.c
280,281c
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;
}
.
## diffname ip/udp.c 1998/0731
## diff -e /n/emeliedump/1998/0728/sys/src/brazil/ip/udp.c /n/emeliedump/1998/0731/sys/src/brazil/ip/udp.c
348c
if(ipcmp(c->raddr, IPnoaddr) == 0){
.
## diffname ip/udp.c 1998/0801
## diff -e /n/emeliedump/1998/0731/sys/src/brazil/ip/udp.c /n/emeliedump/1998/0801/sys/src/brazil/ip/udp.c
94,95c
return snprint(state, n, "%s", c->inuse?"Open":"Closed");
.
## diffname ip/udp.c 1998/0813
## diff -e /n/emeliedump/1998/0801/sys/src/brazil/ip/udp.c /n/emeliedump/1998/0813/sys/src/brazil/ip/udp.c
425c
return snprint(buf, len, "%d %d %d %d",
.
## diffname ip/udp.c 1998/0825
## diff -e /n/emeliedump/1998/0813/sys/src/brazil/ip/udp.c /n/emeliedump/1998/0825/sys/src/brazil/ip/udp.c
425c
return snprint(buf, len, "%lud %lud %lud %lud",
.
## diffname ip/udp.c 1999/0302
## diff -e /n/emeliedump/1998/0825/sys/src/brazil/ip/udp.c /n/emeliedump/1999/0302/sys/src/brazil/ip/udp.c
415a
qunlock(udp);
.
413c
qunlock(s);
freeblist(bp);
return;
.
410a
qlock(s);
qunlock(udp);
.
404a
qlock(udp);
.
367,368c
return;
}
qpass(c->rq, bp);
qunlock(c);
.
363a
qunlock(c);
.
320,321d
310a
qunlock(c);
.
304a
ucb = (Udpcb*)c->ptcl;
qlock(c);
qunlock(udp);
.
295a
qunlock(udp);
.
272a
qlock(udp);
.
133c
qunlock(c);
.
## diffname ip/udp.c 1999/0522
## diff -e /n/emeliedump/1999/0302/sys/src/brazil/ip/udp.c /n/emeliedump/1999/0522/sys/src/brazil/ip/udp.c
218c
if(v6tov4(uh->udpsrc, c->laddr) < 0)
memset(uh->udpsrc, 0, sizeof(uh->udpsrc));
.
## diffname ip/udp.c 1999/0523
## diff -e /n/emeliedump/1999/0522/sys/src/brazil/ip/udp.c /n/emeliedump/1999/0523/sys/src/brazil/ip/udp.c
218,219c
v6tov4(uh->udpsrc, c->laddr);
.
## diffname ip/udp.c 1999/0817
## diff -e /n/emeliedump/1999/0523/sys/src/brazil/ip/udp.c /n/emeliedump/1999/0817/sys/src/brazil/ip/udp.c
229c
ipoput(f, bp, 0, c->ttl, c->tos);
.
## diffname ip/udp.c 1999/0906
## diff -e /n/emeliedump/1999/0817/sys/src/brazil/ip/udp.c /n/emeliedump/1999/0906/sys/src/brazil/ip/udp.c
468c
udp->nc = Nchans;
.
## diffname ip/udp.c 1999/0909
## diff -e /n/emeliedump/1999/0906/sys/src/brazil/ip/udp.c /n/emeliedump/1999/0909/sys/src/brazil/ip/udp.c
295,305c
if(*p == nil){
if(gc != nil)
c = gc;
else {
upriv->ustats.udpNoPorts++;
qunlock(udp);
netlog(f, Logudp, "udp: no conv %I!%d -> %I!%d\n", raddr, rport,
laddr, lport);
uh->Unused = ottl;
hnputs(uh->udpplen, olen);
icmpnoconv(f, bp);
freeblist(bp);
return;
}
.
285,286c
if(ucb->headers && gc == nil){
gc = c;
continue;
}
.
275,276c
/*
* Look for a conversation structure for this port. One
* with headers off wins over one with headers on, i.e.,
* specific wins over generic.
*/
gc = c = nil;
.
237c
Conv *c, **p, *gc;
.
## diffname ip/udp.c 1999/0910
## diff -e /n/emeliedump/1999/0909/sys/src/brazil/ip/udp.c /n/emeliedump/1999/0910/sys/src/brazil/ip/udp.c
402a
/* close any calls that got in twixt announce and headers */
udpcloseincalls(c);
.
399a
/* close any calls that got in twixt announce and headers */
udpcloseincalls(c);
.
390a
/* close any incoming calls waiting on this conversation */
void
udpcloseincalls(Conv *c)
{
Conv *nc;
qlock(c);
for(nc = c->incall; nc; nc = c->incall){
c->incall = nc->next;
closeconv(nc);
}
qunlock(c);
}
.
374a
.
360,373d
302,304c
if(spec != nil)
gen = spec;
if(gen != nil){
if(ipforme(f, laddr) != Runi)
v4tov6(laddr, ia);
c = Fsnewcall(gen, raddr, rport, laddr, lport);
if(c == nil){
freeblist(bp);
return;
}
c->state = Connected;
} else {
.
300a
found:
.
294,298c
} else if(c->lport == 0) {
/* generic listen for all udp ports */
if(c->state == Announced)
gen = c;
.
288,291c
switch(c->state){
case Announced:
/* headers + Announced is special behaviour */
if(ucb->headers)
goto found;
spec = c;
break;
case Connected:
/* exact match */
if(c->rport == rport)
if(ipcmp(c->raddr, raddr) == 0 || ipisbm(c->raddr))
goto found;
.
280c
spec = gen = c = nil;
.
276,278c
* Look for a conversation structure for this packet
.
237c
Conv *c, **p, *spec, *gen;
.
121a
c->state = 0;
.
## diffname ip/udp.c 2000/0424
## diff -e /n/emeliedump/1999/0910/sys/src/brazil/ip/udp.c /n/emeliedump/2000/0424/sys/src/9/ip/udp.c
499a
udp->gc = nil;
.
## diffname ip/udp.c 2000/0527
## diff -e /n/emeliedump/2000/0424/sys/src/9/ip/udp.c /n/emeliedump/2000/0527/sys/src/9/ip/udp.c
113,114c
c->rq = qopen(128*1024, 1, 0, 0);
c->wq = qopen(128*1024, 0, 0, 0);
.
## diffname ip/udp.c 2000/0706
## diff -e /n/emeliedump/2000/0527/sys/src/9/ip/udp.c /n/emeliedump/2000/0706/sys/src/9/ip/udp.c
474,479c
priv = udp->priv;
p = buf;
e = p+len;
for(i = 0; i < Nstats; i++)
p = seprint(p, e, "%s: %lud\n", statnames[i], priv->stats[i]);
return p - buf;
.
472c
Udppriv *priv;
char *p, *e;
int i;
.
347c
upriv->stats[LenErrs]++;
upriv->stats[InErrors]++;
.
322c
upriv->stats[NoPorts]++;
.
266c
upriv->stats[InErrors]++;
upriv->stats[CsumErrs]++;
.
248c
upriv->stats[InDatagrams]++;
.
229c
upriv->stats[OutDatagrams]++;
.
61,66c
ulong stats[Nstats];
.
57a
static char *statnames[] = {
[InDatagrams] "InDatagrams",
[NoPorts] "NoPorts",
[InErrors] "InErrors",
[OutDatagrams] "OutDatagrams",
[CsumErrs] "CsumErrs",
[LenErrs] "LenErrs",
};
.
52,55c
/* MIB II counters */
InDatagrams,
NoPorts,
InErrors,
OutDatagrams,
/* non-MIB counters */
CsumErrs,
LenErrs,
Nstats,
.
48,50c
enum
.
## diffname ip/udp.c 2000/1220
## diff -e /n/emeliedump/2000/0706/sys/src/9/ip/udp.c /n/emeliedump/2000/1220/sys/src/9/ip/udp.c
422a
/* called with c locked */
.
419,420d
413,414d
407c
/*
* close any incoming calls waiting on this conversation
* called with c locked
*/
.
143,144d
## diffname ip/udp.c 2001/0207
## diff -e /n/emeliedump/2000/1220/sys/src/9/ip/udp.c /n/emeliedump/2001/0207/sys/src/9/ip/udp.c
123c
c->rq = qopen(256*1024, 1, 0, 0);
.
## diffname ip/udp.c 2001/0209
## diff -e /n/emeliedump/2001/0207/sys/src/9/ip/udp.c /n/emeliedump/2001/0209/sys/src/9/ip/udp.c
512d
486,491c
upriv = udp->priv;
return snprint(buf, len, "%lud %lud %lud %lud",
upriv->ustats.udpInDatagrams,
upriv->ustats.udpNoPorts,
upriv->ustats.udpInErrors,
upriv->ustats.udpOutDatagrams);
.
482,484c
Udppriv *upriv;
.
435,436d
430,431d
405,420d
356,357c
upriv->lenerr++;
.
342a
/* no converstation found */
upriv->ustats.udpNoPorts++;
qunlock(udp);
netlog(f, Logudp, "udp: no conv %I!%d -> %I!%d\n", raddr, rport,
laddr, lport);
uh->Unused = ottl;
hnputs(uh->udpplen, olen);
icmpnoconv(f, bp);
freeblist(bp);
return;
found:
.
340a
c->state = Connected;
goto found;
.
317,337c
if(gen != nil){
c = gen;
goto found;
}
/* look for a connected port */
for(p = udp->conv; *p; p++){
c = *p;
if(c->inuse == 0 || c->state != Connected)
continue;
if(c->lport == lport
&& c->rport == rport
&& (ipcmp(c->laddr, laddr) == 0)
&& ipcmp(c->raddr, raddr) == 0 || ipisbm(c->raddr))
goto found;
}
/* finally, look for a listener */
for(p = udp->conv; *p; p++){
c = *p;
ucb = (Udpcb*)c->ptcl;
if(c->inuse == 0 || c->state != Announced || ucb->headers != 0)
continue;
if(c->lport != lport)
continue;
if(ipcmp(c->laddr, laddr) == 0)
break;
if(ipcmp(c->laddr, IPnoaddr) == 0)
gen = c;
}
c = *p;
if(c == nil)
c = gen;
if(c != nil){
if(ipforme(f, laddr) != Runi)
v4tov6(laddr, ia);
c = Fsnewcall(gen, raddr, rport, laddr, lport);
if(c == nil){
.
311,315c
if(ipcmp(c->laddr, IPnoaddr) == 0 || ipcmp(c->laddr, v4prefix) == 0)
gen = c;
.
296,309c
if(ipcmp(c->laddr, laddr) == 0)
goto found;
.
293,294c
if(c->lport != lport)
continue;
.
291c
ucb = (Udpcb*)c->ptcl;
if(c->inuse == 0 || c->state != Announced || ucb->headers == 0)
.
285,289c
gen = nil;
/* look for an announced port with headers (most likely) */
for(p = udp->conv; *p; p++){
.
274,275c
upriv->ustats.udpInErrors++;
.
256c
upriv->ustats.udpInDatagrams++;
.
246c
Conv *c, **p, *gen;
.
240a
Conv*
udpincoming(Conv *c, uchar *raddr, ushort rport, uchar *laddr, ushort lport)
{
Conv *new;
new = Fsnewcall(c, raddr, rport, laddr, lport);
if(new == nil)
return nil;
}
.
237c
upriv->ustats.udpOutDatagrams++;
.
142a
qunlock(c);
.
123,124c
c->rq = qopen(64*1024, 1, 0, 0);
c->wq = qopen(64*1024, 0, 0, 0);
.
76c
/* MIB counters */
Udpstats ustats;
/* non-MIB stats */
ulong csumerr; /* checksum errors */
ulong lenerr; /* short packet */
.
63,72d
50,60c
ulong udpInDatagrams;
ulong udpNoPorts;
ulong udpInErrors;
ulong udpOutDatagrams;
.
48c
/* MIB II counters */
typedef struct Udpstats Udpstats;
struct Udpstats
.
## diffname ip/udp.c 2001/0301
## diff -e /n/emeliedump/2001/0209/sys/src/9/ip/udp.c /n/emeliedump/2001/0301/sys/src/9/ip/udp.c
352,364d
348,349d
309,346c
if(c->state == Announced){
if(ucb->headers == 0){
/* create a new conversation */
if(ipforme(f, laddr) != Runi)
v4tov6(laddr, ia);
c = Fsnewcall(c, raddr, rport, laddr, lport);
if(c == nil){
qunlock(udp);
freeblist(bp);
return;
}
iphtadd(&upriv->ht, c);
ucb = (Udpcb*)c->ptcl;
.
304,307c
ucb = (Udpcb*)c->ptcl;
.
286,302c
c = iphtlook(&upriv->ht, raddr, rport, laddr, lport);
if(c == nil){
/* no converstation found */
upriv->ustats.udpNoPorts++;
qunlock(udp);
netlog(f, Logudp, "udp: no conv %I!%d -> %I!%d\n", raddr, rport,
laddr, lport);
uh->Unused = ottl;
hnputs(uh->udpplen, olen);
icmpnoconv(f, bp);
freeblist(bp);
return;
.
248c
Conv *c;
.
121a
upriv = c->p->priv;
iphtrem(&upriv->ht, c);
.
120a
Udppriv *upriv;
.
105a
iphtadd(&upriv->ht, c);
.
101a
upriv = c->p->priv;
.
100a
Udppriv *upriv;
.
85a
iphtadd(&upriv->ht, c);
.
83a
upriv = c->p->priv;
.
82a
Udppriv *upriv;
.
60a
Ipht ht;
.
## diffname ip/udp.c 2001/0306
## diff -e /n/emeliedump/2001/0301/sys/src/9/ip/udp.c /n/emeliedump/2001/0306/sys/src/9/ip/udp.c
150c
udpkick(Conv *c)
.
## diffname ip/udp.c 2001/0412
## diff -e /n/emeliedump/2001/0306/sys/src/9/ip/udp.c /n/emeliedump/2001/0412/sys/src/9/ip/udp.c
449c
return snprint(buf, len, "InDatagrams: %lud\nNoPorts: %lud\nInErrors: %lud\nOutDatagrams: %lud\n",
.
## diffname ip/udp.c 2001/0530
## diff -e /n/emeliedump/2001/0412/sys/src/9/ip/udp.c /n/emeliedump/2001/0530/sys/src/9/ip/udp.c
145,146d
## diffname ip/udp.c 2001/0623
## diff -e /n/emeliedump/2001/0530/sys/src/9/ip/udp.c /n/emeliedump/2001/0623/sys/src/9/ip/udp.c
365c
v6tov4(bp->rp+IPv4addrlen, ifc->lifc->local);
.
354c
ipmove(bp->rp+IPaddrlen, ifc->lifc->local);
.
315c
v4tov6(laddr, ifc->lifc->local);
.
254c
udpiput(Proto *udp, Ipifc *ifc, Block *bp)
.
## diffname ip/udp.c 2002/0507
## diff -e /n/emeliedump/2001/0623/sys/src/9/ip/udp.c /n/emeliedump/2002/0507/sys/src/9/ip/udp.c
429a
print("udpadvise: found, hanging up\n");
.
419a
print("udpadvise: looking for s %I sp %d d %I dp %d\n", source, (int)psource, dest, (int)pdest);
.
415,418c
if(version == 4) {
v4tov6(dest, h4->udpdst);
v4tov6(source, h4->udpsrc);
psource = nhgets(h4->udpsport);
pdest = nhgets(h4->udpdport);
} else {
h6 = (Udp6hdr*)(bp->rp);
ipmove(dest, h6->udpdst);
ipmove(source, h6->udpsrc);
psource = nhgets(h6->udpsport);
pdest = nhgets(h6->udpdport);
}
.
413c
h4 = (Udp4hdr*)(bp->rp);
version = ((h4->vihl&0xF0)==IP_VER6) ? 6 : 4;
.
411a
int version;
.
408c
Udp4hdr *h4;
Udp6hdr *h6;
.
377c
laddr, lport);
.
344c
laddr, lport, len);
.
338c
laddr, lport);
.
333,334c
len -= UDP_UDPHDR_SZ;
if(version == 4)
bp = trimblock(bp, UDP4_IPHDR_SZ+UDP_UDPHDR_SZ, len);
else
bp = trimblock(bp, UDP6_IPHDR_SZ+UDP_UDPHDR_SZ, len);
.
314,315c
if(ipforme(f, laddr) != Runi) {
if(version == 4)
v4tov6(laddr, ifc->lifc->local);
else
ipmove(laddr, ifc->lifc->local);
}
.
302,305c
laddr, lport);
if(version == 4)
icmpnoconv(f, bp);
else {
print("udpiput: no conv %I!%d -> %I!%d\n", raddr, rport, laddr, lport);
icmphostunr(f, ifc, bp, icmp6_port_unreach, 0);
}
.
291a
hnputl(uh6->viclfl, oviclfl);
hnputs(uh6->len, olen);
uh6->nextheader = IP_UDPPROTO;
uh6->hoplimit = ottl;
.
284,285c
if(nhgets(uh4->udpcksum)) {
if(ptclcsum(bp, UDP4_PHDR_OFF, len+UDP4_PHDR_SZ)) {
upriv->ustats.udpInErrors++;
netlog(f, Logudp, "udp: checksum error %I\n", raddr);
DPRINT("udp: checksum error %I\n", raddr);
freeblist(bp);
return;
}
}
uh4->Unused = ottl;
hnputs(uh4->udpplen, olen);
}
else {
int ottl, oviclfl, olen;
uh6 = (Udp6hdr*)(bp->rp);
len = nhgets(uh6->udplen);
oviclfl = nhgetl(uh6->viclfl);
olen = nhgets(uh6->len);
ottl = uh6->hoplimit;
ipmove(raddr, uh6->udpsrc);
ipmove(laddr, uh6->udpdst);
lport = nhgets(uh6->udpdport);
rport = nhgets(uh6->udpsport);
memset(uh6, 0, 8);
hnputl(uh6->viclfl, len);
uh6->hoplimit = IP_UDPPROTO;
if(ptclcsum(bp, UDP6_PHDR_OFF, len+UDP6_PHDR_SZ)) {
.
279,282c
v4tov6(raddr, uh4->udpsrc);
v4tov6(laddr, uh4->udpdst);
lport = nhgets(uh4->udpdport);
rport = nhgets(uh4->udpsport);
.
272,277c
/* Put back pseudo header for checksum
* (remember old values for icmpnoconv()) */
if(version == 4) {
int ottl, olen;
ottl = uh4->Unused;
uh4->Unused = 0;
len = nhgets(uh4->udplen);
olen = nhgets(uh4->udpplen);
hnputs(uh4->udpplen, len);
.
270c
uh4 = (Udp4hdr*)(bp->rp);
version = ((uh4->vihl&0xF0)==IP_VER6) ? 6 : 4;
.
267d
263a
int version;
.
256,257c
int len;
Udp4hdr *uh4;
Udp6hdr *uh6;
.
240d
237,238c
ipoput6(f, bp, 0, c->ttl, c->tos);
}
.
232,235c
else {
// using the v6 ip header to create pseudo header
// first then reset it to the normal ip header
uh6 = (Udp6hdr *)(bp->rp);
memset(uh6, 0, 8);
ptcllen = dlen + UDP_UDPHDR_SZ;
hnputl(uh6->viclfl, ptcllen);
uh6->hoplimit = IP_UDPPROTO;
if(ucb->headers == 6) {
ipmove(uh6->udpdst, raddr);
hnputs(uh6->udpdport, rport);
ipmove(uh6->udpsrc, laddr);
} else {
ipmove(uh6->udpdst, c->raddr);
hnputs(uh6->udpdport, c->rport);
if(ipcmp(c->laddr, IPnoaddr) == 0)
findlocalip(f, c->laddr, c->raddr);
ipmove(uh6->udpsrc, c->laddr);
}
hnputs(uh6->udpsport, c->lport);
hnputs(uh6->udplen, ptcllen);
uh6->udpcksum[0] = 0;
uh6->udpcksum[1] = 0;
hnputs(uh6->udpcksum,
ptclcsum(bp, UDP6_PHDR_OFF, dlen+UDP_UDPHDR_SZ+UDP6_PHDR_SZ));
memset(uh6, 0, 8);
uh6->viclfl[0] = IP_VER6;
hnputs(uh6->len, ptcllen);
uh6->nextheader = IP_UDPPROTO;
.
209,230c
/* fill in pseudo header and compute checksum */
if(version == 4)
{
uh4 = (Udp4hdr *)(bp->rp);
ptcllen = dlen + UDP_UDPHDR_SZ;
uh4->Unused = 0;
uh4->udpproto = IP_UDPPROTO;
uh4->frag[0] = 0;
uh4->frag[1] = 0;
hnputs(uh4->udpplen, ptcllen);
if(ucb->headers == 4 || ucb->headers == 6) {
v6tov4(uh4->udpdst, raddr);
hnputs(uh4->udpdport, rport);
v6tov4(uh4->udpsrc, laddr);
} else {
v6tov4(uh4->udpdst, c->raddr);
hnputs(uh4->udpdport, c->rport);
if(ipcmp(c->laddr, IPnoaddr) == 0)
findlocalip(f, c->laddr, c->raddr);
v6tov4(uh4->udpsrc, c->laddr);
}
hnputs(uh4->udpsport, c->lport);
hnputs(uh4->udplen, ptcllen);
uh4->udpcksum[0] = 0;
uh4->udpcksum[1] = 0;
hnputs(uh4->udpcksum,
ptclcsum(bp, UDP4_PHDR_OFF, dlen+UDP_UDPHDR_SZ+UDP4_PHDR_SZ));
uh4->vihl = IP_VER4;
ipoput4(f, bp, 0, c->ttl, c->tos);
.
205c
if(version == 4)
bp = padblock(bp, UDP4_IPHDR_SZ+UDP_UDPHDR_SZ);
else
bp = padblock(bp, UDP6_IPHDR_SZ+UDP_UDPHDR_SZ);
.
203a
dlen = blocklen(bp);
.
202c
if(ucb->headers == 6) {
if(memcmp(laddr, v4prefix, IPv4off) == 0 ||
ipcmp(laddr, IPnoaddr) == 0)
version = 4;
else
version = 6;
}
else if(ucb->headers == 4)
version = 4;
else {
if( (memcmp(c->raddr, v4prefix, IPv4off) == 0 &&
memcmp(c->laddr, v4prefix, IPv4off) == 0)
|| ipcmp(c->raddr, IPnoaddr) == 0)
version = 4;
else
version = 6;
}
.
182c
bp->rp += 2+2; /* Ignore local port */
.
157a
int version;
.
150c
Udp4hdr *uh4;
Udp6hdr *uh6;
.
144a
qunlock(c);
.
70a
void (*etherprofiler)(char *name, int qlen);
.
47a
typedef struct Udp6hdr Udp6hdr;
struct Udp6hdr {
uchar viclfl[4];
uchar len[2];
uchar nextheader;
uchar hoplimit;
uchar udpsrc[IPaddrlen];
uchar udpdst[IPaddrlen];
/* udp header */
uchar udpsport[2]; /* Source port */
uchar udpdport[2]; /* Destination port */
uchar udplen[2]; /* data length */
uchar udpcksum[2]; /* Checksum */
};
.
38,39c
uchar udpsrc[IPv4addrlen]; /* Ip source */
uchar udpdst[IPv4addrlen]; /* Ip destination */
.
26,27c
typedef struct Udp4hdr Udp4hdr;
struct Udp4hdr
.
14,16c
UDP_UDPHDR_SZ = 8,
UDP4_PHDR_OFF = 8,
UDP4_PHDR_SZ = 12,
UDP4_IPHDR_SZ = 20,
UDP6_IPHDR_SZ = 40,
UDP6_PHDR_SZ = 40,
UDP6_PHDR_OFF = 0,
.
9a
.
8a
#include "ipv6.h"
.
## diffname ip/udp.c 2002/0508
## diff -e /n/emeliedump/2002/0507/sys/src/9/ip/udp.c /n/emeliedump/2002/0508/sys/src/9/ip/udp.c
118c
iphtadd(&upriv->ht, c);
return nil;
.
116c
if(e != nil)
return e;
.
## diffname ip/udp.c 2002/0517
## diff -e /n/emeliedump/2002/0508/sys/src/9/ip/udp.c /n/emeliedump/2002/0517/sys/src/9/ip/udp.c
573d
561,562d
## diffname ip/udp.c 2002/0601
## diff -e /n/emeliedump/2002/0517/sys/src/9/ip/udp.c /n/emeliedump/2002/0601/sys/src/9/ip/udp.c
558a
break;
default:
panic("udpadvise: version %d", version);
return; /* to avoid a warning */
.
553c
break;
case V6:
.
548c
switch(version) {
case V4:
.
464a
break;
default:
bp = nil;
panic("udpiput4: version %d", version);
}
.
463c
break;
case V6:
.
461c
switch(version){
case V4:
.
443c
c = Fsnewcall(c, raddr, rport, laddr, lport, version);
.
441a
break;
default:
panic("udpiput3: version %d", version);
}
.
440c
break;
case V6:
.
438c
switch(version){
case V4:
.
426a
break;
default:
panic("udpiput2: version %d", version);
.
424,425c
break;
case V6:
.
422c
switch(version){
case V4:
.
409a
break;
default:
panic("udpiput: version %d", version);
return; /* to avoid a warning */
.
384,386c
break;
case V6:
.
360,361c
switch(version) {
case V4:
.
349a
int ottl, oviclfl, olen;
.
327,336d
322a
break;
default:
panic("udpkick: version %d", version);
.
321d
291,292c
break;
case V6:
bp = padblock(bp, UDP6_IPHDR_SZ+UDP_UDPHDR_SZ);
if(bp == nil)
return;
.
263,264c
switch(version){
case V4:
bp = padblock(bp, UDP4_IPHDR_SZ+UDP_UDPHDR_SZ);
if(bp == nil)
return;
.
259,261d
253,257d
## diffname ip/udp.c 2002/0615
## diff -e /n/emeliedump/2002/0601/sys/src/9/ip/udp.c /n/emeliedump/2002/0615/sys/src/9/ip/udp.c
149,150c
c->rq = qopen(128*1024, 1, 0, 0);
c->wq = qopen(128*1024, 0, 0, 0);
.
## diffname ip/udp.c 2002/0625
## diff -e /n/emeliedump/2002/0615/sys/src/9/ip/udp.c /n/emeliedump/2002/0625/sys/src/9/ip/udp.c
589a
if(s->ignoreadvice)
break;
.
## diffname ip/udp.c 2002/0711
## diff -e /n/emeliedump/2002/0625/sys/src/9/ip/udp.c /n/emeliedump/2002/0711/sys/src/9/ip/udp.c
149c
c->rq = qopen(128*1024, Qmsg, 0, 0);
.
## diffname ip/udp.c 2002/0712
## diff -e /n/emeliedump/2002/0711/sys/src/9/ip/udp.c /n/emeliedump/2002/0712/sys/src/9/ip/udp.c
626d
179a
Conv *c = x;
.
178c
udpkick(void *x)
.
150c
c->wq = qopen(128*1024, Qkick, udpkick, c);
.
95a
void udpkick(void *x);
.
## diffname ip/udp.c 2003/0220
## diff -e /n/emeliedump/2002/0712/sys/src/9/ip/udp.c /n/emeliedump/2003/0220/sys/src/9/ip/udp.c
197d
186d
179c
udpkick(void *x, Block *bp)
.
151c
c->wq = qbypass(udpkick, c);
.
96c
void udpkick(void *x, Block *bp);
.
## diffname ip/udp.c 2003/0308
## diff -e /n/emeliedump/2003/0220/sys/src/9/ip/udp.c /n/emeliedump/2003/0308/sys/src/9/ip/udp.c
322c
ipoput6(f, bp, 0, c->ttl, c->tos, rc);
.
310a
rc = c;
.
304a
rc = nil;
.
286c
ipoput4(f, bp, 0, c->ttl, c->tos, rc);
.
277a
rc = c;
.
271a
rc = nil;
.
190a
Conv *rc;
.
## diffname ip/udp.c 2003/0420
## diff -e /n/emeliedump/2003/0308/sys/src/9/ip/udp.c /n/emeliedump/2003/0420/sys/src/9/ip/udp.c
548c
ucb->headers = 7;
.
544,545c
if(strcmp(f[0], "oldheaders") == 0){
ucb->headers = 6;
.
508,518d
500,506c
p = bp->rp;
ipmove(p, raddr); p += IPaddrlen;
ipmove(p, ipforme(f, laddr)==Runi ? laddr : ifc->lifc->local); p += IPaddrlen;
hnputs(p, rport); p += 2;
hnputs(p, lport);
.
496a
case 7:
/* pass the src address */
bp = padblock(bp, UDP_USEAD7);
p = bp->rp;
ipmove(p, raddr); p += IPaddrlen;
ipmove(p, laddr); p += IPaddrlen;
ipmove(p, ifc->lifc->local); p += IPaddrlen;
hnputs(p, rport); p += 2;
hnputs(p, lport);
break;
.
349a
uchar *p;
.
304c
if(ucb->headers) {
.
269c
if(ucb->headers) {
.
241,244c
} else {
.
235c
if(ucb->headers) {
.
228c
bp->rp += 2+2; /* Ignore local port */
.
221,224c
ipmove(raddr, bp->rp);
bp->rp += IPaddrlen;
ipmove(laddr, bp->rp);
bp->rp += IPaddrlen;
/* pick interface closest to dest */
.
217,218c
case 6:
/* get user specified addresses */
bp = pullupblock(bp, UDP_USEAD6);
.
213a
bp->rp += IPaddrlen; /* Ignore ifc address */
.
204c
bp = pullupblock(bp, UDP_USEAD7);
.
202c
case 7:
.
27d
25a
UDP_USEAD7 = 52,
.
|