faucet.valve module

Implementation of Valve learning layer 2/3 switch.

class faucet.valve.AlliedTelesis(dp, logname, metrics, notifier, dot1x)[source]

Bases: OVSValve

Valve implementation for AT.

DEC_TTL = False
acl_manager
dot1x
dp
logger
logname
metrics
notifier
ofchannel_logger
pipeline
recent_ofmsgs
stack_manager
stale_root
switch_manager
class faucet.valve.ArubaValve(dp, logname, metrics, notifier, dot1x)[source]

Bases: TfmValve

Valve implementation for Aruba.

DEC_TTL = False
FILL_REQ = False
acl_manager
dot1x
dp
logger
logname
metrics
notifier
ofchannel_logger
pipeline
recent_ofmsgs
stack_manager
stale_root
switch_manager
class faucet.valve.CiscoC9KValve(dp, logname, metrics, notifier, dot1x)[source]

Bases: TfmValve

Valve implementation for C9K.

acl_manager
dot1x
dp
logger
logname
metrics
notifier
ofchannel_logger
pipeline
recent_ofmsgs
stack_manager
stale_root
switch_manager
class faucet.valve.Dot1xManager(dot1x, dp_id, dot1x_ports, nfv_sw_port)[source]

Bases: ValveManagerBase

Dot1x protocol manager. Has to be here to avoid eventlet monkey patch in faucet_dot1x

add_port(port)[source]

install flows in response to a new port

del_port(port)[source]

delete flows in response to a port removal

class faucet.valve.NoviFlowValve(dp, logname, metrics, notifier, dot1x)[source]

Bases: Valve

Valve implementation for NoviFlow with static pipeline.

STATIC_TABLE_IDS = True
USE_BARRIERS = True
acl_manager
dot1x
dp
logger
logname
metrics
notifier
ofchannel_logger
pipeline
recent_ofmsgs
stack_manager
stale_root
switch_manager
class faucet.valve.OVSTfmValve(dp, logname, metrics, notifier, dot1x)[source]

Bases: TfmValve

Valve implementation for OVS.

MAX_TABLE_ID = 253
MIN_MAX_FLOWS = 1000000
USE_BARRIERS = False
USE_OXM_IDS = False
acl_manager
dot1x
dp
logger
logname
metrics
notifier
ofchannel_logger
pipeline
recent_ofmsgs
stack_manager
stale_root
switch_manager
class faucet.valve.OVSValve(dp, logname, metrics, notifier, dot1x)[source]

Bases: Valve

Valve implementation for OVS.

USE_BARRIERS = False
acl_manager
dot1x
dp
logger
logname
metrics
notifier
ofchannel_logger
pipeline
recent_ofmsgs
stack_manager
stale_root
switch_manager
class faucet.valve.TfmValve(dp, logname, metrics, notifier, dot1x)[source]

Bases: Valve

Valve implementation that uses OpenFlow send table features messages.

FILL_REQ = True
MAX_TABLE_ID = 0
MIN_MAX_FLOWS = 0
USE_OXM_IDS = True
acl_manager
dot1x
dp
logger
logname
metrics
notifier
ofchannel_logger
pipeline
recent_ofmsgs
stack_manager
stale_root
switch_manager
class faucet.valve.Valve(dp, logname, metrics, notifier, dot1x)[source]

Bases: object

Generates the messages to configure a datapath as a l2 learning switch.

Vendor specific implementations may require sending configuration flows. This can be achieved by inheriting from this class and overwriting the function switch_features.

DEC_TTL = True
GROUPS = True
STATIC_TABLE_IDS = False
USE_BARRIERS = True
acl_manager
add_dot1x_native_vlan(port_num, vlan_name)[source]
add_route(vlan, ip_gw, ip_dst)[source]

Add route to VLAN routing table.

add_vlan(vlan, cold_start=False)[source]

Configure a VLAN.

add_vlans(vlans, cold_start=False)[source]
advertise(now, _other_values)[source]

Called periodically to advertise services (eg. IPv6 RAs).

