lib: Reduce Pylint warnings

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:
IWASE Yusuke 2016-08-08 16:49:40 +09:00 committed by FUJITA Tomonori
parent 6154450494
commit 59ea6a5231
19 changed files with 198 additions and 221 deletions

View File

@ -34,10 +34,11 @@ Please note that:
import logging import logging
import six
import time import time
import random import random
import six
from ryu.base import app_manager from ryu.base import app_manager
from ryu.controller import event from ryu.controller import event
from ryu.controller import ofp_event from ryu.controller import ofp_event
@ -47,7 +48,6 @@ from ryu.exception import RyuException
from ryu.ofproto.ether import ETH_TYPE_IP, ETH_TYPE_ARP from ryu.ofproto.ether import ETH_TYPE_IP, ETH_TYPE_ARP
from ryu.ofproto import ofproto_v1_3 from ryu.ofproto import ofproto_v1_3
from ryu.ofproto import inet from ryu.ofproto import inet
from ryu.lib import ofctl_v1_3
from ryu.lib import hub from ryu.lib import hub
from ryu.lib.packet import packet from ryu.lib.packet import packet
from ryu.lib.packet import ethernet from ryu.lib.packet import ethernet
@ -462,7 +462,6 @@ class BFDSession(object):
self._remote_session_state == bfd.BFD_STATE_UP: self._remote_session_state == bfd.BFD_STATE_UP:
flags |= bfd.BFD_FLAG_DEMAND flags |= bfd.BFD_FLAG_DEMAND
ver = 1
diag = self._local_diag diag = self._local_diag
state = self._session_state state = self._session_state
detect_mult = self._detect_mult detect_mult = self._detect_mult
@ -570,13 +569,13 @@ class BFDPacket(object):
i = iter(pkt) i = iter(pkt)
eth_pkt = next(i) eth_pkt = next(i)
assert type(eth_pkt) == ethernet.ethernet assert isinstance(eth_pkt, ethernet.ethernet)
ipv4_pkt = next(i) ipv4_pkt = next(i)
assert type(ipv4_pkt) == ipv4.ipv4 assert isinstance(ipv4_pkt, ipv4.ipv4)
udp_pkt = i.next() udp_pkt = next(i)
assert type(udp_pkt) == udp.udp assert isinstance(udp_pkt, udp.udp)
udp_payload = next(i) udp_payload = next(i)
@ -619,10 +618,10 @@ class ARPPacket(object):
i = iter(pkt) i = iter(pkt)
eth_pkt = next(i) eth_pkt = next(i)
# Ensure it's an ethernet frame. # Ensure it's an ethernet frame.
assert type(eth_pkt) == ethernet.ethernet assert isinstance(eth_pkt, ethernet.ethernet)
arp_pkt = next(i) arp_pkt = next(i)
if type(arp_pkt) != arp.arp: if not isinstance(arp_pkt, arp.arp):
raise ARPPacket.ARPUnknownFormat() raise ARPPacket.ARPUnknownFormat()
if arp_pkt.opcode not in (ARP_REQUEST, ARP_REPLY): if arp_pkt.opcode not in (ARP_REQUEST, ARP_REPLY):

View File

@ -18,8 +18,7 @@
# string representation is in hex without '0x' # string representation is in hex without '0x'
_DPID_LEN = 16 _DPID_LEN = 16
_DPID_LEN_STR = str(_DPID_LEN) _DPID_FMT = '%0{0}x'.format(_DPID_LEN)
_DPID_FMT = '%0' + _DPID_LEN_STR + 'x'
DPID_PATTERN = r'[0-9a-f]{%d}' % _DPID_LEN DPID_PATTERN = r'[0-9a-f]{%d}' % _DPID_LEN

View File

@ -54,9 +54,9 @@ if HUB_TYPE == 'eventlet':
return func(*args, **kwargs) return func(*args, **kwargs)
except TaskExit: except TaskExit:
pass pass
except: except BaseException as e:
if raise_error: if raise_error:
raise raise e
# Log uncaught exception. # Log uncaught exception.
# Note: this is an intentional divergence from gevent # Note: this is an intentional divergence from gevent
# behaviour; gevent silently ignores such exceptions. # behaviour; gevent silently ignores such exceptions.
@ -75,9 +75,9 @@ if HUB_TYPE == 'eventlet':
return func(*args, **kwargs) return func(*args, **kwargs)
except TaskExit: except TaskExit:
pass pass
except: except BaseException as e:
if raise_error: if raise_error:
raise raise e
# Log uncaught exception. # Log uncaught exception.
# Note: this is an intentional divergence from gevent # Note: this is an intentional divergence from gevent
# behaviour; gevent silently ignores such exceptions. # behaviour; gevent silently ignores such exceptions.

View File

@ -573,7 +573,7 @@ class IgmpSnooper(IgmpBase):
timeout = query.maxresp / 10 timeout = query.maxresp / 10
self._to_hosts.setdefault(dpid, {}) self._to_hosts.setdefault(dpid, {})
if '0.0.0.0' == query.address: if query.address == '0.0.0.0':
# general query. reset all reply status. # general query. reset all reply status.
for group in self._to_hosts[dpid].values(): for group in self._to_hosts[dpid].values():
group['replied'] = False group['replied'] = False

View File

@ -84,12 +84,11 @@ class LacpLib(app_manager.RyuApp):
if you want to use multi LAG, call 'add' method more than once. if you want to use multi LAG, call 'add' method more than once.
""" """
assert isinstance(ports, list) assert isinstance(ports, list)
assert 2 <= len(ports) assert len(ports) >= 2
ifs = {} ifs = {}
for port in ports: for port in ports:
ifs[port] = {'enabled': False, 'timeout': 0} ifs[port] = {'enabled': False, 'timeout': 0}
bond = {} bond = {dpid: ifs}
bond[dpid] = ifs
self._bonds.append(bond) self._bonds.append(bond)
# ------------------------------------------------------------------- # -------------------------------------------------------------------

View File

@ -195,7 +195,7 @@ def to_match_vid(value, ofpvid_present):
def to_match_masked_int(value): def to_match_masked_int(value):
if isinstance(value, str) and '/' in value: if isinstance(value, str) and '/' in value:
value = value.split('/') value = value.split('/')
return (str_to_int(value[0]), str_to_int(value[1])) return str_to_int(value[0]), str_to_int(value[1])
return str_to_int(value) return str_to_int(value)

View File

