This commit has some improvements for the code related to the OpenFlow 1.2
The changes are:
- On match unpack, insert the proper match tlv object. (e.g, if the oxm field is
an inport, insert and inport object).
- Add a compare method to oxm_tlvs and match_list, because there was not how to test
if the match in messages like flow_stats or flow_removed were correctly sent by the switch.
- Improvements to the print format of oxm_tlvs.
Also, there is a minor fix for the groups test.
diff --git a/src/python/of12/match.py b/src/python/of12/match.py
index de285a2..c732467 100644
--- a/src/python/of12/match.py
+++ b/src/python/of12/match.py
@@ -1,12 +1,15 @@
# Python OpenFlow instruction wrapper classes
+import struct
import ipaddr
+import socket
from cstruct import *
-class oxm_tlv:
- def __init__(self, field, hasmask, length, value, mask=None, class_ = 0x8000):
+class oxm_tlv(object):
+ def __init__(self, field, hasmask, length, value, mask=None,
+ class_ = 0x8000):
self.class_ = class_
self.field = field
self.hasmask = hasmask
@@ -14,10 +17,17 @@
self.value = value
self.mask = mask
+ def __eq__(self, other):
+ return (self.class_ == other.class_ and self.field == other.field
+ and self.hasmask == other.hasmask and
+ self.length == other.length and self.value == other.value and
+ self.mask == self.mask)
+
def pack(self, assertstruct=True):
packed = ""
- packed += struct.pack("!I", ((self.class_ << 16) | (self.field << 9) | (self.hasmask << 8) | self.length))
+ packed += struct.pack("!I", ((self.class_ << 16) | (self.field << 9) |
+ (self.hasmask << 8) | self.length))
if self.length == 1:
packed += struct.pack("B", self.value)
if self.hasmask:
@@ -31,9 +41,11 @@
if self.hasmask:
packed += struct.pack("!I", self.mask)
elif self.length == 6 or self.length == 12:
- packed += struct.pack("!BBBBBB", self.value[0],self.value[1],self.value[2],self.value[3],self.value[4],self.value[5])
+ packed += struct.pack("!BBBBBB", self.value[0],self.value[1],
+ self.value[2],self.value[3],self.value[4],self.value[5])
if self.hasmask:
- packed += struct.pack("!BBBBBB", self.mask[0],self.mask[1],self.mask[2],self.mask[3],self.mask[4],self.mask[5])
+ packed += struct.pack("!BBBBBB", self.mask[0],self.mask[1],
+ self.mask[2],self.mask[3],self.mask[4],self.mask[5])
elif self.length == 8 or (self.length == 16 and self.hasmask == True):
packed += struct.pack("!Q", self.value)
if self.hasmask:
@@ -50,11 +62,33 @@
def show(self, prefix=''):
return "\n".join(
# ("oxm_tlv_class=" + hex(self.class_),
- ("oxm_tlv_class=" + str(self.class_),
- "oxm_tlv_field=" + hex(self.field),
- "oxm_tlv_hasmask=" + str(bool(self.hasmask)),
- "oxm_tlv_length: " + hex(self.length),
- "value: " + str(self.value),))
+ (prefix + "oxm_tlv_class=" + hex(self.class_),
+ prefix + "oxm_tlv_field=" + str(self.field),
+ prefix +"oxm_tlv_hasmask=" + str(bool(self.hasmask)),
+ prefix +"oxm_tlv_length: " + str(self.length) + "\n",))
+
+
+ subclasses = {}
+
+ def set_value(self, value):
+ self.value = value
+
+ def set_hasmask(self, hasmask):
+ self.hasmask = hasmask
+
+ def set_mask(self, mask):
+ self.mask = mask
+
+ @staticmethod
+ def factory():
+ for subclass in oxm_tlv.__subclasses__():
+ obj = subclass()
+ oxm_tlv.subclasses[obj.field] = subclass
+
+ @staticmethod
+ def create(field):
+ return oxm_tlv.subclasses[field]()
+
def roundup (x,y):
@@ -71,11 +105,12 @@
@arg body
"""
- def __init__(self, value, hasmask = False):
+ def __init__(self, value=None, hasmask=False):
oxm_tlv.__init__(self, OFPXMT_OFB_IN_PORT , hasmask, 4, value)
def show(self, prefix=''):
- outstr = prefix + "in_port\n"
- outstr += oxm_tlv.show(self, prefix)
+ outstr = prefix + "name = in_port\n"
+ outstr += oxm_tlv.show(self, prefix)
+ outstr += prefix + "value = " + str(self.value) +"\n"
return outstr
@@ -90,11 +125,12 @@
@arg body
"""
- def __init__(self, value, hasmask = False):
+ def __init__(self, value=None, hasmask=False):
oxm_tlv.__init__(self,OFPXMT_OFB_IN_PHY_PORT, hasmask, 4, value)
def show(self, prefix=''):
- outstr = prefix + "in_phy_port\n"
+ outstr = prefix + "name = in_phy_port\n"
outstr += oxm_tlv.show(self, prefix)
+ outstr += prefix + "value = " + str(self.value) +"\n"
return outstr
@@ -109,14 +145,15 @@
@arg body
"""
- def __init__(self, value, mask = None):
+ def __init__(self, value=None, mask =None):
if mask == None:
oxm_tlv.__init__(self, OFPXMT_OFB_METADATA, False, 8, value)
else:
oxm_tlv.__init__(self, OFPXMT_OFB_METADATA, True, 16, value, mask)
def show(self, prefix=''):
- outstr = prefix + "metadata\n"
+ outstr = prefix + "name = metadata\n"
outstr += oxm_tlv.show(self, prefix)
+ outstr += prefix + "value = " + str(self.value) +"\n"
return outstr
class eth_dst(oxm_tlv):
@@ -130,14 +167,16 @@
@arg body
"""
- def __init__(self, value, mask = None):
+ def __init__(self, value=None, mask=None):
if mask == None:
oxm_tlv.__init__(self, OFPXMT_OFB_ETH_DST, False, 6, value)
else:
oxm_tlv.__init__(self, OFPXMT_OFB_ETH_DST, True, 12, value, mask)
def show(self, prefix=''):
- outstr = prefix + "eth_dst\n"
+ outstr = prefix + "name = eth_dst\n"
outstr += oxm_tlv.show(self, prefix)
+ outstr += prefix + "value = " + ":".join(["%.2x" %x
+ for x in self.value]) +"\n"
return outstr
class eth_src(oxm_tlv):
@@ -151,14 +190,17 @@
@arg body
"""
- def __init__(self, value, hasmask = False):
+ def __init__(self, value=None, hasmask=False):
if not hasmask:
oxm_tlv.__init__(self, OFPXMT_OFB_ETH_SRC, hasmask, 6, value)
else:
- oxm_tlv.__init__(self, OFPXMT_OFB_ETH_SRC, hasmask, 12, value, mask)
+ oxm_tlv.__init__(self, OFPXMT_OFB_ETH_SRC, hasmask, 12,
+ value, mask)
def show(self, prefix=''):
- outstr = prefix + "eth_src\n"
+ outstr = prefix + "name = eth_src\n"
outstr += oxm_tlv.show(self, prefix)
+ outstr += prefix + "value = " + ":".join(["%.2x" %x
+ for x in self.value]) +"\n"
return outstr
class eth_type(oxm_tlv):
@@ -172,11 +214,12 @@
@arg body
"""
- def __init__(self, value, hasmask = False):
+ def __init__(self, value=None, hasmask=False):
oxm_tlv.__init__(self, OFPXMT_OFB_ETH_TYPE, hasmask, 2, value)
def show(self, prefix=''):
- outstr = prefix + "eth_type\n"
+ outstr = prefix + "name = eth_type\n"
outstr += oxm_tlv.show(self, prefix)
+ outstr += prefix + "value = " + hex(self.value) +"\n"
return outstr
class vlan_vid(oxm_tlv):
@@ -190,11 +233,12 @@
@arg body
"""
- def __init__(self, value, hasmask = False):
+ def __init__(self, value=None, hasmask=False):
oxm_tlv.__init__(self, OFPXMT_OFB_VLAN_VID, hasmask, 2, value)
def show(self, prefix=''):
- outstr = prefix + "vlan_vid\n"
+ outstr = prefix + "name = vlan_vid\n"
outstr += oxm_tlv.show(self, prefix)
+ outstr += prefix + "value = " + str(self.value) +"\n"
return outstr
class vlan_pcp(oxm_tlv):
@@ -208,11 +252,12 @@
@arg body
"""
- def __init__(self, value, hasmask = False):
+ def __init__(self, value=None, hasmask=False):
oxm_tlv.__init__(self, OFPXMT_OFB_VLAN_PCP, hasmask, 1, value)
def show(self, prefix=''):
- outstr = prefix + "vlan_pcp\n"
+ outstr = prefix + "name = vlan_pcp\n"
outstr += oxm_tlv.show(self, prefix)
+ outstr += prefix + "value = " + str(self.value) +"\n"
return outstr
class ip_dscp(oxm_tlv):
@@ -226,11 +271,12 @@
@arg body
"""
- def __init__(self, value, hasmask = False):
+ def __init__(self, value=None, hasmask=False):
oxm_tlv.__init__(self, OFPXMT_OFB_IP_DSCP, hasmask, 1, value)
def show(self, prefix=''):
- outstr = prefix + "ip_dscp\n"
+ outstr = prefix + "name = ip_dscp\n"
outstr += oxm_tlv.show(self, prefix)
+ outstr += prefix + "value = " + str(self.value) +"\n"
return outstr
class ip_ecn(oxm_tlv):
@@ -244,11 +290,12 @@
@arg body
"""
- def __init__(self, value, hasmask = False):
+ def __init__(self, value=None, hasmask=False):
oxm_tlv.__init__(self, OFPXMT_OFB_IP_ECN, hasmask, 1, value)
def show(self, prefix=''):
- outstr = prefix + "ip_ecn\n"
+ outstr = prefix + "name = ip_ecn\n"
outstr += oxm_tlv.show(self, prefix)
+ outstr += prefix + "value = " + str(self.value) +"\n"
return outstr
class ip_proto(oxm_tlv):
@@ -262,11 +309,12 @@
@arg body
"""
- def __init__(self, value, hasmask = False):
+ def __init__(self, value=None, hasmask=False):
oxm_tlv.__init__(self, OFPXMT_OFB_IP_PROTO, hasmask, 1, value)
def show(self, prefix=''):
- outstr = prefix + "ip_proto\n"
+ outstr = prefix + "name = ip_proto\n"
outstr += oxm_tlv.show(self, prefix)
+ outstr += prefix + "value = " + str(self.value) +"\n"
return outstr
class ipv4_src(oxm_tlv):
@@ -280,14 +328,20 @@
@arg body
"""
- def __init__(self, value, hasmask = False):
+ def __init__(self, value=None, hasmask=False):
if not hasmask:
oxm_tlv.__init__(self, OFPXMT_OFB_IPV4_SRC, hasmask, 4, value)
else:
oxm_tlv.__init__(self, OFPXMT_OFB_IPV4_SRC, hasmask, 4, value, mask)
def show(self, prefix=''):
- outstr = prefix + "ipv4_src\n"
+ outstr = prefix + "name = ipv4_src\n"
outstr += oxm_tlv.show(self, prefix)
+ #Value can be a long int or a string
+ try:
+ addr = ipaddr.IPv4Address(self.value)
+ except ValueError:
+ addr = ipaddr.IPv4Address(int(self.value, 16))
+ outstr += prefix + "value = " + str(addr) +"\n"
return outstr
class ipv4_dst(oxm_tlv):
@@ -301,14 +355,20 @@
@arg body
"""
- def __init__(self, value, hasmask = False):
+ def __init__(self, value=None, hasmask=False):
if not hasmask:
oxm_tlv.__init__(self, OFPXMT_OFB_IPV4_DST, hasmask, 4, value)
else:
oxm_tlv.__init__(self, OFPXMT_OFB_IPV4_DST, hasmask, 4, value, mask)
def show(self, prefix=''):
- outstr = prefix + "ipv4_dst\n"
+ outstr = prefix + "name = ipv4_dst\n"
outstr += oxm_tlv.show(self, prefix)
+ #Value can be a long int or a string
+ #try:
+ addr = ipaddr.IPv4Address(self.value)
+ #except ValueError:
+ # addr = ipaddr.IPv4Address(int(self.value, 16))
+ outstr += prefix + "value = " + str(addr) +"\n"
return outstr
class tcp_src(oxm_tlv):
@@ -322,11 +382,12 @@
@arg body
"""
- def __init__(self, value, hasmask = False):
+ def __init__(self, value=None, hasmask=False):
oxm_tlv.__init__(self, OFPXMT_OFB_TCP_SRC, hasmask, 2, value)
def show(self, prefix=''):
- outstr = prefix + "tcp_src\n"
+ outstr = prefix + "name = tcp_src\n"
outstr += oxm_tlv.show(self, prefix)
+ outstr += prefix + "value = " + str(self.value) +"\n"
return outstr
class tcp_dst(oxm_tlv):
@@ -340,11 +401,12 @@
@arg body
"""
- def __init__(self, value, hasmask = False):
+ def __init__(self, value=None, hasmask=False):
oxm_tlv.__init__(self, OFPXMT_OFB_TCP_DST, hasmask, 2, value)
def show(self, prefix=''):
- outstr = prefix + "tcp_dst\n"
+ outstr = prefix + "name = tcp_dst\n"
outstr += oxm_tlv.show(self, prefix)
+ outstr += prefix + "value = " + str(self.value) +"\n"
return outstr
class udp_src(oxm_tlv):
@@ -358,11 +420,12 @@
@arg body
"""
- def __init__(self, value, hasmask = False):
+ def __init__(self, value=None, hasmask=False):
oxm_tlv.__init__(self, OFPXMT_OFB_UDP_SRC, hasmask, 2, value)
def show(self, prefix=''):
- outstr = prefix + "udp_src\n"
+ outstr = prefix + "name = udp_src\n"
outstr += oxm_tlv.show(self, prefix)
+ outstr += prefix + "value = " + str(self.value) +"\n"
return outstr
class udp_dst(oxm_tlv):
@@ -376,11 +439,12 @@
@arg body
"""
- def __init__(self, value, hasmask = False):
+ def __init__(self, value=None, hasmask=False):
oxm_tlv.__init__(self, OFPXMT_OFB_UDP_DST, hasmask, 2, value)
def show(self, prefix=''):
- outstr = prefix + "udp_dst\n"
+ outstr = prefix + "name = udp_dst\n"
outstr += oxm_tlv.show(self, prefix)
+ outstr += prefix + "value = " + str(self.value) +"\n"
return outstr
class sctp_src(oxm_tlv):
@@ -394,11 +458,12 @@
@arg body
"""
- def __init__(self, value, hasmask = False):
+ def __init__(self, value=None, hasmask=False):
oxm_tlv.__init__(self, OFPXMT_OFB_SCTP_SRC, hasmask, 2, value)
def show(self, prefix=''):
- outstr = prefix + "sctp_src\n"
+ outstr = prefix + "name = sctp_src\n"
outstr += oxm_tlv.show(self, prefix)
+ outstr += prefix + "value = " + str(self.value) +"\n"
return outstr
@@ -413,11 +478,12 @@
@arg body
"""
- def __init__(self, value, hasmask = False):
+ def __init__(self, value=None, hasmask=False):
oxm_tlv.__init__(self, OFPXMT_OFB_SCTP_DST, hasmask, 2, value)
def show(self, prefix=''):
- outstr = prefix + "sctp_dst\n"
+ outstr = prefix + "name = sctp_dst\n"
outstr += oxm_tlv.show(self, prefix)
+ outstr += prefix + "value = " + str(self.value) +"\n"
return outstr
class icmpv4_type(oxm_tlv):
@@ -431,11 +497,12 @@
@arg body
"""
- def __init__(self, value, hasmask = False):
+ def __init__(self, value=None, hasmask=False):
oxm_tlv.__init__(self, OFPXMT_OFB_ICMPV4_TYPE, hasmask, 1, value)
def show(self, prefix=''):
- outstr = prefix + "icmpv4_type\n"
+ outstr = prefix + "name = icmpv4_type\n"
outstr += oxm_tlv.show(self, prefix)
+ outstr += prefix + "value = " + str(self.value) +"\n"
return outstr
class icmpv4_code(oxm_tlv):
@@ -449,11 +516,12 @@
@arg body
"""
- def __init__(self, value, hasmask = False):
+ def __init__(self, value=None, hasmask=False):
oxm_tlv.__init__(self, OFPXMT_OFB_ICMPV4_CODE, hasmask, 1, value)
def show(self, prefix=''):
- outstr = prefix + "icmpv4_code\n"
+ outstr = prefix + "name = icmpv4_code\n"
outstr += oxm_tlv.show(self, prefix)
+ outstr += prefix + "value = " + str(self.value) +"\n"
return outs
class arp_op(oxm_tlv):
@@ -467,11 +535,12 @@
@arg body
"""
- def __init__(self, value, hasmask = False):
+ def __init__(self, value=None, hasmask=False):
oxm_tlv.__init__(self, OFPXMT_OFB_ARP_OP, hasmask, 2, value)
def show(self, prefix=''):
- outstr = prefix + "arp_op\n"
+ outstr = prefix + "name = arp_op\n"
outstr += oxm_tlv.show(self, prefix)
+ outstr += prefix + "value = " + str(self.value) +"\n"
return outs
class arp_spa(oxm_tlv):
@@ -485,14 +554,20 @@
@arg body
"""
- def __init__(self, value, hasmask = False):
+ def __init__(self, value=None, hasmask=False):
if not hasmask:
oxm_tlv.__init__(self, OFPXMT_OFB_ARP_SPA, hasmask, 4, value)
else:
oxm_tlv.__init__(self, OFPXMT_OFB_ARP_SPA, hasmask, 4, value, mask)
def show(self, prefix=''):
- outstr = prefix + "arp_spa\n"
+ outstr = prefix + "name = arp_spa\n"
+ #Value can be a long int or a string
+ try:
+ addr = ipaddr.IPv4Address(self.value)
+ except ValueError:
+ addr = ipaddr.IPv4Address(int(self.value, 16))
outstr += oxm_tlv.show(self, prefix)
+ outstr += prefix + "value = " + str(addr) +"\n"
return outstr
class arp_tpa(oxm_tlv):
@@ -506,14 +581,21 @@
@arg body
"""
- def __init__(self, value, hasmask = False):
+ def __init__(self, value=None, hasmask=False):
if not hasmask:
oxm_tlv.__init__(self, OFPXMT_OFB_ARP_TPA, hasmask, 4, value)
else:
oxm_tlv.__init__(self, OFPXMT_OFB_ARP_TPA, hasmask, 4, value, mask)
def show(self, prefix=''):
- outstr = prefix + "arp_tpa\n"
+ outstr = prefix + "name = arp_tpa\n"
+ #Value can be a long int or a string
+ try:
+ addr = ipaddr.IPv4Address(self.value)
+ except ValueError:
+ addr = ipaddr.IPv4Address(int(self.value, 16))
outstr += oxm_tlv.show(self, prefix)
+ outstr += prefix + "value = " + ":".join(["%.2x" %x
+ for x in self.value]) +"\n"
return outstr
@@ -528,14 +610,16 @@
@arg body
"""
- def __init__(self, value, hasmask = False):
+ def __init__(self, value=None, hasmask=False):
if not hasmask:
oxm_tlv.__init__(self, OFPXMT_OFB_ARP_SHA, hasmask, 6, value)
else:
oxm_tlv.__init__(self, OFPXMT_OFB_ARP_SHA, hasmask, 12, value)
def show(self, prefix=''):
- outstr = prefix + "arp_sha\n"
+ outstr = prefix + "name = arp_sha\n"
outstr += oxm_tlv.show(self, prefix)
+ outstr += prefix + "value = " + ":".join(["%.2x" %x
+ for x in self.value]) +"\n"
return outstr
class arp_tha(oxm_tlv):
@@ -549,14 +633,15 @@
@arg body
"""
- def __init__(self, value, hasmask = False):
+ def __init__(self, value=None, hasmask=False):
if not hasmask:
oxm_tlv.__init__(self, OFPXMT_OFB_ARP_THA, hasmask, 6, value)
else:
oxm_tlv.__init__(self, OFPXMT_OFB_ARP_THA, hasmask, 12, value)
def show(self, prefix=''):
- outstr = prefix + "arp_tha\n"
+ outstr = prefix + "name = arp_tha\n"
outstr += oxm_tlv.show(self, prefix)
+ outstr += prefix + "value = " + str(self.value) +"\n"
return outstr
class ipv6_src(oxm_tlv):
@@ -570,14 +655,19 @@
@arg body
"""
- def __init__(self, value, hasmask = False):
+ def __init__(self, value=None, hasmask=False):
if not hasmask:
oxm_tlv.__init__(self, OFPXMT_OFB_IPV6_SRC, False, 16, value)
else:
oxm_tlv.__init__(self, OFPXMT_OFB_IPV6_SRC, True, 32, value)
def show(self, prefix=''):
- outstr = prefix + "ipv6_src\n"
+ outstr = prefix + "name = ipv6_src\n"
+ try:
+ addr = ipaddr.IPv6Address(self.value)
+ except ValueError:
+ addr = ipaddr.IPv6Address(int(self.value, 16))
outstr += oxm_tlv.show(self, prefix)
+ outstr += prefix + "value = " + str(addr) +"\n"
return outstr
class ipv6_dst(oxm_tlv):
@@ -591,14 +681,19 @@
@arg body
"""
- def __init__(self, value, hasmask = False):
+ def __init__(self, value=None, hasmask=False):
if not hasmask:
oxm_tlv.__init__(self, OFPXMT_OFB_IPV6_DST, False, 16, value)
else:
oxm_tlv.__init__(self, OFPXMT_OFB_IPV6_DST, True, 32, value)
def show(self, prefix=''):
- outstr = prefix + "ipv6_dst\n"
+ outstr = prefix + "name = ipv6_dst\n"
+ try:
+ addr = ipaddr.IPv6Address(self.value)
+ except ValueError:
+ addr = ipaddr.IPv6Address(int(self.value, 16))
outstr += oxm_tlv.show(self, prefix)
+ outstr += prefix + "value = " + str(addr) +"\n"
return outstr
class ipv6_flabel(oxm_tlv):
@@ -612,13 +707,13 @@
@arg body
"""
- def __init__(self, value, hasmask = False):
+ def __init__(self, value=None, hasmask=False):
if not hasmask:
oxm_tlv.__init__(self, OFPXMT_OFB_IPV6_FLABEL, hasmask, 4, value)
else:
oxm_tlv.__init__(self, OFPXMT_OFB_IPV6_FLABEL, hasmask, 8, value)
def show(self, prefix=''):
- outstr = prefix + "ipv6_flabel\n"
+ outstr = prefix + "name = ipv6_flabel\n"
outstr += oxm_tlv.show(self, prefix)
return outstr
@@ -633,11 +728,12 @@
@arg body
"""
- def __init__(self, value, hasmask = False):
+ def __init__(self, value=None, hasmask=False):
oxm_tlv.__init__(self, OFPXMT_OFB_ICMPV6_TYPE, hasmask, 1, value)
def show(self, prefix=''):
- outstr = prefix + "icmpv6_type\n"
+ outstr = prefix + "name = icmpv6_type\n"
outstr += oxm_tlv.show(self, prefix)
+ outstr += prefix + "value = " + str(self.value) +"\n"
return outstr
class icmpv6_code(oxm_tlv):
@@ -651,11 +747,12 @@
@arg body
"""
- def __init__(self, value, hasmask = False):
+ def __init__(self, value=None, hasmask=False):
oxm_tlv.__init__(self, OFPXMT_OFB_ICMPV6_CODE, hasmask, 1, value)
def show(self, prefix=''):
- outstr = prefix + "icmpv6_code\n"
+ outstr = prefix + "name = icmpv6_code\n"
outstr += oxm_tlv.show(self, prefix)
+ outstr += prefix + "value = " + str(self.value) +"\n"
return outs
class ipv6_nd_target(oxm_tlv):
@@ -669,11 +766,16 @@
@arg body
"""
- def __init__(self, value, hasmask = False):
+ def __init__(self, value=None, hasmask=False):
oxm_tlv.__init__(self, OFPXMT_OFB_IPV6_ND_TARGET, hasmask, 16, value)
def show(self, prefix=''):
- outstr = prefix + "ipv6_nd_target\n"
+ outstr = prefix + "name = ipv6_nd_target\n"
+ try:
+ addr = ipaddr.IPv6Address(self.value)
+ except ValueError:
+ addr = ipaddr.IPv6Address(int(self.value, 16))
outstr += oxm_tlv.show(self, prefix)
+ outstr += prefix + "value = " + str(addr) +"\n"
return outstr
class ipv6_nd_sll(oxm_tlv):
@@ -687,11 +789,12 @@
@arg body
"""
- def __init__(self, value, hasmask = False):
+ def __init__(self, value=None, hasmask=False):
oxm_tlv.__init__(self, OFPXMT_OFB_IPV6_ND_SLL, hasmask, 6, value)
def show(self, prefix=''):
- outstr = prefix + "ipv6_nd_sll\n"
+ outstr = prefix + "name = ipv6_nd_sll\n"
outstr += oxm_tlv.show(self, prefix)
+ outstr += prefix + "value = " + str(self.value) +"\n"
return outstr
class ipv6_nd_tll(oxm_tlv):
@@ -705,11 +808,12 @@
@arg body
"""
- def __init__(self, value, hasmask = False):
+ def __init__(self, value=None, hasmask=False):
oxm_tlv.__init__(self, OFPXMT_OFB_IPV6_ND_TLL, hasmask, 6, value)
def show(self, prefix=''):
- outstr = prefix + "ipv6_nd_tll\n"
+ outstr = prefix + "name = ipv6_nd_tll\n"
outstr += oxm_tlv.show(self, prefix)
+ outstr += prefix + "value = " + str(self.value) +"\n"
return outstr
class mpls_label(oxm_tlv):
@@ -723,11 +827,12 @@
@arg body
"""
- def __init__(self, value, hasmask = False):
+ def __init__(self, value=None, hasmask=False):
oxm_tlv.__init__(self, OFPXMT_OFB_MPLS_LABEL, hasmask, 4, value)
def show(self, prefix=''):
- outstr = prefix + "mpls_label\n"
+ outstr = prefix + "name = mpls_label\n"
outstr += oxm_tlv.show(self, prefix)
+ outstr += prefix + "value = " + str(self.value) +"\n"
return outstr
class mpls_tc(oxm_tlv):
@@ -741,11 +846,12 @@
@arg body
"""
- def __init__(self, value, hasmask = False):
+ def __init__(self, value=None, hasmask=False):
oxm_tlv.__init__(self, OFPXMT_OFB_MPLS_TC, hasmask, 1, value)
def show(self, prefix=''):
- outstr = prefix + "mpls_tc\n"
+ outstr = prefix + "name = mpls_tc\n"
outstr += oxm_tlv.show(self, prefix)
+ outstr += prefix + "value = " + str(self.value) +"\n"
return outstr
match_class_list = (
diff --git a/src/python/of12/match_list.py b/src/python/of12/match_list.py
index 2a9660c..7a50c75 100644
--- a/src/python/of12/match_list.py
+++ b/src/python/of12/match_list.py
@@ -1,7 +1,7 @@
import struct
+import binascii
import match as match
-from match import oxm_tlv
-from binascii import b2a_hex
+from match import oxm_tlv
from base_list import ofp_base_list
@@ -15,31 +15,76 @@
def __len__(self):
return sum([len(i) for i in self])
-
+
+ def __eq__(self, other):
+ self.tlvs.sort(key=lambda x: x.field);
+ other.tlvs.sort(key=lambda x: x.field);
+ return self.tlvs == other.tlvs
+
def unpack(self, binary_string, bytes=None):
+ oxm_tlv.factory()
if bytes <= 4:
return binary_string[4:]
if bytes == None:
bytes = len(binary_string)
offset = 0
cur_string = binary_string
+ part = lambda: cur_string[read+4:read+4+oxm_length]
while offset < bytes:
read = 0
- oxm_class, oxm_fieldhm, oxm_length = struct.unpack("!HBB", cur_string[read:read+4])
+ oxm_class, oxm_fieldhm, oxm_length = struct.unpack("!HBB",
+ cur_string[read:read+4])
#Found padding bytes?
if not oxm_class:
break
oxm_field = oxm_fieldhm >> 1
oxm_hasmask = oxm_fieldhm & 0x00000001
- payload = struct.unpack("!" + str(oxm_length) + "s", cur_string[read+4:read+4+oxm_length])[0]
- if oxm_hasmask:
- value, mask = payload[:oxm_length/2], payload[oxm_length/2:]
- else:
- value, mask = payload, None
- oxm = oxm_tlv(oxm_field, oxm_hasmask, oxm_length, value,mask, oxm_class)
+
+ if oxm_length == 1:
+ if oxm_hasmask:
+ value, mask = struct.unpack("BB", part())[:2]
+ else:
+ value = struct.unpack("!B", part())[0]
+ mask = None
+ elif oxm_length == 2 or (oxm_length == 4 and oxm_hasmask == True):
+ if oxm_hasmask:
+ value, mask = struct.unpack("!HH", part())[:2]
+ else:
+ value = struct.unpack("!H", part())[0]
+ mask = None
+ elif oxm_length == 4 or (oxm_length == 8 and oxm_hasmask == True):
+ if oxm_hasmask:
+ value, mask = struct.unpack("!II", part())[:2]
+ else:
+ value = struct.unpack("!I", part())[0]
+ mask = None
+ elif oxm_length == 6 or oxm_length == 12:
+ if oxm_hasmask:
+ data = struct.unpack("!12B", part())[0]
+ value, mask = data[:6], data[6:]
+ else:
+ value = list(struct.unpack("!6B", part()))
+ mask = None
+ elif oxm_length == 8 or (oxm_length == 16 and oxm_hasmask == True):
+ if oxm_hasmask:
+ value, mask = struct.unpack("!QQ", part())[0]
+ else:
+ value = struct.unpack("!Q", part())[0]
+ mask = None
+ elif oxm_length == 16 or oxm_length == 32:
+ if oxm_hasmask:
+ data = struct.unpack("!32s", part())[0]
+ value, mask = data[:16], data[16:]
+ else:
+ value = struct.unpack("!16s", part())[0]
+ mask = None
+
+ oxm = oxm_tlv.create(oxm_field)
+ oxm.set_hasmask(oxm_hasmask)
+ oxm.set_value(value)
+ oxm.set_mask(mask)
self.tlvs.append(oxm)
read = 4 + oxm_length
offset += read
- cur_string = cur_string[read:]
-
+ cur_string = cur_string[read:]
return cur_string