Skip to content

Commit

Permalink
Merge pull request #2416 from anarkiwi/master
Browse files Browse the repository at this point in the history
1.8.19 (Chewie rollback)
  • Loading branch information
anarkiwi committed Sep 3, 2018
2 parents f7cc7b2 + bc5a512 commit 2a8bddf
Show file tree
Hide file tree
Showing 5 changed files with 68 additions and 178 deletions.
2 changes: 1 addition & 1 deletion debian/control
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ Depends: python3-oslo.config (>= 1:3.9~),
python3-eventlet (>= 0.22.1), python3-eventlet (<< 0.22.2),
python3-ryu (>= 4.27), python3-ryu (<< 4.28),
python3-beka (>= 0.3.3), python3-beka (<< 0.3.4),
python3-chewie (>= 0.0.5), python3-chewie (<< 0.0.6),
python3-chewie (>= 0.0.2), python3-chewie (<< 0.0.3),
python3-pytricia (>= 1.0.0),
python3:any (>= 3.4~),
Suggests: python-faucet-doc, faucet, gauge, oslo.config,
Expand Down
88 changes: 32 additions & 56 deletions faucet/faucet_dot1x.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
from ryu.lib import hub # pylint: disable=wrong-import-position

from chewie.chewie import Chewie # pylint: disable=wrong-import-position
from chewie.mac_address import MacAddress # pylint: disable=wrong-import-position


class FaucetDot1x:
Expand All @@ -32,85 +33,60 @@ def __init__(self, logger, metrics, send_flow_msgs):
self.logger = logger
self.metrics = metrics
self._send_flow_msgs = send_flow_msgs
self._valves = None
self._valve = None
self.dot1x_speaker = None
self.dot1x_intf = None
self.mac_to_port = {} # {"00:00:00:00:00:02" : (valve_0, port_1)}
self.dot1x_port = None

def _create_dot1x_speaker(self, dot1x_intf):
def _create_dot1x_speaker(self):
chewie = Chewie( # pylint: disable=too-many-function-args
dot1x_intf, self.logger,
self.dot1x_intf, self.logger,
self.auth_handler, self.failure_handler, self.logoff_handler,
'127.0.0.1')
hub.spawn(chewie.run)
return chewie

def get_valve_and_port(self, port_id):
"""Finds the valve and port that this address corresponds to
Args:
port_id: is a macaddress string"""
valve, port = self.mac_to_port[port_id]
return valve, port

def auth_handler(self, address, port_id):
def auth_handler(self, address, _group_address):
"""Callback for when a successful auth happens."""
valve, dot1x_port = self.get_valve_and_port(port_id)

self.logger.info(
'Successful auth from MAC %s on %s' % (
str(address), dot1x_port))
self.metrics.inc_var('dp_dot1x_success', valve.base_prom_labels)
self.metrics.inc_var('port_dot1x_success', valve.port_labels(dot1x_port))
str(address), self.dot1x_port))
self.metrics.inc_var('dp_dot1x_success', self._valve.base_prom_labels)
self.metrics.inc_var('port_dot1x_success', self._valve.port_labels(self.dot1x_port))

flowmods = valve.add_authed_mac(
dot1x_port.number, str(address))
flowmods = self._valve.add_authed_mac(
self.dot1x_port.number, str(address))
if flowmods:
self._send_flow_msgs(valve, flowmods)
self._send_flow_msgs(self._valve, flowmods)

def logoff_handler(self, address, port_id):
def logoff_handler(self, address, _):
"""Callback for when an EAP logoff happens."""
valve, dot1x_port = self.get_valve_and_port(port_id)
self.logger.info('Logoff from MAC %s on %s',
str(address), dot1x_port)
self.metrics.inc_var('dp_dot1x_logoff', valve.base_prom_labels)
self.metrics.inc_var('port_dot1x_logoff', valve.port_labels(dot1x_port))
flowmods = valve.del_authed_mac(dot1x_port.number, str(address))
str(address), self.dot1x_port)
self.metrics.inc_var('dp_dot1x_logoff', self._valve.base_prom_labels)
self.metrics.inc_var('port_dot1x_logoff', self._valve.port_labels(self.dot1x_port))
flowmods = self._valve.del_authed_mac(self.dot1x_port.number, str(address))
if flowmods:
self._send_flow_msgs(valve, flowmods)
self._send_flow_msgs(self._valve, flowmods)

def failure_handler(self, address, port_id):
def failure_handler(self, address, _):
"""Callback for when a EAP failure happens."""
valve, dot1x_port = self.get_valve_and_port(port_id)
self.logger.info('Failure from MAC %s on %s',
str(address), dot1x_port)
self.metrics.inc_var('dp_dot1x_failure', valve.base_prom_labels)
self.metrics.inc_var('port_dot1x_failure', valve.port_labels(dot1x_port))
str(address), self.dot1x_port)
self.metrics.inc_var('dp_dot1x_failure', self._valve.base_prom_labels)
self.metrics.inc_var('port_dot1x_failure', self._valve.port_labels(self.dot1x_port))

def reset(self, valves):
"""Set up a dot1x speaker."""
# TODO: support multiple Valves and ports.
self._valves = valves
valve_id = -1
for valve in list(valves.values()):
valve_id += 1
if self.dot1x_speaker is None:
if valve.dp.dot1x:
dot1x_intf = valve.dp.dot1x['nfv_intf']
self.dot1x_speaker = self._create_dot1x_speaker(dot1x_intf)
else:
continue
if valve.dp.dot1x and valve.dp.dot1x_ports():
for dot1x_port in valve.dp.dot1x_ports():
if dot1x_port.number > 255:
self.logger.info('dot1x not enabled on %s %s. Port number is larger than 255'
% (valve.dp, dot1x_port))
continue
if valve_id > 255:
self.logger.info('dot1x not enabled on %s %s. more than 255 valves'
% (valve.dp, dot1x_port))
continue
mac_str = "00:00:00:00:%02x:%02x" % (valve_id, dot1x_port.number)
self.mac_to_port[mac_str] = (valve, dot1x_port)
if self.dot1x_speaker is None:
for valve in list(valves.values()):
if valve.dp.dot1x and valve.dp.dot1x_ports():
self._valve = valve
self.dot1x_intf = self._valve.dp.dot1x['nfv_intf']
self.dot1x_port = self._valve.dp.dot1x_ports()[0]
self.dot1x_speaker = self._create_dot1x_speaker()
self.logger.info(
'dot1x enabled on %s (%s) port %s, NFV interface %s' % (
valve.dp, valve_id, dot1x_port, dot1x_intf))
'dot1x enabled on %s %s, NFV interface %s' % (
self._valve.dp, self.dot1x_port, self.dot1x_intf))
break
2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
chewie==0.0.5
chewie==0.0.2
datadiff
eventlet==0.22.1 # pyup: ignore
influxdb
Expand Down
2 changes: 1 addition & 1 deletion setup.cfg
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[metadata]
name = faucet
version = 1.8.18
version = 1.8.19
summary = Faucet is an OpenFlow controller that implements a layer 2 and layer 3 switch.
license = Apache-2
author = Faucet development team
Expand Down
Loading

0 comments on commit 2a8bddf

Please sign in to comment.