diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2018-06-14 00:08:46 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2018-06-14 00:08:46 +0200 |
commit | 4d496b3c7ac69d094e4beb02e6426f47bc357e9a (patch) | |
tree | 26599342ea0807ca97ccd6ebae7c8e02a9fc73bc | |
parent | 21a221129af5d0599023149734ba040fea41719c (diff) | |
parent | de9141bc6d0d0d51abc39cd6b7e199c9ddf18010 (diff) |
merge
-rw-r--r-- | sys/src/9/ip/ethermedium.c | 14 | ||||
-rw-r--r-- | sys/src/9/ip/ipifc.c | 5 |
2 files changed, 14 insertions, 5 deletions
diff --git a/sys/src/9/ip/ethermedium.c b/sys/src/9/ip/ethermedium.c index 3aa74f42f..6471355c1 100644 --- a/sys/src/9/ip/ethermedium.c +++ b/sys/src/9/ip/ethermedium.c @@ -449,6 +449,7 @@ sendarp(Ipifc *ifc, Arpent *a) Block *bp; Etherarp *e; Etherrock *er = ifc->arg; + uchar targ[IPv4addrlen], src[IPv4addrlen]; /* don't do anything if it's been less than a second since the last */ if(NOW - a->ctime < 1000){ @@ -456,6 +457,9 @@ sendarp(Ipifc *ifc, Arpent *a) return; } + /* try to keep it around for a second more */ + a->ctime = NOW; + /* remove all but the last message */ while((bp = a->hold) != nil){ if(bp == a->last) @@ -464,18 +468,20 @@ sendarp(Ipifc *ifc, Arpent *a) freeblist(bp); } - /* try to keep it around for a second more */ - a->ctime = NOW; + memmove(targ, a->ip+IPv4off, IPv4addrlen); arprelease(er->f->arp, a); + if(!ipv4local(ifc, src, targ)) + return; + n = sizeof(Etherarp); if(n < ifc->m->mintu) n = ifc->m->mintu; bp = allocb(n); memset(bp->rp, 0, n); e = (Etherarp*)bp->rp; - memmove(e->tpa, a->ip+IPv4off, sizeof(e->tpa)); - ipv4local(ifc, e->spa, e->tpa); + memmove(e->tpa, targ, sizeof(e->tpa)); + memmove(e->spa, src, sizeof(e->spa)); memmove(e->sha, ifc->mac, sizeof(e->sha)); memset(e->d, 0xff, sizeof(e->d)); /* ethernet broadcast */ memmove(e->s, ifc->mac, sizeof(e->s)); diff --git a/sys/src/9/ip/ipifc.c b/sys/src/9/ip/ipifc.c index b2fc1676c..302d72df7 100644 --- a/sys/src/9/ip/ipifc.c +++ b/sys/src/9/ip/ipifc.c @@ -1274,7 +1274,7 @@ ipv4local(Ipifc *ifc, uchar *local, uchar *remote) b = -1; for(lifc = ifc->lifc; lifc != nil; lifc = lifc->next){ - if((lifc->type & Rv4) == 0) + if((lifc->type & Rv4) == 0 || ipcmp(lifc->local, IPnoaddr) == 0) continue; a = comprefixlen(lifc->local+IPv4off, remote, IPv4addrlen); if(a > b){ @@ -1466,6 +1466,9 @@ ipifcaddmulti(Conv *c, uchar *ma, uchar *ia) Ipifc *ifc; Fs *f; + if(isv4(ma) != isv4(ia)) + error("incompatible multicast/interface ip address"); + for(l = &c->multi; *l != nil; l = &(*l)->next) if(ipcmp(ma, (*l)->ma) == 0 && ipcmp(ia, (*l)->ia) == 0) return; /* it's already there */ |