M ip/rudp.c => ip/rudp.c +2 -4
@@ 492,7 492,7 @@ rudpiput(Proto *rudp, uchar *ia, Block *bp)
break;
default:
/* connection oriented rudp */
- if(c->raddr == 0){
+ if(ipcmp(c->raddr, IPnoaddr) == 0){
/* save the src address in the conversation */
ipmove(c->raddr, raddr);
c->rport = rport;
@@ 691,7 691,7 @@ relstate(Rudpcb *ucb, uchar *addr, ushort port, char *from)
/* no state for this addr/port, create some */
if(r == nil){
if(generation == 0)
- generation = TK2SEC(MACHP(0)->ticks);
+ generation = rand();
DPRINT("from %s new state %d for %I!%d\n",
from, generation, addr, port);
r = smalloc(sizeof(Reliable));
@@ 728,8 728,6 @@ reliput(Conv *c, Block *bp, uchar *addr, ushort port)
Rudphdr *rh;
ulong seq, ack, sgen, agen, ackreal;
-
-
/* get fields */
uh = (Udphdr*)(bp->rp);
rh = (Rudphdr*)uh;
M ip/udp.c => ip/udp.c +1 -1
@@ 345,7 345,7 @@ udpiput(Proto *udp, uchar *ia, Block *bp)
break;
default:
/* connection oriented udp */
- if(c->raddr == 0){
+ if(ipcmp(c->raddr, IPnoaddr) == 0){
/* save the src address in the conversation */
ipmove(c->raddr, raddr);
c->rport = rport;
M pc/trap.c => pc/trap.c +7 -7
@@ 322,11 322,13 @@ fault386(Ureg* ureg, void*)
int read, user, n, insyscall;
char buf[ERRLEN];
- insyscall = up->insyscall;
- up->insyscall = 1;
addr = getcr2();
+ user = (ureg->cs & 0xFFFF) == UESEL;
+ if(!user && mmukmapsync(addr))
+ return;
read = !(ureg->ecode & 2);
- user = (ureg->cs&0xffff) == UESEL;
+ insyscall = up->insyscall;
+ up->insyscall = 1;
spllo();
n = fault(addr, read);
if(n < 0){
@@ 336,10 338,8 @@ fault386(Ureg* ureg, void*)
postnote(up, 1, buf, NDebug);
return;
}
- if(mmukmapsync(addr) == 0){
- dumpregs(ureg);
- panic("fault: 0x%lux\n", addr);
- }
+ dumpregs(ureg);
+ panic("fault: 0x%lux\n", addr);
}
up->insyscall = insyscall;
}
M port/devcons.c => port/devcons.c +14 -9
@@ 31,7 31,7 @@ char sysname[NAMELEN];
static ulong randomread(void*, ulong);
static void randominit(void);
-static void seednrand(void);
+static void seedrand(void);
static long qtimer(long, vlong);
int qtimerentry = -1;
@@ 462,12 462,6 @@ consinit(void)
static Chan*
consattach(char *spec)
{
- static int seeded;
-
- if(!seeded){
- seednrand();
- seeded = 1;
- }
return devattach('c', spec);
}
@@ 945,7 939,7 @@ static struct
} rb;
static void
-seednrand(void)
+seedrand(void)
{
randomread((void*)&rb.randn, sizeof(rb.randn));
}
@@ 953,10 947,20 @@ seednrand(void)
int
nrand(int n)
{
+ if(rb.randn == 0)
+ seedrand();
rb.randn = rb.randn*1103515245 + 12345 + MACHP(0)->ticks;
return (rb.randn>>16) % n;
}
+int
+rand(void)
+{
+ nrand(1);
+ return rb.randn;
+}
+
+
static int
rbnotfull(void*)
{
@@ 1073,7 1077,8 @@ randomread(void *xp, ulong n)
}
static long
-qtimer(long n, vlong offset) {
+qtimer(long n, vlong offset)
+{
/* block until time ≥ offset;
* add n to offset
* return increment to offset (i.e., n)
M port/portfns.h => port/portfns.h +1 -0
@@ 236,6 236,7 @@ int qwindow(Queue*);
int qwrite(Queue*, void*, int);
void qsetlimit(Queue*, int);
void qnoblock(Queue*, int);
+int rand(void);
int readnum(ulong, char*, ulong, ulong, int);
int readstr(ulong, char*, ulong, char*);
void ready(Proc*);