lib/packet/packet_utils: Add a function to calculate fletcher checksum
I'm resending the patches which appease pep8 fletcher checksum function for OSPF LSA checksum. refer to RFC1008. Signed-off-by: Wataru ISHIDA <ishida.wataru@lab.ntt.co.jp> Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
This commit is contained in:
parent
31c0941fb8
commit
23b1226cd2
@ -97,3 +97,40 @@ def checksum_ip(ipvx, length, payload):
|
|||||||
|
|
||||||
buf = header + payload
|
buf = header + payload
|
||||||
return checksum(buf)
|
return checksum(buf)
|
||||||
|
|
||||||
|
_MODX = 4102
|
||||||
|
|
||||||
|
|
||||||
|
def fletcher_checksum(data, offset):
|
||||||
|
"""
|
||||||
|
Fletcher Checksum -- Refer to RFC1008
|
||||||
|
|
||||||
|
calling with offset == _FLETCHER_CHECKSUM_VALIDATE will validate the
|
||||||
|
checksum without modifying the buffer; a valid checksum returns 0.
|
||||||
|
"""
|
||||||
|
c0 = 0
|
||||||
|
c1 = 0
|
||||||
|
pos = 0
|
||||||
|
length = len(data)
|
||||||
|
data = bytearray(data)
|
||||||
|
data[offset:offset+2] = [0]*2
|
||||||
|
|
||||||
|
while pos < length:
|
||||||
|
tlen = min(length - pos, _MODX)
|
||||||
|
for d in data[pos:pos+tlen]:
|
||||||
|
c0 += d
|
||||||
|
c1 += c0
|
||||||
|
c0 %= 255
|
||||||
|
c1 %= 255
|
||||||
|
pos += tlen
|
||||||
|
|
||||||
|
x = ((length - offset - 1) * c0 - c1) % 255
|
||||||
|
if x <= 0:
|
||||||
|
x += 255
|
||||||
|
y = 510 - c0 - x
|
||||||
|
if y > 255:
|
||||||
|
y -= 255
|
||||||
|
|
||||||
|
data[offset] = x
|
||||||
|
data[offset+1] = y
|
||||||
|
return (x << 8) | (y & 0xff)
|
||||||
|
Loading…
Reference in New Issue
Block a user