diff options
| author | Donald Sharp <sharpd@cumulusnetworks.com> | 2020-02-17 19:43:22 -0500 |
|---|---|---|
| committer | Donald Sharp <sharpd@cumulusnetworks.com> | 2020-02-18 09:34:18 -0500 |
| commit | 30b544edc4248221f5975293ff01d6b7103c9495 (patch) | |
| tree | c4e55bc5e0f7c3f73d058c1033cf5f3f189e0ce6 /zebra/irdp_packet.c | |
| parent | 3d0deb9c8b6ba004aecc8ca8ceed2694533976c9 (diff) | |
zebra: Fix checksum calculation to not include old checksum
As part of checksum calculation for a received packet we were
comparing the checksum returned from in_cksum. Typically
when we calculate the checksum the value stored in the checksum
must be all 0's. Store the received checksum and then set
the checksum to 0 and then compare.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
Diffstat (limited to 'zebra/irdp_packet.c')
| -rw-r--r-- | zebra/irdp_packet.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/zebra/irdp_packet.c b/zebra/irdp_packet.c index 450dfbece3..13dcab9294 100644 --- a/zebra/irdp_packet.c +++ b/zebra/irdp_packet.c @@ -78,6 +78,7 @@ static void parse_irdp_packet(char *p, int len, struct interface *ifp) int ip_hlen, iplen, datalen; struct zebra_if *zi; struct irdp_interface *irdp; + uint16_t saved_chksum; zi = ifp->info; if (!zi) @@ -121,8 +122,10 @@ static void parse_irdp_packet(char *p, int len, struct interface *ifp) icmp = (struct icmphdr *)(p + ip_hlen); + saved_chksum = icmp->checksum; + icmp->checksum = 0; /* check icmp checksum */ - if (in_cksum(icmp, datalen) != icmp->checksum) { + if (in_cksum(icmp, datalen) != saved_chksum) { flog_warn( EC_ZEBRA_IRDP_BAD_CHECKSUM, "IRDP: RX ICMP packet from %s. Bad checksum, silently ignored", |