@ -290,8 +290,8 @@ def get_desc_stats(dp, waiters):
'sw_desc': stats.sw_desc, 'sw_desc': stats.sw_desc,
'serial_num': stats.serial_num, 'serial_num': stats.serial_num,
'dp_desc': stats.dp_desc} 'dp_desc': stats.dp_desc}
desc = {str(dp.id): s}
return desc return {str(dp.id): s}
def get_queue_stats(dp, waiters, port=None, queue_id=None): def get_queue_stats(dp, waiters, port=None, queue_id=None):
@ -319,8 +319,8 @@ def get_queue_stats(dp, waiters, port=None, queue_id=None):
'tx_bytes': stat.tx_bytes, 'tx_bytes': stat.tx_bytes,
'tx_errors': stat.tx_errors, 'tx_errors': stat.tx_errors,
'tx_packets': stat.tx_packets}) 'tx_packets': stat.tx_packets})
desc = {str(dp.id): s}
return desc return {str(dp.id): s}
def get_flow_stats(dp, waiters, flow=None): def get_flow_stats(dp, waiters, flow=None):
@ -355,8 +355,8 @@ def get_flow_stats(dp, waiters, flow=None):
'packet_count': stats.packet_count, 'packet_count': stats.packet_count,
'table_id': UTIL.ofp_table_to_user(stats.table_id)} 'table_id': UTIL.ofp_table_to_user(stats.table_id)}
flows.append(s) flows.append(s)
flows = {str(dp.id): flows}
return flows return {str(dp.id): flows}
def get_aggregate_flow_stats(dp, waiters, flow=None): def get_aggregate_flow_stats(dp, waiters, flow=None):
@ -381,9 +381,8 @@ def get_aggregate_flow_stats(dp, waiters, flow=None):
'byte_count': st.byte_count, 'byte_count': st.byte_count,
'flow_count': st.flow_count} 'flow_count': st.flow_count}
flows.append(s) flows.append(s)
flows = {str(dp.id): flows}
return flows return {str(dp.id): flows}
def get_table_stats(dp, waiters): def get_table_stats(dp, waiters):
@ -432,9 +431,8 @@ def get_table_stats(dp, waiters):
'lookup_count': stat.lookup_count, 'lookup_count': stat.lookup_count,
'matched_count': stat.matched_count} 'matched_count': stat.matched_count}
tables.append(s) tables.append(s)
desc = {str(dp.id): tables}
return desc return {str(dp.id): tables}
def get_port_stats(dp, waiters, port=None): def get_port_stats(dp, waiters, port=None):
@ -465,8 +463,8 @@ def get_port_stats(dp, waiters, port=None):
'rx_crc_err': stats.rx_crc_err, 'rx_crc_err': stats.rx_crc_err,
'collisions': stats.collisions} 'collisions': stats.collisions}
ports.append(s) ports.append(s)
ports = {str(dp.id): ports}
return ports return {str(dp.id): ports}
def get_port_desc(dp, waiters): def get_port_desc(dp, waiters):
@ -476,7 +474,6 @@ def get_port_desc(dp, waiters):
ofctl_utils.send_stats_request(dp, stats, waiters, msgs, LOG) ofctl_utils.send_stats_request(dp, stats, waiters, msgs, LOG)
descs = [] descs = []
for msg in msgs: for msg in msgs:
stats = msg.ports stats = msg.ports
for stat in stats.values(): for stat in stats.values():
@ -490,8 +487,8 @@ def get_port_desc(dp, waiters):
'supported': stat.supported, 'supported': stat.supported,
'peer': stat.peer} 'peer': stat.peer}
descs.append(d) descs.append(d)
descs = {str(dp.id): descs}
return descs return {str(dp.id): descs}
def mod_flow_entry(dp, flow, cmd): def mod_flow_entry(dp, flow, cmd):

View File

