ofctl_v1_/2/3: Modify to_match() to use new match api

Signed-off-by: Minoru TAKAHASHI <takahashi.minoru7@gmail.com>
Signed-off-by: IWASE Yusuke <iwase.yusuke0@gmail.com>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
This commit is contained in:
Yusuke Iwase 2014-11-25 10:53:02 +09:00 committed by FUJITA Tomonori
parent a552d5080a
commit 9d3c9db776
2 changed files with 114 additions and 325 deletions

View File

@ -189,31 +189,28 @@ def actions_to_str(instructions):
def to_match(dp, attrs):
match = dp.ofproto_parser.OFPMatch()
convert = {'in_port': int,
'in_phy_port': int,
'dl_src': to_match_eth,
'metadata': to_match_metadata,
'dl_dst': to_match_eth,
'dl_src': to_match_eth,
'eth_dst': to_match_eth,
'eth_src': to_match_eth,
'dl_type': int,
'eth_type': int,
'dl_vlan': int,
'vlan_vid': int,
'vlan_pcp': int,
'ip_dscp': int,
'ip_ecn': int,
'nw_proto': int,
'ip_proto': int,
'nw_src': to_match_ip,
'nw_dst': to_match_ip,
'nw_proto': int,
'tp_src': int,
'tp_dst': int,
'mpls_label': int,
'metadata': to_match_metadata,
'eth_src': to_match_eth,
'eth_dst': to_match_eth,
'eth_type': int,
'vlan_vid': int,
'ipv4_src': to_match_ip,
'ipv4_dst': to_match_ip,
'ip_proto': int,
'tp_src': int,
'tp_dst': int,
'tcp_src': int,
'tcp_dst': int,
'udp_src': int,
@ -227,61 +224,24 @@ def to_match(dp, attrs):
'arp_tpa': to_match_ip,
'arp_sha': to_match_eth,
'arp_tha': to_match_eth,
'ipv6_src': to_match_ipv6,
'ipv6_dst': to_match_ipv6,
'ipv6_src': to_match_ip,
'ipv6_dst': to_match_ip,
'ipv6_flabel': int,
'icmpv6_type': int,
'icmpv6_code': int,
'ipv6_nd_target': to_match_ipv6,
'ipv6_nd_sll': mac.haddr_to_bin,
'ipv6_nd_tll': mac.haddr_to_bin,
'ipv6_nd_target': to_match_ip,
'ipv6_nd_sll': to_match_eth,
'ipv6_nd_tll': to_match_eth,
'mpls_label': int,
'mpls_tc': int}
match_append = {'in_port': match.set_in_port,
'in_phy_port': match.set_in_phy_port,
'dl_src': match.set_dl_src_masked,
'dl_dst': match.set_dl_dst_masked,
'dl_type': match.set_dl_type,
'dl_vlan': match.set_vlan_vid,
'vlan_pcp': match.set_vlan_pcp,
'nw_src': match.set_ipv4_src_masked,
'nw_dst': match.set_ipv4_dst_masked,
'nw_proto': match.set_ip_proto,
'tp_src': to_match_tpsrc,
'tp_dst': to_match_tpdst,
'mpls_label': match.set_mpls_label,
'metadata': match.set_metadata_masked,
'eth_src': match.set_dl_src_masked,
'eth_dst': match.set_dl_dst_masked,
'eth_type': match.set_dl_type,
'vlan_vid': match.set_vlan_vid,
'ip_dscp': match.set_ip_dscp,
'ip_ecn': match.set_ip_ecn,
'ipv4_src': match.set_ipv4_src_masked,
'ipv4_dst': match.set_ipv4_dst_masked,
'ip_proto': match.set_ip_proto,
'tcp_src': to_match_tpsrc,
'tcp_dst': to_match_tpdst,
'udp_src': to_match_tpsrc,
'udp_dst': to_match_tpdst,
'sctp_src': match.set_sctp_src,
'sctp_dst': match.set_sctp_dst,
'icmpv4_type': match.set_icmpv4_type,
'icmpv4_code': match.set_icmpv4_code,
'arp_op': match.set_arp_opcode,
'arp_spa': match.set_arp_spa_masked,
'arp_tpa': match.set_arp_tpa_masked,
'arp_sha': match.set_arp_sha_masked,
'arp_tha': match.set_arp_tha_masked,
'ipv6_src': match.set_ipv6_src_masked,
'ipv6_dst': match.set_ipv6_dst_masked,
'ipv6_flabel': match.set_ipv6_flabel,
'icmpv6_type': match.set_icmpv6_type,
'icmpv6_code': match.set_icmpv6_code,
'ipv6_nd_target': match.set_ipv6_nd_target,
'ipv6_nd_sll': match.set_ipv6_nd_sll,
'ipv6_nd_tll': match.set_ipv6_nd_tll,
'mpls_tc': match.set_mpls_tc}
keys = {'dl_dst': 'eth_dst',
'dl_src': 'eth_src',
'dl_type': 'eth_type',
'dl_vlan': 'vlan_vid',
'nw_src': 'ipv4_src',
'nw_dst': 'ipv4_dst',
'nw_proto': 'ip_proto'}
if attrs.get('dl_type') == ether.ETH_TYPE_ARP or \
attrs.get('eth_type') == ether.ETH_TYPE_ARP:
@ -292,120 +252,56 @@ def to_match(dp, attrs):
attrs['arp_tpa'] = attrs['nw_dst']
del attrs['nw_dst']
kwargs = {}
for key, value in attrs.items():
if key in convert:
value = convert[key](value)
if key in match_append:
if key == 'dl_src' or key == 'dl_dst' or \
key == 'eth_src' or key == 'eth_dst' or \
key == 'arp_sha' or key == 'arp_tha':
# MAC address
eth = value[0]
mask = value[1]
match_append[key](eth, mask)
elif key == 'nw_src' or key == 'nw_dst' or \
key == 'ipv4_src' or key == 'ipv4_dst' or \
key == 'arp_spa' or key == 'arp_tpa' or \
key == 'ipv6_src' or key == 'ipv6_dst':
# IP address
ip = value[0]
mask = value[1]
match_append[key](ip, mask)
elif key == 'ipv6_nd_target':
match_append[key](value[0])
elif key == 'tp_src' or key == 'tp_dst' or \
key == 'tcp_src' or key == 'tcp_dst' or \
key == 'udp_src' or key == 'udp_dst':
# tp_src/dst
match_append[key](value, match, attrs)
elif key == 'metadata':
# metadata
metadata = value[0]
metadata_mask = value[1]
match_append[key](metadata, metadata_mask)
else:
# others
match_append[key](value)
if key in keys:
# For old field name
key = keys[key]
if key == 'tp_src' or key == 'tp_dst':
# TCP/UDP port
conv = {inet.IPPROTO_TCP: {'tp_src': 'tcp_src',
'tp_dst': 'tcp_dst'},
inet.IPPROTO_UDP: {'tp_src': 'udp_src',
'tp_dst': 'udp_dst'}}
ip_proto = attrs.get('nw_proto', attrs.get('ip_proto', 0))
key = conv[ip_proto][key]
kwargs[key] = value
elif key == 'vlan_vid':
# VLAN ID
kwargs[key] = value | ofproto_v1_2.OFPVID_PRESENT
else:
# others
kwargs[key] = value
return match
return dp.ofproto_parser.OFPMatch(**kwargs)
def to_match_eth(value):
eth_mask = value.split('/')
# MAC address
eth = mac.haddr_to_bin(eth_mask[0])
# mask
mask = mac.haddr_to_bin('ff:ff:ff:ff:ff:ff')
if len(eth_mask) == 2:
mask = mac.haddr_to_bin(eth_mask[1])
return eth, mask
def to_match_tpsrc(value, match, rest):
match_append = {inet.IPPROTO_TCP: match.set_tcp_src,
inet.IPPROTO_UDP: match.set_udp_src}
nw_proto = int(rest.get('nw_proto', rest.get('ip_proto', 0)))
if nw_proto in match_append:
match_append[nw_proto](value)
return match
def to_match_tpdst(value, match, rest):
match_append = {inet.IPPROTO_TCP: match.set_tcp_dst,
inet.IPPROTO_UDP: match.set_udp_dst}
nw_proto = int(rest.get('nw_proto', rest.get('ip_proto', 0)))
if nw_proto in match_append:
match_append[nw_proto](value)
return match
if '/' in value:
value = value.split('/')
return value[0], value[1]
else:
return value
def to_match_ip(value):
ip_mask = value.split('/')
# IP address
ipv4 = struct.unpack('!I', socket.inet_aton(ip_mask[0]))[0]
# netmask
netmask = ofproto_v1_2_parser.UINT32_MAX
if len(ip_mask) == 2:
# Check the mask is CIDR or not.
if ip_mask[1].isdigit():
netmask &= ofproto_v1_2_parser.UINT32_MAX << 32 - int(ip_mask[1])
else:
netmask = struct.unpack('!I', socket.inet_aton(ip_mask[1]))[0]
return ipv4, netmask
def to_match_ipv6(value):
ip_mask = value.split('/')
if len(ip_mask) == 2 and ip_mask[1].isdigit() is False:
# Both address and netmask are colon-hexadecimal.
ipv6 = netaddr.IPAddress(ip_mask[0]).words
netmask = netaddr.IPAddress(ip_mask[1]).words
if '/' in value:
ip = netaddr.ip.IPNetwork(value)
ip_addr = str(ip.ip)
ip_mask = str(ip.netmask)
return ip_addr, ip_mask
else:
# For other formats.
network = netaddr.IPNetwork(value)
ipv6 = network.ip.words
netmask = network.netmask.words
return ipv6, netmask
return value
def to_match_metadata(value):
if '/' in value:
metadata = value.split('/')
return str_to_int(metadata[0]), str_to_int(metadata[1])
value = value.split('/')
return str_to_int(value[0]), str_to_int(value[1])
else:
return str_to_int(value), ofproto_v1_2_parser.UINT64_MAX
return str_to_int(value)
def match_to_str(ofmatch):

