diff --git a/scapy/contrib/cdp.py b/scapy/contrib/cdp.py index 12794c7b929469c2f4e904e8e057f07236542891..8da85d11c00fc00c3801452c010d2bf3740bed16 100644 --- a/scapy/contrib/cdp.py +++ b/scapy/contrib/cdp.py @@ -288,10 +288,24 @@ class CDPMsg(CDPMsgGeneric): StrLenField("val", "", length_from=lambda x:x.len - 4) ] class _CDPChecksum: + def _check_len(self, pkt): + """Check for odd packet length and pad according to Cisco spec""" + if len(pkt) % 2: + last_chr = pkt[-1] + if ord(last_chr) <=0x80: + ck_p = pkt[:-1] + '\x00' + last_chr + else: + ck_p = pkt[:-1] + '\xff' + chr(ord(last_chr) - 1) + else: + ck_p = pkt + + return ck_p + def post_build(self, pkt, pay): p = pkt + pay + ck_p = self._check_len(p) if self.cksum is None: - cksum = checksum(p) + cksum = checksum(ck_p) p = p[:2] + struct.pack("!H", cksum) + p[4:] return p