Friday, November 21, 2014

Syntax and parameters of different OpenFlow library functions

The core function of OpenFlow is implemented in /opt/openflow-main/nox/src/nox/lib.

The core.py contains following important functions:

register_for_port_status(self, handler):
register_for_datapath_leave(self, handler):
register_for_flow_stats_in(self, handler):
register_for_aggregate_stats_in(self, handler):
register_for_port_stats_in(self, handler):
register_for_table_stats_in(self, handler):
register_for_datapath_join(self, handler):
register_for_flow_mod(self, handler):
register_for_flow_removed(self, handler):
register_for_packet_in(self, handler):

The file describes the syntax to be followed while declaring a handler function.

Simple program for understanding OpenFlow

I thank Mr. Michael Karl for helping me in understanding the OpenFlow modules.



# Import helper classes
execfile('/opt/openflow-main/nox/src/nox/coreapps/mycontroller/main/myrouting.py')

# Initialize helper classes
myrouting = My_Routing()
Ramakrishna = RamakrishnaModule(); # init Ramakrishna's module

def oflogger(txt):
logger.warn('-OPENFLOW / WARN- : ' + txt + '\n')

def oferror(txt):
logger.warn('\n\n\n-OPENFLOW / ERROR- : ' + txt + ' \n\n\n')

class mycontroller(Component):
""" Main control component for NOX of My OpenFlow Network
"""

def __init__(self, ctxt):
""" Initialize the my controller
@param ctxt: nox context. This is only needed for the super constructor
"""

# Call inherited constructor
Component.__init__(self, ctxt)

Ramakrishna.setCtrl(self)

# init internal variables
self._discovery = self.resolve('nox.netapps.discovery.discovery.discovery')

logger.debug('OPENFLOW-CONTROL Initialized')




def install(self):
""" Install self as NOX component. This method will be called by the NOX framework.
All we do is register ourselves to the appropriate events.
"""

# Handler
self.register_for_packet_in(self.handle_my_packet_in)
self.register_for_datapath_join(self.handle_my_dp_join)
self.register_for_datapath_leave(self.handle_my_dp_leave)
self.register_for_flow_removed(self.handle_my_flow_removed)
self.register_for_flow_mod(self.handle_my_flow_mod)
self.register_handler(Link_event.static_my_get_name(), self.handle_my_link_event)


logger.debug('OF-CONTROL Installed')

def getInterface(self):
""" Returns a string representation of this my controller object """
return str(mycontroller)


def handle_my_packet_in(self, dpid, inport, reason, length, bufid, packet):
"""
This function is called to notify the controller of an incoming packet on a router
@param dpid: DPID of the switch receiving the packet
@param inport: port at the switch on which the packet was received
@param reason: ???
@param length: Length of the incoming packet
@param bufid: ???
@param packet: the packet blob
"""

# Could not parse packet. Ignore
if not packet.parsed:
return CONTINUE

# Forward every packet seen by the controller also to Ramakrishna's module
Ramakrishna.PacketIn(dpid, inport, reason, length, bufid, packet)

return CONTINUE

def handle_my_dp_join(self, dpid, stats):
"""
This method is called when a switch joins us. We notify our helpers, reset the switch and set some parameters
@param dpid: DPID of the switch that just joined
@param stats: stats of this switch
"""

Ramakrishna.DPJoin(dpid, stats)
self.switch_reset(dpid) # Reset switch and set parameters

return CONTINUE

def handle_my_dp_leave(self, dpid):
"""
This method is called when a switch leaves. We notify our helpers and delete the flows.
@param dpid: DPID of the switch that just left
"""

Ramakrishna.DPLeave(dpid, stats)
return CONTINUE

def handle_my_link_event(self, event):
"""
This handles link add and remove events. Basically only notify our helpers (and delete flows).
@param event: the link event. Contains action and link details
"""
Ramakrishna.LinkEvent(event)
return CONTINUE

def handle_my_flow_removed(self, dpid, flow, priority, reason, cookie, dursec, durnsec, bytecount, packetcount):
"""
This method handles removed flows by removing them in the helpers
@param dpid: is the datapath id of the switch.
@param flow: is a NOX flow dictionary
@param priority: is the flow's priority
@param reason: why the flow was removed (see ofp_flow_removed_reason)
@param cookie: is the flow's cookie
@param dursec: is how long the flow was alive in (s).
@param durnsec: is how long the flow was alive beyond dur_sec in (ns).
@param bytecount: is the number of bytes passed through this flow.
@param packetcount: is the number of packets passed through this flow.
"""

Ramakrishna.FlowRemoved(dpid, flow, priority, reason, cookie, dursec, durnsec, bytecount, packetcount)
return CONTINUE

def handle_my_flow_mod(self, dpid, flow, command, idle_to, hard_to, buffer_id, priority, cookie):  
"""
Manages modified flows by telling the DataStore (except for delay measurement flows)
@param dpid: is the datapath id of the switch.
@param flow: is a NOX flow dictionary
@param command: is the type of flow mod (see ofp_flow_mod_command)
@param idle_to: is the idle timeout of the flow
@param hard_to: is the hard timeout of the flow
@param buffer_id: is a buffer id assigned by the switch, or -1 if there is no buffer. (This is not meaningful for OFPFC_DELETE command).
@param priority: is the flow's priority
@param cookie: is the flow's cookie
"""

Ramakrishna.FlowModification(dpid, flow, command, idle_to, hard_to, buffer_id, priority, cookie)
return CONTINUE

     
def getFactory():
"""Builds a factory class for ofcontrol
"""
class Factory:
def instance(self, ctxt):
"""Returns a new mycontroller instance
"""
return mycontroller(ctxt)
return Factory()


Execution Steps:


cd /opt/openflow-main/nox/build/src/
./nox_core -i ptcp:6633 monitoring mycontroller

Friday, November 7, 2014

Installing ESXi 5.1

The ESXi 5.1 is available in below given link:

https://my.vmware.com/group/vmware/details?downloadGroup=VCL-VSP510-ESXI-51U2&productId=285#errorCheckDiv

or

https://my.vmware.com/group/vmware/evalcenter?p=free-esxi5&lp=default


The system compatibility can be checked using :

http://www.vmware.com/resources/compatibility/search.php?lp=default



The ESXi server can be accessed through vSphere Client:

http://www.empirion.co.uk/vmware/vmware-vsphere-client-direct-download-links/


Installation procedure is available in:

For ESXi Installation:

http://www.thegeekstuff.com/2010/06/vmware-esxi-installation-guide/


For vSphere Client:
https://pubs.vmware.com/vsphere-51/index.jsp?topic=%2Fcom.vmware.vsphere.install.doc%2FGUID-1F4EB138-3301-4AC9-9B48-61166E0EBE24.html