diff --git a/ryu/lib/packet/packet_utils.py b/ryu/lib/packet/packet_utils.py index 9331472a..e797e6e2 100644 --- a/ryu/lib/packet/packet_utils.py +++ b/ryu/lib/packet/packet_utils.py @@ -97,3 +97,40 @@ def checksum_ip(ipvx, length, payload): buf = header + payload 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)