def packet_in_callback(self, dpid, inport, reason, len, bufid, packet): if packet.type == Globals.ARP_TYPE: # ARP Response from replicas for our ARP Requests if packet.dst == octstr_to_array(Globals.VMAC): self.foundMac(dpid, mac_to_str(packet.src), ip_to_str(packet.next.protosrc), inport) # Request for VIP, respond with ARP Response elif packet.next.protodst == ipstr_to_int(Globals.VIP): Globals.STATSLOG.write(mac_to_str(dpid) + ' received ' + ip_to_str(packet.next.protosrc) + '\n') srcIP = ip_to_str(packet.next.protosrc) # Install Rewrite Rules (flow, defaultActions, rewriteActions) = IPs.get_forwarding_srcrule(srcIP, mac_to_str(packet.src), Globals.VMAC, Globals.VIP, inport) Multipath.install_microflow_flow(flow, openflow.OFP_FLOW_PERMANENT, openflow.OFP_FLOW_PERMANENT, defaultActions, None, openflow.OFP_DEFAULT_PRIORITY + 20, 0, None, dpid, inport, rewriteActions) # Response arpResponse = Arps.create_virtual_arp_response(packet, octstr_to_array(Globals.VMAC), ipstr_to_int(Globals.VIP)) Multipath.send(dpid, None, arpResponse, [[openflow.OFPAT_OUTPUT, [0, inport]]], openflow.OFPP_CONTROLLER) ip = ip_to_str(packet.next.protosrc) for i, switchJ in enumerate(Globals.SWITCHES): if switchJ['mac'] == dpid: found = False for i, client in enumerate(switchJ['clients']): if client['ip'] == ip: found = True if not found: Globals.STATSLOG.write(mac_to_str(dpid) + ' found ' + ip + '\n') switchJ['clients'].append({'port': inport, 'ip': ip, 'oldCount': 0L, 'newCount': 0L, 'avg': 0L}) elif packet.src != octstr_to_array(Globals.VMAC): Globals.STATSLOG.write(mac_to_str(dpid) + ' received REQ ' + ip_to_str(packet.next.protosrc) + '\n') arpResponse = Arps.create_arp_response(packet) Multipath.send(dpid, None, arpResponse, [[openflow.OFPAT_OUTPUT, [0, inport]]], openflow.OFPP_CONTROLLER) elif packet.type == Globals.IP_TYPE: if reason == openflow.OFPR_ACTION: IPTransition.handleControllerAction(packet)
def arpRequestReplicas(self): for i in range(0, Globals.NUMREPLICAS): if Globals.REPLICAS[i]['mac'] == '': arpRequest = Arps.create_arp_request(octstr_to_array(Globals.VMAC), ipstr_to_int(Globals.VIP), ipstr_to_int(Globals.REPLICAS[i]['ip'])) self.Multipath.flood(None, arpRequest, openflow.OFPP_FLOOD, openflow.OFPP_CONTROLLER) self.post_callback(5, self.arpRequestReplicas)
def get_forwarding_srcrule(srcIP, srcMAC, dstMAC, dstIP, outport): flow = {} flow[DL_TYPE] = 0x0800 flow[NW_DST] = ipstr_to_int(srcIP) defaultActions = [ [openflow.OFPAT_OUTPUT, [0, outport]] ] rewriteActions = [ [openflow.OFPAT_SET_DL_SRC, dstMAC], [openflow.OFPAT_SET_NW_SRC, ipstr_to_int(dstIP)], [openflow.OFPAT_SET_DL_DST, octstr_to_array(srcMAC)], [openflow.OFPAT_OUTPUT, [0, outport]] ] return (flow, defaultActions, rewriteActions)
def packet_in_callback(self, dpid, inport, reason, len, bufid, packet): # Install initial setup forwarding rules if self.Init == True: self.post_callback(Globals.PORT_STATS_PERIOD, lambda : self.port_timer()) self.Init = False # Controller Attention if reason == openflow.OFPR_ACTION: self.myIPTransition.controllerAction(packet) # Incoming ARPs elif packet.type == Globals.ARP_TYPE: # Response to our ARP requests # 1. Record MAC # 2. Install appropriate IP Forwarding Rule: Change dest VIP to dest Replica i if packet.dst == octstr_to_array(Globals.VMAC): foundMacs = True for i in range(0, Globals.NUMREPLICAS): if ((packet.next.protosrc == ipstr_to_int(Globals.REPLICAS[i]['ip'])) and (Globals.REPLICAS[i]['mac'] != mac_to_str(packet.src))): Globals.REPLICAS[i]['mac'] = mac_to_str(packet.src) Globals.REPLICAS[i]['port'] = inport for j, switchJ in enumerate(Globals.SWITCHES): if switchJ['mac'] == dpid: switchJ['replicas'].append(Globals.REPLICAS[i]['no']) if (Globals.REPLICAS[i]['mac'] == ''): foundMacs = False if foundMacs == True and self.AllMacsFound == False: Globals.log.info('REPLICAS ' + str(Globals.REPLICAS)) Globals.log.info('SWITCHES ' + str(Globals.SWITCHES)) Globals.log.info('\n') Globals.log.info('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>') rulePairList = self.myEvalRules.updateAlphas() self.myIPTransition.installRules(rulePairList) Globals.log.info('<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<') Globals.log.info('\n') self.AllMacsFound = True # Requests for VIP respond with ARP Response elif packet.next.protodst == ipstr_to_int(Globals.VIP): srcIP = ip_to_str(packet.next.protosrc) # IP Rules (flow, defaultActions, rewriteActions) = IPs.get_forwarding_srcrule(srcIP, mac_to_str(packet.src), Globals.VMAC, Globals.VIP, inport) self.Multipath.install_microflow_flow(flow, openflow.OFP_FLOW_PERMANENT, openflow.OFP_FLOW_PERMANENT, defaultActions, None, openflow.OFP_DEFAULT_PRIORITY, 0, None, dpid, inport, rewriteActions) arpResponse = Arps.create_virtual_arp_response(packet, octstr_to_array(Globals.VMAC), ipstr_to_int(Globals.VIP)) self.Multipath.send(dpid, None, arpResponse, [[openflow.OFPAT_OUTPUT, [0, inport]]], openflow.OFPP_CONTROLLER) else: arpResponse = Arps.create_arp_response(packet) self.Multipath.send(dpid, None, arpResponse, [[openflow.OFPAT_OUTPUT, [0, inport]]], openflow.OFPP_CONTROLLER) elif packet.type == Globals.IP_TYPE: Globals.log.info("Warning! S1 SHOULD NOT BE RECEIVING IP Traffic!!!") # self.myIPTransition.controllerAction(packet) return CONTINUE
def mac(h): x = hex(h)[2:] return octstr_to_array("00:00:00:00:00:" + ("0" if h < 16 else "") + str(x))