@ -95,8 +95,8 @@ def to_actions(dp, acts):
if action_type == 'WRITE_ACTIONS': if action_type == 'WRITE_ACTIONS':
write_actions = [] write_actions = []
write_acts = a.get('actions') write_acts = a.get('actions')
for a in write_acts: for act in write_acts:
action = to_action(dp, a) action = to_action(dp, act)
if action is not None: if action is not None:
write_actions.append(action) write_actions.append(action)
else: else:
@ -106,8 +106,8 @@ def to_actions(dp, acts):
parser.OFPInstructionActions(ofp.OFPIT_WRITE_ACTIONS, parser.OFPInstructionActions(ofp.OFPIT_WRITE_ACTIONS,
write_actions)) write_actions))
elif action_type == 'CLEAR_ACTIONS': elif action_type == 'CLEAR_ACTIONS':
inst.append(parser.OFPInstructionActions( inst.append(
ofp.OFPIT_CLEAR_ACTIONS, [])) parser.OFPInstructionActions(ofp.OFPIT_CLEAR_ACTIONS, []))
elif action_type == 'GOTO_TABLE': elif action_type == 'GOTO_TABLE':
table_id = UTIL.ofp_table_from_user(a.get('table_id')) table_id = UTIL.ofp_table_from_user(a.get('table_id'))
inst.append(parser.OFPInstructionGotoTable(table_id)) inst.append(parser.OFPInstructionGotoTable(table_id))
@ -358,8 +358,7 @@ def match_to_str(ofmatch):
'tcp_src': 'tp_src', 'tcp_src': 'tp_src',
'tcp_dst': 'tp_dst', 'tcp_dst': 'tp_dst',
'udp_src': 'tp_src', 'udp_src': 'tp_src',
'udp_dst': 'tp_dst' 'udp_dst': 'tp_dst'}
}
match = {} match = {}
@ -407,8 +406,8 @@ def get_desc_stats(dp, waiters):
'sw_desc': stats.sw_desc, 'sw_desc': stats.sw_desc,
'serial_num': stats.serial_num, 'serial_num': stats.serial_num,
'dp_desc': stats.dp_desc} 'dp_desc': stats.dp_desc}
desc = {str(dp.id): s}
return desc return {str(dp.id): s}
def get_queue_stats(dp, waiters, port=None, queue_id=None): def get_queue_stats(dp, waiters, port=None, queue_id=None):
@ -438,8 +437,8 @@ def get_queue_stats(dp, waiters, port=None, queue_id=None):
'tx_bytes': stat.tx_bytes, 'tx_bytes': stat.tx_bytes,
'tx_errors': stat.tx_errors, 'tx_errors': stat.tx_errors,
'tx_packets': stat.tx_packets}) 'tx_packets': stat.tx_packets})
desc = {str(dp.id): s}
return desc return {str(dp.id): s}
def get_queue_config(dp, waiters, port=None): def get_queue_config(dp, waiters, port=None):
@ -452,10 +451,11 @@ def get_queue_config(dp, waiters, port=None):
msgs = [] msgs = []
ofctl_utils.send_stats_request(dp, stats, waiters, msgs, LOG) ofctl_utils.send_stats_request(dp, stats, waiters, msgs, LOG)
prop_type = {dp.ofproto.OFPQT_MIN_RATE: 'MIN_RATE', prop_type = {
dp.ofproto.OFPQT_MAX_RATE: 'MAX_RATE', dp.ofproto.OFPQT_MIN_RATE: 'MIN_RATE',
dp.ofproto.OFPQT_EXPERIMENTER: 'EXPERIMENTER', dp.ofproto.OFPQT_MAX_RATE: 'MAX_RATE',
} dp.ofproto.OFPQT_EXPERIMENTER: 'EXPERIMENTER',
}
configs = [] configs = []
for config in msgs: for config in msgs:
@ -478,9 +478,8 @@ def get_queue_config(dp, waiters, port=None):
c = {'port': UTIL.ofp_port_to_user(config.port), c = {'port': UTIL.ofp_port_to_user(config.port),
'queues': queue_list} 'queues': queue_list}
configs.append(c) configs.append(c)
configs = {str(dp.id): configs}
return configs return {str(dp.id): configs}
def get_flow_stats(dp, waiters, flow=None): def get_flow_stats(dp, waiters, flow=None):
@ -519,9 +518,8 @@ def get_flow_stats(dp, waiters, flow=None):
'table_id': UTIL.ofp_table_to_user(stats.table_id), 'table_id': UTIL.ofp_table_to_user(stats.table_id),
'length': stats.length} 'length': stats.length}
flows.append(s) flows.append(s)
flows = {str(dp.id): flows}
return flows return {str(dp.id): flows}
def get_aggregate_flow_stats(dp, waiters, flow=None): def get_aggregate_flow_stats(dp, waiters, flow=None):
@ -549,9 +547,8 @@ def get_aggregate_flow_stats(dp, waiters, flow=None):
'byte_count': stats.byte_count, 'byte_count': stats.byte_count,
'flow_count': stats.flow_count} 'flow_count': stats.flow_count}
flows.append(s) flows.append(s)
flows = {str(dp.id): flows}
return flows return {str(dp.id): flows}
def get_table_stats(dp, waiters): def get_table_stats(dp, waiters):
@ -674,9 +671,8 @@ def get_table_stats(dp, waiters):
'lookup_count': stat.lookup_count, 'lookup_count': stat.lookup_count,
'matched_count': stat.matched_count} 'matched_count': stat.matched_count}
tables.append(s) tables.append(s)
desc = {str(dp.id): tables}
return desc return {str(dp.id): tables}
def get_port_stats(dp, waiters, port=None): def get_port_stats(dp, waiters, port=None):
@ -707,8 +703,8 @@ def get_port_stats(dp, waiters, port=None):
'rx_crc_err': stats.rx_crc_err, 'rx_crc_err': stats.rx_crc_err,
'collisions': stats.collisions} 'collisions': stats.collisions}
ports.append(s) ports.append(s)
ports = {str(dp.id): ports}
return ports return {str(dp.id): ports}
def get_group_stats(dp, waiters, group_id=None): def get_group_stats(dp, waiters, group_id=None):
@ -737,8 +733,8 @@ def get_group_stats(dp, waiters, group_id=None):
'byte_count': stats.byte_count, 'byte_count': stats.byte_count,
'bucket_stats': bucket_counters} 'bucket_stats': bucket_counters}
groups.append(g) groups.append(g)
groups = {str(dp.id): groups}
return groups return {str(dp.id): groups}
def get_group_features(dp, waiters): def get_group_features(dp, waiters):
@ -797,8 +793,8 @@ def get_group_features(dp, waiters):
'max_groups': max_groups, 'max_groups': max_groups,
'actions': actions} 'actions': actions}
features.append(f) features.append(f)
features = {str(dp.id): features}
return features return {str(dp.id): features}
def get_group_desc(dp, waiters): def get_group_desc(dp, waiters):
@ -829,8 +825,8 @@ def get_group_desc(dp, waiters):
'group_id': UTIL.ofp_group_to_user(stats.group_id), 'group_id': UTIL.ofp_group_to_user(stats.group_id),
'buckets': buckets} 'buckets': buckets}
descs.append(d) descs.append(d)
descs = {str(dp.id): descs}
return descs return {str(dp.id): descs}
def get_port_desc(dp, waiters): def get_port_desc(dp, waiters):
@ -856,8 +852,8 @@ def get_port_desc(dp, waiters):
'curr_speed': stat.curr_speed, 'curr_speed': stat.curr_speed,
'max_speed': stat.max_speed} 'max_speed': stat.max_speed}
descs.append(d) descs.append(d)
descs = {str(dp.id): descs}
return descs return {str(dp.id): descs}
def mod_flow_entry(dp, flow, cmd): def mod_flow_entry(dp, flow, cmd):

View File

