~kris/9p

9hist

081d57ba339469767fe6cf0ddec7c75fc789cc1a — David du Colombier 23 years ago f8a89fa
Plan 9 from Bell Labs 2003-04-19
1 files changed, 32 insertions(+), 31 deletions(-)

M ip/rudp.c
M ip/rudp.c => ip/rudp.c +32 -31
@@ 30,6 30,7 @@ enum
	UDP_RHDRSIZE	= 36,	/* pseudo header + udp header + rudp header */
	UDP_IPHDR	= 8,	/* ip header */
	IP_UDPPROTO	= 254,
	UDP_USEAD7	= 52,
	UDP_USEAD6	= 36,
	UDP_USEAD4	= 12,



@@ 357,9 358,9 @@ rudpkick(void *x)

	ucb = (Rudpcb*)c->ptcl;
	switch(ucb->headers) {
	case 6:
	case 7:
		/* get user specified addresses */
		bp = pullupblock(bp, UDP_USEAD6);
		bp = pullupblock(bp, UDP_USEAD7);
		if(bp == nil)
			return;
		ipmove(raddr, bp->rp);


@@ 369,18 370,20 @@ rudpkick(void *x)
		/* pick interface closest to dest */
		if(ipforme(f, laddr) != Runi)
			findlocalip(f, laddr, raddr);
		bp->rp += IPaddrlen;		/* Ignore ifc address */
		rport = nhgets(bp->rp);

		bp->rp += 4;			/* Igonore local port */
		bp->rp += 2+2;			/* Ignore local port */
		break;
	case 4:
		bp = pullupblock(bp, UDP_USEAD4);
	case 6:
		/* get user specified addresses */
		bp = pullupblock(bp, UDP_USEAD6);
		if(bp == nil)
			return;
		v4tov6(raddr, bp->rp);
		bp->rp += IPv4addrlen;
		v4tov6(laddr, bp->rp);
		bp->rp += IPv4addrlen;
		ipmove(raddr, bp->rp);
		bp->rp += IPaddrlen;
		ipmove(laddr, bp->rp);
		bp->rp += IPaddrlen;
		/* pick interface closest to dest */
		if(ipforme(f, laddr) != Runi)
			findlocalip(f, laddr, raddr);
		rport = nhgets(bp->rp);


@@ 414,8 417,8 @@ rudpkick(void *x)
	uh->frag[1] = 0;
	hnputs(uh->udpplen, ptcllen);
	switch(ucb->headers){
	case 4:
	case 6:
	case 7:
		v6tov4(uh->udpdst, raddr);
		hnputs(uh->udpdport, rport);
		v6tov4(uh->udpsrc, laddr);


@@ 487,6 490,7 @@ rudpiput(Proto *rudp, Ipifc *ifc, Block *bp)
	ushort rport, lport;
	Rudppriv *upriv;
	Fs *f;
	uchar *p;

	upriv = rudp->priv;
	f = rudp->f;


@@ 564,27 568,24 @@ rudpiput(Proto *rudp, Ipifc *ifc, Block *bp)
		raddr, rport, laddr, lport, len);

	switch(ucb->headers){
	case 6:
	case 7:
		/* pass the src address */
		bp = padblock(bp, UDP_USEAD6);
		ipmove(bp->rp, raddr);
		if(ipforme(f, laddr) == Runi)
			ipmove(bp->rp+IPaddrlen, laddr);
		else
			ipmove(bp->rp+IPaddrlen, ifc->lifc->local);
		hnputs(bp->rp+2*IPaddrlen, rport);
		hnputs(bp->rp+2*IPaddrlen+2, lport);
		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;
	case 4:
	case 6:
		/* pass the src address */
		bp = padblock(bp, UDP_USEAD4);
		v6tov4(bp->rp, raddr);
		if(ipforme(f, laddr) == Runi)
			v6tov4(bp->rp+IPv4addrlen, laddr);
		else
			v6tov4(bp->rp+IPv4addrlen, ifc->lifc->local);
		hnputs(bp->rp + 2*IPv4addrlen, rport);
		hnputs(bp->rp + 2*IPv4addrlen + 2, lport);
		bp = padblock(bp, UDP_USEAD6);
		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);
		break;
	default:
		/* connection oriented rudp */


@@ 628,8 629,8 @@ rudpctl(Conv *c, char **f, int n)
	if(n < 1)
		return rudpunknown;

	if(strcmp(f[0], "headers4") == 0){
		ucb->headers = 4;
	if(strcmp(f[0], "headers++4") == 0){
		ucb->headers = 7;
		return nil;
	} else if(strcmp(f[0], "headers") == 0){
		ucb->headers = 6;