diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2019-03-07 01:25:11 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2019-03-07 01:25:11 +0100 |
commit | 4885c75526f91ff9eb245b32a63512e2e67b3038 (patch) | |
tree | 72245162aa01144cbcdb797c977d50f66db345d5 /sys/src/9/ip | |
parent | 88e054ffdfed8fd229b00d4f6311aefdb769cf0d (diff) |
devip: ignore icmp advise about laggard fragments
icmp has to advise protocols about the first
fragment only. all other fragments should be
ignored.
Diffstat (limited to 'sys/src/9/ip')
-rw-r--r-- | sys/src/9/ip/icmp.c | 10 | ||||
-rw-r--r-- | sys/src/9/ip/icmp6.c | 11 |
2 files changed, 12 insertions, 9 deletions
diff --git a/sys/src/9/ip/icmp.c b/sys/src/9/ip/icmp.c index 51f041b38..90c289f4b 100644 --- a/sys/src/9/ip/icmp.c +++ b/sys/src/9/ip/icmp.c @@ -401,10 +401,12 @@ icmpiput(Proto *icmp, Ipifc*, Block *bp) goto raise; } p = (Icmp *)bp->rp; - pr = Fsrcvpcolx(icmp->f, p->proto); - if(pr != nil && pr->advise != nil) { - (*pr->advise)(pr, bp, msg); - return; + if((nhgets(p->frag) & ~(IP_DF|IP_MF)) == 0){ + pr = Fsrcvpcolx(icmp->f, p->proto); + if(pr != nil && pr->advise != nil) { + (*pr->advise)(pr, bp, msg); + return; + } } bp->rp -= ICMP_IPSIZE+ICMP_HDRSIZE; goticmpkt(icmp, bp); diff --git a/sys/src/9/ip/icmp6.c b/sys/src/9/ip/icmp6.c index 783408076..4f483a79d 100644 --- a/sys/src/9/ip/icmp6.c +++ b/sys/src/9/ip/icmp6.c @@ -725,11 +725,12 @@ icmpiput6(Proto *icmp, Ipifc *ifc, Block *bp) bp->rp -= IP6HDR; } } - - pr = Fsrcvpcolx(icmp->f, p->proto); - if(pr != nil && pr->advise != nil) { - (*pr->advise)(pr, bp, msg); - return; + if(p->proto != FH){ + pr = Fsrcvpcolx(icmp->f, p->proto); + if(pr != nil && pr->advise != nil) { + (*pr->advise)(pr, bp, msg); + return; + } } bp->rp -= IPICMPSZ; goticmpkt6(icmp, bp, 0); |