@ -55,8 +55,8 @@ def to_actions(dp, acts):
if action_type == 'WRITE_ACTIONS': if action_type == 'WRITE_ACTIONS':
write_actions = [] write_actions = []
write_acts = a.get('actions') write_acts = a.get('actions')
for a in write_acts: for act in write_acts:
action = to_action(dp, a) action = to_action(dp, act)
if action is not None: if action is not None:
write_actions.append(action) write_actions.append(action)
else: else:
@ -66,8 +66,8 @@ def to_actions(dp, acts):
parser.OFPInstructionActions(ofp.OFPIT_WRITE_ACTIONS, parser.OFPInstructionActions(ofp.OFPIT_WRITE_ACTIONS,
write_actions)) write_actions))
elif action_type == 'CLEAR_ACTIONS': elif action_type == 'CLEAR_ACTIONS':
inst.append(parser.OFPInstructionActions( inst.append(
ofp.OFPIT_CLEAR_ACTIONS, [])) parser.OFPInstructionActions(ofp.OFPIT_CLEAR_ACTIONS, []))
elif action_type == 'GOTO_TABLE': elif action_type == 'GOTO_TABLE':
table_id = UTIL.ofp_table_from_user(a.get('table_id')) table_id = UTIL.ofp_table_from_user(a.get('table_id'))
inst.append(parser.OFPInstructionGotoTable(table_id)) inst.append(parser.OFPInstructionGotoTable(table_id))
@ -133,7 +133,7 @@ def action_to_str(act):
if act.experimenter == ofproto_common.NX_EXPERIMENTER_ID: if act.experimenter == ofproto_common.NX_EXPERIMENTER_ID:
try: try:
return ofctl_nicira_ext.action_to_str(act, action_to_str) return ofctl_nicira_ext.action_to_str(act, action_to_str)
except: except Exception:
LOG.debug('Error parsing NX_ACTION(%s)', LOG.debug('Error parsing NX_ACTION(%s)',
act.__class__.__name__, exc_info=True) act.__class__.__name__, exc_info=True)
@ -299,8 +299,7 @@ def match_to_str(ofmatch):
'tcp_src': 'tp_src', 'tcp_src': 'tp_src',
'tcp_dst': 'tp_dst', 'tcp_dst': 'tp_dst',
'udp_src': 'tp_src', 'udp_src': 'tp_src',
'udp_dst': 'tp_dst' 'udp_dst': 'tp_dst'}
}
match = {} match = {}
@ -395,8 +394,7 @@ def get_queue_config(dp, waiters, port=None, to_user=True):
prop_type = {dp.ofproto.OFPQT_MIN_RATE: 'MIN_RATE', prop_type = {dp.ofproto.OFPQT_MIN_RATE: 'MIN_RATE',
dp.ofproto.OFPQT_MAX_RATE: 'MAX_RATE', dp.ofproto.OFPQT_MAX_RATE: 'MAX_RATE',
dp.ofproto.OFPQT_EXPERIMENTER: 'EXPERIMENTER', dp.ofproto.OFPQT_EXPERIMENTER: 'EXPERIMENTER'}
}
configs = [] configs = []
for config in msgs: for config in msgs:
@ -564,8 +562,7 @@ def get_table_features(dp, waiters, to_user=True):
ofproto.OFPTFPT_APPLY_SETFIELD: 'APPLY_SETFIELD', ofproto.OFPTFPT_APPLY_SETFIELD: 'APPLY_SETFIELD',
ofproto.OFPTFPT_APPLY_SETFIELD_MISS: 'APPLY_SETFIELD_MISS', ofproto.OFPTFPT_APPLY_SETFIELD_MISS: 'APPLY_SETFIELD_MISS',
ofproto.OFPTFPT_EXPERIMENTER: 'EXPERIMENTER', ofproto.OFPTFPT_EXPERIMENTER: 'EXPERIMENTER',
ofproto.OFPTFPT_EXPERIMENTER_MISS: 'EXPERIMENTER_MISS' ofproto.OFPTFPT_EXPERIMENTER_MISS: 'EXPERIMENTER_MISS'}
}
if not to_user: if not to_user:
prop_type = dict((k, k) for k in prop_type.keys()) prop_type = dict((k, k) for k in prop_type.keys())
@ -600,41 +597,42 @@ def get_table_features(dp, waiters, to_user=True):
p = {'type': prop_type.get(prop.type, 'UNKNOWN')} p = {'type': prop_type.get(prop.type, 'UNKNOWN')}
if prop.type in p_type_instructions: if prop.type in p_type_instructions:
instruction_ids = [] instruction_ids = []
for id in prop.instruction_ids: for i in prop.instruction_ids:
i = {'len': id.len, inst = {'len': i.len,
'type': id.type} 'type': i.type}
instruction_ids.append(i) instruction_ids.append(inst)
p['instruction_ids'] = instruction_ids p['instruction_ids'] = instruction_ids
elif prop.type in p_type_next_tables: elif prop.type in p_type_next_tables:
table_ids = [] table_ids = []
for id in prop.table_ids: for i in prop.table_ids:
table_ids.append(id) table_ids.append(i)
p['table_ids'] = table_ids p['table_ids'] = table_ids
elif prop.type in p_type_actions: elif prop.type in p_type_actions:
action_ids = [] action_ids = []
for id in prop.action_ids: for i in prop.action_ids:
i = {'len': id.len, act = {'len': i.len,
'type': id.type} 'type': i.type}
action_ids.append(i) action_ids.append(act)
p['action_ids'] = action_ids p['action_ids'] = action_ids
elif prop.type in p_type_oxms: elif prop.type in p_type_oxms:
oxm_ids = [] oxm_ids = []
for id in prop.oxm_ids: for i in prop.oxm_ids:
i = {'hasmask': id.hasmask, oxm = {'hasmask': i.hasmask,
'length': id.length, 'length': i.length,
'type': id.type} 'type': i.type}
oxm_ids.append(i) oxm_ids.append(oxm)
p['oxm_ids'] = oxm_ids p['oxm_ids'] = oxm_ids
elif prop.type in p_type_experimenter: elif prop.type in p_type_experimenter:
pass pass
properties.append(p) properties.append(p)
s = {'name': stat.name.decode('utf-8'), s = {
'metadata_match': stat.metadata_match, 'name': stat.name.decode('utf-8'),
'metadata_write': stat.metadata_write, 'metadata_match': stat.metadata_match,
'config': stat.config, 'metadata_write': stat.metadata_write,
'max_entries': stat.max_entries, 'config': stat.config,
'properties': properties, 'max_entries': stat.max_entries,
} 'properties': properties,
}
if to_user: if to_user:
s['table_id'] = UTIL.ofp_table_to_user(stat.table_id) s['table_id'] = UTIL.ofp_table_to_user(stat.table_id)

View File