View File

@ -206,30 +206,28 @@ def actions_to_str(instructions):
def to_match(dp, attrs):
match = dp.ofproto_parser.OFPMatch()
convert = {'in_port': int,
'in_phy_port': int,
'dl_src': to_match_eth,
'metadata': to_match_metadata,
'dl_dst': to_match_eth,
'dl_src': to_match_eth,
'eth_dst': to_match_eth,
'eth_src': to_match_eth,
'dl_type': int,
'eth_type': int,
'dl_vlan': int,
'vlan_vid': int,
'vlan_pcp': int,
'ip_dscp': int,
'ip_ecn': int,
'nw_proto': int,
'ip_proto': int,
'nw_src': to_match_ip,
'nw_dst': to_match_ip,
'nw_proto': int,
'tp_src': int,
'tp_dst': int,
'mpls_label': int,
'metadata': to_match_metadata,
'eth_src': to_match_eth,
'eth_dst': to_match_eth,
'eth_type': int,
'vlan_vid': int,
'ipv4_src': to_match_ip,
'ipv4_dst': to_match_ip,
'ip_proto': int,
'tp_src': int,
'tp_dst': int,
'tcp_src': int,
'tcp_dst': int,
'udp_src': int,
@ -243,69 +241,28 @@ def to_match(dp, attrs):
'arp_tpa': to_match_ip,
'arp_sha': to_match_eth,
'arp_tha': to_match_eth,
'ipv6_src': to_match_ipv6,
'ipv6_dst': to_match_ipv6,
'ipv6_src': to_match_ip,
'ipv6_dst': to_match_ip,
'ipv6_flabel': int,
'icmpv6_type': int,
'icmpv6_code': int,
'ipv6_nd_target': to_match_ipv6,
'ipv6_nd_sll': mac.haddr_to_bin,
'ipv6_nd_tll': mac.haddr_to_bin,
'ipv6_nd_target': to_match_ip,
'ipv6_nd_sll': to_match_eth,
'ipv6_nd_tll': to_match_eth,
'mpls_label': int,
'mpls_tc': int,
'mpls_bos': int,
'pbb_isid': int,
'tunnel_id': int,
'ipv6_exthdr': int}
match_append = {'in_port': match.set_in_port,
'in_phy_port': match.set_in_phy_port,
'dl_src': match.set_dl_src_masked,
'dl_dst': match.set_dl_dst_masked,
'dl_type': match.set_dl_type,
'dl_vlan': match.set_vlan_vid,
'vlan_pcp': match.set_vlan_pcp,
'nw_src': match.set_ipv4_src_masked,
'nw_dst': match.set_ipv4_dst_masked,
'nw_proto': match.set_ip_proto,
'tp_src': to_match_tpsrc,
'tp_dst': to_match_tpdst,
'mpls_label': match.set_mpls_label,
'metadata': match.set_metadata_masked,
'eth_src': match.set_dl_src_masked,
'eth_dst': match.set_dl_dst_masked,
'eth_type': match.set_dl_type,
'vlan_vid': match.set_vlan_vid,
'ip_dscp': match.set_ip_dscp,
'ip_ecn': match.set_ip_ecn,
'ipv4_src': match.set_ipv4_src_masked,
'ipv4_dst': match.set_ipv4_dst_masked,
'ip_proto': match.set_ip_proto,
'tcp_src': to_match_tpsrc,
'tcp_dst': to_match_tpdst,
'udp_src': to_match_tpsrc,
'udp_dst': to_match_tpdst,
'sctp_src': match.set_sctp_src,
'sctp_dst': match.set_sctp_dst,
'icmpv4_type': match.set_icmpv4_type,
'icmpv4_code': match.set_icmpv4_code,
'arp_op': match.set_arp_opcode,
'arp_spa': match.set_arp_spa_masked,
'arp_tpa': match.set_arp_tpa_masked,
'arp_sha': match.set_arp_sha_masked,
'arp_tha': match.set_arp_tha_masked,
'ipv6_src': match.set_ipv6_src_masked,
'ipv6_dst': match.set_ipv6_dst_masked,
'ipv6_flabel': match.set_ipv6_flabel,
'icmpv6_type': match.set_icmpv6_type,
'icmpv6_code': match.set_icmpv6_code,
'ipv6_nd_target': match.set_ipv6_nd_target,
'ipv6_nd_sll': match.set_ipv6_nd_sll,
'ipv6_nd_tll': match.set_ipv6_nd_tll,
'mpls_tc': match.set_mpls_tc,
'mpls_bos': match.set_mpls_bos,
'pbb_isid': match.set_pbb_isid,
'tunnel_id': match.set_tunnel_id,
'ipv6_exthdr': match.set_ipv6_exthdr}
keys = {'dl_dst': 'eth_dst',
'dl_src': 'eth_src',
'dl_type': 'eth_type',
'dl_vlan': 'vlan_vid',
'nw_src': 'ipv4_src',
'nw_dst': 'ipv4_dst',
'nw_proto': 'ip_proto'}
if attrs.get('dl_type') == ether.ETH_TYPE_ARP or \
attrs.get('eth_type') == ether.ETH_TYPE_ARP:
@ -316,120 +273,56 @@ def to_match(dp, attrs):
attrs['arp_tpa'] = attrs['nw_dst']
del attrs['nw_dst']
kwargs = {}
for key, value in attrs.items():
if key in convert:
value = convert[key](value)
if key in match_append:
if key == 'dl_src' or key == 'dl_dst' or \
key == 'eth_src' or key == 'eth_dst' or \
key == 'arp_sha' or key == 'arp_tha':
# MAC address
eth = value[0]
mask = value[1]
match_append[key](eth, mask)
elif key == 'nw_src' or key == 'nw_dst' or \
key == 'ipv4_src' or key == 'ipv4_dst' or \
key == 'arp_spa' or key == 'arp_tpa' or \
key == 'ipv6_src' or key == 'ipv6_dst':
# IP address
ip = value[0]
mask = value[1]
match_append[key](ip, mask)
elif key == 'ipv6_nd_target':
match_append[key](value[0])
elif key == 'tp_src' or key == 'tp_dst' or \
key == 'tcp_src' or key == 'tcp_dst' or \
key == 'udp_src' or key == 'udp_dst':
# tp_src/dst
match_append[key](value, match, attrs)
elif key == 'metadata':
# metadata
metadata = value[0]
metadata_mask = value[1]
match_append[key](metadata, metadata_mask)
else:
# others
match_append[key](value)
if key in keys:
# For old field name
key = keys[key]
if key == 'tp_src' or key == 'tp_dst':
# TCP/UDP port
conv = {inet.IPPROTO_TCP: {'tp_src': 'tcp_src',
'tp_dst': 'tcp_dst'},
inet.IPPROTO_UDP: {'tp_src': 'udp_src',
'tp_dst': 'udp_dst'}}
ip_proto = attrs.get('nw_proto', attrs.get('ip_proto', 0))
key = conv[ip_proto][key]
kwargs[key] = value
elif key == 'vlan_vid':
# VLAN ID
kwargs[key] = value | ofproto_v1_3.OFPVID_PRESENT
else:
# others
kwargs[key] = value
return match
return dp.ofproto_parser.OFPMatch(**kwargs)
def to_match_eth(value):
eth_mask = value.split('/')
# MAC address
eth = mac.haddr_to_bin(eth_mask[0])
# mask
mask = mac.haddr_to_bin('ff:ff:ff:ff:ff:ff')
if len(eth_mask) == 2:
mask = mac.haddr_to_bin(eth_mask[1])
return eth, mask
def to_match_tpsrc(value, match, rest):
match_append = {inet.IPPROTO_TCP: match.set_tcp_src,
inet.IPPROTO_UDP: match.set_udp_src}
nw_proto = int(rest.get('nw_proto', rest.get('ip_proto', 0)))
if nw_proto in match_append:
match_append[nw_proto](value)
return match
def to_match_tpdst(value, match, rest):
match_append = {inet.IPPROTO_TCP: match.set_tcp_dst,
inet.IPPROTO_UDP: match.set_udp_dst}
nw_proto = int(rest.get('nw_proto', rest.get('ip_proto', 0)))
if nw_proto in match_append:
match_append[nw_proto](value)
return match
if '/' in value:
value = value.split('/')
return value[0], value[1]
else:
return value
def to_match_ip(value):
ip_mask = value.split('/')
# IP address
ipv4 = struct.unpack('!I', socket.inet_aton(ip_mask[0]))[0]
# netmask
netmask = ofproto_v1_3_parser.UINT32_MAX
if len(ip_mask) == 2:
# Check the mask is CIDR or not.
if ip_mask[1].isdigit():
netmask &= ofproto_v1_3_parser.UINT32_MAX << 32 - int(ip_mask[1])
else:
netmask = struct.unpack('!I', socket.inet_aton(ip_mask[1]))[0]
return ipv4, netmask
def to_match_ipv6(value):
ip_mask = value.split('/')
if len(ip_mask) == 2 and ip_mask[1].isdigit() is False:
# Both address and netmask are colon-hexadecimal.
ipv6 = netaddr.IPAddress(ip_mask[0]).words
netmask = netaddr.IPAddress(ip_mask[1]).words
if '/' in value:
ip = netaddr.ip.IPNetwork(value)
ip_addr = str(ip.ip)
ip_mask = str(ip.netmask)
return ip_addr, ip_mask
else:
# For other formats.
network = netaddr.IPNetwork(value)
ipv6 = network.ip.words
netmask = network.netmask.words
return ipv6, netmask
return value
def to_match_metadata(value):
if '/' in value:
metadata = value.split('/')
return str_to_int(metadata[0]), str_to_int(metadata[1])
value = value.split('/')
return str_to_int(value[0]), str_to_int(value[1])
else:
return str_to_int(value), ofproto_v1_3_parser.UINT64_MAX
return str_to_int(value)
def match_to_str(ofmatch):