summaryrefslogtreecommitdiff
path: root/zebra/irdp_packet.c
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@cumulusnetworks.com>2020-02-17 19:43:22 -0500
committerDonald Sharp <sharpd@cumulusnetworks.com>2020-02-18 09:34:18 -0500
commit30b544edc4248221f5975293ff01d6b7103c9495 (patch)
treec4e55bc5e0f7c3f73d058c1033cf5f3f189e0ce6 /zebra/irdp_packet.c
parent3d0deb9c8b6ba004aecc8ca8ceed2694533976c9 (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.c5
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",