@ -166,8 +166,7 @@ def to_match(dp, attrs):
'pbb_isid': ofctl_utils.to_match_masked_int, 'pbb_isid': ofctl_utils.to_match_masked_int,
'tunnel_id': ofctl_utils.to_match_masked_int, 'tunnel_id': ofctl_utils.to_match_masked_int,
'ipv6_exthdr': ofctl_utils.to_match_masked_int, 'ipv6_exthdr': ofctl_utils.to_match_masked_int,
'pbb_uca': int, 'pbb_uca': int}
}
keys = {'dl_dst': 'eth_dst', keys = {'dl_dst': 'eth_dst',
'dl_src': 'eth_src', 'dl_src': 'eth_src',
@ -430,27 +429,27 @@ def get_table_features(dp, waiters, to_user=True):
p['type'] = t if t != prop.type else 'UNKNOWN' p['type'] = t if t != prop.type else 'UNKNOWN'
if prop.type in p_type_instructions: if prop.type in p_type_instructions:
instruction_ids = [] instruction_ids = []
for id in prop.instruction_ids: for i in prop.instruction_ids:
i = {'len': id.len, inst = {'len': i.len,
'type': id.type} 'type': i.type}
instruction_ids.append(i) instruction_ids.append(inst)
p['instruction_ids'] = instruction_ids p['instruction_ids'] = instruction_ids
elif prop.type in p_type_next_tables: elif prop.type in p_type_next_tables:
table_ids = [] table_ids = []
for id in prop.table_ids: for i in prop.table_ids:
table_ids.append(id) table_ids.append(i)
p['table_ids'] = table_ids p['table_ids'] = table_ids
elif prop.type in p_type_actions: elif prop.type in p_type_actions:
action_ids = [] action_ids = []
for id in prop.action_ids: for i in prop.action_ids:
i = id.to_jsondict()[id.__class__.__name__] act = i.to_jsondict()[i.__class__.__name__]
action_ids.append(i) action_ids.append(act)
p['action_ids'] = action_ids p['action_ids'] = action_ids
elif prop.type in p_type_oxms: elif prop.type in p_type_oxms:
oxm_ids = [] oxm_ids = []
for id in prop.oxm_ids: for i in prop.oxm_ids:
i = id.to_jsondict()[id.__class__.__name__] oxm = i.to_jsondict()[i.__class__.__name__]
oxm_ids.append(i) oxm_ids.append(oxm)
p['oxm_ids'] = oxm_ids p['oxm_ids'] = oxm_ids
elif prop.type in p_type_experimenter: elif prop.type in p_type_experimenter:
pass pass
@ -677,8 +676,7 @@ def get_group_features(dp, waiters, to_user=True):
ofp.OFPAT_SET_FIELD: 'SET_FIELD', ofp.OFPAT_SET_FIELD: 'SET_FIELD',
ofp.OFPAT_PUSH_PBB: 'PUSH_PBB', ofp.OFPAT_PUSH_PBB: 'PUSH_PBB',
ofp.OFPAT_POP_PBB: 'POP_PBB', ofp.OFPAT_POP_PBB: 'POP_PBB',
ofp.OFPAT_EXPERIMENTER: 'EXPERIMENTER', ofp.OFPAT_EXPERIMENTER: 'EXPERIMENTER'}
}
stats = dp.ofproto_parser.OFPGroupFeaturesStatsRequest(dp, 0) stats = dp.ofproto_parser.OFPGroupFeaturesStatsRequest(dp, 0)
msgs = [] msgs = []

View File

@ -171,8 +171,7 @@ def to_match(dp, attrs):
'pbb_uca': int, 'pbb_uca': int,
'tcp_flags': int, 'tcp_flags': int,
'actset_output': int, 'actset_output': int,
'packet_type': ofctl_utils.to_match_packet_type, 'packet_type': ofctl_utils.to_match_packet_type}
}
keys = {'dl_dst': 'eth_dst', keys = {'dl_dst': 'eth_dst',
'dl_src': 'eth_src', 'dl_src': 'eth_src',
@ -501,27 +500,27 @@ def get_table_features(dp, waiters, to_user=True):
p['type'] = t if t != prop.type else 'UNKNOWN' p['type'] = t if t != prop.type else 'UNKNOWN'
if prop.type in p_type_instructions: if prop.type in p_type_instructions:
instruction_ids = [] instruction_ids = []
for id in prop.instruction_ids: for i in prop.instruction_ids:
i = {'len': id.len, inst = {'len': i.len,
'type': id.type} 'type': i.type}
instruction_ids.append(i) instruction_ids.append(inst)
p['instruction_ids'] = instruction_ids p['instruction_ids'] = instruction_ids
elif prop.type in p_type_next_tables: elif prop.type in p_type_next_tables:
table_ids = [] table_ids = []
for id in prop.table_ids: for i in prop.table_ids:
table_ids.append(id) table_ids.append(i)
p['table_ids'] = table_ids p['table_ids'] = table_ids
elif prop.type in p_type_actions: elif prop.type in p_type_actions:
action_ids = [] action_ids = []
for id in prop.action_ids: for i in prop.action_ids:
i = id.to_jsondict()[id.__class__.__name__] act = i.to_jsondict()[i.__class__.__name__]
action_ids.append(i) action_ids.append(act)
p['action_ids'] = action_ids p['action_ids'] = action_ids
elif prop.type in p_type_oxms: elif prop.type in p_type_oxms:
oxm_ids = [] oxm_ids = []
for id in prop.oxm_ids: for i in prop.oxm_ids:
i = id.to_jsondict()[id.__class__.__name__] oxm = i.to_jsondict()[i.__class__.__name__]
oxm_ids.append(i) oxm_ids.append(oxm)
p['oxm_ids'] = oxm_ids p['oxm_ids'] = oxm_ids
elif prop.type == p_type_packet: elif prop.type == p_type_packet:
oxm_values = [] oxm_values = []
@ -756,8 +755,7 @@ def get_group_features(dp, waiters, to_user=True):
ofp.OFPAT_POP_PBB: 'POP_PBB', ofp.OFPAT_POP_PBB: 'POP_PBB',
ofp.OFPAT_COPY_FIELD: 'COPY_FIELD', ofp.OFPAT_COPY_FIELD: 'COPY_FIELD',
ofp.OFPAT_METER: 'METER', ofp.OFPAT_METER: 'METER',
ofp.OFPAT_EXPERIMENTER: 'EXPERIMENTER', ofp.OFPAT_EXPERIMENTER: 'EXPERIMENTER'}
}
stats = dp.ofproto_parser.OFPGroupFeaturesStatsRequest(dp, 0) stats = dp.ofproto_parser.OFPGroupFeaturesStatsRequest(dp, 0)
msgs = [] msgs = []

View File

@ -18,13 +18,6 @@ import struct
def msg_pack_into(fmt, buf, offset, *args): def msg_pack_into(fmt, buf, offset, *args):
if len(buf) < offset:
buf += bytearray(offset - len(buf))
if len(buf) == offset:
buf += struct.pack(fmt, *args)
return
needed_len = offset + struct.calcsize(fmt) needed_len = offset + struct.calcsize(fmt)
if len(buf) < needed_len: if len(buf) < needed_len:
buf += bytearray(needed_len - len(buf)) buf += bytearray(needed_len - len(buf))

View File

@ -17,8 +17,7 @@
# string representation is in hex without '0x' # string representation is in hex without '0x'
_PORT_NO_LEN = 8 _PORT_NO_LEN = 8
_PORT_NO_LEN_STR = str(_PORT_NO_LEN) _PORT_NO_FMT = '%0{0}x'.format(_PORT_NO_LEN)
_PORT_NO_FMT = '%0' + _PORT_NO_LEN_STR + 'x'
PORT_NO_PATTERN = r'[0-9a-f]{%d}' % _PORT_NO_LEN PORT_NO_PATTERN = r'[0-9a-f]{%d}' % _PORT_NO_LEN

View File