close_logs()[source]

Explicitly close any active loggers.

datapath_connect(now, discovered_up_ports)[source]

Handle Ryu datapath connection event and provision pipeline.

Parameters:
  • now (float) – current epoch time.

  • discovered_up_ports (set) – datapath port numbers that are up.

Returns:

OpenFlow messages to send to datapath.

Return type:

list

datapath_disconnect(now)[source]

Handle Ryu datapath disconnection event.

del_dot1x_native_vlan(port_num)[source]
del_route(vlan, ip_dst)[source]

Delete route from VLAN routing table.

del_vlan(vlan)[source]

Delete a configured VLAN.

del_vlans(vlans)[source]
dot1x
dot1x_event(event_dict)[source]
dp
dp_init(new_dp=None, valves=None)[source]

Initialize datapath state at connection/re/config time.

fast_advertise(now, _other_valves)[source]

Called periodically to send LLDP/LACP packets.

fast_state_expire(now, other_valves)[source]

Called periodically to verify the state of stack ports.

floods_to_root()[source]

Return True if our dp floods (only) to root switch

flow_timeout(now, table_id, match)[source]

Call flow timeout message handler:

Parameters:
  • now (float) – current epoch time.

  • table_id (int) – ID of table where flow was installed.

  • match (dict) – match conditions for expired flow.

Returns:

OpenFlow messages, if any.

Return type:

list

lacp_update(port, lacp_up, now=None, lacp_pkt=None, other_valves=None, cold_start=False)[source]

Update the port’s LACP states and enables/disables pipeline processing.

Parameters:
  • port – The port the packet is being received on

  • lacp_up (bool) – Whether the lacp actor is up

  • now (float) – The current time

  • lacp_pkt (PacketMeta) – The received LACP packet

  • other_valves (list) – List of other valves (in the stack)

  • cold_start (bool) – Whether port is cold starting.

Returns:

ofmsgs

learn_host(now, pkt_meta, other_valves)[source]

Possibly learn a host on a port.

Parameters:
  • now (float) – current epoch time.

  • pkt_meta (PacketMeta) – PacketMeta instance for packet received.

  • other_valves (list) – all Valves other than this one.

Returns:

OpenFlow messages, if any.

Return type:

list

lldp_handler(now, pkt_meta, other_valves)[source]

Handle an LLDP packet.

Parameters:

pkt_meta (PacketMeta) – packet for control plane.

logger
logname
metrics
notifier
notify(event_dict)[source]

Send an event notification.

ofchannel_log(ofmsgs)[source]

Log OpenFlow messages in text format to debugging log.

ofchannel_logger
ofdescstats_handler(body)[source]

Handle OF DP description.

oferror(msg)[source]

Correlate OFError message with flow we sent, if any.

Parameters:

msg (ryu.controller.ofp_event.EventOFPMsgBase) – message from datapath.

parse_pkt_meta(msg)[source]

Parse OF packet-in message to PacketMeta.

parse_rcv_packet(reason, in_port, vlan_vid, eth_type, data, orig_len, pkt, eth_pkt, vlan_pkt)[source]

Parse a received packet into a PacketMeta instance.

Parameters:
  • reason (int) – reason for packet in message.

  • in_port (int) – port packet was received on.

  • vlan_vid (int) – VLAN VID of port packet was received on.

  • eth_type (int) – Ethernet type of packet.

  • data (bytes) – Raw packet data.

  • orig_len (int) – Original length of packet.

  • pkt (ryu.lib.packet.packet) – parsed packet received.

  • ekt_pkt (ryu.lib.packet.ethernet) – parsed Ethernet header.

  • vlan_pkt (ryu.lib.packet.vlan) – parsed VLAN Ethernet header.

Returns:

PacketMeta instance.

pipeline
port_add(port_num)[source]

Handle addition of a single port.

Parameters:

port_num (list) – list of port numbers.

Returns:

OpenFlow messages, if any.

Return type:

list

port_delete(port_num, keep_cache=False, other_valves=None)[source]

