From 38893d906b7a6de884bb06d77d5ead0d9b3fe8fd Mon Sep 17 00:00:00 2001 From: FUJITA Tomonori Date: Tue, 6 Aug 2013 16:23:56 +0900 Subject: [PATCH] packet lib: make vrrp get_payload robust Let's not make an assumption about the position of IP(v4 or v6) and VRRP. The original code excepts pure ether or vlan and search them in try-and-error way. Signed-off-by: FUJITA Tomonori --- ryu/lib/packet/vrrp.py | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/ryu/lib/packet/vrrp.py b/ryu/lib/packet/vrrp.py index 772d913b..ab544e7c 100644 --- a/ryu/lib/packet/vrrp.py +++ b/ryu/lib/packet/vrrp.py @@ -211,21 +211,25 @@ class vrrp(packet_base.PacketBase): @staticmethod def get_payload(packet_): - protocols = packet_.protocols + may_ip = None + may_vrrp = None - try: - may_ip, may_vrrp = protocols[-2], protocols[-1] - if isinstance(may_vrrp, bytearray): - may_ip, may_vrrp = protocols[-3], protocols[-2] - except IndexError: - return None, None + idx = 0 + for protocol in packet_: + if isinstance(protocol, ipv4.ipv4) or isinstance(protocol, + ipv6.ipv6): + may_ip = protocol + try: + if isinstance(packet_.protocols[idx + 1], vrrp): + may_vrrp = packet_.protocols[idx + 1] + finally: + break + idx += 1 - if (not isinstance(may_ip, ipv4.ipv4) and - not isinstance(may_ip, ipv6.ipv6)): + if may_ip and may_vrrp: + return may_ip, may_vrrp + else: return None, None - if not isinstance(may_vrrp, vrrp): - return None, None - return may_ip, may_vrrp @classmethod def register_vrrp_version(cls, version,