diff options
Diffstat (limited to 'pimd/pim_msg.c')
| -rw-r--r-- | pimd/pim_msg.c | 13 |
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; } |
