summaryrefslogtreecommitdiff
path: root/pimd/pim_msg.c
diff options
context:
space:
mode:
Diffstat (limited to 'pimd/pim_msg.c')
-rw-r--r--pimd/pim_msg.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/pimd/pim_msg.c b/pimd/pim_msg.c
index 7ea7b1ad82..ab14b3ae5f 100644
--- a/pimd/pim_msg.c
+++ b/pimd/pim_msg.c
@@ -35,6 +35,7 @@
#include "pim_iface.h"
#include "pim_rp.h"
#include "pim_rpf.h"
+#include "pim_register.h"
void pim_msg_build_header(uint8_t *pim_msg, int pim_msg_size,
uint8_t pim_msg_type)
@@ -54,8 +55,16 @@ void pim_msg_build_header(uint8_t *pim_msg, int pim_msg_size,
* Compute checksum
*/
- *(uint16_t *) PIM_MSG_HDR_OFFSET_CHECKSUM(pim_msg) = 0;
- checksum = in_cksum(pim_msg, pim_msg_size);
+ *(uint16_t *) PIM_MSG_HDR_OFFSET_CHECKSUM (pim_msg) = 0;
+ /*
+ * The checksum for Registers is done only on the first 8 bytes of the packet,
+ * including the PIM header and the next 4 bytes, excluding the data packet portion
+ */
+ if (pim_msg_type == PIM_MSG_TYPE_REGISTER)
+ checksum = in_cksum (pim_msg, PIM_MSG_REGISTER_LEN);
+ else
+ checksum = in_cksum (pim_msg, pim_msg_size);
+
*(uint16_t *) PIM_MSG_HDR_OFFSET_CHECKSUM(pim_msg) = checksum;
}