Return flow messages that delete port from pipeline.

port_desc_stats_reply_handler(port_desc_stats, _other_valves, now)[source]
port_status_handler(port_no, reason, state, _other_valves, now)[source]

Return OpenFlow messages responding to port operational status change.

ports_add(port_nums, cold_start=False, log_msg='up')[source]

Handle the addition of ports.

Parameters:
  • port_num (list) – list of port numbers.

  • cold_start (bool) – True if configuring datapath from scratch.

Returns:

OpenFlow messages, if any.

Return type:

list

ports_delete(port_nums, log_msg='down', keep_cache=False, other_valves=None, now=None)[source]

Handle the deletion of ports.

Parameters:

port_nums (list) – list of port numbers.

Returns:

OpenFlow messages, if any.

Return type:

list

prepare_send_flows(flow_msgs)[source]

Prepare to send flows to datapath.

Parameters:

flow_msgs (list) – OpenFlow messages to send.

rate_limit_packet_ins(now)[source]

Return True if too many packet ins this second.

rcv_packet(now, other_valves, pkt_meta)[source]

Handle a packet from the dataplane (eg to re/learn a host).

The packet may be sent to us also in response to FAUCET initiating IPv6 neighbor discovery, or ARP, to resolve a nexthop.

Parameters:
  • other_valves (list) – all Valves other than this one.

  • pkt_meta (PacketMeta) – packet for control plane.

Returns:

OpenFlow messages, if any by Valve.

Return type:

dict

recent_ofmsgs
reload_config(_now, new_dp, valves=None)[source]

Reload configuration new_dp.

Following config changes are currently supported:
  • Port config: support all available configs

    (e.g. native_vlan, acl_in) & change operations (add, delete, modify) a port

  • ACL config:support any modification, currently reload all

    rules belonging to an ACL

  • VLAN config: enable, disable routing, etc…

Parameters:
  • now (float) – current epoch time.

  • new_dp (DP) – new dataplane configuration.

  • valves (list) – List of all valves

Returns:

OpenFlow messages.

Return type:

ofmsgs (list)

resolve_gateways(now, _other_valves)[source]

Call route managers to re/resolve gateways.

Returns:

OpenFlow messages, if any by Valve.

Return type:

dict

router_rcv_packet(now, pkt_meta)[source]

Process packets destined for router or run resolver.

Parameters:
  • now (float) – current epoch time.

  • pkt_meta (PacketMeta) – packet for control plane.

Returns:

OpenFlow messages.

Return type:

list

router_vlan_for_ip_gw(vlan, ip_gw)[source]
send_flows(ryu_dp, flow_msgs, now)[source]

Send flows to datapath (or disconnect an OF session).

Parameters:
  • ryu_dp (ryu.controller.controller.Datapath) – datapath.

  • flow_msgs (list) – OpenFlow messages to send.

stack_manager
stale_root
state_expire(now, other_valves)[source]

Expire controller caches/state (e.g. hosts learned).

Parameters:
  • now (float) – current epoch time.

  • other_valves (list) – all Valves other than this one.

Returns:

OpenFlow messages, if any by Valve.

Return type:

dict

switch_features(_msg)[source]

Send configuration flows necessary for the switch implementation.

Parameters:

msg (OFPSwitchFeatures) – msg sent from switch.

Vendor specific configuration should be implemented here.

switch_manager
update_config_metrics()[source]

Update table names for configuration.

update_metrics(now, updated_port=None, rate_limited=False)[source]

Update Gauge/metrics.

class faucet.valve.ValveLogger(logger, dp_id, dp_name)[source]

Bases: object

Logger for a Valve that adds DP ID.

debug(log_msg)[source]

Log debug level message.

error(log_msg)[source]

Log error level message.

info(log_msg)[source]

Log info level message.

warning(log_msg)[source]

Log warning level message.

faucet.valve.valve_factory(dp)[source]

Return a Valve object based dp’s hardware configuration field.

Parameters:

dp (DP) – DP instance with the configuration for this Valve.