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:
parent
6154450494
commit
59ea6a5231
@ -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):
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
@ -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.
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
|
||||||
# -------------------------------------------------------------------
|
# -------------------------------------------------------------------
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
@ -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):
|
||||||
|
@ -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,7 +451,8 @@ 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_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',
|
||||||
}
|
}
|
||||||
@ -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):
|
||||||
|
@ -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,35 +597,36 @@ 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 = {
|
||||||
|
'name': stat.name.decode('utf-8'),
|
||||||
'metadata_match': stat.metadata_match,
|
'metadata_match': stat.metadata_match,
|
||||||
'metadata_write': stat.metadata_write,
|
'metadata_write': stat.metadata_write,
|
||||||
'config': stat.config,
|
'config': stat.config,
|
||||||
|
@ -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 = []
|
||||||
|
@ -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 = []
|
||||||
|
@ -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))
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
@ -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):
|
||||||
|
@ -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)
|
||||||
|
@ -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):
|
||||||
|
@ -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.
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
def to_user(data):
|
||||||
if six.PY3:
|
if six.PY3:
|
||||||
@classmethod
|
return base64.b64encode(data).decode('ascii')
|
||||||
def to_user(cls, data):
|
|
||||||
return cls.b64encode(data).decode('ascii')
|
|
||||||
else:
|
else:
|
||||||
to_user = staticmethod(base64.b64encode)
|
return base64.b64encode(data)
|
||||||
|
|
||||||
from_user = staticmethod(base64.b64decode)
|
from_user = staticmethod(base64.b64decode)
|
||||||
|
Loading…
Reference in New Issue
Block a user