summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2018-06-14 00:08:46 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2018-06-14 00:08:46 +0200
commit4d496b3c7ac69d094e4beb02e6426f47bc357e9a (patch)
tree26599342ea0807ca97ccd6ebae7c8e02a9fc73bc
parent21a221129af5d0599023149734ba040fea41719c (diff)
parentde9141bc6d0d0d51abc39cd6b7e199c9ddf18010 (diff)
merge
-rw-r--r--sys/src/9/ip/ethermedium.c14
-rw-r--r--sys/src/9/ip/ipifc.c5
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 */