project overview cs5229 lecturer: dr. richard ma ta: mostafa rezazad
TRANSCRIPT
Project Overview
CS5229Lecturer: Dr. Richard MA
TA: Mostafa Rezazad
Variety of SDN Controllers
• NOX/POX• Ryu• Floodlight• OpenDaylight• Pyretic• Frenetic• Procera• RouteFlow• Trema
POX: Overview
• A platform for building network control applications using Python
• Supports OpenFlow v. 1.0 only
• Advantages:o Widely used, maintained, supportedo Relatively easy to read and write code
• Disadvantages: Performance
OpenFlowSwitch
OpenFlowSwitch
OpenFlowSwitch
OpenFlo
w
OpenFlo
w
OpenFlo
w
Preview
Control Plane
Data Plane
Listener Control Logic Messager
1
Parse packet and execute control logicFirst packet arrives at switchNo flow table match“PacketIn” event firedPacket sent to controllerCompose and send messageWrite flow table entrySecond packet arrives at switchFlow table matchAction
PacketIn
Msg
Entry 1
2
Learn through an example
• Implement a switcho What is a switch?o What is a hub?
Simple hub
• Ethernet is a broadcast mediumo Hub is a flooding device
Example: Simple Switch
• Switch layer 2:o A multiple port bridge o learn about the MAC addresses on each portso passes MAC frames destined to those ports.
A
A’
B
B’ C
C’
1 2
345
6
Self-learning, forwarding: example
A A’
Source: ADest: A’
MAC addr interface TTL
switch table (initially empty)
A 1 60
A A’A A’A A’A A’A A’
• frame destination, A’, location unknown: flood
A’ A
• destination A location known:
A’ 4 60
selectively send on just one link
How it works?
• Step 1: Register event listeners to handle specific events (e.g. ConnectionUp, PacketIn)
• Step 2: Parse packet and execute control logics
• Step 3: Compose and send the OpenFlow message to the switch
ControllerListenerEvent
def launch ():
1- core.openflow.addListenerByName("PacketIn", _handle_PacketIn)
2- core.registerNew (Tutorial)
Class Tutorial(EventMixin): //EventMixin is the class that raises events
def __init__(self): self.listenTo(core.openflow)
core.openflow_discovery.addListeners(self)//then implement all handlers you need….
How it works?
• Step 1: Register event listeners to handle specific events (e.g. ConnectionUp, PacketIn)
• Step 2: Parse packet and execute control logics
• Step 3: Compose and send the OpenFlow message to the switch
ControllerListener Control LogicEvent
def _handle_PacketIn (self, event): packet = event.parsed dst_port = table.get(packet.dst)
def _handle_ConnectioUp (self, event) :log.debug(“Switch %s has come up.”,
dpid_to_str(event.dpid))
Every switch connected to the controller has an id named dpid (data path id).
How it works?
• Step 1: Register event listeners to handle specific events (e.g. ConnectionUp, PacketIn)
• Step 2: Parse packet and execute control logics
• Step 3: Compose and send the OpenFlow message to the switch
Listener Control Logic MessagerEvent
Msg
msg = of.ofp_flow_mod() <- This instructs a switch to install a flow table entry
msg.match.dl_src = packet.src another example is:
msg.match.dl_dst = packet.dst _packet_out()
msg.actions.append(of.ofp_action_output(port = dst_port))event.connection.send(msg)
Example: Simple Switch
def launch (): core.openflow.addListenerByName("PacketIn", _handle_PacketIn)
def _handle_PacketIn (event): packet = event.parsed dst_port = table.get(packet.dst)
msg = of.ofp_flow_mod() msg.match.dl_src = packet.src msg.match.dl_dst = packet.dst msg.actions.append(of.ofp_action_output(port = dst_port)) event.connection.send(msg)
Step 1: Register event listener
Example: Simple Switch
def launch (): core.openflow.addListenerByName("PacketIn", _handle_PacketIn)
def _handle_PacketIn (event): packet = event.parsed dst_port = table.get(packet.dst)
msg = of.ofp_flow_mod() msg.match.dl_src = packet.src msg.match.dl_dst = packet.dst msg.actions.append(of.ofp_action_output(port = dst_port)) event.connection.send(msg)
Step 2: Parse the packet and execute control logics
Example: Simple Switch
def launch (): core.openflow.addListenerByName("PacketIn", _handle_PacketIn)
def _handle_PacketIn (event): packet = event.parsed dst_port = table.get(packet.dst)
msg = of.ofp_flow_mod() msg.match.dl_src = packet.src msg.match.dl_dst = packet.dst msg.actions.append(of.ofp_action_output(port = dst_port)) event.connection.send(msg)Step 3: Compose and send OpenFlow
message
Network slicing
• Divide the production network into logical sliceso Each slice controls its own packet
forwarding
• Enforce strong isolation between sliceso Actions in one slice do not affect another
Example1: FlowVisor
• FlowVisor a transparent proxy between switches and multiple controllers
• FlowVisor enforces isolation between each slice
OpenFlowSwitch
OpenFlowSwitch
OpenFlowSwitch
OpenFlowSwitch
OpenFlowSwitch
FlowVisor
Slice 1Controller
Slice 2Controller
Slice 3Controller
OFOF
OF OF
OF
OF OF
OF
OpenFlowSwitch
Example2: QoS-related Network Slicing• Multiple queues for multiple classes• Guaranteed minimum bandwidth• Queue configuration is not part of the
openflow• Configuration defines packet treatment • Openflow maps flows to queuesRef:http://archive.openflow.org/wk/index.php/Slicing
Controller
OF
Q1 Q2 Q3 Q4 Q5DQ IF1
IF2
IF1IF3
IF4
Your project
• It is not FlowVisor • It is not multiple queues (e.g., QoS)• Special case where multiple bandwidth is
provided• Separate traffics into two slices and assign to
different interfaces (not different controller not different queues)
• Try to keep it simple.
Lets have a look at the skeleton!
Flow Space