@ -1,5 +1,3 @@
#!/usr/bin/env python
#
# Copyright (C) 2013 Nippon Telegraph and Telephone Corporation. # Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
# Copyright (C) 2013 YAMAMOTO Takashi <yamamoto at valinux co jp> # Copyright (C) 2013 YAMAMOTO Takashi <yamamoto at valinux co jp>
# #
@ -19,6 +17,9 @@
# msgpack-rpc # msgpack-rpc
# http://wiki.msgpack.org/display/MSGPACK/RPC+specification # http://wiki.msgpack.org/display/MSGPACK/RPC+specification
from collections import deque
import select
import msgpack import msgpack
import six import six
@ -53,12 +54,12 @@ class MessageEncoder(object):
assert isinstance(method, six.binary_type) assert isinstance(method, six.binary_type)
assert isinstance(params, list) assert isinstance(params, list)
msgid = self._create_msgid() msgid = self._create_msgid()
return (self._packer.pack([MessageType.REQUEST, msgid, method, return (self._packer.pack(
params]), msgid) [MessageType.REQUEST, msgid, method, params]), msgid)
def create_response(self, msgid, error=None, result=None): def create_response(self, msgid, error=None, result=None):
assert isinstance(msgid, int) assert isinstance(msgid, int)
assert 0 <= msgid and msgid <= 0xffffffff assert 0 <= msgid <= 0xffffffff
assert error is None or result is None assert error is None or result is None
return self._packer.pack([MessageType.RESPONSE, msgid, error, result]) return self._packer.pack([MessageType.RESPONSE, msgid, error, result])
@ -76,21 +77,18 @@ class MessageEncoder(object):
for m in self._unpacker: for m in self._unpacker:
self._dispatch_message(m, disp_table) self._dispatch_message(m, disp_table)
def _dispatch_message(self, m, disp_table): @staticmethod
def _dispatch_message(m, disp_table):
# XXX validation # XXX validation
type = m[0] t = m[0]
try: try:
f = disp_table[type] f = disp_table[t]
except KeyError: except KeyError:
# ignore messages with unknown type # ignore messages with unknown type
return return
f(m[1:]) f(m[1:])
from collections import deque
import select
class EndPoint(object): class EndPoint(object):
"""An endpoint """An endpoint
*sock* is a socket-like. it can be either blocking or non-blocking. *sock* is a socket-like. it can be either blocking or non-blocking.
@ -231,7 +229,7 @@ class EndPoint(object):
except KeyError: except KeyError:
return None return None
error, result = m error, result = m
return (result, error) return result, error
def get_notification(self): def get_notification(self):
return self._get_message(self._notifications) return self._get_message(self._notifications)
@ -241,6 +239,7 @@ class RPCError(Exception):
"""an error from server """an error from server
""" """
def __init__(self, error): def __init__(self, error):
super(RPCError, self).__init__()
self._error = error self._error = error
def get_value(self): def get_value(self):

View File

@ -40,6 +40,8 @@ class SnortLib(app_manager.RyuApp):
self.name = 'snortlib' self.name = 'snortlib'
self.config = {'unixsock': True} self.config = {'unixsock': True}
self._set_logger() self._set_logger()
self.sock = None
self.nwsock = None
def set_config(self, config): def set_config(self, config):
assert isinstance(config, dict) assert isinstance(config, dict)

View File

@ -21,6 +21,10 @@ import struct
from ryu.lib import sockaddr from ryu.lib import sockaddr
TCP_MD5SIG_LINUX = 0x0e
TCP_MD5SIG_BSD = 0x10
def _set_tcp_md5sig_linux(s, addr, key): def _set_tcp_md5sig_linux(s, addr, key):
# struct tcp_md5sig { # struct tcp_md5sig {
# struct sockaddr_storage addr; # struct sockaddr_storage addr;
@ -29,7 +33,6 @@ def _set_tcp_md5sig_linux(s, addr, key):
# u32 pad2; # u32 pad2;
# u8 key[80]; # u8 key[80];
# } # }
TCP_MD5SIG = 14
af = s.family af = s.family
if af == socket.AF_INET: if af == socket.AF_INET:
sa = sockaddr.sa_in4(addr) sa = sockaddr.sa_in4(addr)
@ -39,14 +42,13 @@ def _set_tcp_md5sig_linux(s, addr, key):
raise ValueError("unsupported af %s" % (af,)) raise ValueError("unsupported af %s" % (af,))
ss = sockaddr.sa_to_ss(sa) ss = sockaddr.sa_to_ss(sa)
tcp_md5sig = ss + struct.pack("2xH4x80s", len(key), key) tcp_md5sig = ss + struct.pack("2xH4x80s", len(key), key)
s.setsockopt(socket.IPPROTO_TCP, TCP_MD5SIG, tcp_md5sig) s.setsockopt(socket.IPPROTO_TCP, TCP_MD5SIG_LINUX, tcp_md5sig)
def _set_tcp_md5sig_bsd(s, _addr, _key): def _set_tcp_md5sig_bsd(s, _addr, _key):
# NOTE: On this platform, address and key need to be set using setkey(8). # NOTE: On this platform, address and key need to be set using setkey(8).
TCP_MD5SIG = 0x10
tcp_md5sig = struct.pack("I", 1) tcp_md5sig = struct.pack("I", 1)
s.setsockopt(socket.IPPROTO_TCP, TCP_MD5SIG, tcp_md5sig) s.setsockopt(socket.IPPROTO_TCP, TCP_MD5SIG_BSD, tcp_md5sig)
def set_tcp_md5sig(s, addr, key): def set_tcp_md5sig(s, addr, key):

View File

