M ip/devip.c => ip/devip.c +6 -0
@@ 1099,6 1099,12 @@ Fsrcvpcol(Fs* f, uchar proto)
return f->t2p[proto];
}
+Proto*
+Fsrcvpcolx(Fs *f, uchar proto)
+{
+ return f->t2p[proto];
+}
+
Conv*
Fsnewcall(Conv *c, uchar *raddr, ushort rport, uchar *laddr, ushort lport)
{
M ip/icmp.c => ip/icmp.c +15 -2
@@ 141,8 141,21 @@ icmpnoconv(Fs *f, Block *bp)
{
Block *nbp;
Icmp *p, *np;
+ int i;
+ uchar addr[IPaddrlen];
p = (Icmp *)bp->rp;
+
+ /* only do this for unicast sources and destinations */
+ v4tov6(addr, p->dst);
+ i = ipforme(f, addr);
+ if((i&Runi) == 0)
+ return;
+ v4tov6(addr, p->src);
+ i = ipforme(f, addr);
+ if((i&Runi) == 0)
+ return;
+
netlog(f, Logicmp, "sending icmpnoconv -> %V\n", p->src);
nbp = allocb(ICMP_IPSIZE + ICMP_HDRSIZE + ICMP_IPSIZE + 8);
nbp->wp += ICMP_IPSIZE + ICMP_HDRSIZE + ICMP_IPSIZE + 8;
@@ 263,7 276,7 @@ icmpiput(Proto *icmp, uchar*, Block *bp)
goto raise;
}
p = (Icmp *)bp->rp;
- pr = Fsrcvpcol(icmp->f, p->proto);
+ pr = Fsrcvpcolx(icmp->f, p->proto);
if(pr != nil && pr->advise != nil) {
(*pr->advise)(pr, bp, msg);
return;
@@ 282,7 295,7 @@ icmpiput(Proto *icmp, uchar*, Block *bp)
goto raise;
}
p = (Icmp *)bp->rp;
- pr = Fsrcvpcol(icmp->f, p->proto);
+ pr = Fsrcvpcolx(icmp->f, p->proto);
if(pr != nil && pr->advise != nil) {
(*pr->advise)(pr, bp, m2);
return;
M ip/ip.h => ip/ip.h +1 -0
@@ 264,6 264,7 @@ int Fsproto(Fs*, Proto*);
int Fsbuiltinproto(Fs*, uchar);
Conv* Fsprotoclone(Proto*, char*);
Proto* Fsrcvpcol(Fs*, uchar);
+Proto* Fsrcvpcolx(Fs*, uchar);
char* Fsstdconnect(Conv*, char**, int);
char* Fsstdannounce(Conv*, char**, int);
char* Fsstdbind(Conv*, char**, int);
M ip/udp.c => ip/udp.c +3 -6
@@ 284,12 284,9 @@ udpiput(Proto *udp, uchar *ia, Block *bp)
upriv->ustats.udpNoPorts++;
netlog(f, Logudp, "udp: no conv %I!%d -> %I!%d\n", raddr, rport,
laddr, lport);
- /* don't complain about broadcasts... */
- if(ipforme(f, raddr) == 0){
- uh->Unused = ottl;
- hnputs(uh->udpplen, olen);
- icmpnoconv(f, bp);
- }
+ uh->Unused = ottl;
+ hnputs(uh->udpplen, olen);
+ icmpnoconv(f, bp);
freeblist(bp);
return;
}
M pc/vgamga2164w.c => pc/vgamga2164w.c +2 -2
@@ 54,7 54,7 @@ mga2164wlinear(VGAscr* scr, int* size, int* align)
if(p = mgapcimatch()){
aperture = p->mem[p->did==MGA2064? 1 : 0].bar & ~0x0F;
- *size = 16*1024*1024;
+ *size = (p->did==MGA2064? 8 :16)*1024*1024;
}
else
aperture = 0;
@@ 117,7 117,7 @@ mga2164wenable(VGAscr* scr)
scr->io = (ulong)KADDR(scr->io);
/* need to map frame buffer here too, so vga can find memory size */
- size = 16*1024*1024;
+ size = (p->did==MGA2064? 8 :16)*1024*1024;
align = 0;
aperture = mga2164wlinear(scr, &size, &align);
if(aperture) {