@ -191,7 +191,7 @@ class Stp(app_manager.RyuApp):
self.bridge_list = {} self.bridge_list = {}
def close(self): def close(self):
for dpid in self.bridge_list.keys(): for dpid in self.bridge_list:
self._unregister_bridge(dpid) self._unregister_bridge(dpid)
def _set_logger(self): def _set_logger(self):
@ -480,12 +480,12 @@ class Bridge(object):
pkt = packet.Packet(msg.data) pkt = packet.Packet(msg.data)
if bpdu.ConfigurationBPDUs in pkt: if bpdu.ConfigurationBPDUs in pkt:
""" Receive Configuration BPDU. # Received Configuration BPDU.
- If receive superior BPDU: # - If received superior BPDU:
re-caluculation of spanning tree. # Re-calculates spanning tree.
- If receive Topology Change BPDU: # - If received Topology Change BPDU:
throw EventTopologyChange. # Throws EventTopologyChange.
forward Topology Change BPDU. """ # Forwards Topology Change BPDU.
(bpdu_pkt, ) = pkt.get_protocols(bpdu.ConfigurationBPDUs) (bpdu_pkt, ) = pkt.get_protocols(bpdu.ConfigurationBPDUs)
if bpdu_pkt.message_age > bpdu_pkt.max_age: if bpdu_pkt.message_age > bpdu_pkt.max_age:
log_msg = 'Drop BPDU packet which message_age exceeded.' log_msg = 'Drop BPDU packet which message_age exceeded.'
@ -506,24 +506,23 @@ class Bridge(object):
self._forward_tc_bpdu(rcv_tc) self._forward_tc_bpdu(rcv_tc)
elif bpdu.TopologyChangeNotificationBPDUs in pkt: elif bpdu.TopologyChangeNotificationBPDUs in pkt:
""" Receive Topology Change Notification BPDU. # Received Topology Change Notification BPDU.
send Topology Change Ack BPDU. # Send Topology Change Ack BPDU and throws EventTopologyChange.
throw EventTopologyChange. # - Root bridge:
- Root bridge: # Sends Topology Change BPDU from all port.
send Topology Change BPDU from all port. # - Non root bridge:
- Non root bridge: # Sends Topology Change Notification BPDU to root bridge.
send Topology Change Notification BPDU to root bridge. """
in_port.transmit_ack_bpdu() in_port.transmit_ack_bpdu()
self.topology_change_notify(None) self.topology_change_notify(None)
elif bpdu.RstBPDUs in pkt: elif bpdu.RstBPDUs in pkt:
""" Receive Rst BPDU. """ # Received Rst BPDU.
# TODO: RSTP # TODO: RSTP
pass pass
else: else:
""" Receive non BPDU packet. # Received non BPDU packet.
throw EventPacketIn. """ # Throws EventPacketIn.
self.send_event(EventPacketIn(msg)) self.send_event(EventPacketIn(msg))
def recalculate_spanning_tree(self, init=True): def recalculate_spanning_tree(self, init=True):
@ -544,7 +543,7 @@ class Bridge(object):
if init: if init:
self.logger.info('Root bridge.', extra=self.dpid_str) self.logger.info('Root bridge.', extra=self.dpid_str)
for port_no in self.ports.keys(): for port_no in self.ports:
port_roles[port_no] = DESIGNATED_PORT port_roles[port_no] = DESIGNATED_PORT
else: else:
(port_roles, (port_roles,
@ -574,7 +573,7 @@ class Bridge(object):
root_priority = self.root_priority root_priority = self.root_priority
root_times = self.root_times root_times = self.root_times
for port_no in self.ports.keys(): for port_no in self.ports:
if self.ports[port_no].state is not PORT_STATE_DISABLE: if self.ports[port_no].state is not PORT_STATE_DISABLE:
port_roles[port_no] = DESIGNATED_PORT port_roles[port_no] = DESIGNATED_PORT
else: else:
@ -726,7 +725,7 @@ class Port(object):
dp.ofproto.OFPPF_1GB_HD: bpdu.PORT_PATH_COST_1GB, dp.ofproto.OFPPF_1GB_HD: bpdu.PORT_PATH_COST_1GB,
dp.ofproto.OFPPF_1GB_FD: bpdu.PORT_PATH_COST_1GB, dp.ofproto.OFPPF_1GB_FD: bpdu.PORT_PATH_COST_1GB,
dp.ofproto.OFPPF_10GB_FD: bpdu.PORT_PATH_COST_10GB} dp.ofproto.OFPPF_10GB_FD: bpdu.PORT_PATH_COST_10GB}
for rate in sorted(path_costs.keys(), reverse=True): for rate in sorted(path_costs, reverse=True):
if ofport.curr & rate: if ofport.curr & rate:
values['path_cost'] = path_costs[rate] values['path_cost'] = path_costs[rate]
break break
@ -859,10 +858,10 @@ class Port(object):
if new_state is not PORT_STATE_DISABLE: if new_state is not PORT_STATE_DISABLE:
self.ofctl.set_port_status(self.ofport, new_state) self.ofctl.set_port_status(self.ofport, new_state)
if(new_state is PORT_STATE_FORWARD or if(new_state is PORT_STATE_FORWARD
(self.state is PORT_STATE_FORWARD and or (self.state is PORT_STATE_FORWARD
(new_state is PORT_STATE_DISABLE or and (new_state is PORT_STATE_DISABLE
new_state is PORT_STATE_BLOCK))): or new_state is PORT_STATE_BLOCK))):
self.topology_change_notify(new_state) self.topology_change_notify(new_state)
if (new_state is PORT_STATE_DISABLE if (new_state is PORT_STATE_DISABLE
@ -927,7 +926,7 @@ class Port(object):
or self.role is NON_DESIGNATED_PORT)): or self.role is NON_DESIGNATED_PORT)):
self._update_wait_bpdu_timer() self._update_wait_bpdu_timer()
chk_flg = True chk_flg = True
elif(rcv_info is INFERIOR and self.role is DESIGNATED_PORT): elif rcv_info is INFERIOR and self.role is DESIGNATED_PORT:
chk_flg = True chk_flg = True
# Check TopologyChange flag. # Check TopologyChange flag.

View File

@ -1,5 +1,3 @@
#!/usr/bin/env python
#
# Copyright (C) 2013 Nippon Telegraph and Telephone Corporation. # Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
# Copyright (C) 2013 YAMAMOTO Takashi <yamamoto at valinux co jp> # Copyright (C) 2013 YAMAMOTO Takashi <yamamoto at valinux co jp>
# #
@ -19,7 +17,6 @@
from __future__ import print_function from __future__ import print_function
import base64 import base64
import collections
import inspect import inspect
import six import six
@ -104,7 +101,7 @@ class NXFlowSpecFieldType(TypeDescr):
if not isinstance(v, list): if not isinstance(v, list):
return v return v
field, ofs = v field, ofs = v
return (field, ofs) return field, ofs
_types = { _types = {
@ -126,7 +123,7 @@ class StringifyMixin(object):
Currently the following types are implemented. Currently the following types are implemented.
========= ============= ========= =============
Type Descrption Type Description
========= ============= ========= =============
ascii US-ASCII ascii US-ASCII
utf-8 UTF-8 utf-8 UTF-8
@ -162,7 +159,7 @@ class StringifyMixin(object):
def _is_class(cls, dict_): def _is_class(cls, dict_):
# we distinguish a dict like OFPSwitchFeatures.ports # we distinguish a dict like OFPSwitchFeatures.ports
# from OFPxxx classes using heuristics. # from OFPxxx classes using heuristics.
# exmples of OFP classes: # Examples of OFP classes:
# {"OFPMatch": { ... }} # {"OFPMatch": { ... }}
# {"MTIPv6SRC": { ... }} # {"MTIPv6SRC": { ... }}
assert isinstance(dict_, dict) assert isinstance(dict_, dict)
@ -208,7 +205,7 @@ class StringifyMixin(object):
if six.PY3: if six.PY3:
json_value = json_value.decode('ascii') json_value = json_value.decode('ascii')
elif isinstance(v, list): elif isinstance(v, list):
json_value = list(map(_encode, v)) json_value = [_encode(ve) for ve in v]
elif isinstance(v, dict): elif isinstance(v, dict):
json_value = _mapdict(_encode, v) json_value = _mapdict(_encode, v)
# while a python dict key can be any hashable object, # while a python dict key can be any hashable object,
@ -218,7 +215,7 @@ class StringifyMixin(object):
else: else:
try: try:
json_value = v.to_jsondict() json_value = v.to_jsondict()
except: except Exception:
json_value = v json_value = v
return json_value return json_value
return _encode return _encode
@ -253,7 +250,7 @@ class StringifyMixin(object):
============= ===================================================== ============= =====================================================
""" """
dict_ = {} dict_ = {}
encode = lambda k, x: self._encode_value(k, x, encode_string) encode = lambda key, val: self._encode_value(key, val, encode_string)
for k, v in obj_attrs(self): for k, v in obj_attrs(self):
dict_[k] = encode(k, v) dict_[k] = encode(k, v)
return {self.__class__.__name__: dict_} return {self.__class__.__name__: dict_}
@ -282,6 +279,8 @@ class StringifyMixin(object):
@classmethod @classmethod
def _decode_value(cls, k, json_value, decode_string=base64.b64decode, def _decode_value(cls, k, json_value, decode_string=base64.b64decode,
**additional_args): **additional_args):
# Note: To avoid passing redundant arguments (e.g. 'datapath' for
# non OFP classes), we omit '**additional_args' here.
return cls._get_decoder(k, decode_string)(json_value) return cls._get_decoder(k, decode_string)(json_value)
@classmethod @classmethod
@ -290,13 +289,13 @@ class StringifyMixin(object):
if isinstance(json_value, (bytes, six.text_type)): if isinstance(json_value, (bytes, six.text_type)):
v = decode_string(json_value) v = decode_string(json_value)
elif isinstance(json_value, list): elif isinstance(json_value, list):
v = list(map(_decode, json_value)) v = [_decode(jv) for jv in json_value]
elif isinstance(json_value, dict): elif isinstance(json_value, dict):
if cls._is_class(json_value): if cls._is_class(json_value):
v = cls.obj_from_jsondict(json_value, **additional_args) v = cls.obj_from_jsondict(json_value, **additional_args)
else: else:
v = _mapdict(_decode, json_value) v = _mapdict(_decode, json_value)
# XXXhack # XXX: Hack
# try to restore integer keys used by # try to restore integer keys used by
# OFPSwitchFeatures.ports. # OFPSwitchFeatures.ports.
try: try:
@ -386,11 +385,11 @@ def obj_attrs(msg_):
""" """
if isinstance(msg_, StringifyMixin): if isinstance(msg_, StringifyMixin):
iter = msg_.stringify_attrs() itr = msg_.stringify_attrs()
else: else:
# probably called by msg_str_attr # probably called by msg_str_attr
iter = obj_python_attrs(msg_) itr = obj_python_attrs(msg_)
for k, v in iter: for k, v in itr:
if k.endswith('_') and k[:-1] in _RESERVED_KEYWORD: if k.endswith('_') and k[:-1] in _RESERVED_KEYWORD:
# XXX currently only StringifyMixin has restoring logic # XXX currently only StringifyMixin has restoring logic
assert isinstance(msg_, StringifyMixin) assert isinstance(msg_, StringifyMixin)

View File

@ -14,6 +14,7 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
import base64
import six import six
@ -28,20 +29,20 @@ class IntDescr(TypeDescr):
def __init__(self, size): def __init__(self, size):
self.size = size self.size = size
def to_user(self, bin): def to_user(self, binary):
i = 0 i = 0
for x in range(self.size): for _ in range(self.size):
c = bin[:1] c = binary[:1]
i = i * 256 + ord(c) i = i * 256 + ord(c)
bin = bin[1:] binary = binary[1:]
return i return i
def from_user(self, i): def from_user(self, i):
bin = b'' binary = b''
for x in range(self.size): for _ in range(self.size):
bin = six.int2byte(i & 255) + bin binary = six.int2byte(i & 255) + binary
i //= 256 i //= 256
return bin return binary
Int1 = IntDescr(1) Int1 = IntDescr(1)
Int2 = IntDescr(2) Int2 = IntDescr(2)
@ -65,13 +66,13 @@ class IntDescrMlt(TypeDescr):
self.num = num self.num = num
self.size = length * num self.size = length * num
def to_user(self, bin): def to_user(self, binary):
assert len(bin) == self.size assert len(binary) == self.size
lb = _split_str(bin, self.length) lb = _split_str(binary, self.length)
li = [] li = []
for b in lb: for b in lb:
i = 0 i = 0
for x in range(self.length): for _ in range(self.length):
c = b[:1] c = b[:1]
i = i * 256 + ord(c) i = i * 256 + ord(c)
b = b[1:] b = b[1:]
@ -80,14 +81,14 @@ class IntDescrMlt(TypeDescr):
def from_user(self, li): def from_user(self, li):
assert len(li) == self.num assert len(li) == self.num
bin = b'' binary = b''
for i in li: for i in li:
b = b'' b = b''
for x in range(self.length): for _ in range(self.length):
b = six.int2byte(i & 255) + b b = six.int2byte(i & 255) + b
i //= 256 i //= 256
bin += b binary += b
return bin return binary
Int4Double = IntDescrMlt(4, 2) Int4Double = IntDescrMlt(4, 2)
@ -111,13 +112,12 @@ class IPv6Addr(TypeDescr):
class UnknownType(TypeDescr): class UnknownType(TypeDescr):
import base64
b64encode = base64.b64encode @staticmethod
if six.PY3: def to_user(data):
@classmethod if six.PY3:
def to_user(cls, data): return base64.b64encode(data).decode('ascii')
return cls.b64encode(data).decode('ascii') else:
else: return base64.b64encode(data)
to_user = staticmethod(base64.b64encode)
from_user = staticmethod(base64.b64decode) from_user = staticmethod(base64.b64decode)